2002-08-27 Roland McGrath <roland@redhat.com>
authorroland <roland>
Tue, 27 Aug 2002 22:56:46 +0000 (22:56 +0000)
committerroland <roland>
Tue, 27 Aug 2002 22:56:46 +0000 (22:56 +0000)
* 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/strptime.c
time/strptime_l.c [new file with mode: 0644]

index f127905..bbd9e64 100644 (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));
+                       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 (file)
index 0000000..6813860
--- /dev/null
@@ -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)