X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Ffmt_date.c;h=15e5673ca25756813f6529f6fff6d6aa4e21bb5e;hb=faa7bc4175fa88b5fd6548b2e92cdc5497dfe692;hp=6bfebd4d54a6a4d0697fa3454f4349a41c91be41;hpb=315f40a0635b396cfa707b6e4d36d790c6f06ac2;p=citadel.git diff --git a/webcit/fmt_date.c b/webcit/fmt_date.c index 6bfebd4d5..15e5673ca 100644 --- a/webcit/fmt_date.c +++ b/webcit/fmt_date.c @@ -1,10 +1,28 @@ /* - * $Id$ + * Copyright (c) 1996-2010 by the citadel.org team + * + * This program is open source software. You can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "webcit.h" #include "webserver.h" +#ifdef HAVE_USELOCALE +extern locale_t *wc_locales; +#endif + typedef unsigned char byte; #define FALSE 0 /**< no. */ @@ -21,23 +39,29 @@ typedef unsigned char byte; */ size_t wc_strftime(char *s, size_t max, const char *format, const struct tm *tm) { + #ifdef ENABLE_NLS +#ifdef HAVE_USELOCALE if (wc_locales[WC->selected_language] == NULL) { return strftime(s, max, format, tm); } - else { // TODO: this gives empty strings on debian. + else { return strftime_l(s, max, format, tm, wc_locales[WC->selected_language]); } #else return strftime(s, max, format, tm); #endif +#else + return strftime(s, max, format, tm); +#endif } + /* * Format a date/time stamp for output */ -void webcit_fmt_date(char *buf, time_t thetime, int brief) +void webcit_fmt_date(char *buf, size_t siz, time_t thetime, int Format) { struct tm tm; struct tm today_tm; @@ -50,35 +74,64 @@ void webcit_fmt_date(char *buf, time_t thetime, int brief) localtime_r(&thetime, &tm); - if (brief) { + /* + * DATEFMT_FULL: full display + * DATEFMT_BRIEF: if date == today, show only the time + * otherwise, for messages up to 6 months old, + * show the month and day, and the time + * older than 6 months, show only the date + * DATEFMT_RAWDATE: show full date, regardless of age + * DATEFMT_LOCALEDATE: show full date as prefered for the locale + */ - /* 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)) { - if (time_format == WC_TIMEFORMAT_24) - wc_strftime(buf, 32, "%k:%M", &tm); + switch (Format) { + case DATEFMT_BRIEF: + if ((tm.tm_year == today_tm.tm_year) + &&(tm.tm_mon == today_tm.tm_mon) + &&(tm.tm_mday == today_tm.tm_mday)) { + if (time_format == WC_TIMEFORMAT_24) + wc_strftime(buf, siz, "%k:%M", &tm); + else + wc_strftime(buf, siz, "%l:%M%p", &tm); + } + else if (today_timet - thetime < 15552000) { + if (time_format == WC_TIMEFORMAT_24) + wc_strftime(buf, siz, "%b %d %k:%M", &tm); + else + wc_strftime(buf, siz, "%b %d %l:%M%p", &tm); + } + else { + wc_strftime(buf, siz, "%b %d %Y", &tm); + } + break; + case DATEFMT_FULL: + if (time_format == WC_TIMEFORMAT_24) + wc_strftime(buf, siz, "%a %b %d %Y %T %Z", &tm); else - wc_strftime(buf, 32, "%l:%M%p", &tm); - } - /* Otherwise, for messages up to 6 months old, show the month and day, and the time */ - else if (today_timet - thetime < 15552000) { - if (time_format == WC_TIMEFORMAT_24) - wc_strftime(buf, 32, "%b %d %k:%M", &tm); - else - wc_strftime(buf, 32, "%b %d %l:%M%p", &tm); - } - /* older than 6 months, show only the date */ - else { - wc_strftime(buf, 32, "%b %d %Y", &tm); - } + wc_strftime(buf, siz, "%a %b %d %Y %r %Z", &tm); + break; + case DATEFMT_RAWDATE: + wc_strftime(buf, siz, "%a %b %d %Y", &tm); + break; + case DATEFMT_LOCALEDATE: + wc_strftime(buf, siz, "%x", &tm); + break; } - else { - if (time_format == WC_TIMEFORMAT_24) - wc_strftime(buf, 32, "%a %b %d %Y %T %Z", &tm); - else - wc_strftime(buf, 32, "%a %b %d %Y %r %Z", &tm); +} + + +/* + * Try to guess whether the user will prefer 12 hour or 24 hour time based on the locale. + */ +long guess_calhourformat(void) { + char buf[64]; + struct tm tm; + memset(&tm, 0, sizeof tm); + wc_strftime(buf, 64, "%X", &tm); + if (buf[strlen(buf)-1] == 'M') { + return 12; } + return 24; } @@ -87,13 +140,22 @@ void webcit_fmt_date(char *buf, time_t thetime, int brief) */ int get_time_format_cached (void) { - char calhourformat[16]; + long calhourformat; int *time_format_cache; time_format_cache = &(WC->time_format_cache); if (*time_format_cache == WC_TIMEFORMAT_NONE) { - get_preference("calhourformat", calhourformat, sizeof calhourformat); - if (!strcasecmp(calhourformat, "24")) + get_pref_long("calhourformat", &calhourformat, 99); + + /* If we don't know the user's time format preference yet, + * make a guess based on the locale. + */ + if (calhourformat == 99) { + calhourformat = guess_calhourformat(); + } + + /* Now set the preference */ + if (calhourformat == 24) *time_format_cache = WC_TIMEFORMAT_24; else *time_format_cache = WC_TIMEFORMAT_AMPM; @@ -106,7 +168,7 @@ int get_time_format_cached (void) * buf the output buffer * thetime time to format into buf */ -void fmt_time(char *buf, time_t thetime) +void fmt_time(char *buf, size_t siz, time_t thetime) { struct tm *tm; int hour; @@ -122,12 +184,12 @@ void fmt_time(char *buf, time_t thetime) hour = hour - 12; if (time_format == WC_TIMEFORMAT_24) { - sprintf(buf, "%2d:%02d", + snprintf(buf, siz, "%d:%02d", tm->tm_hour, tm->tm_min ); } else { - sprintf(buf, "%d:%02d%s", + snprintf(buf, siz, "%d:%02d%s", hour, tm->tm_min, ((tm->tm_hour > 12) ? "pm" : "am") ); } @@ -142,16 +204,18 @@ void fmt_time(char *buf, time_t thetime) * FIXME won't read asctime * Doesn't understand timezone, but we only should be using GMT/UTC anyway */ -time_t httpdate_to_timestamp(char *buf) +time_t httpdate_to_timestamp(StrBuf *buf) { time_t t = 0; struct tm tt; - char *c; + const char *c; /** Skip day of week, to number */ - for (c = buf; *c != ' '; c++) + for (c = ChrPtr(buf); *c != ' '; c++) ; c++; + + memset(&tt, 0, sizeof(tt)); /* Get day of month */ tt.tm_mday = atoi(c); @@ -220,7 +284,30 @@ time_t httpdate_to_timestamp(char *buf) * some systems. */ tzset(); - tt.tm_sec -= timezone; + tt.tm_sec = tt.tm_sec - (int)timezone; t = mktime(&tt); return t; } + + +void LoadTimeformatSettingsCache(StrBuf *Preference, long lvalue) +{ + int *time_format_cache; + + time_format_cache = &(WC->time_format_cache); + if (lvalue == 24) + *time_format_cache = WC_TIMEFORMAT_24; + else + *time_format_cache = WC_TIMEFORMAT_AMPM; +} + + + +void +InitModule_DATETIME +(void) +{ + RegisterPreference("calhourformat", _("Time format"), PRF_INT, LoadTimeformatSettingsCache); + + +}