summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--time/Makefile2
-rw-r--r--time/strftime.c30
-rw-r--r--time/strptime.c42
-rw-r--r--time/strptime_l.c22
5 files changed, 92 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 55da607296..9b55618600 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/time/Makefile b/time/Makefile
index 5e55e3539f..246b9803fa 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 5ed47f6cbd..8ae5985537 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 f127905102..bbd9e64550 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 0000000000..681386003d
--- /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 <strptime.c>
+
+weak_alias (__strptime_l, strptime_l)