summaryrefslogtreecommitdiff
path: root/time
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2007-10-16 22:50:20 +0000
committerUlrich Drepper <drepper@redhat.com>2007-10-16 22:50:20 +0000
commit800d6f9ee878373efac8d7063f1231be4b054225 (patch)
treeb21a605800ff8903136b7c9b8d5dcc84756e67f9 /time
parent69819d92239d4b8d7519a3cbcff0e2cab5906be3 (diff)
downloadglibc-800d6f9ee878373efac8d7063f1231be4b054225.tar.gz
[BZ #5184]
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 ().
Diffstat (limited to 'time')
-rw-r--r--time/strftime_l.c70
1 files changed, 40 insertions, 30 deletions
diff --git a/time/strftime_l.c b/time/strftime_l.c
index 0fd3f7764f..4a57b1599d 100644
--- a/time/strftime_l.c
+++ b/time/strftime_l.c
@@ -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