X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fstrftime.c;h=484852a72d13d83361cefdcc8448efe5d774dccc;hb=6aae241f16ed2dbe57475cb4c8b3a5b1ca1e9699;hp=b6695342a2b43db4e8cd4c24de064922e7d1d0cf;hpb=29e59276fc2d28fcbede9bad652e0e648d33fc5f;p=gnulib.git diff --git a/lib/strftime.c b/lib/strftime.c index b6695342a..484852a72 100644 --- a/lib/strftime.c +++ b/lib/strftime.c @@ -46,6 +46,7 @@ %p locale's AM or PM %r time, 12-hour (hh:mm:ss [AP]M) %R time, 24-hour (hh:mm) + %s time in seconds since 00:00:00, Jan 1, 1970 (a nonstandard extension) %S second (00..61) %T time, 24-hour (hh:mm:ss) %X locale's time representation (%H:%M:%S) @@ -73,6 +74,11 @@ David MacKenzie */ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include #include #if defined(TM_IN_SYS_TIME) || (!defined(HAVE_TM_ZONE) && !defined(HAVE_TZNAME)) #include @@ -80,12 +86,12 @@ #include #endif -#if defined(HAVE_TZNAME) -extern char *tzname[2]; +#ifndef STDC_HEADERS +time_t mktime (); #endif -#if !__STDC__ -#define const +#if defined(HAVE_TZNAME) +extern char *tzname[2]; #endif /* Types of padding for numbers in date and time. */ @@ -108,7 +114,13 @@ static char const * const months[] = /* Add character C to STRING and increment LENGTH, unless LENGTH would exceed MAX. */ -#define add_char(c) (length + 1 <= max) && (string[length++] = (c)) +#define add_char(c) \ + do \ + { \ + if (length + 1 <= max) \ + string[length++] = (c); \ + } \ + while (0) /* Add a 2 digit number to STRING, padding if specified. Return the number of characters added, up to MAX. */ @@ -162,7 +174,7 @@ add_num3 (string, num, max, pad) static int add_str (to, from, max) char *to; - char *from; + const char *from; int max; { int i; @@ -172,6 +184,25 @@ add_str (to, from, max) return i; } +static int +add_num_time_t (string, max, num) + char *string; + int max; + time_t num; +{ + /* This buffer is large enough to hold the character representation + (including the trailing NUL) of any unsigned decimal quantity + whose binary representation fits in 128 bits. */ + char buf[40]; + int length; + + if (sizeof (num) > 16) + abort (); + sprintf (buf, "%lu", (unsigned long) num); + length = add_str (string, buf, max); + return length; +} + /* Return the week in the year of the time in TM, with the weeks starting on Sundays. */ @@ -317,6 +348,16 @@ strftime (string, max, format, tm) length += strftime (&string[length], max - length, "%H:%M", tm); break; + + case 's': + { + struct tm writable_tm; + writable_tm = *tm; + length += add_num_time_t (&string[length], max - length, + mktime (&writable_tm)); + } + break; + case 'S': length += add_num2 (&string[length], tm->tm_sec, max - length, pad);