about summary refs log tree commit diff
path: root/time/strptime.c
diff options
context:
space:
mode:
Diffstat (limited to 'time/strptime.c')
-rw-r--r--time/strptime.c42
1 files changed, 36 insertions, 6 deletions
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