X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fstrftime.c;h=a8c9072670cffe5d94b76dc520595bc0a41502a0;hb=caeffcaecfffc772003c9a9f934734497e08c333;hp=95e55cba514ecc79ff87d7bd34c1a0953208bb9a;hpb=cd89762c143f09ac5f7eb00e296472169784b785;p=gnulib.git diff --git a/lib/strftime.c b/lib/strftime.c index 95e55cba5..a8c907267 100644 --- a/lib/strftime.c +++ b/lib/strftime.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc. +/* Copyright (C) 1991-1999, 2000 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. @@ -98,8 +98,8 @@ extern char *tzname[]; # define L_(Str) L##Str # define NLW(Sym) _NL_W##Sym -# define MEMCPY(d, s, n) wmemcpy (d, s, n) -# define STRLEN(s) wcslen (s) +# define MEMCPY(d, s, n) __wmemcpy (d, s, n) +# define STRLEN(s) __wcslen (s) #else # define CHAR_T char @@ -457,8 +457,7 @@ static CHAR_T const month_name[][10] = return _strftime_copytm (s, maxsize, format, &tmcopy ut_argument); } # undef my_strftime -# define my_strftime(S, Maxsize, Format, Tp) \ - _strftime_copytm (S, Maxsize, Format, Tp) +# define my_strftime _strftime_copytm #endif @@ -516,6 +515,9 @@ my_strftime (s, maxsize, format, tp ut_argument) size_t i = 0; CHAR_T *p = s; const CHAR_T *f; +#if DO_MULTIBYTE && !defined COMPILE_WIDE + const char *format_end = NULL; +#endif zone = NULL; #if HAVE_TM_ZONE @@ -608,10 +610,15 @@ my_strftime (s, maxsize, format, tp ut_argument) { mbstate_t mbstate = mbstate_zero; size_t len = 0; + size_t fsize; + + if (! format_end) + format_end = f + strlen (f) + 1; + fsize = format_end - f; do { - size_t bytes = mbrlen (f + len, (size_t) -1, &mbstate); + size_t bytes = mbrlen (f + len, fsize - len, &mbstate); if (bytes == 0) break; @@ -752,6 +759,11 @@ my_strftime (s, maxsize, format, tp ut_argument) case L_('b'): case L_('h'): /* POSIX.2 extension. */ + if (change_case) + { + to_uppcase = 1; + to_lowcase = 0; + } if (modifier != 0) goto bad_format; #if defined _NL_CURRENT || !HAVE_STRFTIME @@ -796,8 +808,10 @@ my_strftime (s, maxsize, format, tp ut_argument) subformat: { CHAR_T *old_start = p; - size_t len = my_strftime (NULL, (size_t) -1, subfmt, tp); - add (len, my_strftime (p, maxsize - i, subfmt, tp)); + size_t len = my_strftime (NULL, (size_t) -1, subfmt, + tp ut_argument); + add (len, my_strftime (p, maxsize - i, subfmt, + tp ut_argument)); if (to_uppcase) while (old_start < p) @@ -817,6 +831,14 @@ my_strftime (s, maxsize, format, tp ut_argument) char *u = ufmt; char ubuf[1024]; /* enough for any single format in practice */ size_t len; + /* Make sure we're calling the actual underlying strftime. + In some cases, config.h contains something like + "#define strftime rpl_strftime". */ +# ifdef strftime +# undef strftime + size_t strftime (); +# endif + *u++ = '%'; if (modifier != 0) *u++ = modifier; @@ -840,7 +862,7 @@ my_strftime (s, maxsize, format, tp ut_argument) if (era) { # ifdef COMPILE_WIDE - size_t len = wcslen (era->era_wname); + size_t len = __wcslen (era->era_wname); cpy (len, era->era_wname); # else size_t len = strlen (era->era_name);