]> code.citadel.org Git - citadel.git/blobdiff - webcit/fmt_date.c
Date picker is now localized to the currently selected
[citadel.git] / webcit / fmt_date.c
index af694a8c6b0ea72bd2503ad6102349c90bad3ce8..c541b7b17ec9f029d93514d00e56d6b65df03355 100644 (file)
@@ -21,7 +21,9 @@ 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);
        }
@@ -31,9 +33,13 @@ size_t wc_strftime(char *s, size_t max, const char *format, const struct tm *tm)
 #else
        return strftime(s, max, format, tm);
 #endif
+#else
+       return strftime(s, max, format, tm);
+#endif
 }
 
 
+
 /*
  * Format a date/time stamp for output 
  */
@@ -87,13 +93,13 @@ 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, 24);
+               if (calhourformat == 24
                        *time_format_cache = WC_TIMEFORMAT_24;
                else
                        *time_format_cache = WC_TIMEFORMAT_AMPM;
@@ -142,17 +148,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;
-       char tz[256];
+       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);
@@ -213,18 +220,15 @@ time_t httpdate_to_timestamp(char *buf)
        tt.tm_sec = atoi(c);
        for (; *c && *c != ' '; c++);
 
-       /* Got everything; let's go */
-       /* First, change to UTC */
-       if (getenv("TZ"))
-               snprintf(tz, 256, "TZ=%s", getenv("TZ"));
-       else
-               strcpy(tz, "TZ=");
-       putenv("TZ=UTC");
+       /* Got everything; let's go.  The global 'timezone' variable contains the
+        * local timezone's offset from UTC, in seconds, so we apply that to tm_sec.
+        * This produces an illegal value for tm_sec, but mktime() will normalize
+        * it for us.  This eliminates the need to temporarily switch the environment
+        * variable TZ to UTC, which is good because it fails to switch back on
+        * some systems.
+        */
        tzset();
+       tt.tm_sec = tt.tm_sec - (int)timezone;
        t = mktime(&tt);
-       putenv(tz);
-       tzset();
        return t;
 }
-
-