X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Ffmt_date.c;h=0475f91cf3b0c3a91c410078d5ed72874e769b19;hb=1e32899153e9e52aaec1e651e0c33a563b8aaed8;hp=4481063f88c1e134e7a22a5e86c78156958fb394;hpb=c4b6017c2f87080eceb593fd510cc29bac3e31bc;p=citadel.git diff --git a/webcit/fmt_date.c b/webcit/fmt_date.c index 4481063f8..0475f91cf 100644 --- a/webcit/fmt_date.c +++ b/webcit/fmt_date.c @@ -1,28 +1,26 @@ /* * $Id$ - * - * Miscellaneous routines */ - +/** + * \defgroup FormatDates Miscellaneous routines formating dates + * \ingroup Calendaring + */ +/*@{*/ #include "webcit.h" #include "webserver.h" -typedef unsigned char byte; - -#define FALSE 0 -#define TRUE 1 +typedef unsigned char byte; /**< a byte. */ +char *wdays[7]; +char *months[12]; -char *ascmonths[] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; +#define FALSE 0 /**< no. */ +#define TRUE 1 /**< yes. */ -char *ascdays[] = { - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" -}; - -/* - * Format a date/time stamp for output +/** + * \brief Format a date/time stamp for output + * \param buf the output buffer + * \param thetime time to convert to string + * \param brief do we want compact view????? */ void fmt_date(char *buf, time_t thetime, int brief) { @@ -31,6 +29,22 @@ void fmt_date(char *buf, time_t thetime, int brief) time_t today_timet; int hour; char calhourformat[16]; + static char *ascmonths[12] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL } ; + + if (ascmonths[0] == NULL) { + ascmonths[0] = _("Jan"); + ascmonths[1] = _("Feb"); + ascmonths[2] = _("Mar"); + ascmonths[3] = _("Apr"); + ascmonths[4] = _("May"); + ascmonths[5] = _("Jun"); + ascmonths[6] = _("Jul"); + ascmonths[7] = _("Aug"); + ascmonths[8] = _("Sep"); + ascmonths[9] = _("Oct"); + ascmonths[10] = _("Nov"); + ascmonths[11] = _("Dec"); + }; get_preference("calhourformat", calhourformat, sizeof calhourformat); @@ -48,6 +62,7 @@ void fmt_date(char *buf, time_t thetime, int brief) if (brief) { + /** If date == today, show only the time */ if ((tm.tm_year == today_tm.tm_year) &&(tm.tm_mon == today_tm.tm_mon) &&(tm.tm_mday == today_tm.tm_mday)) { @@ -63,6 +78,28 @@ void fmt_date(char *buf, time_t thetime, int brief) ); } } + + /** Otherwise, for messages up to 6 months old, show the + * month and day, and the time */ + else if (today_timet - thetime < 15552000) { + if (!strcasecmp(calhourformat, "24")) { + sprintf(buf, "%s %d %2d:%02d", + ascmonths[tm.tm_mon], + tm.tm_mday, + tm.tm_hour, tm.tm_min + ); + } + else { + sprintf(buf, "%s %d %2d:%02d%s", + ascmonths[tm.tm_mon], + tm.tm_mday, + hour, tm.tm_min, + ((tm.tm_hour >= 12) ? "pm" : "am") + ); + } + } + + /** older than 6 months, show only the date */ else { sprintf(buf, "%s %d %d", ascmonths[tm.tm_mon], @@ -93,8 +130,10 @@ void fmt_date(char *buf, time_t thetime, int brief) -/* - * Format TIME ONLY for output +/** + * \brief Format TIME ONLY for output + * \param buf the output buffer + * \param thetime time to format into buf */ void fmt_time(char *buf, time_t thetime) { @@ -127,29 +166,13 @@ void fmt_time(char *buf, time_t thetime) -/* - * Format a date/time stamp to the format used in HTTP headers - */ -void httpdate(char *buf, time_t thetime) -{ - struct tm *tm; - - buf[0] = 0; - tm = localtime(&thetime); - - sprintf(buf, "%s, %02d %s %4d %02d:%02d:%02d", - ascdays[tm->tm_wday], - tm->tm_mday, - ascmonths[tm->tm_mon], - tm->tm_year + 1900, tm->tm_hour, tm->tm_min, tm->tm_sec); -} - - -/* - * Break down the timestamp used in HTTP headers +/** + * \brief Break down the timestamp used in HTTP headers * Should read rfc1123 and rfc850 dates OK - * FIXME won't read asctime + * \todo FIXME won't read asctime * Doesn't understand timezone, but we only should be using GMT/UTC anyway + * \param buf time to parse + * \return the time found in buf */ time_t httpdate_to_timestamp(const char *buf) { @@ -158,8 +181,7 @@ time_t httpdate_to_timestamp(const char *buf) char *c; char tz[256]; -lprintf(3, "Datestamp: %s\n", buf); - /* Skip day of week, to number */ + /** Skip day of week, to number */ for (c = buf; *c != ' '; c++) ; c++; @@ -169,62 +191,62 @@ lprintf(3, "Datestamp: %s\n", buf); for (; *c != ' ' && *c != '-'; c++); c++; - /* Get month */ + /** Get month */ switch (*c) { - case 'A': /* April, August */ + case 'A': /** April, August */ tt.tm_mon = (c[1] == 'p') ? 3 : 7; break; - case 'D': /* December */ + case 'D': /** December */ tt.tm_mon = 11; break; - case 'F': /* February */ + case 'F': /** February */ tt.tm_mon = 1; break; - case 'M': /* March, May */ + case 'M': /** March, May */ tt.tm_mon = (c[2] == 'r') ? 2 : 4; break; - case 'J': /* January, June, July */ + case 'J': /** January, June, July */ tt.tm_mon = (c[2] == 'n') ? ((c[1] == 'a') ? 0 : 5) : 6; break; - case 'N': /* November */ + case 'N': /** November */ tt.tm_mon = 10; break; - case 'O': /* October */ + case 'O': /** October */ tt.tm_mon = 9; break; - case 'S': /* September */ + case 'S': /** September */ tt.tm_mon = 8; break; default: return 42; - break; /* NOTREACHED */ + break; /** NOTREACHED */ } c += 4; tt.tm_year = 0; - /* Get year */ + /** Get year */ tt.tm_year = atoi(c); for (; *c != ' '; c++); c++; if (tt.tm_year >= 1900) tt.tm_year -= 1900; - /* Get hour */ + /** Get hour */ tt.tm_hour = atoi(c); for (; *c != ':'; c++); c++; - /* Get minute */ + /** Get minute */ tt.tm_min = atoi(c); for (; *c != ':'; c++); c++; - /* Get second */ + /** Get second */ tt.tm_sec = atoi(c); for (; *c && *c != ' '; c++); - /* Got everything; let's go */ - /* First, change to UTC */ + /** Got everything; let's go */ + /** First, change to UTC */ if (getenv("TZ")) sprintf(tz, "TZ=%s", getenv("TZ")); else @@ -236,3 +258,36 @@ lprintf(3, "Datestamp: %s\n", buf); tzset(); return t; } + + + +/** + * /brief Initialize the strings used to display months and weekdays. + */ +void initialize_months_and_days(void) { + wdays[0] = _("Sunday"); + wdays[1] = _("Monday"); + wdays[2] = _("Tuesday"); + wdays[3] = _("Wednesday"); + wdays[4] = _("Thursday"); + wdays[5] = _("Friday"); + wdays[6] = _("Saturday"); + + months[0] = _("January"); + months[1] = _("February"); + months[2] = _("March"); + months[3] = _("April"); + months[4] = _("May"); + months[5] = _("June"); + months[6] = _("July"); + months[7] = _("August"); + months[8] = _("September"); + months[9] = _("October"); + months[10] = _("November"); + months[11] = _("December"); +} + + + + +/*@}*/