X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fstrftime.c;h=8085a59925515f3286a1ff97540157791036c9f0;hb=3feb3145b632af0fd4349f5685a19ec58fa0fb75;hp=1e026649d0c6a568f2a897f1d6cf43c6128aa917;hpb=7b224479dcac36108cbf435aff9b45767143ed25;p=gnulib.git diff --git a/lib/strftime.c b/lib/strftime.c index 1e026649d..8085a5992 100644 --- a/lib/strftime.c +++ b/lib/strftime.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1991-1999, 2000, 2001, 2003 Free Software Foundation, Inc. +/* Copyright (C) 1991-1999, 2000, 2001, 2003, 2004, 2005 Free Software + Foundation, Inc. NOTE: The canonical source of this file is maintained with the GNU C Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. @@ -22,7 +23,6 @@ #endif #ifdef _LIBC -# define HAVE_LIMITS_H 1 # define HAVE_MBLEN 1 # define HAVE_MBRLEN 1 # define HAVE_STRUCT_ERA_ENTRY 1 @@ -31,14 +31,9 @@ # define HAVE_TZNAME 1 # define HAVE_TZSET 1 # define MULTIBYTE_IS_FORMAT_SAFE 1 -# define STDC_HEADERS 1 # include "../locale/localeinfo.h" #endif -#if defined emacs && !defined HAVE_BCOPY -# define HAVE_MEMCPY 1 -#endif - #include #include /* Some systems define `time_t' here. */ @@ -62,7 +57,7 @@ extern char *tzname[]; conversion specifications. The GNU C Library uses UTF8 multibyte encoding, which is safe for formats, but strftime.c can be used with other C libraries that use unsafe encodings. */ -#define DO_MULTIBYTE (HAVE_MBLEN && ! MULTIBYTE_IS_FORMAT_SAFE) +#define DO_MULTIBYTE (HAVE_MBLEN && HAVE_WCHAR_H && ! MULTIBYTE_IS_FORMAT_SAFE) #if DO_MULTIBYTE # if HAVE_MBRLEN @@ -76,19 +71,11 @@ extern char *tzname[]; static const mbstate_t mbstate_zero; #endif -#if HAVE_LIMITS_H -# include -#endif - -#if STDC_HEADERS -# include -# include -# include -#else -# ifndef HAVE_MEMCPY -# define memcpy(d, s, n) bcopy ((s), (d), (n)) -# endif -#endif +#include +#include +#include +#include +#include #ifdef COMPILE_WIDE # include @@ -106,11 +93,7 @@ extern char *tzname[]; # define L_(Str) Str # define NLW(Sym) Sym -# if !defined STDC_HEADERS && !defined HAVE_MEMCPY -# define MEMCPY(d, s, n) bcopy ((s), (d), (n)) -# else -# define MEMCPY(d, s, n) memcpy ((d), (s), (n)) -# endif +# define MEMCPY(d, s, n) memcpy (d, s, n) # define STRLEN(s) strlen (s) # ifdef _LIBC @@ -122,39 +105,27 @@ extern char *tzname[]; # endif #endif -#ifndef __P -# if defined __GNUC__ || (defined __STDC__ && __STDC__) -# define __P(args) args -# else -# define __P(args) () -# endif /* GCC. */ -#endif /* Not __P. */ - -#ifndef PTR -# ifdef __STDC__ -# define PTR void * -# else -# define PTR char * -# endif -#endif - -#ifndef CHAR_BIT -# define CHAR_BIT 8 -#endif - -#ifndef NULL -# define NULL 0 -#endif - -#define TYPE_SIGNED(t) ((t) -1 < 0) - -/* Bound on length of the string representing an integer value of type t. - Subtract one for the sign bit if t is signed; - 302 / 1000 is log10 (2) rounded up; - add one for integer division truncation; - add one more for a minus sign if t is signed. */ +/* Shift A right by B bits portably, by dividing A by 2**B and + truncating towards minus infinity. A and B should be free of side + effects, and B should be in the range 0 <= B <= INT_BITS - 2, where + INT_BITS is the number of useful bits in an int. GNU code can + assume that INT_BITS is at least 32. + + ISO C99 says that A >> B is implementation-defined if A < 0. Some + implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift + right in the usual way when A < 0, so SHR falls back on division if + ordinary A >> B doesn't seem to be the usual signed shift. */ +#define SHR(a, b) \ + (-1 >> 1 == -1 \ + ? (a) >> (b) \ + : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0)) + +/* Bound on length of the string representing an integer value or type T. + Subtract 1 for the sign bit if t is signed; log10 (2.0) < 146/485; + add 1 for integer division truncation; add 1 more for a minus sign + if needed. */ #define INT_STRLEN_BOUND(t) \ - ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 + 1 + TYPE_SIGNED (t)) + ((sizeof (t) * CHAR_BIT - 1) * 146 / 485 + 2) #define TM_YEAR_BASE 1900 @@ -184,55 +155,12 @@ extern char *tzname[]; #endif -#if !defined memset && !defined HAVE_MEMSET && !defined _LIBC -/* Some systems lack the `memset' function and we don't want to - introduce additional dependencies. */ -/* The SGI compiler reportedly barfs on the trailing null - if we use a string constant as the initializer. 28 June 1997, rms. */ -static const CHAR_T spaces[16] = /* " " */ -{ - L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '), - L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' ') -}; -static const CHAR_T zeroes[16] = /* "0000000000000000" */ -{ - L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'), - L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0') -}; - -# define memset_space(P, Len) \ - do { \ - int _len = (Len); \ - \ - do \ - { \ - int _this = _len > 16 ? 16 : _len; \ - (P) = MEMPCPY ((P), spaces, _this * sizeof (CHAR_T)); \ - _len -= _this; \ - } \ - while (_len > 0); \ - } while (0) - -# define memset_zero(P, Len) \ - do { \ - int _len = (Len); \ - \ - do \ - { \ - int _this = _len > 16 ? 16 : _len; \ - (P) = MEMPCPY ((P), zeroes, _this * sizeof (CHAR_T)); \ - _len -= _this; \ - } \ - while (_len > 0); \ - } while (0) +#ifdef COMPILE_WIDE +# define memset_space(P, Len) (wmemset (P, L' ', Len), (P) += (Len)) +# define memset_zero(P, Len) (wmemset (P, L'0', Len), (P) += (Len)) #else -# ifdef COMPILE_WIDE -# define memset_space(P, Len) (wmemset ((P), L' ', (Len)), (P) += (Len)) -# define memset_zero(P, Len) (wmemset ((P), L'0', (Len)), (P) += (Len)) -# else -# define memset_space(P, Len) (memset ((P), ' ', (Len)), (P) += (Len)) -# define memset_zero(P, Len) (memset ((P), '0', (Len)), (P) += (Len)) -# endif +# define memset_space(P, Len) (memset (P, ' ', Len), (P) += (Len)) +# define memset_zero(P, Len) (memset (P, '0', Len), (P) += (Len)) #endif #define add(n, f) \ @@ -265,7 +193,7 @@ static const CHAR_T zeroes[16] = /* "0000000000000000" */ else if (to_uppcase) \ memcpy_uppcase (p, (s), _n LOCALE_ARG); \ else \ - MEMCPY ((PTR) p, (const PTR) (s), _n)) + MEMCPY ((void *) p, (void const *) (s), _n)) #ifdef COMPILE_WIDE # ifndef USE_IN_EXTENDED_LOCALE_MODEL @@ -294,16 +222,12 @@ static const CHAR_T zeroes[16] = /* "0000000000000000" */ # undef _NL_CURRENT # define _NL_CURRENT(category, item) \ (current->values[_NL_ITEM_INDEX (item)].string) -# define LOCALE_PARAM , loc # define LOCALE_ARG , loc -# define LOCALE_PARAM_DECL __locale_t loc; # define LOCALE_PARAM_PROTO , __locale_t loc # define HELPER_LOCALE_ARG , current #else -# define LOCALE_PARAM # define LOCALE_PARAM_PROTO # define LOCALE_ARG -# define LOCALE_PARAM_DECL # ifdef _LIBC # define HELPER_LOCALE_ARG , _NL_CURRENT_DATA (LC_TIME) # else @@ -339,30 +263,18 @@ static const CHAR_T zeroes[16] = /* "0000000000000000" */ more reliable way to accept other sets of digits. */ #define ISDIGIT(Ch) ((unsigned int) (Ch) - L_('0') <= 9) -static CHAR_T *memcpy_lowcase __P ((CHAR_T *dest, const CHAR_T *src, - size_t len LOCALE_PARAM_PROTO)); - static CHAR_T * -memcpy_lowcase (dest, src, len LOCALE_PARAM) - CHAR_T *dest; - const CHAR_T *src; - size_t len; - LOCALE_PARAM_DECL +memcpy_lowcase (CHAR_T *dest, const CHAR_T *src, + size_t len LOCALE_PARAM_PROTO) { while (len-- > 0) dest[len] = TOLOWER ((UCHAR_T) src[len], loc); return dest; } -static CHAR_T *memcpy_uppcase __P ((CHAR_T *dest, const CHAR_T *src, - size_t len LOCALE_PARAM_PROTO)); - static CHAR_T * -memcpy_uppcase (dest, src, len LOCALE_PARAM) - CHAR_T *dest; - const CHAR_T *src; - size_t len; - LOCALE_PARAM_DECL +memcpy_uppcase (CHAR_T *dest, const CHAR_T *src, + size_t len LOCALE_PARAM_PROTO) { while (len-- > 0) dest[len] = TOUPPER ((UCHAR_T) src[len], loc); @@ -374,21 +286,18 @@ memcpy_uppcase (dest, src, len LOCALE_PARAM) /* Yield the difference between *A and *B, measured in seconds, ignoring leap seconds. */ # define tm_diff ftime_tm_diff -static int tm_diff __P ((const struct tm *, const struct tm *)); static int -tm_diff (a, b) - const struct tm *a; - const struct tm *b; +tm_diff (const struct tm *a, const struct tm *b) { /* Compute intervening leap days correctly even if year is negative. Take care to avoid int overflow in leap day calculations, but it's OK to assume that A and B are close to each other. */ - int a4 = (a->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (a->tm_year & 3); - int b4 = (b->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (b->tm_year & 3); + int a4 = SHR (a->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (a->tm_year & 3); + int b4 = SHR (b->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (b->tm_year & 3); int a100 = a4 / 25 - (a4 % 25 < 0); int b100 = b4 / 25 - (b4 % 25 < 0); - int a400 = a100 >> 2; - int b400 = b100 >> 2; + int a400 = SHR (a100, 2); + int b400 = SHR (b100, 2); int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400); int years = a->tm_year - b->tm_year; int days = (365 * years + intervening_leap_days @@ -408,14 +317,11 @@ tm_diff (a, b) #define ISO_WEEK_START_WDAY 1 /* Monday */ #define ISO_WEEK1_WDAY 4 /* Thursday */ #define YDAY_MINIMUM (-366) -static int iso_week_days __P ((int, int)); #ifdef __GNUC__ __inline__ #endif static int -iso_week_days (yday, wday) - int yday; - int wday; +iso_week_days (int yday, int wday) { /* Add enough to the first operand of % to make it nonnegative. */ int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7; @@ -451,8 +357,7 @@ static CHAR_T const month_name[][10] = #ifdef my_strftime # define extra_args , ut, ns -# define extra_args_spec int ut; int ns; -# define extra_args_spec_iso , int ut, int ns +# define extra_args_spec , int ut, int ns #else # ifdef COMPILE_WIDE # define my_strftime wcsftime @@ -463,7 +368,6 @@ static CHAR_T const month_name[][10] = # endif # define extra_args # define extra_args_spec -# define extra_args_spec_iso /* We don't have this information in general. */ # define ut 0 # define ns 0 @@ -484,13 +388,8 @@ static CHAR_T const month_name[][10] = anywhere, so to determine how many characters would be written, use NULL for S and (size_t) UINT_MAX for MAXSIZE. */ size_t -my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) - CHAR_T *s; - size_t maxsize; - const CHAR_T *format; - const struct tm *tp; - extra_args_spec - LOCALE_PARAM_DECL +my_strftime (CHAR_T *s, size_t maxsize, const CHAR_T *format, + const struct tm *tp extra_args_spec LOCALE_PARAM_PROTO) { #if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL struct locale_data *const current = loc->__locales[LC_TIME]; @@ -578,16 +477,17 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) int modifier; /* Field modifier ('E', 'O', or 0). */ int digits; /* Max digits for numeric format. */ int number_value; /* Numeric value to be printed. */ - int negative_number; /* 1 if the number is negative. */ + unsigned int u_number_value; /* (unsigned int) number_value. */ + bool negative_number; /* 1 if the number is negative. */ const CHAR_T *subfmt; CHAR_T *bufp; CHAR_T buf[1 + (sizeof (int) < sizeof (time_t) ? INT_STRLEN_BOUND (time_t) : INT_STRLEN_BOUND (int))]; int width = -1; - int to_lowcase = 0; - int to_uppcase = 0; - int change_case = 0; + bool to_lowcase = false; + bool to_uppcase = false; + bool change_case = false; int format_char; #if DO_MULTIBYTE && !defined COMPILE_WIDE @@ -692,10 +592,10 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) /* This changes textual output. */ case L_('^'): - to_uppcase = 1; + to_uppcase = true; continue; case L_('#'): - change_case = 1; + change_case = true; continue; default: @@ -742,10 +642,14 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) switch (format_char) { #define DO_NUMBER(d, v) \ - digits = d > width ? d : width; \ + digits = d; \ number_value = v; goto do_number +#define DO_SIGNED_NUMBER(d, negative, v) \ + digits = d; \ + negative_number = negative; \ + u_number_value = v; goto do_signed_number #define DO_NUMBER_SPACEPAD(d, v) \ - digits = d > width ? d : width; \ + digits = d; \ number_value = v; goto do_number_spacepad case L_('%'): @@ -759,8 +663,8 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) goto bad_format; if (change_case) { - to_uppcase = 1; - to_lowcase = 0; + to_uppcase = true; + to_lowcase = false; } #if defined _NL_CURRENT || !HAVE_STRFTIME cpy (aw_len, a_wkday); @@ -774,8 +678,8 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) goto bad_format; if (change_case) { - to_uppcase = 1; - to_lowcase = 0; + to_uppcase = true; + to_lowcase = false; } #if defined _NL_CURRENT || !HAVE_STRFTIME cpy (STRLEN (f_wkday), f_wkday); @@ -788,8 +692,8 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) case L_('h'): if (change_case) { - to_uppcase = 1; - to_lowcase = 0; + to_uppcase = true; + to_lowcase = false; } if (modifier != 0) goto bad_format; @@ -805,8 +709,8 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) goto bad_format; if (change_case) { - to_uppcase = 1; - to_lowcase = 0; + to_uppcase = true; + to_lowcase = false; } #if defined _NL_CURRENT || !HAVE_STRFTIME cpy (STRLEN (f_month), f_month); @@ -906,8 +810,9 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) } { - int year = tp->tm_year + TM_YEAR_BASE; - DO_NUMBER (1, year / 100 - (year % 100 < 0)); + int century = tp->tm_year / 100 + TM_YEAR_BASE / 100; + century -= tp->tm_year % 100 < 0 && 0 < century; + DO_SIGNED_NUMBER (2, tp->tm_year < - TM_YEAR_BASE, century); } case L_('x'): @@ -945,8 +850,8 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) DO_NUMBER_SPACEPAD (2, tp->tm_mday); - /* All numeric formats set DIGITS and NUMBER_VALUE and then - jump to one of these two labels. */ + /* All numeric formats set DIGITS and NUMBER_VALUE (or U_NUMBER_VALUE) + and then jump to one of these three labels. */ do_number_spacepad: /* Force `_' flag unless overridden by `0' or `-' flag. */ @@ -954,14 +859,22 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) pad = L_('_'); do_number: - /* Format the number according to the MODIFIER flag. */ - - if (modifier == L_('O') && 0 <= number_value) + /* Format NUMBER_VALUE according to the MODIFIER flag. */ + negative_number = number_value < 0; + u_number_value = number_value; + + do_signed_number: + /* Format U_NUMBER_VALUE according to the MODIFIER flag. + NEGATIVE_NUMBER is nonzero if the original number was + negative; in this case it was converted directly to + unsigned int (i.e., modulo (UINT_MAX + 1)) without + negating it. */ + if (modifier == L_('O') && !negative_number) { #ifdef _NL_CURRENT /* Get the locale specific alternate representation of - the number NUMBER_VALUE. If none exist NULL is returned. */ - const CHAR_T *cp = nl_get_alt_digit (number_value + the number. If none exist NULL is returned. */ + const CHAR_T *cp = nl_get_alt_digit (u_number_value HELPER_LOCALE_ARG); if (cp != NULL) @@ -979,19 +892,21 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) # endif #endif } - { - unsigned int u = number_value; - bufp = buf + sizeof (buf) / sizeof (buf[0]); - negative_number = number_value < 0; + bufp = buf + sizeof (buf) / sizeof (buf[0]); - if (negative_number) - u = -u; + if (negative_number) + u_number_value = - u_number_value; - do - *--bufp = u % 10 + L_('0'); - while ((u /= 10) != 0); - } + do + { + *--bufp = u_number_value % 10 + L_('0'); + u_number_value /= 10; + } + while (u_number_value != 0); + + if (digits < width) + digits = width; do_number_sign_and_padding: if (negative_number) @@ -1073,7 +988,7 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) if (modifier == L_('E')) goto bad_format; - DO_NUMBER (3, 1 + tp->tm_yday); + DO_SIGNED_NUMBER (3, tp->tm_yday < -1, tp->tm_yday + 1U); case L_('M'): if (modifier == L_('E')) @@ -1085,7 +1000,7 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) if (modifier == L_('E')) goto bad_format; - DO_NUMBER (2, tp->tm_mon + 1); + DO_SIGNED_NUMBER (2, tp->tm_mon < -1, tp->tm_mon + 1U); #ifndef _LIBC case L_('N'): /* GNU extension. */ @@ -1109,7 +1024,7 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) break; case L_('P'): - to_lowcase = 1; + to_lowcase = true; #if !defined _NL_CURRENT && HAVE_STRFTIME format_char = L_('p'); #endif @@ -1118,8 +1033,8 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) case L_('p'): if (change_case) { - to_uppcase = 0; - to_lowcase = 1; + to_uppcase = false; + to_lowcase = true; } #if defined _NL_CURRENT || !HAVE_STRFTIME cpy (ap_len, ampm); @@ -1169,20 +1084,7 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) { int d = t % 10; t /= 10; - - if (negative_number) - { - d = -d; - - /* Adjust if division truncates to minus infinity. */ - if (0 < -1 % 10 && d < 0) - { - t++; - d += 10; - } - } - - *--bufp = d + L_('0'); + *--bufp = (negative_number ? -d : d) + L_('0'); } while (t != 0); @@ -1230,14 +1132,22 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) if (modifier == L_('E')) goto bad_format; { - int year = tp->tm_year + TM_YEAR_BASE; + /* YEAR is a leap year if and only if (tp->tm_year + TM_YEAR_BASE) + is a leap year, except that YEAR and YEAR - 1 both work + correctly even when (tp->tm_year + TM_YEAR_BASE) would + overflow. */ + int year = (tp->tm_year + + (tp->tm_year < 0 + ? TM_YEAR_BASE % 400 + : TM_YEAR_BASE % 400 - 400)); + int year_adjust = 0; int days = iso_week_days (tp->tm_yday, tp->tm_wday); if (days < 0) { /* This ISO week belongs to the previous year. */ - year--; - days = iso_week_days (tp->tm_yday + (365 + __isleap (year)), + year_adjust = -1; + days = iso_week_days (tp->tm_yday + (365 + __isleap (year - 1)), tp->tm_wday); } else @@ -1247,7 +1157,7 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) if (0 <= d) { /* This ISO week belongs to the next year. */ - year++; + year_adjust = 1; days = d; } } @@ -1255,10 +1165,19 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) switch (*f) { case L_('g'): - DO_NUMBER (2, (year % 100 + 100) % 100); + { + int yy = (tp->tm_year % 100 + year_adjust) % 100; + DO_NUMBER (2, (0 <= yy + ? yy + : tp->tm_year < -TM_YEAR_BASE - year_adjust + ? -yy + : yy + 100)); + } case L_('G'): - DO_NUMBER (1, year); + DO_SIGNED_NUMBER (4, tp->tm_year < -TM_YEAR_BASE - year_adjust, + (tp->tm_year + (unsigned int) TM_YEAR_BASE + + year_adjust)); default: DO_NUMBER (2, days / 7 + 1); @@ -1300,7 +1219,8 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) if (modifier == L_('O')) goto bad_format; else - DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE); + DO_SIGNED_NUMBER (4, tp->tm_year < -TM_YEAR_BASE, + tp->tm_year + (unsigned int) TM_YEAR_BASE); case L_('y'): if (modifier == L_('E')) @@ -1319,19 +1239,25 @@ my_strftime (s, maxsize, format, tp extra_args LOCALE_PARAM) # endif #endif } - DO_NUMBER (2, (tp->tm_year % 100 + 100) % 100); + + { + int yy = tp->tm_year % 100; + if (yy < 0) + yy = tp->tm_year < - TM_YEAR_BASE ? -yy : yy + 100; + DO_NUMBER (2, yy); + } case L_('Z'): if (change_case) { - to_uppcase = 0; - to_lowcase = 1; + to_uppcase = false; + to_lowcase = true; } #if HAVE_TZNAME /* The tzset() call might have changed the value. */ if (!(zone && *zone) && tp->tm_isdst >= 0) - zone = tzname[tp->tm_isdst]; + zone = tzname[tp->tm_isdst != 0]; #endif if (! zone) zone = ""; @@ -1437,12 +1363,8 @@ libc_hidden_def (my_strftime) /* For Emacs we have a separate interface which corresponds to the normal strftime function plus the ut argument, but without the ns argument. */ size_t -emacs_strftimeu (s, maxsize, format, tp, ut) - char *s; - size_t maxsize; - const char *format; - const struct tm *tp; - int ut; +emacs_strftimeu (char *s, size_t maxsize, const char *format, + const struct tm *tp, int ut) { return my_strftime (s, maxsize, format, tp, ut, 0); }