diff options
Diffstat (limited to 'time/strftime_l.c')
-rw-r--r-- | time/strftime_l.c | 88 |
1 files changed, 31 insertions, 57 deletions
diff --git a/time/strftime_l.c b/time/strftime_l.c index b48ef34034..1205035206 100644 --- a/time/strftime_l.c +++ b/time/strftime_l.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002-2015 Free Software Foundation, Inc. +/* Copyright (C) 2002-2016 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 @@ -284,16 +284,12 @@ static const CHAR_T zeroes[16] = /* "0000000000000000" */ # undef _NL_CURRENT # define _NL_CURRENT(category, item) \ (current->values[_NL_ITEM_INDEX (item)].string) -# define LOCALE_PARAM , loc +# define LOCALE_PARAM , __locale_t loc # define LOCALE_ARG , loc -# define LOCALE_PARAM_DECL __locale_t loc; -# define LOCALE_PARAM_PROTO , __locale_t loc # define HELPER_LOCALE_ARG , current #else # define LOCALE_PARAM -# define LOCALE_PARAM_PROTO # define LOCALE_ARG -# define LOCALE_PARAM_DECL # ifdef _LIBC # define HELPER_LOCALE_ARG , _NL_CURRENT_DATA (LC_TIME) # else @@ -330,14 +326,10 @@ static const CHAR_T zeroes[16] = /* "0000000000000000" */ #define ISDIGIT(Ch) ((unsigned int) (Ch) - L_('0') <= 9) static CHAR_T *memcpy_lowcase (CHAR_T *dest, const CHAR_T *src, - size_t len LOCALE_PARAM_PROTO) __THROW; + size_t len LOCALE_PARAM) __THROW; static CHAR_T * -memcpy_lowcase (dest, src, len LOCALE_PARAM) - CHAR_T *dest; - const CHAR_T *src; - size_t len; - LOCALE_PARAM_DECL +memcpy_lowcase (CHAR_T *dest, const CHAR_T *src, size_t len LOCALE_PARAM) { while (len-- > 0) dest[len] = TOLOWER ((UCHAR_T) src[len], loc); @@ -345,14 +337,10 @@ memcpy_lowcase (dest, src, len LOCALE_PARAM) } static CHAR_T *memcpy_uppcase (CHAR_T *dest, const CHAR_T *src, - size_t len LOCALE_PARAM_PROTO) __THROW; + size_t len LOCALE_PARAM) __THROW; static CHAR_T * -memcpy_uppcase (dest, src, len LOCALE_PARAM) - CHAR_T *dest; - const CHAR_T *src; - size_t len; - LOCALE_PARAM_DECL +memcpy_uppcase (CHAR_T *dest, const CHAR_T *src, size_t len LOCALE_PARAM) { while (len-- > 0) dest[len] = TOUPPER ((UCHAR_T) src[len], loc); @@ -366,9 +354,7 @@ memcpy_uppcase (dest, src, len LOCALE_PARAM) # define tm_diff ftime_tm_diff static int tm_diff (const struct tm *, const struct tm *) __THROW; static int -tm_diff (a, b) - const struct tm *a; - const struct tm *b; +tm_diff (const struct tm *a, const struct tm *b) { /* Compute intervening leap days correctly even if year is negative. Take care to avoid int overflow in leap day calculations, @@ -403,9 +389,7 @@ static int iso_week_days (int, int) __THROW; __inline__ #endif static int -iso_week_days (yday, wday) - int yday; - int wday; +iso_week_days (int yday, int wday) { /* Add enough to the first operand of % to make it nonnegative. */ int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7; @@ -433,8 +417,7 @@ static CHAR_T const month_name[][10] = #ifdef emacs # define my_strftime emacs_strftimeu # define ut_argument , ut -# define ut_argument_spec int ut; -# define ut_argument_spec_iso , int ut +# define ut_argument_spec , int ut #else # ifdef COMPILE_WIDE # define my_strftime wcsftime @@ -445,15 +428,14 @@ static CHAR_T const month_name[][10] = # endif # define ut_argument # define ut_argument_spec -# define ut_argument_spec_iso /* We don't have this information in general. */ # define ut 0 #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; + ut_argument_spec + LOCALE_PARAM) __THROW; /* Write information from TP into S according to the format string FORMAT, writing no more that MAXSIZE characters @@ -463,13 +445,8 @@ static size_t __strftime_internal (CHAR_T *, size_t, const CHAR_T *, 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 +my_strftime (CHAR_T *s, size_t maxsize, const CHAR_T *format, + const struct tm *tp ut_argument_spec LOCALE_PARAM) { #if !defined _LIBC && HAVE_TZNAME && HAVE_TZSET /* Solaris 2.5 tzset sometimes modifies the storage returned by localtime. @@ -487,15 +464,9 @@ 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 +__strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format, + const struct tm *tp, bool *tzset_called + ut_argument_spec LOCALE_PARAM) { #if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL struct __locale_data *const current = loc->__locales[LC_TIME]; @@ -510,13 +481,17 @@ __strftime_internal (s, maxsize, format, tp, tzset_called ut_argument only a few elements. Dereference the pointers only if the format requires this. Then it is ok to fail if the pointers are invalid. */ # define a_wkday \ - ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday)) + ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))) # define f_wkday \ - ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday)) + ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday))) # define a_month \ - ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon)) + ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))) # define f_month \ - ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon)) + ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon))) # define ampm \ ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11 \ ? NLW(PM_STR) : NLW(AM_STR))) @@ -526,8 +501,10 @@ __strftime_internal (s, maxsize, format, tp, tzset_called ut_argument # define ap_len STRLEN (ampm) #else # if !HAVE_STRFTIME -# define f_wkday (weekday_name[tp->tm_wday]) -# define f_month (month_name[tp->tm_mon]) +# define f_wkday (tp->tm_wday < 0 || tp->tm_wday > 6 \ + ? "?" : weekday_name[tp->tm_wday]) +# define f_month (tp->tm_mon < 0 || tp->tm_mon > 11 \ + ? "?" : month_name[tp->tm_mon]) # define a_wkday f_wkday # define a_month f_month # define ampm (L_("AMPM") + 2 * (tp->tm_hour > 11)) @@ -1321,7 +1298,7 @@ __strftime_internal (s, maxsize, format, tp, tzset_called ut_argument *tzset_called = true; } # endif - zone = tzname[tp->tm_isdst]; + zone = tp->tm_isdst <= 1 ? tzname[tp->tm_isdst] : "?"; } #endif if (! zone) @@ -1436,11 +1413,8 @@ __strftime_internal (s, maxsize, format, tp, tzset_called ut_argument strftime function and does not have the extra information whether the TP arguments comes from a `gmtime' call or not. */ size_t -emacs_strftime (s, maxsize, format, tp) - char *s; - size_t maxsize; - const char *format; - const struct tm *tp; +emacs_strftime (char *s, size_t maxsize, const char *format, + const struct tm *tp) { return my_strftime (s, maxsize, format, tp, 0); } |