Back to index

webcit  8.12-dfsg
Defines | Typedefs | Functions
fmt_date.c File Reference
#include "webcit.h"
#include "webserver.h"

Go to the source code of this file.

Defines

#define FALSE   0
 no.
#define TRUE   1
 yes.

Typedefs

typedef unsigned char byte

Functions

size_t wc_strftime (char *s, size_t max, const char *format, const struct tm *tm)
void webcit_fmt_date (char *buf, size_t siz, time_t thetime, int Format)
long guess_calhourformat (void)
int get_time_format_cached (void)
void fmt_time (char *buf, size_t siz, time_t thetime)
time_t httpdate_to_timestamp (StrBuf *buf)
void LoadTimeformatSettingsCache (StrBuf *Preference, long lvalue)
void InitModule_DATETIME (void)

Define Documentation

#define FALSE   0

no.

Definition at line 22 of file fmt_date.c.

#define TRUE   1

yes.

Definition at line 23 of file fmt_date.c.


Typedef Documentation

typedef unsigned char byte

Definition at line 20 of file fmt_date.c.


Function Documentation

void fmt_time ( char *  buf,
size_t  siz,
time_t  thetime 
)

Definition at line 165 of file fmt_date.c.

{
       struct tm *tm;
       int hour;
       int time_format;
       
       time_format = get_time_format_cached ();
       buf[0] = 0;
       tm = localtime(&thetime);
       hour = tm->tm_hour;
       if (hour == 0)
              hour = 12;
       else if (hour > 12)
              hour = hour - 12;

       if (time_format == WC_TIMEFORMAT_24) {
              snprintf(buf, siz, "%d:%02d",
                     tm->tm_hour, tm->tm_min
              );
       }
       else {
              snprintf(buf, siz, "%d:%02d%s",
                     hour, tm->tm_min, ((tm->tm_hour > 12) ? "pm" : "am")
              );
       }
}

Here is the call graph for this function:

Here is the caller graph for this function:

int get_time_format_cached ( void  )

Definition at line 135 of file fmt_date.c.

{
       long calhourformat;
       int *time_format_cache;
       time_format_cache = &(WC->time_format_cache);
       if (*time_format_cache == WC_TIMEFORMAT_NONE)
       {
              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;
       }
       return *time_format_cache;
}

Here is the call graph for this function:

Here is the caller graph for this function:

long guess_calhourformat ( void  )

Definition at line 120 of file fmt_date.c.

                               {
       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;
}

Here is the call graph for this function:

Here is the caller graph for this function:

time_t httpdate_to_timestamp ( StrBuf *  buf)

Skip day of week, to number

Definition at line 201 of file fmt_date.c.

{
       time_t t = 0;
       struct tm tt;
       const char *c;

       for (c = ChrPtr(buf); *c != ' '; c++)
              ;
       c++;
       
       memset(&tt, 0, sizeof(tt));

       /* Get day of month */
       tt.tm_mday = atoi(c);
       for (; *c != ' ' && *c != '-'; c++);
       c++;

       /* Get month */
       switch (*c) {
       case 'A':     /* April, August */
              tt.tm_mon = (c[1] == 'p') ? 3 : 7;
              break;
       case 'D':     /* December */
              tt.tm_mon = 11;
              break;
       case 'F':     /* February */
              tt.tm_mon = 1;
              break;
       case 'M':     /* March, May */
              tt.tm_mon = (c[2] == 'r') ? 2 : 4;
              break;
       case 'J':     /* January, June, July */
              tt.tm_mon = (c[2] == 'n') ? ((c[1] == 'a') ? 0 : 5) : 6;
              break;
       case 'N':     /* November */
              tt.tm_mon = 10;
              break;
       case 'O':     /* October */
              tt.tm_mon = 9;
              break;
       case 'S':     /* September */
              tt.tm_mon = 8;
              break;
       default:
              return 42;
              break; /* NOTREACHED */
       }
       c += 4;

       tt.tm_year = 0;
       /* Get year */
       tt.tm_year = atoi(c);
       for (; *c != ' '; c++);
       c++;
       if (tt.tm_year >= 1900)
              tt.tm_year -= 1900;

       /* Get hour */
       tt.tm_hour = atoi(c);
       for (; *c != ':'; c++);
       c++;

       /* Get minute */
       tt.tm_min = atoi(c);
       for (; *c != ':'; c++);
       c++;

       /* Get second */
       tt.tm_sec = atoi(c);
       for (; *c && *c != ' '; c++);

       /* 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);
       return t;
}

Here is the caller graph for this function:

void InitModule_DATETIME ( void  )

Definition at line 302 of file fmt_date.c.

{
       RegisterPreference("calhourformat", _("Time format"), PRF_INT, LoadTimeformatSettingsCache);


}

Here is the call graph for this function:

Here is the caller graph for this function:

void LoadTimeformatSettingsCache ( StrBuf *  Preference,
long  lvalue 
)

Definition at line 287 of file fmt_date.c.

{
       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;
}

Here is the caller graph for this function:

size_t wc_strftime ( char *  s,
size_t  max,
const char *  format,
const struct tm *  tm 
)

Definition at line 34 of file fmt_date.c.

{

#ifdef ENABLE_NLS
#ifdef HAVE_USELOCALE
       if (wc_locales[WC->selected_language] == NULL) {
              return strftime(s, max, format, tm);
       }
       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
}

Here is the caller graph for this function:

void webcit_fmt_date ( char *  buf,
size_t  siz,
time_t  thetime,
int  Format 
)

Definition at line 58 of file fmt_date.c.

{
       struct tm tm;
       struct tm today_tm;
       time_t today_timet;
       int time_format;

       time_format = get_time_format_cached ();
       today_timet = time(NULL);
       localtime_r(&today_timet, &today_tm);

       localtime_r(&thetime, &tm);

       /*
        * 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
        */

       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, 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;
       }
}

Here is the call graph for this function:

Here is the caller graph for this function: