[BZ #5184]
authorUlrich Drepper <drepper@redhat.com>
Tue, 16 Oct 2007 22:50:20 +0000 (22:50 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 16 Oct 2007 22:50:20 +0000 (22:50 +0000)
Include stdbool.h. (my_strftime): New wrapper, old function renamed to... (__strftime_internal): ... new function.  Add tzset_called argument, pass it down to recursive calls, don't call tzset () if already true, set to true after call to tzset ().
2007-10-16  Jakub Jelinek  <jakub@redhat.com>

[BZ #5184]
* time/strftime_l.c: Include stdbool.h.
(my_strftime): New wrapper, old function renamed to...
(__strftime_internal): ... new function.  Add tzset_called
argument, pass it down to recursive calls, don't call tzset ()
if already true, set to true after call to tzset ().

ChangeLog
time/strftime_l.c

index 9ffe807..86eb56b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-10-16  Jakub Jelinek  <jakub@redhat.com>
+
+       [BZ #5184]
+       * time/strftime_l.c: Include stdbool.h.
+       (my_strftime): New wrapper, old function renamed to...
+       (__strftime_internal): ... new function.  Add tzset_called
+       argument, pass it down to recursive calls, don't call tzset ()
+       if already true, set to true after call to tzset ().
+                                               
 2007-10-16  Ulrich Drepper  <drepper@redhat.com>
 
        * time/tzfile.c (__tzfile_read): Take extra memory requested by caller
index 0fd3f77..4a57b15 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2004, 2007 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
@@ -84,6 +84,7 @@ extern char *tzname[];
 # include <stddef.h>
 # include <stdlib.h>
 # include <string.h>
+# include <stdbool.h>
 #else
 # ifndef HAVE_MEMCPY
 #  define memcpy(d, s, n) bcopy ((s), (d), (n))
@@ -453,27 +454,9 @@ static CHAR_T const month_name[][10] =
 # define ut 0
 #endif
 
-#if !defined _LIBC && HAVE_TZNAME && HAVE_TZSET
-  /* Solaris 2.5 tzset sometimes modifies the storage returned by localtime.
-     Work around this bug by copying *tp before it might be munged.  */
-  size_t _strftime_copytm (char *, size_t, const char *,
-                          const struct tm * ut_argument_spec_iso) __THROW;
-  size_t
-  my_strftime (s, maxsize, format, tp ut_argument)
-      CHAR_T *s;
-      size_t maxsize;
-      const CHAR_T *format;
-      const struct tm *tp;
-      ut_argument_spec
-  {
-    struct tm tmcopy;
-    tmcopy = *tp;
-    return _strftime_copytm (s, maxsize, format, &tmcopy ut_argument);
-  }
-# undef my_strftime
-# define my_strftime _strftime_copytm
-#endif
-
+static size_t __strftime_internal (CHAR_T *, size_t, const CHAR_T *,
+                                  const struct tm *, bool ut_argument_spec_iso
+                                  LOCALE_PARAM_PROTO) __THROW;
 
 /* Write information from TP into S according to the format
    string FORMAT, writing no more that MAXSIZE characters
@@ -481,12 +464,38 @@ static CHAR_T const month_name[][10] =
    characters written.  If S is NULL, nothing will be written
    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 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 && HAVE_TZNAME && HAVE_TZSET
+  /* Solaris 2.5 tzset sometimes modifies the storage returned by localtime.
+     Work around this bug by copying *tp before it might be munged.  */
+  struct tm tmcopy;
+  tmcopy = *tp;
+  tp = &tmcopy;
+#endif
+  return __strftime_internal (s, maxsize, format, tp, false
+                             ut_argument LOCALE_ARG);
+}
+#ifdef _LIBC
+libc_hidden_def (my_strftime)
+#endif
+
+static size_t
+__strftime_internal (s, maxsize, format, tp, tzset_called ut_argument
+                    LOCALE_PARAM)
       CHAR_T *s;
       size_t maxsize;
       const CHAR_T *format;
       const struct tm *tp;
+      bool tzset_called;
       ut_argument_spec
       LOCALE_PARAM_DECL
 {
@@ -559,7 +568,9 @@ my_strftime (s, maxsize, format, tp ut_argument LOCALE_PARAM)
       /* POSIX.1 requires that local time zone information is used as
         though strftime called tzset.  */
 # if HAVE_TZSET
-      tzset ();
+      if (!tzset_called)
+       tzset ();
+      tzset_called = true;
 # endif
     }
 #endif
@@ -834,10 +845,12 @@ my_strftime (s, maxsize, format, tp ut_argument LOCALE_PARAM)
        subformat:
          {
            CHAR_T *old_start = p;
-           size_t len = my_strftime (NULL, (size_t) -1, subfmt,
-                                     tp ut_argument LOCALE_ARG);
-           add (len, my_strftime (p, maxsize - i, subfmt,
-                                  tp ut_argument LOCALE_ARG));
+           size_t len = __strftime_internal (NULL, (size_t) -1, subfmt,
+                                             tp, tzset_called ut_argument
+                                             LOCALE_ARG);
+           add (len, __strftime_internal (p, maxsize - i, subfmt,
+                                          tp, tzset_called ut_argument
+                                          LOCALE_ARG));
 
            if (to_uppcase)
              while (old_start < p)
@@ -1409,9 +1422,6 @@ my_strftime (s, maxsize, format, tp ut_argument LOCALE_PARAM)
     *p = L_('\0');
   return i;
 }
-#ifdef _LIBC
-libc_hidden_def (my_strftime)
-#endif
 
 
 #ifdef emacs