From 60f20c19fb3f4fc7c4d383dcfb2b54e70906e818 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 27 Aug 2002 22:57:05 +0000 Subject: [PATCH] * time/strptime.c [USE_IN_EXTENDED_LOCALE_MODEL]: Define __strptime_l instead, taking an extra __locale_t argument. * time/Makefile (routines): Add strptime_l. * time/strptime_l.c: New file. * time/strftime.c [USE_IN_EXTENDED_LOCALE_MODEL]: Define __strftime_l or __wcsftime_l instead, taking an extra __locale_t argument. --- ChangeLog | 6 ++++++ time/Makefile | 2 +- time/strftime.c | 30 +++++++++++++++++++++++++++--- time/strptime.c | 42 ++++++++++++++++++++++++++++++++++++------ time/strptime_l.c | 22 ++++++++++++++++++++++ 5 files changed, 92 insertions(+), 10 deletions(-) create mode 100644 time/strptime_l.c diff --git a/ChangeLog b/ChangeLog index 55da607..9b55618 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,10 @@ 2002-08-27 Roland McGrath + * time/strptime.c [USE_IN_EXTENDED_LOCALE_MODEL]: Define __strptime_l + instead, taking an extra __locale_t argument. + * time/Makefile (routines): Add strptime_l. * time/time.h (__strptime_l, strptime_l): Declare them. + * time/strptime_l.c: New file. * time/time.h (__strftime_l, strftime_l): Declare them. * wcsmbs/wchar.h (__wcsftime_l, wcsftime_l): Declare them. @@ -9,6 +13,8 @@ * time/Makefile (routines): Add strftime_l, wcsftime_l. * time/Versions (libc: GLIBC_2.3): Add __strftime_l, __wcsftime_l, strftime_l, wcsftime_l. + * time/strftime.c [USE_IN_EXTENDED_LOCALE_MODEL]: Define __strftime_l + or __wcsftime_l instead, taking an extra __locale_t argument. * locale/Versions (libc: GLIBC_PRIVATE): Move __uselocale to ... (libc: GLIBC_2.3): ... here. diff --git a/time/Makefile b/time/Makefile index 5e55e35..246b980 100644 --- a/time/Makefile +++ b/time/Makefile @@ -28,7 +28,7 @@ routines := offtime asctime clock ctime ctime_r difftime \ gettimeofday settimeofday adjtime tzset \ tzfile getitimer setitimer \ stime dysize timegm ftime \ - strptime getdate \ + getdate strptime strptime_l \ strftime wcsftime strftime_l wcsftime_l distribute := datemsk diff --git a/time/strftime.c b/time/strftime.c index 5ed47f6..8ae5985 100644 --- a/time/strftime.c +++ b/time/strftime.c @@ -302,6 +302,25 @@ static const CHAR_T zeroes[16] = /* "0000000000000000" */ #endif +#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL +/* We use this code also for the extended locale handling where the + function gets as an additional argument the locale which has to be + used. To access the values we have to redefine the _NL_CURRENT + macro. */ +# define strftime __strftime_l +# define wcsftime __wcsftime_l +# 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; +#else +# define LOCALE_PARAM +# define LOCALE_ARG +# define LOCALE_PARAM_DECL +#endif + #ifdef COMPILE_WIDE # define TOUPPER(Ch) towupper (Ch) # define TOLOWER(Ch) towlower (Ch) @@ -466,13 +485,18 @@ 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 ut_argument) +my_strftime (s, maxsize, format, tp ut_argument LOCALE_PARAM) CHAR_T *s; size_t maxsize; const CHAR_T *format; const struct tm *tp; ut_argument_spec + LOCALE_PARAM_DECL { +#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL + const struct locale_data *const current = loc->__locales[LC_TIME]; +#endif + int hour12 = tp->tm_hour; #ifdef _NL_CURRENT /* We cannot make the following values variables since we must delay @@ -807,9 +831,9 @@ my_strftime (s, maxsize, format, tp ut_argument) { CHAR_T *old_start = p; size_t len = my_strftime (NULL, (size_t) -1, subfmt, - tp ut_argument); + tp ut_argument LOCALE_ARG); add (len, my_strftime (p, maxsize - i, subfmt, - tp ut_argument)); + tp ut_argument LOCALE_ARG)); if (to_uppcase) while (old_start < p) diff --git a/time/strptime.c b/time/strptime.c index f127905..bbd9e64 100644 --- a/time/strptime.c +++ b/time/strptime.c @@ -128,7 +128,8 @@ localtime_r (t, tp) #endif #define recursive(new_fmt) \ (*(new_fmt) != '\0' \ - && (rp = strptime_internal (rp, (new_fmt), tm, decided, era_cnt)) != NULL) + && (rp = strptime_internal (rp, (new_fmt), tm, \ + decided, era_cnt LOCALE_ARG)) != NULL) #ifdef _LIBC @@ -185,6 +186,27 @@ const unsigned short int __mon_yday[2][13] = }; #endif +#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL +/* We use this code also for the extended locale handling where the + function gets as an additional argument the locale which has to be + used. To access the values we have to redefine the _NL_CURRENT + macro. */ +# define strptime __strptime_l +# undef _NL_CURRENT +# define _NL_CURRENT(category, item) \ + (current->values[_NL_ITEM_INDEX (item)].string) +# define LOCALE_PARAM , locale +# define LOCALE_ARG , locale +# define LOCALE_PARAM_PROTO , __locale_t locale +# define LOCALE_PARAM_DECL __locale_t locale; +#else +# define LOCALE_PARAM +# define LOCALE_ARG +# define LOCALE_PARAM_DECL +# define LOCALE_PARAM_PROTO +#endif + + /* Status of lookup: do we use the locale data or the raw data? */ enum locale_status { not, loc, raw }; @@ -222,24 +244,31 @@ day_of_the_year (struct tm *tm) + (tm->tm_mday - 1)); } + static char * #ifdef _LIBC internal_function #endif strptime_internal __P ((const char *rp, const char *fmt, struct tm *tm, - enum locale_status *decided, int era_cnt)); + enum locale_status *decided, int era_cnt + LOCALE_PARAM_PROTO)); static char * #ifdef _LIBC internal_function #endif -strptime_internal (rp, fmt, tm, decided, era_cnt) +strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM) const char *rp; const char *fmt; struct tm *tm; enum locale_status *decided; int era_cnt; + LOCALE_PARAM_DECL { +#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL + const struct locale_data *const current = locale->__locales[LC_TIME]; +#endif + const char *rp_backup; int cnt; size_t val; @@ -1023,10 +1052,11 @@ strptime_internal (rp, fmt, tm, decided, era_cnt) char * -strptime (buf, format, tm) +strptime (buf, format, tm LOCALE_PARAM) const char *buf; const char *format; struct tm *tm; + LOCALE_PARAM_DECL { enum locale_status decided; @@ -1035,8 +1065,8 @@ strptime (buf, format, tm) #else decided = raw; #endif - return strptime_internal (buf, format, tm, &decided, -1); + return strptime_internal (buf, format, tm, &decided, -1 LOCALE_ARG); } -#ifdef _LIBC +#if defined _LIBC && !defined USE_IN_EXTENDED_LOCALE_MODEL libc_hidden_def (strptime) #endif diff --git a/time/strptime_l.c b/time/strptime_l.c new file mode 100644 index 0000000..6813860 --- /dev/null +++ b/time/strptime_l.c @@ -0,0 +1,22 @@ +/* Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#define USE_IN_EXTENDED_LOCALE_MODEL 1 +#include + +weak_alias (__strptime_l, strptime_l) -- 2.7.4