#include "webserver.h"
typedef unsigned char byte; /**< a byte. */
-char *wdays[7];
-char *months[12];
#define FALSE 0 /**< no. */
#define TRUE 1 /**< yes. */
+/**
+ * \brief Wrapper around strftime() or strftime_l()
+ * depending upon how our build is configured.
+ *
+ * \param s String target buffer
+ * \param max Maximum size of string target buffer
+ * \param format strftime() format
+ * \param tm Input date/time
+ */
+size_t wc_strftime(char *s, size_t max, const char *format, const struct tm *tm)
+{
+#ifdef ENABLE_NLS
+ if (wc_locales[WC->selected_language] == NULL) {
+ return strftime(s, max, format, tm);
+ }
+ else { // TODO: this gives empty strings on debian.
+ return strftime_l(s, max, format, tm, wc_locales[WC->selected_language]);
+ }
+#else
+ return strftime(s, max, format, tm);
+#endif
+}
+
+
/**
* \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)
+void webcit_fmt_date(char *buf, time_t thetime, int brief)
{
struct tm tm;
struct tm today_tm;
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);
-
+ int time_format;
+
+ time_format = get_time_format_cached ();
today_timet = time(NULL);
localtime_r(&today_timet, &today_tm);
localtime_r(&thetime, &tm);
- hour = tm.tm_hour;
- if (hour == 0)
- hour = 12;
- else if (hour > 12)
- hour = hour - 12;
-
- buf[0] = 0;
if (brief) {
if ((tm.tm_year == today_tm.tm_year)
&&(tm.tm_mon == today_tm.tm_mon)
&&(tm.tm_mday == today_tm.tm_mday)) {
- if (!strcasecmp(calhourformat, "24")) {
- sprintf(buf, "%2d:%02d",
- tm.tm_hour, tm.tm_min
- );
- }
- else {
- sprintf(buf, "%2d:%02d%s",
- hour, tm.tm_min,
- ((tm.tm_hour >= 12) ? "pm" : "am")
- );
- }
+ if (time_format == WC_TIMEFORMAT_24)
+ wc_strftime(buf, 32, "%k:%M", &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 */
+ /** 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")
- );
- }
+ 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 {
- sprintf(buf, "%s %d %d",
- ascmonths[tm.tm_mon],
- tm.tm_mday,
- tm.tm_year + 1900
- );
+ wc_strftime(buf, 32, "%b %d %Y", &tm);
}
}
else {
- strftime_l(buf, 32, "%c", &tm, wc_locales[WC->selected_language]);
+ 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);
}
}
+/**
+ * \brief learn the users timeformat preference.
+ */
+int get_time_format_cached (void)
+{
+ char calhourformat[16];
+ 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"))
+ *time_format_cache = WC_TIMEFORMAT_24;
+ else
+ *time_format_cache = WC_TIMEFORMAT_AMPM;
+ }
+ return *time_format_cache;
+}
/**
* \brief Format TIME ONLY for output
{
struct tm *tm;
int hour;
- char calhourformat[16];
-
- get_preference("calhourformat", calhourformat, sizeof calhourformat);
-
+ int time_format;
+
+ time_format = get_time_format_cached ();
buf[0] = 0;
tm = localtime(&thetime);
hour = tm->tm_hour;
else if (hour > 12)
hour = hour - 12;
- if (!strcasecmp(calhourformat, "24")) {
+ if (time_format == WC_TIMEFORMAT_24) {
sprintf(buf, "%2d:%02d",
tm->tm_hour, tm->tm_min
);
* \param buf time to parse
* \return the time found in buf
*/
-time_t httpdate_to_timestamp(const char *buf)
+time_t httpdate_to_timestamp(char *buf)
{
time_t t = 0;
struct tm tt;
-/**
- * /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");
-}
-
-
-
/*@}*/