From 0a610d00fee344f804d3338c880d73d2de5db143 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Fri, 29 Jul 2016 14:04:17 -0700 Subject: [PATCH] Upgrade to tzcode-2016f. No significant changes other than a default implementation of strftime_l. Change-Id: I6edd2c03e5e7559f012c0c87d43f7109d641d3ca --- libc/Android.bp | 3 +- libc/bionic/locale.cpp | 4 --- libc/tzcode/localtime.c | 13 +++++---- libc/tzcode/private.h | 33 ++++++++++++--------- libc/tzcode/strftime.c | 64 +++++++++++++++++++++++++++-------------- tests/time_test.cpp | 21 ++++++++++++++ 6 files changed, 93 insertions(+), 45 deletions(-) diff --git a/libc/Android.bp b/libc/Android.bp index 36dfbc837..4776f903b 100644 --- a/libc/Android.bp +++ b/libc/Android.bp @@ -154,7 +154,8 @@ cc_library_static { "-DTM_GMTOFF=tm_gmtoff", // Where we store our tzdata. "-DTZDIR=\\\"/system/usr/share/zoneinfo\\\"", - // Include timezone and daylight globals. + // Include `tzname`, `timezone`, and `daylight` globals. + "-DHAVE_POSIX_DECLS=0", "-DUSG_COMPAT=1", // Use the empty string (instead of " ") as the timezone abbreviation // fallback. diff --git a/libc/bionic/locale.cpp b/libc/bionic/locale.cpp index f26a5f212..2a4ce68c8 100644 --- a/libc/bionic/locale.cpp +++ b/libc/bionic/locale.cpp @@ -192,10 +192,6 @@ char* strerror_l(int error, locale_t) { return strerror(error); } -size_t strftime_l(char* s, size_t max, const char* format, const struct tm* tm, locale_t) { - return strftime(s, max, format, tm); -} - int strncasecmp_l(const char* s1, const char* s2, size_t n, locale_t) { return strncasecmp(s1, s2, n); } diff --git a/libc/tzcode/localtime.c b/libc/tzcode/localtime.c index 165dd2d12..08610154a 100644 --- a/libc/tzcode/localtime.c +++ b/libc/tzcode/localtime.c @@ -178,11 +178,6 @@ static struct state gmtmem; static char lcl_TZname[TZ_STRLEN_MAX + 1]; static int lcl_is_set; -char * tzname[2] = { - (char *) wildabbr, - (char *) wildabbr -}; - /* ** Section 4.12.3 of X3.159-1989 requires that ** Except for the strftime function, these functions [asctime, @@ -193,10 +188,16 @@ char * tzname[2] = { static struct tm tm; +#if !HAVE_POSIX_DECLS +char * tzname[2] = { + (char *) wildabbr, + (char *) wildabbr +}; #ifdef USG_COMPAT long timezone; int daylight; -#endif /* defined USG_COMPAT */ +# endif +#endif #ifdef ALTZONE long altzone; diff --git a/libc/tzcode/private.h b/libc/tzcode/private.h index 1c176e62b..941e91b2f 100644 --- a/libc/tzcode/private.h +++ b/libc/tzcode/private.h @@ -22,6 +22,10 @@ ** You can override these in your C compiler options, e.g. '-DHAVE_GETTEXT=1'. */ +#ifndef HAVE_DECL_ASCTIME_R +#define HAVE_DECL_ASCTIME_R 1 +#endif + #ifndef HAVE_GETTEXT #define HAVE_GETTEXT 0 #endif /* !defined HAVE_GETTEXT */ @@ -34,6 +38,10 @@ #define HAVE_LINK 1 #endif /* !defined HAVE_LINK */ +#ifndef HAVE_POSIX_DECLS +#define HAVE_POSIX_DECLS 1 +#endif + #ifndef HAVE_STRDUP #define HAVE_STRDUP 1 #endif @@ -106,6 +114,9 @@ #ifndef ENAMETOOLONG # define ENAMETOOLONG EINVAL #endif +#ifndef ENOTSUP +# define ENOTSUP EINVAL +#endif #ifndef EOVERFLOW # define EOVERFLOW EINVAL #endif @@ -379,25 +390,21 @@ time_t time(time_t *); void tzset(void); #endif -/* -** Some time.h implementations don't declare asctime_r. -** Others might define it as a macro. -** Fix the former without affecting the latter. -** Similarly for timezone, daylight, and altzone. -*/ - -#ifndef asctime_r -extern char * asctime_r(struct tm const *restrict, char *restrict); +#if !HAVE_DECL_ASCTIME_R && !defined asctime_r +extern char *asctime_r(struct tm const *restrict, char *restrict); #endif -#ifdef USG_COMPAT -# ifndef timezone +#if !HAVE_POSIX_DECLS +# ifdef USG_COMPAT +# ifndef timezone extern long timezone; -# endif -# ifndef daylight +# endif +# ifndef daylight extern int daylight; +# endif # endif #endif + #if defined ALTZONE && !defined altzone extern long altzone; #endif diff --git a/libc/tzcode/strftime.c b/libc/tzcode/strftime.c index 4349cf607..b1e0d1cc6 100644 --- a/libc/tzcode/strftime.c +++ b/libc/tzcode/strftime.c @@ -1,29 +1,40 @@ +/* Convert a broken-down time stamp to a string. */ + +/* Copyright 1989 The Regents of the University of California. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. */ + /* -** Based on the UCB version with the copyright notice and sccsid -** appearing below. +** Based on the UCB version with the copyright notice appearing above. ** ** This is ANSIish only when "multibyte character == plain character". */ #include "private.h" -/* -** Copyright (c) 1989 The Regents of the University of California. -** All rights reserved. -** -** Redistribution and use in source and binary forms are permitted -** provided that the above copyright notice and this paragraph are -** duplicated in all such forms and that any documentation, -** advertising materials, and other materials related to such -** distribution and use acknowledge that the software was developed -** by the University of California, Berkeley. The name of the -** University may not be used to endorse or promote products derived -** from this software without specific prior written permission. -** THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED -** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -*/ - #include "tzfile.h" #include "fcntl.h" #include "locale.h" @@ -108,9 +119,10 @@ static char * _conv(int, const char *, char *, const char *); static char * _fmt(const char *, const struct tm *, char *, const char *, int *); static char * _yconv(int, int, bool, bool, char *, const char *, int); -static char * getformat(int, char *, char *, char *, char *); +#if !HAVE_POSIX_DECLS extern char * tzname[]; +#endif #ifndef YEAR_2000_NAME #define YEAR_2000_NAME "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS" @@ -121,7 +133,17 @@ extern char * tzname[]; #define IN_THIS 2 #define IN_ALL 3 -#define FORCE_LOWER_CASE 0x100 +#if HAVE_STRFTIME_L +size_t +strftime_l(char *s, size_t maxsize, char const *format, struct tm const *t, + locale_t locale) +{ + /* Just call strftime, as only the C locale is supported. */ + return strftime(s, maxsize, format, t); +} +#endif + +#define FORCE_LOWER_CASE 0x100 /* Android extension. */ size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *t) diff --git a/tests/time_test.cpp b/tests/time_test.cpp index 10399c5ff..028a359db 100644 --- a/tests/time_test.cpp +++ b/tests/time_test.cpp @@ -176,6 +176,27 @@ TEST(time, strftime_null_tm_zone) { #endif } +TEST(time, strftime_l) { + locale_t cloc = newlocale(LC_ALL, "C.UTF-8", 0); + locale_t old_locale = uselocale(cloc); + + setenv("TZ", "UTC", 1); + + struct tm t; + memset(&t, 0, sizeof(tm)); + t.tm_year = 200; + t.tm_mon = 2; + t.tm_mday = 10; + + // Date and time as text. + char buf[64]; + EXPECT_EQ(24U, strftime_l(buf, sizeof(buf), "%c", &t, cloc)); + EXPECT_STREQ("Sun Mar 10 00:00:00 2100", buf); + + uselocale(old_locale); + freelocale(cloc); +} + TEST(time, strptime) { setenv("TZ", "UTC", 1);