/* Define your own defaults in config.h if necessary */
#if defined(TZNAME_STD) && defined(TZNAME_DST)
-char *tzname_[2] = {TZNAME_STD, TZNAME_DST};
+char *tzname_[2] = { TZNAME_STD, TZNAME_DST };
#else
#define tzname_ tzname
#endif
static char buf[26];
-static void strfmt(char *str, const char *fmt, ...);
+static void strfmt(
+ char *str,
+ const char *fmt,
+ ...);
/**
*
*
**/
-size_t strftime_(char *s, size_t maxs, const char *f, const struct tm *t)
+size_t strftime_(
+ char *s,
+ size_t maxs,
+ const char *f,
+ const struct tm *t)
{
- int w,d;
- char *p, *q, *r;
-
- p = s;
- q = s + maxs - 1;
- while ((*f != '\0'))
- {
- if (*f++ == '%')
- {
- r = buf;
- switch (*f++)
- {
- case '%' :
- r = "%";
- break;
-
- case 'a' :
- r = aday[t->tm_wday];
- break;
-
- case 'A' :
- r = day[t->tm_wday];
- break;
-
- case 'b' :
- r = amonth[t->tm_mon];
- break;
-
- case 'B' :
- r = month[t->tm_mon];
- break;
-
- case 'c' :
- strfmt(r, "%0 %0 %2 %2:%2:%2 %4",
- aday[t->tm_wday], amonth[t->tm_mon],
- t->tm_mday,t->tm_hour, t->tm_min,
- t->tm_sec, t->tm_year+1900);
- break;
-
- case 'd' :
- strfmt(r,"%2",t->tm_mday);
- break;
-
- case 'H' :
- strfmt(r,"%2",t->tm_hour);
- break;
-
- case 'I' :
- strfmt(r,"%2",(t->tm_hour%12)?t->tm_hour%12:12);
- break;
-
- case 'j' :
- strfmt(r,"%3",t->tm_yday+1);
- break;
-
- case 'm' :
- strfmt(r,"%2",t->tm_mon+1);
- break;
-
- case 'M' :
- strfmt(r,"%2",t->tm_min);
- break;
-
- case 'p' :
- r = (t->tm_hour>11)?"PM":"AM";
- break;
-
- case 'S' :
- strfmt(r,"%2",t->tm_sec);
- break;
-
- case 'U' :
- w = t->tm_yday/7;
- if (t->tm_yday%7 > t->tm_wday)
- w++;
- strfmt(r, "%2", w);
- break;
-
- case 'W' :
- w = t->tm_yday/7;
- if (t->tm_yday%7 > (t->tm_wday+6)%7)
- w++;
- strfmt(r, "%2", w);
- break;
-
- case 'V':
-
- /* ISO 8601 Week Of Year:
- If the week (Monday - Sunday) containing January 1 has four or more
- days in the new year, then it is week 1; otherwise it is week 53 of
- the previous year and the next week is week one. */
-
- w = (t->tm_yday + 7 - (t->tm_wday ? t->tm_wday - 1 : 6)) / 7;
- d = (t->tm_yday + 7 - (t->tm_wday ? t->tm_wday - 1 : 6)) % 7;
-
- if (d >= 4) { w++; } else if (w == 0) { w = 53; }
- strfmt(r, "%2", w);
- break;
-
- case 'w' :
- strfmt(r,"%1",t->tm_wday);
- break;
-
- case 'x' :
- strfmt(r, "%3s %3s %2 %4", aday[t->tm_wday],
- amonth[t->tm_mon], t->tm_mday, t->tm_year+1900);
- break;
-
- case 'X' :
- strfmt(r, "%2:%2:%2", t->tm_hour,
- t->tm_min, t->tm_sec);
- break;
-
- case 'y' :
- strfmt(r,"%2",t->tm_year%100);
- break;
-
- case 'Y' :
- strfmt(r,"%4",t->tm_year+1900);
- break;
-
- case 'Z' :
- r = (t->tm_isdst && tzname_[1][0]) ?
- tzname_[1] : tzname_[0];
- break;
-
- default:
- buf[0] = '%'; /* reconstruct the format */
- buf[1] = f[-1];
- buf[2] = '\0';
- if (buf[1] == 0)
- f--; /* back up if at end of string */
- }
- while (*r)
- {
- if (p == q)
- {
- *q = '\0';
- return 0;
- }
- *p++ = *r++;
- }
+ int w, d;
+ char *p, *q, *r;
+
+ p = s;
+ q = s + maxs - 1;
+ while ((*f != '\0')) {
+ if (*f++ == '%') {
+ r = buf;
+ switch (*f++) {
+ case '%':
+ r = "%";
+ break;
+
+ case 'a':
+ r = aday[t->tm_wday];
+ break;
+
+ case 'A':
+ r = day[t->tm_wday];
+ break;
+
+ case 'b':
+ r = amonth[t->tm_mon];
+ break;
+
+ case 'B':
+ r = month[t->tm_mon];
+ break;
+
+ case 'c':
+ strfmt(r, "%0 %0 %2 %2:%2:%2 %4",
+ aday[t->tm_wday], amonth[t->tm_mon],
+ t->tm_mday, t->tm_hour, t->tm_min,
+ t->tm_sec, t->tm_year + 1900);
+ break;
+
+ case 'd':
+ strfmt(r, "%2", t->tm_mday);
+ break;
+
+ case 'H':
+ strfmt(r, "%2", t->tm_hour);
+ break;
+
+ case 'I':
+ strfmt(r, "%2", (t->tm_hour % 12) ? t->tm_hour % 12 : 12);
+ break;
+
+ case 'j':
+ strfmt(r, "%3", t->tm_yday + 1);
+ break;
+
+ case 'm':
+ strfmt(r, "%2", t->tm_mon + 1);
+ break;
+
+ case 'M':
+ strfmt(r, "%2", t->tm_min);
+ break;
+
+ case 'p':
+ r = (t->tm_hour > 11) ? "PM" : "AM";
+ break;
+
+ case 'S':
+ strfmt(r, "%2", t->tm_sec);
+ break;
+
+ case 'U':
+ w = t->tm_yday / 7;
+ if (t->tm_yday % 7 > t->tm_wday)
+ w++;
+ strfmt(r, "%2", w);
+ break;
+
+ case 'W':
+ w = t->tm_yday / 7;
+ if (t->tm_yday % 7 > (t->tm_wday + 6) % 7)
+ w++;
+ strfmt(r, "%2", w);
+ break;
+
+ case 'V':
+
+ /* ISO 8601 Week Of Year:
+ If the week (Monday - Sunday) containing January 1 has four or more
+ days in the new year, then it is week 1; otherwise it is week 53 of
+ the previous year and the next week is week one. */
+
+ w = (t->tm_yday + 7 - (t->tm_wday ? t->tm_wday - 1 : 6)) / 7;
+ d = (t->tm_yday + 7 - (t->tm_wday ? t->tm_wday - 1 : 6)) % 7;
+
+ if (d >= 4) {
+ w++;
+ } else if (w == 0) {
+ w = 53;
+ }
+ strfmt(r, "%2", w);
+ break;
+
+ case 'w':
+ strfmt(r, "%1", t->tm_wday);
+ break;
+
+ case 'x':
+ strfmt(r, "%3s %3s %2 %4", aday[t->tm_wday],
+ amonth[t->tm_mon], t->tm_mday, t->tm_year + 1900);
+ break;
+
+ case 'X':
+ strfmt(r, "%2:%2:%2", t->tm_hour, t->tm_min, t->tm_sec);
+ break;
+
+ case 'y':
+ strfmt(r, "%2", t->tm_year % 100);
+ break;
+
+ case 'Y':
+ strfmt(r, "%4", t->tm_year + 1900);
+ break;
+
+ case 'Z':
+ r = (t->tm_isdst && tzname_[1][0]) ? tzname_[1] : tzname_[0];
+ break;
+
+ default:
+ buf[0] = '%'; /* reconstruct the format */
+ buf[1] = f[-1];
+ buf[2] = '\0';
+ if (buf[1] == 0)
+ f--; /* back up if at end of string */
}
- else
- {
- if (p == q)
- {
- *q = '\0';
- return 0;
- }
- *p++ = f[-1];
+ while (*r) {
+ if (p == q) {
+ *q = '\0';
+ return 0;
+ }
+ *p++ = *r++;
}
- }
- *p = '\0';
- return p - s;
+ } else {
+ if (p == q) {
+ *q = '\0';
+ return 0;
+ }
+ *p++ = f[-1];
+ }
+ }
+ *p = '\0';
+ return p - s;
}
/*
*
**/
-static void strfmt(char *str, const char *fmt, ...)
+static void strfmt(
+ char *str,
+ const char *fmt,
+ ...)
{
- int ival, ilen;
- char *sval;
- va_list vp;
-
- va_start(vp, fmt);
- while (*fmt)
- {
- if (*fmt++ == '%')
- {
- ilen = *fmt++ - '0';
- if (ilen == 0) /* zero means string arg */
- {
- sval = va_arg(vp, char*);
- while (*sval)
- *str++ = *sval++;
- }
- else /* always leading zeros */
- {
- ival = va_arg(vp, int);
- while (ilen)
- {
- ival %= powers[ilen--];
- *str++ = (char)('0' + ival / powers[ilen]);
- }
- }
+ int ival, ilen;
+ char *sval;
+ va_list vp;
+
+ va_start(vp, fmt);
+ while (*fmt) {
+ if (*fmt++ == '%') {
+ ilen = *fmt++ - '0';
+ if (ilen == 0) { /* zero means string arg */
+ sval = va_arg(vp, char *);
+
+ while (*sval)
+ *str++ = *sval++;
+ } else { /* always leading zeros */
+
+ ival = va_arg(vp, int);
+
+ while (ilen) {
+ ival %= powers[ilen--];
+ *str++ = (char) ('0' + ival / powers[ilen]);
+ }
}
- else *str++ = fmt[-1];
- }
- *str = '\0';
- va_end(vp);
+ } else
+ *str++ = fmt[-1];
+ }
+ *str = '\0';
+ va_end(vp);
}
#ifdef TEST
#include <stdio.h> /* for printf */
#include <time.h> /* for strftime */
-char test[80];
+char test[80];
-int main(int argc, char *argv[])
+int main(
+ int argc,
+ char *argv[])
{
- int len;
- char *fmt;
- time_t now;
+ int len;
+ char *fmt;
+ time_t now;
- time(&now);
+ time(&now);
- fmt = (argc == 1) ? "%I:%M %p\n%c\n" : argv[1];
- len = strftime_(test,sizeof test, fmt, localtime(&now));
- printf("%d: %s\n", len, test);
- return !len;
+ fmt = (argc == 1) ? "%I:%M %p\n%c\n" : argv[1];
+ len = strftime_(test, sizeof test, fmt, localtime(&now));
+ printf("%d: %s\n", len, test);
+ return !len;
}
-#endif /* TEST */
+#endif /* TEST */