* 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.
This commit is contained in:
Roland McGrath 2002-08-27 22:57:05 +00:00
parent c4d6f155e0
commit 60f20c19fb
5 changed files with 97 additions and 15 deletions

View File

@ -1,6 +1,10 @@
2002-08-27 Roland McGrath <roland@redhat.com>
* 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.

View File

@ -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

View File

@ -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)

View File

@ -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));
static char *
#ifdef _LIBC
internal_function
#endif
strptime_internal (rp, fmt, tm, decided, era_cnt)
strptime_internal __P ((const char *rp, const char *fmt, struct tm *tm,
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 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

22
time/strptime_l.c Normal file
View File

@ -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 <strptime.c>
weak_alias (__strptime_l, strptime_l)