]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
* time/strptime.c [USE_IN_EXTENDED_LOCALE_MODEL]: Define __strptime_l
authorRoland McGrath <roland@gnu.org>
Tue, 27 Aug 2002 22:57:05 +0000 (22:57 +0000)
committerRoland McGrath <roland@gnu.org>
Tue, 27 Aug 2002 22:57:05 +0000 (22:57 +0000)
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
time/Makefile
time/strftime.c
time/strptime.c
time/strptime_l.c [new file with mode: 0644]

index 55da60729671591c7f2d82b288313fb14a405943..9b556186002bf6b6a825a2098170b886e350e759 100644 (file)
--- 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.
index 5e55e3539f55c550f8b93b6f5c46f7a534beafaa..246b9803fa1337f67a2248b6e4c2385313ac13f0 100644 (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
 
index 5ed47f6cbdb8473095621b5417526f7bee2814d0..8ae598553755d51bb5983f53968c4eaaeb6dbe73 100644 (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)
index f1279051026f0a8ce13c1671cf7cb23232b9bc45..bbd9e645505ed713509f22e50142d519bba58dae 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)