diff options
author | Zack Weinberg <zackw@panix.com> | 2017-06-08 15:39:03 -0400 |
---|---|---|
committer | Zack Weinberg <zackw@panix.com> | 2017-06-08 15:39:03 -0400 |
commit | 5046dbb4a7eba5eccfd258f92f4735c9ffc8d069 (patch) | |
tree | 4470480d904b65cf14ca524f96f79eca818c3eaf /time | |
parent | 199fc19d3aaaf57944ef036e15904febe877fc93 (diff) | |
download | glibc-zack/build-layout-experiment.tar glibc-zack/build-layout-experiment.tar.gz glibc-zack/build-layout-experiment.tar.bz2 glibc-zack/build-layout-experiment.zip |
Prepare for radical source tree reorganization.zack/build-layout-experiment
All top-level files and directories are moved into a temporary storage
directory, REORG.TODO, except for files that will certainly still
exist in their current form at top level when we're done (COPYING,
COPYING.LIB, LICENSES, NEWS, README), all old ChangeLog files (which
are moved to the new directory OldChangeLogs, instead), and the
generated file INSTALL (which is just deleted; in the new order, there
will be no generated files checked into version control).
Diffstat (limited to 'time')
67 files changed, 0 insertions, 9199 deletions
diff --git a/time/Depend b/time/Depend deleted file mode 100644 index 79b246903c..0000000000 --- a/time/Depend +++ /dev/null @@ -1 +0,0 @@ -timezone diff --git a/time/Makefile b/time/Makefile deleted file mode 100644 index 317c4d8901..0000000000 --- a/time/Makefile +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright (C) 1991-2017 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 -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. - -# The GNU C Library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. - -# You should have received a copy of the GNU Lesser General Public -# License along with the GNU C Library; if not, see -# <http://www.gnu.org/licenses/>. - -# -# Makefile for time routines -# -subdir := time - -include ../Makeconfig - -headers := time.h sys/time.h sys/timeb.h bits/time.h \ - bits/types/clockid_t.h bits/types/clock_t.h \ - bits/types/struct_itimerspec.h \ - bits/types/struct_timespec.h bits/types/struct_timeval.h \ - bits/types/struct_tm.h bits/types/timer_t.h \ - bits/types/time_t.h - -routines := offtime asctime clock ctime ctime_r difftime \ - gmtime localtime mktime time \ - gettimeofday settimeofday adjtime tzset \ - tzfile getitimer setitimer \ - stime dysize timegm ftime \ - getdate strptime strptime_l \ - strftime wcsftime strftime_l wcsftime_l \ - timespec_get -aux := era alt_digit lc-time-cleanup - -tests := test_time clocktest tst-posixtz tst-strptime tst_wcsftime \ - tst-getdate tst-mktime tst-mktime2 tst-ftime_l tst-strftime \ - tst-mktime3 tst-strptime2 bug-asctime bug-asctime_r bug-mktime1 \ - tst-strptime3 bug-getdate1 tst-strptime-whitespace tst-ftime \ - tst-tzname - -include ../Rules - -ifeq ($(run-built-tests),yes) -LOCALES := de_DE.ISO-8859-1 en_US.ISO-8859-1 ja_JP.EUC-JP -include ../gen-locales.mk - -$(objpfx)tst-ftime_l.out: $(gen-locales) -$(objpfx)tst-strptime.out: $(gen-locales) -endif - -tz-cflags = -DTZDIR='"$(zonedir)"' \ - -DTZDEFAULT='"$(localtime-file)"' \ - -DTZDEFRULES='"$(posixrules-file)"' - -CFLAGS-tzfile.c = $(tz-cflags) -CFLAGS-tzset.c = $(tz-cflags) -CFLAGS-getdate.c = -fexceptions - -# Don't warn about Y2k problem in strftime format string. -CFLAGS-test_time.c = -Wno-format - -tst-getdate-ENV= DATEMSK=datemsk TZDIR=${common-objpfx}timezone/testdata -test_time-ARGS= EST5EDT CST - -tst-tzname-ENV = TZDIR=${common-objpfx}timezone/testdata -CPPFLAGS-tst-tzname.c = -DTZDEFRULES='"$(posixrules-file)"' - -bug-getdate1-ARGS = ${objpfx}bug-getdate1-fmt diff --git a/time/Versions b/time/Versions deleted file mode 100644 index fd838181e4..0000000000 --- a/time/Versions +++ /dev/null @@ -1,68 +0,0 @@ -libc { - GLIBC_2.0 { - # global variables - __daylight; __timezone; __tzname; - - # functions with special/multiple interfaces - __adjtimex; - - # functions used in other libraries - __gmtime_r; __gettimeofday; - - # variables in normal name space - daylight; timezone; tzname; - - # a* - adjtime; adjtimex; asctime; asctime_r; - - # c* - clock; ctime; ctime_r; - - # d* - difftime; dysize; - - # f* - ftime; - - # g* - getitimer; gettimeofday; gmtime; gmtime_r; - - # l* - localtime; localtime_r; - - # m* - mktime; - - # s* - setitimer; settimeofday; stime; strftime; strptime; - - # t* - time; timegm; timelocal; tzset; - } - GLIBC_2.1 { - # variables in normal name space - getdate_err; - - # g* - getdate; getdate_r; - } - GLIBC_2.2 { - # w* - wcsftime; - } - GLIBC_2.3 { - # these internal names are used by libstdc++ - __strftime_l; __wcsftime_l; - - # s* - strftime_l; - # w* - wcsftime_l; - } - GLIBC_2.3.2 { - strptime_l; - } - GLIBC_2.16 { - timespec_get; - } -} diff --git a/time/adjtime.c b/time/adjtime.c deleted file mode 100644 index 180bf48e13..0000000000 --- a/time/adjtime.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <sys/time.h> - -/* Adjust the current time of day by the amount in DELTA. - If OLDDELTA is not NULL, it is filled in with the amount - of time adjustment remaining to be done from the last `__adjtime' call. - This call is restricted to the super-user. */ -int -__adjtime (const struct timeval *delta, struct timeval *olddelta) -{ - __set_errno (ENOSYS); - return -1; -} -stub_warning (adjtime) - -weak_alias (__adjtime, adjtime) diff --git a/time/alt_digit.c b/time/alt_digit.c deleted file mode 100644 index e3bcea4414..0000000000 --- a/time/alt_digit.c +++ /dev/null @@ -1,193 +0,0 @@ -/* Helper functions used by strftime/strptime to handle alternate digits. - Copyright (C) 1995-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "../locale/localeinfo.h" -#include <libc-lock.h> -#include <stdlib.h> -#include <wchar.h> -#include <string.h> -#include <stdint.h> - -/* Some of the functions here must not be used while setlocale is called. */ -__libc_rwlock_define (extern, __libc_setlocale_lock attribute_hidden) - -#define CURRENT(item) (current->values[_NL_ITEM_INDEX (item)].string) -#define CURRENT_WSTR(item) \ - ((wchar_t *) current->values[_NL_ITEM_INDEX (item)].wstr) - -static void -_nl_init_alt_digit (struct __locale_data *current) -{ - struct lc_time_data *data; - - if (current->private.time == NULL) - { - current->private.time = malloc (sizeof *current->private.time); - if (current->private.time == NULL) - return; - memset (current->private.time, 0, sizeof *current->private.time); - current->private.cleanup = &_nl_cleanup_time; - } - data = current->private.time; - - if (! data->alt_digits_initialized) - { - const char *ptr = CURRENT (ALT_DIGITS); - size_t cnt; - - data->alt_digits_initialized = 1; - - if (ptr != NULL) - { - data->alt_digits = malloc (100 * sizeof (const char *)); - if (data->alt_digits != NULL) - for (cnt = 0; cnt < 100; ++cnt) - { - data->alt_digits[cnt] = ptr; - - /* Skip digit format. */ - ptr = strchr (ptr, '\0') + 1; - } - } - } - -} - -const char * -internal_function -_nl_get_alt_digit (unsigned int number, struct __locale_data *current) -{ - const char *result; - - if (number >= 100 || CURRENT (ALT_DIGITS)[0] == '\0') - return NULL; - - __libc_rwlock_wrlock (__libc_setlocale_lock); - - if (current->private.time == NULL - || ! current->private.time->alt_digits_initialized) - _nl_init_alt_digit (current); - - result = ((current->private.time != NULL - && current->private.time->alt_digits != NULL) - ? current->private.time->alt_digits[number] - : NULL); - - __libc_rwlock_unlock (__libc_setlocale_lock); - - return result; -} - - -const wchar_t * -internal_function -_nl_get_walt_digit (unsigned int number, struct __locale_data *current) -{ - const wchar_t *result = NULL; - struct lc_time_data *data; - - if (number >= 100 || CURRENT_WSTR (_NL_WALT_DIGITS)[0] == L'\0') - return NULL; - - __libc_rwlock_wrlock (__libc_setlocale_lock); - - if (current->private.time == NULL) - { - current->private.time = malloc (sizeof *current->private.time); - if (current->private.time == NULL) - goto out; - memset (current->private.time, 0, sizeof *current->private.time); - current->private.cleanup = &_nl_cleanup_time; - } - data = current->private.time; - - if (! data->walt_digits_initialized) - { - const wchar_t *ptr = CURRENT_WSTR (_NL_WALT_DIGITS); - size_t cnt; - - data->walt_digits_initialized = 1; - - if (ptr != NULL) - { - data->walt_digits = malloc (100 * sizeof (const uint32_t *)); - if (data->walt_digits != NULL) - for (cnt = 0; cnt < 100; ++cnt) - { - data->walt_digits[cnt] = ptr; - - /* Skip digit format. */ - ptr = __wcschr (ptr, L'\0') + 1; - } - } - } - - if (data->walt_digits != NULL) - result = data->walt_digits[number]; - - out: - __libc_rwlock_unlock (__libc_setlocale_lock); - - return (wchar_t *) result; -} - - -int -internal_function -_nl_parse_alt_digit (const char **strp, struct __locale_data *current) -{ - const char *str = *strp; - int result = -1; - size_t cnt; - size_t maxlen = 0; - - if (CURRENT_WSTR (_NL_WALT_DIGITS)[0] == L'\0') - return result; - - __libc_rwlock_wrlock (__libc_setlocale_lock); - - if (current->private.time == NULL - || ! current->private.time->alt_digits_initialized) - _nl_init_alt_digit (current); - - if (current->private.time != NULL && - current->private.time->alt_digits != NULL) - /* Matching is not unambiguous. The alternative digits could be like - I, II, III, ... and the first one is a substring of the second - and third. Therefore we must keep on searching until we found - the longest possible match. Note that this is not specified in - the standard. */ - for (cnt = 0; cnt < 100; ++cnt) - { - const char *const dig = current->private.time->alt_digits[cnt]; - size_t len = strlen (dig); - - if (len > maxlen && strncmp (dig, str, len) == 0) - { - maxlen = len; - result = (int) cnt; - } - } - - __libc_rwlock_unlock (__libc_setlocale_lock); - - if (result != -1) - *strp += maxlen; - - return result; -} diff --git a/time/asctime.c b/time/asctime.c deleted file mode 100644 index b57de7dc8b..0000000000 --- a/time/asctime.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "../locale/localeinfo.h" -#include <errno.h> -#include <limits.h> -#include <stdio.h> -#include <time.h> - -/* This is defined in locale/C-time.c in the GNU libc. */ -extern const struct __locale_data _nl_C_LC_TIME attribute_hidden; -#define ab_day_name(DAY) (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABDAY_1)+(DAY)].string) -#define ab_month_name(MON) (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)+(MON)].string) - -static const char format[] = "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n"; -static char result[ 3+1+ 3+1+20+1+20+1+20+1+20+1+20+1 + 1]; - - -static char * -asctime_internal (const struct tm *tp, char *buf, size_t buflen) -{ - if (tp == NULL) - { - __set_errno (EINVAL); - return NULL; - } - - /* We limit the size of the year which can be printed. Using the %d - format specifier used the addition of 1900 would overflow the - number and a negative vaue is printed. For some architectures we - could in theory use %ld or an evern larger integer format but - this would mean the output needs more space. This would not be a - problem if the 'asctime_r' interface would be defined sanely and - a buffer size would be passed. */ - if (__glibc_unlikely (tp->tm_year > INT_MAX - 1900)) - { - eoverflow: - __set_errno (EOVERFLOW); - return NULL; - } - - int n = __snprintf (buf, buflen, format, - (tp->tm_wday < 0 || tp->tm_wday >= 7 ? - "???" : ab_day_name (tp->tm_wday)), - (tp->tm_mon < 0 || tp->tm_mon >= 12 ? - "???" : ab_month_name (tp->tm_mon)), - tp->tm_mday, tp->tm_hour, tp->tm_min, - tp->tm_sec, 1900 + tp->tm_year); - if (n < 0) - return NULL; - if (n >= buflen) - goto eoverflow; - - return buf; -} - - -/* Like asctime, but write result to the user supplied buffer. The - buffer is only guaranteed to be 26 bytes in length. */ -char * -__asctime_r (const struct tm *tp, char *buf) -{ - return asctime_internal (tp, buf, 26); -} -weak_alias (__asctime_r, asctime_r) - - -/* Returns a string of the form "Day Mon dd hh:mm:ss yyyy\n" - which is the representation of TP in that form. */ -char * -asctime (const struct tm *tp) -{ - return asctime_internal (tp, result, sizeof (result)); -} -libc_hidden_def (asctime) diff --git a/time/bits/types/clock_t.h b/time/bits/types/clock_t.h deleted file mode 100644 index ce97248f88..0000000000 --- a/time/bits/types/clock_t.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __clock_t_defined -#define __clock_t_defined 1 - -#include <bits/types.h> - -/* Returned by `clock'. */ -typedef __clock_t clock_t; - -#endif diff --git a/time/bits/types/clockid_t.h b/time/bits/types/clockid_t.h deleted file mode 100644 index b17c7da853..0000000000 --- a/time/bits/types/clockid_t.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __clockid_t_defined -#define __clockid_t_defined 1 - -#include <bits/types.h> - -/* Clock ID used in clock and timer functions. */ -typedef __clockid_t clockid_t; - -#endif diff --git a/time/bits/types/struct_itimerspec.h b/time/bits/types/struct_itimerspec.h deleted file mode 100644 index 17cc1ac86d..0000000000 --- a/time/bits/types/struct_itimerspec.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __itimerspec_defined -#define __itimerspec_defined 1 - -#include <bits/types.h> -#include <bits/types/struct_timespec.h> - -/* POSIX.1b structure for timer start values and intervals. */ -struct itimerspec - { - struct timespec it_interval; - struct timespec it_value; - }; - -#endif diff --git a/time/bits/types/struct_timespec.h b/time/bits/types/struct_timespec.h deleted file mode 100644 index 644db9fdb6..0000000000 --- a/time/bits/types/struct_timespec.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __timespec_defined -#define __timespec_defined 1 - -#include <bits/types.h> - -/* POSIX.1b structure for a time value. This is like a `struct timeval' but - has nanoseconds instead of microseconds. */ -struct timespec -{ - __time_t tv_sec; /* Seconds. */ - __syscall_slong_t tv_nsec; /* Nanoseconds. */ -}; - -#endif diff --git a/time/bits/types/struct_timeval.h b/time/bits/types/struct_timeval.h deleted file mode 100644 index 70394ce886..0000000000 --- a/time/bits/types/struct_timeval.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef __timeval_defined -#define __timeval_defined 1 - -#include <bits/types.h> - -/* A time value that is accurate to the nearest - microsecond but also has a range of years. */ -struct timeval -{ - __time_t tv_sec; /* Seconds. */ - __suseconds_t tv_usec; /* Microseconds. */ -}; -#endif diff --git a/time/bits/types/struct_tm.h b/time/bits/types/struct_tm.h deleted file mode 100644 index b13b631228..0000000000 --- a/time/bits/types/struct_tm.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef __struct_tm_defined -#define __struct_tm_defined 1 - -#include <bits/types.h> - -/* ISO C `broken-down time' structure. */ -struct tm -{ - int tm_sec; /* Seconds. [0-60] (1 leap second) */ - int tm_min; /* Minutes. [0-59] */ - int tm_hour; /* Hours. [0-23] */ - int tm_mday; /* Day. [1-31] */ - int tm_mon; /* Month. [0-11] */ - int tm_year; /* Year - 1900. */ - int tm_wday; /* Day of week. [0-6] */ - int tm_yday; /* Days in year.[0-365] */ - int tm_isdst; /* DST. [-1/0/1]*/ - -# ifdef __USE_MISC - long int tm_gmtoff; /* Seconds east of UTC. */ - const char *tm_zone; /* Timezone abbreviation. */ -# else - long int __tm_gmtoff; /* Seconds east of UTC. */ - const char *__tm_zone; /* Timezone abbreviation. */ -# endif -}; - -#endif diff --git a/time/bits/types/time_t.h b/time/bits/types/time_t.h deleted file mode 100644 index ab8287c6fe..0000000000 --- a/time/bits/types/time_t.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __time_t_defined -#define __time_t_defined 1 - -#include <bits/types.h> - -/* Returned by `time'. */ -typedef __time_t time_t; - -#endif diff --git a/time/bits/types/timer_t.h b/time/bits/types/timer_t.h deleted file mode 100644 index d71a4130e2..0000000000 --- a/time/bits/types/timer_t.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __timer_t_defined -#define __timer_t_defined 1 - -#include <bits/types.h> - -/* Timer ID returned by `timer_create'. */ -typedef __timer_t timer_t; - -#endif diff --git a/time/bug-asctime.c b/time/bug-asctime.c deleted file mode 100644 index 0b04b475a8..0000000000 --- a/time/bug-asctime.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <errno.h> -#include <limits.h> -#include <stdio.h> -#include <time.h> - - -static int -do_test (void) -{ - int result = 0; - time_t t = time (NULL); - struct tm *tp = localtime (&t); - tp->tm_year = INT_MAX; - errno = 0; - char *s = asctime (tp); - if (s != NULL || errno != EOVERFLOW) - { - puts ("asctime did not fail correctly"); - result = 1; - } - char buf[1000]; - errno = 0; - s = asctime_r (tp, buf); - if (s != NULL || errno != EOVERFLOW) - { - puts ("asctime_r did not fail correctly"); - result = 1; - } - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/bug-asctime_r.c b/time/bug-asctime_r.c deleted file mode 100644 index 86651ef1c5..0000000000 --- a/time/bug-asctime_r.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <errno.h> -#include <limits.h> -#include <stdio.h> -#include <time.h> - - -static int -do_test (void) -{ - int result = 0; - time_t t = time (NULL); - struct tm *tp = localtime (&t); - tp->tm_year = 10000 - 1900; - char buf[1000]; - errno = 0; - buf[26] = '\xff'; - char *s = asctime_r (tp, buf); - if (s != NULL || errno != EOVERFLOW) - { - puts ("asctime_r did not fail correctly"); - result = 1; - } - if (buf[26] != '\xff') - { - puts ("asctime_r overwrote 27th byte in buffer"); - result = 1; - } - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/bug-getdate1.c b/time/bug-getdate1.c deleted file mode 100644 index 9afafba5be..0000000000 --- a/time/bug-getdate1.c +++ /dev/null @@ -1,152 +0,0 @@ -/* BZ #5451 */ -#include <time.h> -#include <stdio.h> -#include <stdlib.h> - -#include <support/temp_file.h> - -static char *templ_filename; - -// Writes template given as parameter to file, -// specified as the argument -static void -output_to_template_file (const char *str) -{ - FILE *fd = fopen (templ_filename, "w"); - if (fd == NULL) - { - printf ("Can not open file for writing\n"); - exit (1); - } - - fprintf (fd, "%s\n", str); - fclose (fd); -} - -// Calls getdate() function with specified parameter, -// specified as the argument, also checks the contents of -// file with template and prints the result -static int -process_getdate_on (const char *str) -{ - struct tm *res; - char templ[1000]; - FILE *fd = fopen (templ_filename, "r"); - - if (fd == NULL) - { - printf ("Can not open file for reading\n"); - exit (1); - } - - if (fgets (templ, 1000, fd) == NULL) - { - printf ("Can not read file\n"); - exit (1); - } - fclose (fd); - - res = getdate (str); - if (res == NULL) - { - printf ("Failed on getdate(\"%s\"), template is: %s", str, templ); - printf ("Error number: %d\n\n", getdate_err); - return 1; - } - printf ("Success on getdate(\"%s\"), template is: %s\n", str, templ); - printf ("Result is\n"); - printf ("Seconds: %d\n", res->tm_sec); - printf ("Minutes: %d\n", res->tm_min); - printf ("Hour: %d\n", res->tm_hour); - printf ("Day of month: %d\n", res->tm_mday); - printf ("Month of year: %d\n", res->tm_mon); - printf ("Years since 1900: %d\n", res->tm_year); - printf ("Day of week: %d\n", res->tm_wday); - printf ("Day of year: %d\n", res->tm_yday); - printf ("Daylight Savings flag: %d\n\n", res->tm_isdst); - return 0; -} - -static int -do_test (int argc, char *argv[]) -{ - - templ_filename = argv[1]; - - setenv ("DATEMSK", templ_filename, 1); - - /* - * The following 4 testcases reproduce the problem: - * 1. Templates "%S" and "%M" are not processed, - * when used without "%H" template - */ - int res = 0; - output_to_template_file ("%M"); - res |= process_getdate_on ("1"); - - output_to_template_file ("%M %H"); - res |= process_getdate_on ("1 2"); - - output_to_template_file ("%S"); - res |= process_getdate_on ("1"); - - output_to_template_file ("%S %H"); - res |= process_getdate_on ("1 2"); - - /* - * The following 9 testcases reproduce the problem: - * 2. Templates "%Y", "%y", "%d", "%C", "%C %y" - * are not processed separately - */ - output_to_template_file ("%Y"); - process_getdate_on ("2001"); - - output_to_template_file ("%Y %m"); - res |= process_getdate_on ("2001 3"); - - output_to_template_file ("%y"); - res |= process_getdate_on ("70"); - - output_to_template_file ("%y %m"); - res |= process_getdate_on ("70 3"); - - output_to_template_file ("%d"); - res |= process_getdate_on ("06"); - - output_to_template_file ("%d %m"); - res |= process_getdate_on ("25 3"); - - output_to_template_file ("%C"); - res |= process_getdate_on ("20"); - - output_to_template_file ("%C %y %m"); - res |= process_getdate_on ("20 3 2"); - - output_to_template_file ("%C %y"); - res |= process_getdate_on ("20 5"); - - /* - * The following testcase reproduces the problem: - * 3. When template is "%Y %m", day of month is not set - * to 1 as standard requires - */ - output_to_template_file ("%Y %m"); - res |= process_getdate_on ("2008 3"); - - return res; -} -#define TEST_FUNCTION_ARGV do_test - -static void -do_prepare (int argc, char **argv) -{ - if (argc < 2) - { - puts ("Command line: progname template_filename_full_path"); - exit (1); - } - add_temp_file (argv[1]); -} -#define PREPARE do_prepare - -#include <support/test-driver.c> diff --git a/time/bug-mktime1.c b/time/bug-mktime1.c deleted file mode 100644 index e071273f05..0000000000 --- a/time/bug-mktime1.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> -#include <time.h> - - -static int -do_test (void) -{ - struct tm t2 = { 0, 0, 0, 1, 1, 2050 - 1900, 1, 1, 1 }; - time_t tt2 = mktime (&t2); - printf ("%ld\n", (long int) tt2); - if (sizeof (time_t) == 4 && tt2 != -1) - return 1; - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/clock.c b/time/clock.c deleted file mode 100644 index bb8e9d323e..0000000000 --- a/time/clock.c +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sys/times.h> -#include <time.h> -#include <errno.h> - -/* Return the time used by the program so far (user time + system time). */ -clock_t -clock (void) -{ - __set_errno (ENOSYS); - return (clock_t) -1; -} - -stub_warning (clock) diff --git a/time/clocktest.c b/time/clocktest.c deleted file mode 100644 index 779c05d8d9..0000000000 --- a/time/clocktest.c +++ /dev/null @@ -1,37 +0,0 @@ -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <unistd.h> -#include <stdint.h> - -volatile int gotit = 0; - -static void -alarm_handler (int signal) -{ - gotit = 1; -} - - -int -main (int argc, char ** argv) -{ - clock_t start, stop; - - if (signal(SIGALRM, alarm_handler) == SIG_ERR) - { - perror ("signal"); - exit (1); - } - alarm(1); - start = clock (); - while (!gotit); - stop = clock (); - - printf ("%jd clock ticks per second (start=%jd,stop=%jd)\n", - (intmax_t) (stop - start), (intmax_t) start, (intmax_t) stop); - printf ("CLOCKS_PER_SEC=%jd, sysconf(_SC_CLK_TCK)=%ld\n", - (intmax_t) CLOCKS_PER_SEC, sysconf(_SC_CLK_TCK)); - return 0; -} diff --git a/time/ctime.c b/time/ctime.c deleted file mode 100644 index 7baca1bb57..0000000000 --- a/time/ctime.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <time.h> - -/* Return a string as returned by asctime which - is the representation of *T in that form. */ -char * -ctime (const time_t *t) -{ - /* The C Standard says ctime (t) is equivalent to asctime (localtime (t)). - In particular, ctime and asctime must yield the same pointer. */ - return asctime (localtime (t)); -} diff --git a/time/ctime_r.c b/time/ctime_r.c deleted file mode 100644 index ecd7731038..0000000000 --- a/time/ctime_r.c +++ /dev/null @@ -1,29 +0,0 @@ -/* Return in BUF representation of time T in form of asctime - Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <time.h> - -/* Return a string as returned by asctime which is the representation - of *T in that form. Reentrant version. */ -char * -ctime_r (const time_t *t, char *buf) -{ - struct tm tm; - return __asctime_r (__localtime_r (t, &tm), buf); -} diff --git a/time/datemsk b/time/datemsk deleted file mode 100644 index 3dc4d417fe..0000000000 --- a/time/datemsk +++ /dev/null @@ -1,2 +0,0 @@ -%H:%M:%S %F -%d-%m-%Y %T diff --git a/time/difftime.c b/time/difftime.c deleted file mode 100644 index e5e3311744..0000000000 --- a/time/difftime.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Written by Paul Eggert <eggert@cs.ucla.edu>. */ - -#include <time.h> - -#include <limits.h> -#include <float.h> -#include <stdint.h> - -#define TYPE_BITS(type) (sizeof (type) * CHAR_BIT) -#define TYPE_FLOATING(type) ((type) 0.5 == 0.5) -#define TYPE_SIGNED(type) ((type) -1 < 0) - -/* Return the difference between TIME1 and TIME0, where TIME0 <= TIME1. - time_t is known to be an integer type. */ - -static double -subtract (time_t time1, time_t time0) -{ - if (! TYPE_SIGNED (time_t)) - return time1 - time0; - else - { - /* Optimize the common special cases where time_t - can be converted to uintmax_t without losing information. */ - uintmax_t dt = (uintmax_t) time1 - (uintmax_t) time0; - double delta = dt; - - if (UINTMAX_MAX / 2 < INTMAX_MAX) - { - /* This is a rare host where uintmax_t has padding bits, and possibly - information was lost when converting time_t to uintmax_t. - Check for overflow by comparing dt/2 to (time1/2 - time0/2). - Overflow occurred if they differ by more than a small slop. - Thanks to Clive D.W. Feather for detailed technical advice about - hosts with padding bits. - - In the following code the "h" prefix means half. By range - analysis, we have: - - -0.5 <= ht1 - 0.5*time1 <= 0.5 - -0.5 <= ht0 - 0.5*time0 <= 0.5 - -1.0 <= dht - 0.5*(time1 - time0) <= 1.0 - - If overflow has not occurred, we also have: - - -0.5 <= hdt - 0.5*(time1 - time0) <= 0 - -1.0 <= dht - hdt <= 1.5 - - and since dht - hdt is an integer, we also have: - - -1 <= dht - hdt <= 1 - - or equivalently: - - 0 <= dht - hdt + 1 <= 2 - - In the above analysis, all the operators have their exact - mathematical semantics, not C semantics. However, dht - hdt + - 1 is unsigned in C, so it need not be compared to zero. */ - - uintmax_t hdt = dt / 2; - time_t ht1 = time1 / 2; - time_t ht0 = time0 / 2; - time_t dht = ht1 - ht0; - - if (2 < dht - hdt + 1) - { - /* Repair delta overflow. - - The following expression contains a second rounding, - so the result may not be the closest to the true answer. - This problem occurs only with very large differences. - It's too painful to fix this portably. */ - - delta = dt + 2.0L * (UINTMAX_MAX - UINTMAX_MAX / 2); - } - } - - return delta; - } -} - -/* Return the difference between TIME1 and TIME0. */ -double -__difftime (time_t time1, time_t time0) -{ - /* Convert to double and then subtract if no double-rounding error could - result. */ - - if (TYPE_BITS (time_t) <= DBL_MANT_DIG - || (TYPE_FLOATING (time_t) && sizeof (time_t) < sizeof (long double))) - return (double) time1 - (double) time0; - - /* Likewise for long double. */ - - if (TYPE_BITS (time_t) <= LDBL_MANT_DIG || TYPE_FLOATING (time_t)) - return (long double) time1 - (long double) time0; - - /* Subtract the smaller integer from the larger, convert the difference to - double, and then negate if needed. */ - - return time1 < time0 ? - subtract (time0, time1) : subtract (time1, time0); -} -strong_alias (__difftime, difftime) diff --git a/time/dysize.c b/time/dysize.c deleted file mode 100644 index feed19c2d7..0000000000 --- a/time/dysize.c +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (C) 1994-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <time.h> - -int -dysize (int year) -{ - return __isleap (year) ? 366 : 365; -} diff --git a/time/era.c b/time/era.c deleted file mode 100644 index b5743c621a..0000000000 --- a/time/era.c +++ /dev/null @@ -1,177 +0,0 @@ -/* Helper functions used by strftime/strptime to handle locale-specific "eras". - Copyright (C) 1995-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "../locale/localeinfo.h" -#include <libc-lock.h> -#include <stdlib.h> -#include <wchar.h> -#include <string.h> -#include <stdint.h> - -/* Some of the functions here must not be used while setlocale is called. */ -__libc_rwlock_define (extern, __libc_setlocale_lock attribute_hidden) - -#define CURRENT(item) (current->values[_NL_ITEM_INDEX (item)].string) -#define CURRENT_WORD(item) (current->values[_NL_ITEM_INDEX (item)].word) - -#define ERA_DATE_CMP(a, b) \ - (a[0] < b[0] || (a[0] == b[0] && (a[1] < b[1] \ - || (a[1] == b[1] && a[2] <= b[2])))) - -/* Look up the era information in CURRENT's locale strings and - cache it in CURRENT->private. */ -static void internal_function -_nl_init_era_entries (struct __locale_data *current) -{ - size_t cnt; - struct lc_time_data *data; - - /* Avoid touching CURRENT if there is no data at all, for _nl_C_LC_TIME. */ - if (CURRENT_WORD (_NL_TIME_ERA_NUM_ENTRIES) == 0) - return; - - __libc_rwlock_wrlock (__libc_setlocale_lock); - - if (current->private.time == NULL) - { - current->private.time = malloc (sizeof *current->private.time); - if (current->private.time == NULL) - goto out; - memset (current->private.time, 0, sizeof *current->private.time); - current->private.cleanup = &_nl_cleanup_time; - } - data = current->private.time; - - if (! data->era_initialized) - { - size_t new_num_eras = CURRENT_WORD (_NL_TIME_ERA_NUM_ENTRIES); - if (new_num_eras == 0) - { - if (data->eras != NULL) - { - free (data->eras); - data->eras = NULL; - } - } - else - { - struct era_entry *new_eras = data->eras; - - if (data->num_eras != new_num_eras) - new_eras = - (struct era_entry *) realloc (data->eras, - new_num_eras - * sizeof (struct era_entry)); - if (new_eras == NULL) - { - free (data->eras); - data->num_eras = 0; - data->eras = NULL; - } - else - { - const char *ptr = CURRENT (_NL_TIME_ERA_ENTRIES); - data->num_eras = new_num_eras; - data->eras = new_eras; - - for (cnt = 0; cnt < new_num_eras; ++cnt) - { - const char *base_ptr = ptr; - memcpy ((void *) (new_eras + cnt), (const void *) ptr, - sizeof (uint32_t) * 8); - - if (ERA_DATE_CMP(new_eras[cnt].start_date, - new_eras[cnt].stop_date)) - if (new_eras[cnt].direction == (uint32_t) '+') - new_eras[cnt].absolute_direction = 1; - else - new_eras[cnt].absolute_direction = -1; - else - if (new_eras[cnt].direction == (uint32_t) '+') - new_eras[cnt].absolute_direction = -1; - else - new_eras[cnt].absolute_direction = 1; - - /* Skip numeric values. */ - ptr += sizeof (uint32_t) * 8; - - /* Set and skip era name. */ - new_eras[cnt].era_name = ptr; - ptr = strchr (ptr, '\0') + 1; - - /* Set and skip era format. */ - new_eras[cnt].era_format = ptr; - ptr = strchr (ptr, '\0') + 1; - - ptr += 3 - (((ptr - (const char *) base_ptr) + 3) & 3); - - /* Set and skip wide era name. */ - new_eras[cnt].era_wname = (wchar_t *) ptr; - ptr = (char *) (__wcschr ((wchar_t *) ptr, L'\0') + 1); - - /* Set and skip wide era format. */ - new_eras[cnt].era_wformat = (wchar_t *) ptr; - ptr = (char *) (__wcschr ((wchar_t *) ptr, L'\0') + 1); - } - } - } - - data->era_initialized = 1; - } - - out: - __libc_rwlock_unlock (__libc_setlocale_lock); -} - -struct era_entry * -internal_function -_nl_get_era_entry (const struct tm *tp, struct __locale_data *current) -{ - if (current->private.time == NULL || !current->private.time->era_initialized) - _nl_init_era_entries (current); - - if (current->private.time != NULL) - { - /* Now compare date with the available eras. */ - const int32_t tdate[3] = { tp->tm_year, tp->tm_mon, tp->tm_mday }; - size_t cnt; - for (cnt = 0; cnt < current->private.time->num_eras; ++cnt) - if ((ERA_DATE_CMP (current->private.time->eras[cnt].start_date, tdate) - && ERA_DATE_CMP (tdate, - current->private.time->eras[cnt].stop_date)) - || (ERA_DATE_CMP (current->private.time->eras[cnt].stop_date, - tdate) - && ERA_DATE_CMP (tdate, - current->private.time->eras[cnt].start_date))) - return ¤t->private.time->eras[cnt]; - } - - return NULL; -} - - -struct era_entry * -internal_function -_nl_select_era_entry (int cnt, struct __locale_data *current) -{ - if (current->private.time == NULL || !current->private.time->era_initialized) - _nl_init_era_entries (current); - - return (current->private.time == NULL - ? NULL : ¤t->private.time->eras[cnt]); -} diff --git a/time/ftime.c b/time/ftime.c deleted file mode 100644 index 1cfb53cc04..0000000000 --- a/time/ftime.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 1994-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <time.h> -#include <sys/timeb.h> - -int -ftime (struct timeb *timebuf) -{ - int save = errno; - struct tm tp; - - __set_errno (0); - if (time (&timebuf->time) == (time_t) -1 && errno != 0) - return -1; - timebuf->millitm = 0; - - if (__localtime_r (&timebuf->time, &tp) == NULL) - return -1; - - timebuf->timezone = tp.tm_gmtoff / 60; - timebuf->dstflag = tp.tm_isdst; - - __set_errno (save); - return 0; -} diff --git a/time/getdate.c b/time/getdate.c deleted file mode 100644 index 28ea48287f..0000000000 --- a/time/getdate.c +++ /dev/null @@ -1,312 +0,0 @@ -/* Convert a string representation of time to a time value. - Copyright (C) 1997-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <limits.h> -#include <stdio.h> -#include <stdio_ext.h> -#include <stdlib.h> -#include <stdbool.h> -#include <string.h> -#include <time.h> -#include <unistd.h> -#include <sys/stat.h> -#include <ctype.h> -#include <alloca.h> - -#define TM_YEAR_BASE 1900 - - -/* Prototypes for local functions. */ -static int first_wday (int year, int mon, int wday); -static int check_mday (int year, int mon, int mday); - - -/* Set to one of the following values to indicate an error. - 1 the DATEMSK environment variable is null or undefined, - 2 the template file cannot be opened for reading, - 3 failed to get file status information, - 4 the template file is not a regular file, - 5 an error is encountered while reading the template file, - 6 memory allication failed (not enough memory available), - 7 there is no line in the template that matches the input, - 8 invalid input specification Example: February 31 or a time is - specified that can not be represented in a time_t (representing - the time in seconds since 00:00:00 UTC, January 1, 1970) */ -int getdate_err; - - -/* Returns the first weekday WDAY of month MON in the year YEAR. */ -static int -first_wday (int year, int mon, int wday) -{ - struct tm tm; - - if (wday == INT_MIN) - return 1; - - memset (&tm, 0, sizeof (struct tm)); - tm.tm_year = year; - tm.tm_mon = mon; - tm.tm_mday = 1; - mktime (&tm); - - return (1 + (wday - tm.tm_wday + 7) % 7); -} - - -/* Returns 1 if MDAY is a valid day of the month in month MON of year - YEAR, and 0 if it is not. */ -static int -check_mday (int year, int mon, int mday) -{ - switch (mon) - { - case 0: - case 2: - case 4: - case 6: - case 7: - case 9: - case 11: - if (mday >= 1 && mday <= 31) - return 1; - break; - case 3: - case 5: - case 8: - case 10: - if (mday >= 1 && mday <= 30) - return 1; - break; - case 1: - if (mday >= 1 && mday <= (__isleap (year) ? 29 : 28)) - return 1; - break; - } - - return 0; -} - - -int -__getdate_r (const char *string, struct tm *tp) -{ - FILE *fp; - char *line; - size_t len; - char *datemsk; - char *result = NULL; - time_t timer; - struct tm tm; - struct stat64 st; - int mday_ok = 0; - - datemsk = getenv ("DATEMSK"); - if (datemsk == NULL || *datemsk == '\0') - return 1; - - if (stat64 (datemsk, &st) < 0) - return 3; - - if (!S_ISREG (st.st_mode)) - return 4; - - if (__access (datemsk, R_OK) < 0) - return 2; - - /* Open the template file. */ - fp = fopen (datemsk, "rce"); - if (fp == NULL) - return 2; - - /* No threads reading this stream. */ - __fsetlocking (fp, FSETLOCKING_BYCALLER); - - /* Skip leading whitespace. */ - while (isspace (*string)) - string++; - - size_t inlen, oldlen; - - oldlen = inlen = strlen (string); - - /* Skip trailing whitespace. */ - while (inlen > 0 && isspace (string[inlen - 1])) - inlen--; - - char *instr = NULL; - - if (inlen < oldlen) - { - bool using_malloc = false; - - if (__libc_use_alloca (inlen + 1)) - instr = alloca (inlen + 1); - else - { - instr = malloc (inlen + 1); - if (instr == NULL) - { - fclose (fp); - return 6; - } - using_malloc = true; - } - memcpy (instr, string, inlen); - instr[inlen] = '\0'; - string = instr; - - if (!using_malloc) - instr = NULL; - } - - line = NULL; - len = 0; - do - { - ssize_t n; - - n = __getline (&line, &len, fp); - if (n < 0) - break; - if (line[n - 1] == '\n') - line[n - 1] = '\0'; - - /* Do the conversion. */ - tp->tm_year = tp->tm_mon = tp->tm_mday = tp->tm_wday = INT_MIN; - tp->tm_hour = tp->tm_sec = tp->tm_min = INT_MIN; - tp->tm_isdst = -1; - tp->tm_gmtoff = 0; - tp->tm_zone = NULL; - result = strptime (string, line, tp); - if (result && *result == '\0') - break; - } - while (!feof_unlocked (fp)); - - free (instr); - - /* Free the buffer. */ - free (line); - - /* Check for errors. */ - if (ferror_unlocked (fp)) - { - fclose (fp); - return 5; - } - - /* Close template file. */ - fclose (fp); - - if (result == NULL || *result != '\0') - return 7; - - /* Get current time. */ - time (&timer); - __localtime_r (&timer, &tm); - - /* If only the weekday is given, today is assumed if the given day - is equal to the current day and next week if it is less. */ - if (tp->tm_wday >= 0 && tp->tm_wday <= 6 && tp->tm_year == INT_MIN - && tp->tm_mon == INT_MIN && tp->tm_mday == INT_MIN) - { - tp->tm_year = tm.tm_year; - tp->tm_mon = tm.tm_mon; - tp->tm_mday = tm.tm_mday + (tp->tm_wday - tm.tm_wday + 7) % 7; - mday_ok = 1; - } - - /* If only the month is given, the current month is assumed if the - given month is equal to the current month and next year if it is - less and no year is given (the first day of month is assumed if - no day is given. */ - if (tp->tm_mon >= 0 && tp->tm_mon <= 11 && tp->tm_mday == INT_MIN) - { - if (tp->tm_year == INT_MIN) - tp->tm_year = tm.tm_year + (((tp->tm_mon - tm.tm_mon) < 0) ? 1 : 0); - tp->tm_mday = first_wday (tp->tm_year, tp->tm_mon, tp->tm_wday); - mday_ok = 1; - } - - /* If no hour, minute and second are given the current hour, minute - and second are assumed. */ - if (tp->tm_hour == INT_MIN && tp->tm_min == INT_MIN && tp->tm_sec == INT_MIN) - { - tp->tm_hour = tm.tm_hour; - tp->tm_min = tm.tm_min; - tp->tm_sec = tm.tm_sec; - } - - /* Fill in the gaps. */ - if (tp->tm_hour == INT_MIN) - tp->tm_hour = 0; - if (tp->tm_min == INT_MIN) - tp->tm_min = 0; - if (tp->tm_sec == INT_MIN) - tp->tm_sec = 0; - - /* If no date is given, today is assumed if the given hour is - greater than the current hour and tomorrow is assumed if - it is less. */ - if (tp->tm_hour >= 0 && tp->tm_hour <= 23 - && tp->tm_mon == INT_MIN - && tp->tm_mday == INT_MIN && tp->tm_wday == INT_MIN) - { - tp->tm_mon = tm.tm_mon; - tp->tm_mday = tm.tm_mday + ((tp->tm_hour - tm.tm_hour) < 0 ? 1 : 0); - mday_ok = 1; - } - - /* More fillers. */ - if (tp->tm_year == INT_MIN) - tp->tm_year = tm.tm_year; - if (tp->tm_mon == INT_MIN) - tp->tm_mon = tm.tm_mon; - - /* Check if the day of month is within range, and if the time can be - represented in a time_t. We make use of the fact that the mktime - call normalizes the struct tm. */ - if ((!mday_ok && !check_mday (TM_YEAR_BASE + tp->tm_year, tp->tm_mon, - tp->tm_mday)) - || mktime (tp) == (time_t) -1) - return 8; - - return 0; -} -#ifdef weak_alias -weak_alias (__getdate_r, getdate_r) -#endif - - -struct tm * -getdate (const char *string) -{ - /* Buffer returned by getdate. */ - static struct tm tmbuf; - int errval = __getdate_r (string, &tmbuf); - - if (errval != 0) - { - getdate_err = errval; - return NULL; - } - - return &tmbuf; -} diff --git a/time/getitimer.c b/time/getitimer.c deleted file mode 100644 index f42e728bdf..0000000000 --- a/time/getitimer.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stddef.h> -#include <errno.h> -#include <sys/time.h> - -/* Set *VALUE to the current setting of timer WHICH. - Return 0 on success, -1 on errors. */ -int -__getitimer (enum __itimer_which which, struct itimerval *value) -{ - if (value == NULL) - { - __set_errno (EINVAL); - return -1; - } - - __set_errno (ENOSYS); - return -1; -} -stub_warning (getitimer) - -weak_alias (__getitimer, getitimer) diff --git a/time/gettimeofday.c b/time/gettimeofday.c deleted file mode 100644 index 1d675b6b23..0000000000 --- a/time/gettimeofday.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <sys/time.h> - -/* Get the current time of day and timezone information, - putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled. - Returns 0 on success, -1 on errors. */ -int -__gettimeofday (struct timeval *tv, struct timezone *tz) -{ - __set_errno (ENOSYS); - return -1; -} -libc_hidden_def (__gettimeofday) -weak_alias (__gettimeofday, gettimeofday) -libc_hidden_weak (gettimeofday) - -stub_warning (gettimeofday) diff --git a/time/gmtime.c b/time/gmtime.c deleted file mode 100644 index 049d551cdf..0000000000 --- a/time/gmtime.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Convert `time_t' to `struct tm' in UTC. - Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <time.h> - -/* Return the `struct tm' representation of *T in UTC, - using *TP to store the result. */ -struct tm * -__gmtime_r (const time_t *t, struct tm *tp) -{ - return __tz_convert (t, 0, tp); -} -libc_hidden_def (__gmtime_r) -weak_alias (__gmtime_r, gmtime_r) - - -/* Return the `struct tm' representation of *T in UTC. */ -struct tm * -gmtime (const time_t *t) -{ - return __tz_convert (t, 0, &_tmbuf); -} diff --git a/time/lc-time-cleanup.c b/time/lc-time-cleanup.c deleted file mode 100644 index 92b5be5818..0000000000 --- a/time/lc-time-cleanup.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Cleanup code for data structures kept by strftime/strptime helper functions. - Copyright (C) 2002-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "../locale/localeinfo.h" -#include <stdlib.h> - -void internal_function -_nl_cleanup_time (struct __locale_data *locale) -{ - struct lc_time_data *const data = locale->private.time; - if (data != NULL) - { - locale->private.time = NULL; - locale->private.cleanup = NULL; - - free (data->eras); - free (data->alt_digits); - free (data->walt_digits); - - free (data); - } -} diff --git a/time/localtime.c b/time/localtime.c deleted file mode 100644 index 07dd67ca71..0000000000 --- a/time/localtime.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Convert `time_t' to `struct tm' in local time zone. - Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <time.h> - -/* The C Standard says that localtime and gmtime return the same pointer. */ -struct tm _tmbuf; - - -/* Return the `struct tm' representation of *T in local time, - using *TP to store the result. */ -struct tm * -__localtime_r (const time_t *t, struct tm *tp) -{ - return __tz_convert (t, 1, tp); -} -weak_alias (__localtime_r, localtime_r) - - -/* Return the `struct tm' representation of *T in local time. */ -struct tm * -localtime (const time_t *t) -{ - return __tz_convert (t, 1, &_tmbuf); -} -libc_hidden_def (localtime) diff --git a/time/mktime.c b/time/mktime.c deleted file mode 100644 index 4c48d358a1..0000000000 --- a/time/mktime.c +++ /dev/null @@ -1,741 +0,0 @@ -/* Convert a 'struct tm' to a time_t value. - Copyright (C) 1993-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Paul Eggert <eggert@twinsun.com>. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Define this to have a standalone program to test this implementation of - mktime. */ -/* #define DEBUG_MKTIME 1 */ - -#ifndef _LIBC -# include <config.h> -#endif - -/* Assume that leap seconds are possible, unless told otherwise. - If the host has a 'zic' command with a '-L leapsecondfilename' option, - then it supports leap seconds; otherwise it probably doesn't. */ -#ifndef LEAP_SECONDS_POSSIBLE -# define LEAP_SECONDS_POSSIBLE 1 -#endif - -#include <time.h> - -#include <limits.h> - -#include <string.h> /* For the real memcpy prototype. */ - -#if defined DEBUG_MKTIME && DEBUG_MKTIME -# include <stdio.h> -# include <stdlib.h> -/* Make it work even if the system's libc has its own mktime routine. */ -# undef mktime -# define mktime my_mktime -#endif /* DEBUG_MKTIME */ - -/* Some of the code in this file assumes that signed integer overflow - silently wraps around. This assumption can't easily be programmed - around, nor can it be checked for portably at compile-time or - easily eliminated at run-time. - - Define WRAPV to 1 if the assumption is valid and if - #pragma GCC optimize ("wrapv") - does not trigger GCC bug 51793 - <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51793>. - Otherwise, define it to 0; this forces the use of slower code that, - while not guaranteed by the C Standard, works on all production - platforms that we know about. */ -#ifndef WRAPV -# if (((__GNUC__ == 4 && 4 <= __GNUC_MINOR__) || 4 < __GNUC__) \ - && defined __GLIBC__) -# pragma GCC optimize ("wrapv") -# define WRAPV 1 -# else -# define WRAPV 0 -# endif -#endif - -/* Verify a requirement at compile-time (unlike assert, which is runtime). */ -#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } - -/* A signed type that is at least one bit wider than int. */ -#if INT_MAX <= LONG_MAX / 2 -typedef long int long_int; -#else -typedef long long int long_int; -#endif -verify (long_int_is_wide_enough, INT_MAX == INT_MAX * (long_int) 2 / 2); - -/* Shift A right by B bits portably, by dividing A by 2**B and - truncating towards minus infinity. A and B should be free of side - effects, and B should be in the range 0 <= B <= INT_BITS - 2, where - INT_BITS is the number of useful bits in an int. GNU code can - assume that INT_BITS is at least 32. - - ISO C99 says that A >> B is implementation-defined if A < 0. Some - implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift - right in the usual way when A < 0, so SHR falls back on division if - ordinary A >> B doesn't seem to be the usual signed shift. */ -#define SHR(a, b) \ - ((-1 >> 1 == -1 \ - && (long_int) -1 >> 1 == -1 \ - && ((time_t) -1 >> 1 == -1 || ! TYPE_SIGNED (time_t))) \ - ? (a) >> (b) \ - : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0)) - -/* The extra casts in the following macros work around compiler bugs, - e.g., in Cray C 5.0.3.0. */ - -/* True if the arithmetic type T is an integer type. bool counts as - an integer. */ -#define TYPE_IS_INTEGER(t) ((t) 1.5 == 1) - -/* True if negative values of the signed integer type T use two's - complement, or if T is an unsigned integer type. */ -#define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1) - -/* True if the arithmetic type T is signed. */ -#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) - -/* The maximum and minimum values for the integer type T. These - macros have undefined behavior if T is signed and has padding bits. - If this is a problem for you, please let us know how to fix it for - your host. */ -#define TYPE_MINIMUM(t) \ - ((t) (! TYPE_SIGNED (t) \ - ? (t) 0 \ - : ~ TYPE_MAXIMUM (t))) -#define TYPE_MAXIMUM(t) \ - ((t) (! TYPE_SIGNED (t) \ - ? (t) -1 \ - : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) - -#ifndef TIME_T_MIN -# define TIME_T_MIN TYPE_MINIMUM (time_t) -#endif -#ifndef TIME_T_MAX -# define TIME_T_MAX TYPE_MAXIMUM (time_t) -#endif -#define TIME_T_MIDPOINT (SHR (TIME_T_MIN + TIME_T_MAX, 1) + 1) - -verify (time_t_is_integer, TYPE_IS_INTEGER (time_t)); -verify (twos_complement_arithmetic, - (TYPE_TWOS_COMPLEMENT (int) - && TYPE_TWOS_COMPLEMENT (long_int) - && TYPE_TWOS_COMPLEMENT (time_t))); - -#define EPOCH_YEAR 1970 -#define TM_YEAR_BASE 1900 -verify (base_year_is_a_multiple_of_100, TM_YEAR_BASE % 100 == 0); - -/* Return 1 if YEAR + TM_YEAR_BASE is a leap year. */ -static int -leapyear (long_int year) -{ - /* Don't add YEAR to TM_YEAR_BASE, as that might overflow. - Also, work even if YEAR is negative. */ - return - ((year & 3) == 0 - && (year % 100 != 0 - || ((year / 100) & 3) == (- (TM_YEAR_BASE / 100) & 3))); -} - -/* How many days come before each month (0-12). */ -#ifndef _LIBC -static -#endif -const unsigned short int __mon_yday[2][13] = - { - /* Normal years. */ - { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, - /* Leap years. */ - { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } - }; - - -#ifndef _LIBC -/* Portable standalone applications should supply a <time.h> that - declares a POSIX-compliant localtime_r, for the benefit of older - implementations that lack localtime_r or have a nonstandard one. - See the gnulib time_r module for one way to implement this. */ -# undef __localtime_r -# define __localtime_r localtime_r -# define __mktime_internal mktime_internal -# include "mktime-internal.h" -#endif - -/* Return 1 if the values A and B differ according to the rules for - tm_isdst: A and B differ if one is zero and the other positive. */ -static int -isdst_differ (int a, int b) -{ - return (!a != !b) && (0 <= a) && (0 <= b); -} - -/* Return an integer value measuring (YEAR1-YDAY1 HOUR1:MIN1:SEC1) - - (YEAR0-YDAY0 HOUR0:MIN0:SEC0) in seconds, assuming that the clocks - were not adjusted between the time stamps. - - The YEAR values uses the same numbering as TP->tm_year. Values - need not be in the usual range. However, YEAR1 must not be less - than 2 * INT_MIN or greater than 2 * INT_MAX. - - The result may overflow. It is the caller's responsibility to - detect overflow. */ - -static time_t -ydhms_diff (long_int year1, long_int yday1, int hour1, int min1, int sec1, - int year0, int yday0, int hour0, int min0, int sec0) -{ - verify (C99_integer_division, -1 / 2 == 0); - - /* Compute intervening leap days correctly even if year is negative. - Take care to avoid integer overflow here. */ - int a4 = SHR (year1, 2) + SHR (TM_YEAR_BASE, 2) - ! (year1 & 3); - int b4 = SHR (year0, 2) + SHR (TM_YEAR_BASE, 2) - ! (year0 & 3); - int a100 = a4 / 25 - (a4 % 25 < 0); - int b100 = b4 / 25 - (b4 % 25 < 0); - int a400 = SHR (a100, 2); - int b400 = SHR (b100, 2); - int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400); - - /* Compute the desired time in time_t precision. Overflow might - occur here. */ - time_t tyear1 = year1; - time_t years = tyear1 - year0; - time_t days = 365 * years + yday1 - yday0 + intervening_leap_days; - time_t hours = 24 * days + hour1 - hour0; - time_t minutes = 60 * hours + min1 - min0; - time_t seconds = 60 * minutes + sec1 - sec0; - return seconds; -} - -/* Return the average of A and B, even if A + B would overflow. */ -static time_t -time_t_avg (time_t a, time_t b) -{ - return SHR (a, 1) + SHR (b, 1) + (a & b & 1); -} - -/* Return 1 if A + B does not overflow. If time_t is unsigned and if - B's top bit is set, assume that the sum represents A - -B, and - return 1 if the subtraction does not wrap around. */ -static int -time_t_add_ok (time_t a, time_t b) -{ - if (! TYPE_SIGNED (time_t)) - { - time_t sum = a + b; - return (sum < a) == (TIME_T_MIDPOINT <= b); - } - else if (WRAPV) - { - time_t sum = a + b; - return (sum < a) == (b < 0); - } - else - { - time_t avg = time_t_avg (a, b); - return TIME_T_MIN / 2 <= avg && avg <= TIME_T_MAX / 2; - } -} - -/* Return 1 if A + B does not overflow. */ -static int -time_t_int_add_ok (time_t a, int b) -{ - verify (int_no_wider_than_time_t, INT_MAX <= TIME_T_MAX); - if (WRAPV) - { - time_t sum = a + b; - return (sum < a) == (b < 0); - } - else - { - int a_odd = a & 1; - time_t avg = SHR (a, 1) + (SHR (b, 1) + (a_odd & b)); - return TIME_T_MIN / 2 <= avg && avg <= TIME_T_MAX / 2; - } -} - -/* Return a time_t value corresponding to (YEAR-YDAY HOUR:MIN:SEC), - assuming that *T corresponds to *TP and that no clock adjustments - occurred between *TP and the desired time. - If TP is null, return a value not equal to *T; this avoids false matches. - If overflow occurs, yield the minimal or maximal value, except do not - yield a value equal to *T. */ -static time_t -guess_time_tm (long_int year, long_int yday, int hour, int min, int sec, - const time_t *t, const struct tm *tp) -{ - if (tp) - { - time_t d = ydhms_diff (year, yday, hour, min, sec, - tp->tm_year, tp->tm_yday, - tp->tm_hour, tp->tm_min, tp->tm_sec); - if (time_t_add_ok (*t, d)) - return *t + d; - } - - /* Overflow occurred one way or another. Return the nearest result - that is actually in range, except don't report a zero difference - if the actual difference is nonzero, as that would cause a false - match; and don't oscillate between two values, as that would - confuse the spring-forward gap detector. */ - return (*t < TIME_T_MIDPOINT - ? (*t <= TIME_T_MIN + 1 ? *t + 1 : TIME_T_MIN) - : (TIME_T_MAX - 1 <= *t ? *t - 1 : TIME_T_MAX)); -} - -/* Use CONVERT to convert *T to a broken down time in *TP. - If *T is out of range for conversion, adjust it so that - it is the nearest in-range value and then convert that. */ -static struct tm * -ranged_convert (struct tm *(*convert) (const time_t *, struct tm *), - time_t *t, struct tm *tp) -{ - struct tm *r = convert (t, tp); - - if (!r && *t) - { - time_t bad = *t; - time_t ok = 0; - - /* BAD is a known unconvertible time_t, and OK is a known good one. - Use binary search to narrow the range between BAD and OK until - they differ by 1. */ - while (bad != ok + (bad < 0 ? -1 : 1)) - { - time_t mid = *t = time_t_avg (ok, bad); - r = convert (t, tp); - if (r) - ok = mid; - else - bad = mid; - } - - if (!r && ok) - { - /* The last conversion attempt failed; - revert to the most recent successful attempt. */ - *t = ok; - r = convert (t, tp); - } - } - - return r; -} - - -/* Convert *TP to a time_t value, inverting - the monotonic and mostly-unit-linear conversion function CONVERT. - Use *OFFSET to keep track of a guess at the offset of the result, - compared to what the result would be for UTC without leap seconds. - If *OFFSET's guess is correct, only one CONVERT call is needed. - This function is external because it is used also by timegm.c. */ -time_t -__mktime_internal (struct tm *tp, - struct tm *(*convert) (const time_t *, struct tm *), - time_t *offset) -{ - time_t t, gt, t0, t1, t2; - struct tm tm; - - /* The maximum number of probes (calls to CONVERT) should be enough - to handle any combinations of time zone rule changes, solar time, - leap seconds, and oscillations around a spring-forward gap. - POSIX.1 prohibits leap seconds, but some hosts have them anyway. */ - int remaining_probes = 6; - - /* Time requested. Copy it in case CONVERT modifies *TP; this can - occur if TP is localtime's returned value and CONVERT is localtime. */ - int sec = tp->tm_sec; - int min = tp->tm_min; - int hour = tp->tm_hour; - int mday = tp->tm_mday; - int mon = tp->tm_mon; - int year_requested = tp->tm_year; - int isdst = tp->tm_isdst; - - /* 1 if the previous probe was DST. */ - int dst2; - - /* Ensure that mon is in range, and set year accordingly. */ - int mon_remainder = mon % 12; - int negative_mon_remainder = mon_remainder < 0; - int mon_years = mon / 12 - negative_mon_remainder; - long_int lyear_requested = year_requested; - long_int year = lyear_requested + mon_years; - - /* The other values need not be in range: - the remaining code handles minor overflows correctly, - assuming int and time_t arithmetic wraps around. - Major overflows are caught at the end. */ - - /* Calculate day of year from year, month, and day of month. - The result need not be in range. */ - int mon_yday = ((__mon_yday[leapyear (year)] - [mon_remainder + 12 * negative_mon_remainder]) - - 1); - long_int lmday = mday; - long_int yday = mon_yday + lmday; - - time_t guessed_offset = *offset; - - int sec_requested = sec; - - if (LEAP_SECONDS_POSSIBLE) - { - /* Handle out-of-range seconds specially, - since ydhms_tm_diff assumes every minute has 60 seconds. */ - if (sec < 0) - sec = 0; - if (59 < sec) - sec = 59; - } - - /* Invert CONVERT by probing. First assume the same offset as last - time. */ - - t0 = ydhms_diff (year, yday, hour, min, sec, - EPOCH_YEAR - TM_YEAR_BASE, 0, 0, 0, - guessed_offset); - - if (TIME_T_MAX / INT_MAX / 366 / 24 / 60 / 60 < 3) - { - /* time_t isn't large enough to rule out overflows, so check - for major overflows. A gross check suffices, since if t0 - has overflowed, it is off by a multiple of TIME_T_MAX - - TIME_T_MIN + 1. So ignore any component of the difference - that is bounded by a small value. */ - - /* Approximate log base 2 of the number of time units per - biennium. A biennium is 2 years; use this unit instead of - years to avoid integer overflow. For example, 2 average - Gregorian years are 2 * 365.2425 * 24 * 60 * 60 seconds, - which is 63113904 seconds, and rint (log2 (63113904)) is - 26. */ - int ALOG2_SECONDS_PER_BIENNIUM = 26; - int ALOG2_MINUTES_PER_BIENNIUM = 20; - int ALOG2_HOURS_PER_BIENNIUM = 14; - int ALOG2_DAYS_PER_BIENNIUM = 10; - int LOG2_YEARS_PER_BIENNIUM = 1; - - int approx_requested_biennia = - (SHR (year_requested, LOG2_YEARS_PER_BIENNIUM) - - SHR (EPOCH_YEAR - TM_YEAR_BASE, LOG2_YEARS_PER_BIENNIUM) - + SHR (mday, ALOG2_DAYS_PER_BIENNIUM) - + SHR (hour, ALOG2_HOURS_PER_BIENNIUM) - + SHR (min, ALOG2_MINUTES_PER_BIENNIUM) - + (LEAP_SECONDS_POSSIBLE - ? 0 - : SHR (sec, ALOG2_SECONDS_PER_BIENNIUM))); - - int approx_biennia = SHR (t0, ALOG2_SECONDS_PER_BIENNIUM); - int diff = approx_biennia - approx_requested_biennia; - int approx_abs_diff = diff < 0 ? -1 - diff : diff; - - /* IRIX 4.0.5 cc miscalculates TIME_T_MIN / 3: it erroneously - gives a positive value of 715827882. Setting a variable - first then doing math on it seems to work. - (ghazi@caip.rutgers.edu) */ - time_t time_t_max = TIME_T_MAX; - time_t time_t_min = TIME_T_MIN; - time_t overflow_threshold = - (time_t_max / 3 - time_t_min / 3) >> ALOG2_SECONDS_PER_BIENNIUM; - - if (overflow_threshold < approx_abs_diff) - { - /* Overflow occurred. Try repairing it; this might work if - the time zone offset is enough to undo the overflow. */ - time_t repaired_t0 = -1 - t0; - approx_biennia = SHR (repaired_t0, ALOG2_SECONDS_PER_BIENNIUM); - diff = approx_biennia - approx_requested_biennia; - approx_abs_diff = diff < 0 ? -1 - diff : diff; - if (overflow_threshold < approx_abs_diff) - return -1; - guessed_offset += repaired_t0 - t0; - t0 = repaired_t0; - } - } - - /* Repeatedly use the error to improve the guess. */ - - for (t = t1 = t2 = t0, dst2 = 0; - (gt = guess_time_tm (year, yday, hour, min, sec, &t, - ranged_convert (convert, &t, &tm)), - t != gt); - t1 = t2, t2 = t, t = gt, dst2 = tm.tm_isdst != 0) - if (t == t1 && t != t2 - && (tm.tm_isdst < 0 - || (isdst < 0 - ? dst2 <= (tm.tm_isdst != 0) - : (isdst != 0) != (tm.tm_isdst != 0)))) - /* We can't possibly find a match, as we are oscillating - between two values. The requested time probably falls - within a spring-forward gap of size GT - T. Follow the common - practice in this case, which is to return a time that is GT - T - away from the requested time, preferring a time whose - tm_isdst differs from the requested value. (If no tm_isdst - was requested and only one of the two values has a nonzero - tm_isdst, prefer that value.) In practice, this is more - useful than returning -1. */ - goto offset_found; - else if (--remaining_probes == 0) - return -1; - - /* We have a match. Check whether tm.tm_isdst has the requested - value, if any. */ - if (isdst_differ (isdst, tm.tm_isdst)) - { - /* tm.tm_isdst has the wrong value. Look for a neighboring - time with the right value, and use its UTC offset. - - Heuristic: probe the adjacent timestamps in both directions, - looking for the desired isdst. This should work for all real - time zone histories in the tz database. */ - - /* Distance between probes when looking for a DST boundary. In - tzdata2003a, the shortest period of DST is 601200 seconds - (e.g., America/Recife starting 2000-10-08 01:00), and the - shortest period of non-DST surrounded by DST is 694800 - seconds (Africa/Tunis starting 1943-04-17 01:00). Use the - minimum of these two values, so we don't miss these short - periods when probing. */ - int stride = 601200; - - /* The longest period of DST in tzdata2003a is 536454000 seconds - (e.g., America/Jujuy starting 1946-10-01 01:00). The longest - period of non-DST is much longer, but it makes no real sense - to search for more than a year of non-DST, so use the DST - max. */ - int duration_max = 536454000; - - /* Search in both directions, so the maximum distance is half - the duration; add the stride to avoid off-by-1 problems. */ - int delta_bound = duration_max / 2 + stride; - - int delta, direction; - - for (delta = stride; delta < delta_bound; delta += stride) - for (direction = -1; direction <= 1; direction += 2) - if (time_t_int_add_ok (t, delta * direction)) - { - time_t ot = t + delta * direction; - struct tm otm; - ranged_convert (convert, &ot, &otm); - if (! isdst_differ (isdst, otm.tm_isdst)) - { - /* We found the desired tm_isdst. - Extrapolate back to the desired time. */ - t = guess_time_tm (year, yday, hour, min, sec, &ot, &otm); - ranged_convert (convert, &t, &tm); - goto offset_found; - } - } - } - - offset_found: - *offset = guessed_offset + t - t0; - - if (LEAP_SECONDS_POSSIBLE && sec_requested != tm.tm_sec) - { - /* Adjust time to reflect the tm_sec requested, not the normalized value. - Also, repair any damage from a false match due to a leap second. */ - int sec_adjustment = (sec == 0 && tm.tm_sec == 60) - sec; - if (! time_t_int_add_ok (t, sec_requested)) - return -1; - t1 = t + sec_requested; - if (! time_t_int_add_ok (t1, sec_adjustment)) - return -1; - t2 = t1 + sec_adjustment; - if (! convert (&t2, &tm)) - return -1; - t = t2; - } - - *tp = tm; - return t; -} - - -/* FIXME: This should use a signed type wide enough to hold any UTC - offset in seconds. 'int' should be good enough for GNU code. We - can't fix this unilaterally though, as other modules invoke - __mktime_internal. */ -static time_t localtime_offset; - -/* Convert *TP to a time_t value. */ -time_t -mktime (struct tm *tp) -{ -#ifdef _LIBC - /* POSIX.1 8.1.1 requires that whenever mktime() is called, the - time zone names contained in the external variable 'tzname' shall - be set as if the tzset() function had been called. */ - __tzset (); -#endif - - return __mktime_internal (tp, __localtime_r, &localtime_offset); -} - -#ifdef weak_alias -weak_alias (mktime, timelocal) -#endif - -#ifdef _LIBC -libc_hidden_def (mktime) -libc_hidden_weak (timelocal) -#endif - -#if defined DEBUG_MKTIME && DEBUG_MKTIME - -static int -not_equal_tm (const struct tm *a, const struct tm *b) -{ - return ((a->tm_sec ^ b->tm_sec) - | (a->tm_min ^ b->tm_min) - | (a->tm_hour ^ b->tm_hour) - | (a->tm_mday ^ b->tm_mday) - | (a->tm_mon ^ b->tm_mon) - | (a->tm_year ^ b->tm_year) - | (a->tm_yday ^ b->tm_yday) - | isdst_differ (a->tm_isdst, b->tm_isdst)); -} - -static void -print_tm (const struct tm *tp) -{ - if (tp) - printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d", - tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday, - tp->tm_hour, tp->tm_min, tp->tm_sec, - tp->tm_yday, tp->tm_wday, tp->tm_isdst); - else - printf ("0"); -} - -static int -check_result (time_t tk, struct tm tmk, time_t tl, const struct tm *lt) -{ - if (tk != tl || !lt || not_equal_tm (&tmk, lt)) - { - printf ("mktime ("); - print_tm (lt); - printf (")\nyields ("); - print_tm (&tmk); - printf (") == %ld, should be %ld\n", (long int) tk, (long int) tl); - return 1; - } - - return 0; -} - -int -main (int argc, char **argv) -{ - int status = 0; - struct tm tm, tmk, tml; - struct tm *lt; - time_t tk, tl, tl1; - char trailer; - - if ((argc == 3 || argc == 4) - && (sscanf (argv[1], "%d-%d-%d%c", - &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer) - == 3) - && (sscanf (argv[2], "%d:%d:%d%c", - &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer) - == 3)) - { - tm.tm_year -= TM_YEAR_BASE; - tm.tm_mon--; - tm.tm_isdst = argc == 3 ? -1 : atoi (argv[3]); - tmk = tm; - tl = mktime (&tmk); - lt = localtime (&tl); - if (lt) - { - tml = *lt; - lt = &tml; - } - printf ("mktime returns %ld == ", (long int) tl); - print_tm (&tmk); - printf ("\n"); - status = check_result (tl, tmk, tl, lt); - } - else if (argc == 4 || (argc == 5 && strcmp (argv[4], "-") == 0)) - { - time_t from = atol (argv[1]); - time_t by = atol (argv[2]); - time_t to = atol (argv[3]); - - if (argc == 4) - for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1) - { - lt = localtime (&tl); - if (lt) - { - tmk = tml = *lt; - tk = mktime (&tmk); - status |= check_result (tk, tmk, tl, &tml); - } - else - { - printf ("localtime (%ld) yields 0\n", (long int) tl); - status = 1; - } - tl1 = tl + by; - if ((tl1 < tl) != (by < 0)) - break; - } - else - for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1) - { - /* Null benchmark. */ - lt = localtime (&tl); - if (lt) - { - tmk = tml = *lt; - tk = tl; - status |= check_result (tk, tmk, tl, &tml); - } - else - { - printf ("localtime (%ld) yields 0\n", (long int) tl); - status = 1; - } - tl1 = tl + by; - if ((tl1 < tl) != (by < 0)) - break; - } - } - else - printf ("Usage:\ -\t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n\ -\t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n\ -\t%s FROM BY TO - # Do not test those values (for benchmark).\n", - argv[0], argv[0], argv[0]); - - return status; -} - -#endif /* DEBUG_MKTIME */ - -/* -Local Variables: -compile-command: "gcc -DDEBUG_MKTIME -I. -Wall -W -O2 -g mktime.c -o mktime" -End: -*/ diff --git a/time/offtime.c b/time/offtime.c deleted file mode 100644 index 75a28fed84..0000000000 --- a/time/offtime.c +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <time.h> - -#define SECS_PER_HOUR (60 * 60) -#define SECS_PER_DAY (SECS_PER_HOUR * 24) - -/* Compute the `struct tm' representation of *T, - offset OFFSET seconds east of UTC, - and store year, yday, mon, mday, wday, hour, min, sec into *TP. - Return nonzero if successful. */ -int -__offtime (const time_t *t, long int offset, struct tm *tp) -{ - time_t days, rem, y; - const unsigned short int *ip; - - days = *t / SECS_PER_DAY; - rem = *t % SECS_PER_DAY; - rem += offset; - while (rem < 0) - { - rem += SECS_PER_DAY; - --days; - } - while (rem >= SECS_PER_DAY) - { - rem -= SECS_PER_DAY; - ++days; - } - tp->tm_hour = rem / SECS_PER_HOUR; - rem %= SECS_PER_HOUR; - tp->tm_min = rem / 60; - tp->tm_sec = rem % 60; - /* January 1, 1970 was a Thursday. */ - tp->tm_wday = (4 + days) % 7; - if (tp->tm_wday < 0) - tp->tm_wday += 7; - y = 1970; - -#define DIV(a, b) ((a) / (b) - ((a) % (b) < 0)) -#define LEAPS_THRU_END_OF(y) (DIV (y, 4) - DIV (y, 100) + DIV (y, 400)) - - while (days < 0 || days >= (__isleap (y) ? 366 : 365)) - { - /* Guess a corrected year, assuming 365 days per year. */ - time_t yg = y + days / 365 - (days % 365 < 0); - - /* Adjust DAYS and Y to match the guessed year. */ - days -= ((yg - y) * 365 - + LEAPS_THRU_END_OF (yg - 1) - - LEAPS_THRU_END_OF (y - 1)); - y = yg; - } - tp->tm_year = y - 1900; - if (tp->tm_year != y - 1900) - { - /* The year cannot be represented due to overflow. */ - __set_errno (EOVERFLOW); - return 0; - } - tp->tm_yday = days; - ip = __mon_yday[__isleap(y)]; - for (y = 11; days < (long int) ip[y]; --y) - continue; - days -= ip[y]; - tp->tm_mon = y; - tp->tm_mday = days + 1; - return 1; -} diff --git a/time/setitimer.c b/time/setitimer.c deleted file mode 100644 index 65d85a79af..0000000000 --- a/time/setitimer.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stddef.h> -#include <errno.h> -#include <sys/time.h> - -/* Set the timer WHICH to *NEW. If OLD is not NULL, - set *OLD to the old value of timer WHICH. - Returns 0 on success, -1 on errors. */ -int -__setitimer (enum __itimer_which which, const struct itimerval *new, - struct itimerval *old) -{ - if (new == NULL) - { - __set_errno (EINVAL); - return -1; - } - - __set_errno (ENOSYS); - return -1; -} -stub_warning (setitimer) - -weak_alias (__setitimer, setitimer) diff --git a/time/settimeofday.c b/time/settimeofday.c deleted file mode 100644 index 317c93d35f..0000000000 --- a/time/settimeofday.c +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <sys/time.h> - -/* Set the current time of day and timezone information. - This call is restricted to the super-user. */ -int -__settimeofday (const struct timeval *tv, const struct timezone *tz) -{ - __set_errno (ENOSYS); - return -1; -} -stub_warning (settimeofday) - -weak_alias (__settimeofday, settimeofday) diff --git a/time/stime.c b/time/stime.c deleted file mode 100644 index 723eedacf1..0000000000 --- a/time/stime.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 1992-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <time.h> -#include <stddef.h> - -/* Set the system clock to *WHEN. */ - -int -stime (const time_t *when) -{ - if (when == NULL) - { - __set_errno (EINVAL); - return -1; - } - - __set_errno (ENOSYS); - return -1; -} - -stub_warning (stime) diff --git a/time/strftime.c b/time/strftime.c deleted file mode 100644 index eeab20e2b3..0000000000 --- a/time/strftime.c +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <time.h> -#include <locale/localeinfo.h> - - -size_t -strftime (char *s, size_t maxsize, const char *format, const struct tm *tp) -{ - return __strftime_l (s, maxsize, format, tp, _NL_CURRENT_LOCALE); -} -libc_hidden_def (strftime) diff --git a/time/strftime_l.c b/time/strftime_l.c deleted file mode 100644 index eb3efb8129..0000000000 --- a/time/strftime_l.c +++ /dev/null @@ -1,1425 +0,0 @@ -/* Copyright (C) 2002-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#ifdef _LIBC -# define USE_IN_EXTENDED_LOCALE_MODEL 1 -# define HAVE_LIMITS_H 1 -# define HAVE_MBLEN 1 -# define HAVE_MBRLEN 1 -# define HAVE_STRUCT_ERA_ENTRY 1 -# define HAVE_TM_GMTOFF 1 -# define HAVE_TM_ZONE 1 -# define HAVE_TZNAME 1 -# define HAVE_TZSET 1 -# define HAVE_STRFTIME 0 -# define MULTIBYTE_IS_FORMAT_SAFE 1 -# define STDC_HEADERS 1 -# include "../locale/localeinfo.h" -#endif - -#if defined emacs && !defined HAVE_BCOPY -# define HAVE_MEMCPY 1 -#endif - -#include <ctype.h> -#include <sys/types.h> /* Some systems define `time_t' here. */ - -#ifdef TIME_WITH_SYS_TIME -# include <sys/time.h> -# include <time.h> -#else -# ifdef HAVE_SYS_TIME_H -# include <sys/time.h> -# else -# include <time.h> -# endif -#endif -#if HAVE_TZNAME -extern char *tzname[]; -#endif - -/* Do multibyte processing if multibytes are supported, unless - multibyte sequences are safe in formats. Multibyte sequences are - safe if they cannot contain byte sequences that look like format - conversion specifications. The GNU C Library uses UTF8 multibyte - encoding, which is safe for formats, but strftime.c can be used - with other C libraries that use unsafe encodings. */ -#define DO_MULTIBYTE (HAVE_MBLEN && ! MULTIBYTE_IS_FORMAT_SAFE) - -#if DO_MULTIBYTE -# if HAVE_MBRLEN -# include <wchar.h> -# else - /* Simulate mbrlen with mblen as best we can. */ -# define mbstate_t int -# define mbrlen(s, n, ps) mblen (s, n) -# define mbsinit(ps) (*(ps) == 0) -# endif - static const mbstate_t mbstate_zero; -#endif - -#if HAVE_LIMITS_H -# include <limits.h> -#endif - -#if STDC_HEADERS -# 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)) -# endif -#endif - -#ifdef COMPILE_WIDE -# include <endian.h> -# define CHAR_T wchar_t -# define UCHAR_T unsigned int -# define L_(Str) L##Str -# define NLW(Sym) _NL_W##Sym - -# define MEMCPY(d, s, n) __wmemcpy (d, s, n) -# define STRLEN(s) __wcslen (s) - -#else -# define CHAR_T char -# define UCHAR_T unsigned char -# define L_(Str) Str -# define NLW(Sym) Sym - -# if !defined STDC_HEADERS && !defined HAVE_MEMCPY -# define MEMCPY(d, s, n) bcopy ((s), (d), (n)) -# else -# define MEMCPY(d, s, n) memcpy ((d), (s), (n)) -# endif -# define STRLEN(s) strlen (s) - -# ifdef _LIBC -# define MEMPCPY(d, s, n) __mempcpy (d, s, n) -# else -# ifndef HAVE_MEMPCPY -# define MEMPCPY(d, s, n) ((void *) ((char *) memcpy (d, s, n) + (n))) -# endif -# endif -#endif - -#ifndef PTR -# define PTR void * -#endif - -#ifndef CHAR_BIT -# define CHAR_BIT 8 -#endif - -#ifndef NULL -# define NULL 0 -#endif - -#define TYPE_SIGNED(t) ((t) -1 < 0) - -/* Bound on length of the string representing an integer value of type t. - Subtract one for the sign bit if t is signed; - 302 / 1000 is log10 (2) rounded up; - add one for integer division truncation; - add one more for a minus sign if t is signed. */ -#define INT_STRLEN_BOUND(t) \ - ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 + 1 + TYPE_SIGNED (t)) - -#define TM_YEAR_BASE 1900 - -#ifndef __isleap -/* Nonzero if YEAR is a leap year (every 4 years, - except every 100th isn't, and every 400th is). */ -# define __isleap(year) \ - ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) -#endif - - -#ifdef _LIBC -# define tzname __tzname -# define tzset __tzset -#endif - -#if !HAVE_TM_GMTOFF -/* Portable standalone applications should supply a "time_r.h" that - declares a POSIX-compliant localtime_r, for the benefit of older - implementations that lack localtime_r or have a nonstandard one. - Similarly for gmtime_r. See the gnulib time_r module for one way - to implement this. */ -# include "time_r.h" -# undef __gmtime_r -# undef __localtime_r -# define __gmtime_r gmtime_r -# define __localtime_r localtime_r -#endif - - -#if !defined memset && !defined HAVE_MEMSET && !defined _LIBC -/* Some systems lack the `memset' function and we don't want to - introduce additional dependencies. */ -/* The SGI compiler reportedly barfs on the trailing null - if we use a string constant as the initializer. 28 June 1997, rms. */ -static const CHAR_T spaces[16] = /* " " */ -{ - L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '), - L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' ') -}; -static const CHAR_T zeroes[16] = /* "0000000000000000" */ -{ - L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'), - L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0') -}; - -# define memset_space(P, Len) \ - do { \ - int _len = (Len); \ - \ - do \ - { \ - int _this = _len > 16 ? 16 : _len; \ - (P) = MEMPCPY ((P), spaces, _this * sizeof (CHAR_T)); \ - _len -= _this; \ - } \ - while (_len > 0); \ - } while (0) - -# define memset_zero(P, Len) \ - do { \ - int _len = (Len); \ - \ - do \ - { \ - int _this = _len > 16 ? 16 : _len; \ - (P) = MEMPCPY ((P), zeroes, _this * sizeof (CHAR_T)); \ - _len -= _this; \ - } \ - while (_len > 0); \ - } while (0) -#else -# ifdef COMPILE_WIDE -# define memset_space(P, Len) (wmemset ((P), L' ', (Len)), (P) += (Len)) -# define memset_zero(P, Len) (wmemset ((P), L'0', (Len)), (P) += (Len)) -# else -# define memset_space(P, Len) (memset ((P), ' ', (Len)), (P) += (Len)) -# define memset_zero(P, Len) (memset ((P), '0', (Len)), (P) += (Len)) -# endif -#endif - -#define add(n, f) \ - do \ - { \ - int _n = (n); \ - int _delta = width - _n; \ - int _incr = _n + (_delta > 0 ? _delta : 0); \ - if ((size_t) _incr >= maxsize - i) \ - return 0; \ - if (p) \ - { \ - if (_delta > 0) \ - { \ - if (pad == L_('0')) \ - memset_zero (p, _delta); \ - else \ - memset_space (p, _delta); \ - } \ - f; \ - p += _n; \ - } \ - i += _incr; \ - } while (0) - -#define cpy(n, s) \ - add ((n), \ - if (to_lowcase) \ - memcpy_lowcase (p, (s), _n LOCALE_ARG); \ - else if (to_uppcase) \ - memcpy_uppcase (p, (s), _n LOCALE_ARG); \ - else \ - MEMCPY ((PTR) p, (const PTR) (s), _n)) - -#ifdef COMPILE_WIDE -# ifndef USE_IN_EXTENDED_LOCALE_MODEL -# undef __mbsrtowcs_l -# define __mbsrtowcs_l(d, s, l, st, loc) __mbsrtowcs (d, s, l, st) -# endif -# define widen(os, ws, l) \ - { \ - mbstate_t __st; \ - const char *__s = os; \ - memset (&__st, '\0', sizeof (__st)); \ - l = __mbsrtowcs_l (NULL, &__s, 0, &__st, loc); \ - ws = alloca ((l + 1) * sizeof (wchar_t)); \ - (void) __mbsrtowcs_l (ws, &__s, l, &__st, loc); \ - } -#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 strftime __strftime_l -# define wcsftime __wcsftime_l -# undef _NL_CURRENT -# define _NL_CURRENT(category, item) \ - (current->values[_NL_ITEM_INDEX (item)].string) -# define LOCALE_PARAM , __locale_t loc -# define LOCALE_ARG , loc -# define HELPER_LOCALE_ARG , current -#else -# define LOCALE_PARAM -# define LOCALE_ARG -# ifdef _LIBC -# define HELPER_LOCALE_ARG , _NL_CURRENT_DATA (LC_TIME) -# else -# define HELPER_LOCALE_ARG -# endif -#endif - -#ifdef COMPILE_WIDE -# ifdef USE_IN_EXTENDED_LOCALE_MODEL -# define TOUPPER(Ch, L) __towupper_l (Ch, L) -# define TOLOWER(Ch, L) __towlower_l (Ch, L) -# else -# define TOUPPER(Ch, L) towupper (Ch) -# define TOLOWER(Ch, L) towlower (Ch) -# endif -#else -# ifdef _LIBC -# ifdef USE_IN_EXTENDED_LOCALE_MODEL -# define TOUPPER(Ch, L) __toupper_l (Ch, L) -# define TOLOWER(Ch, L) __tolower_l (Ch, L) -# else -# define TOUPPER(Ch, L) toupper (Ch) -# define TOLOWER(Ch, L) tolower (Ch) -# endif -# else -# define TOUPPER(Ch, L) (islower (Ch) ? toupper (Ch) : (Ch)) -# define TOLOWER(Ch, L) (isupper (Ch) ? tolower (Ch) : (Ch)) -# endif -#endif -/* We don't use `isdigit' here since the locale dependent - interpretation is not what we want here. We only need to accept - the arabic digits in the ASCII range. One day there is perhaps a - more reliable way to accept other sets of digits. */ -#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) __THROW; - -static CHAR_T * -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); - return dest; -} - -static CHAR_T *memcpy_uppcase (CHAR_T *dest, const CHAR_T *src, - size_t len LOCALE_PARAM) __THROW; - -static CHAR_T * -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); - return dest; -} - - -#if ! HAVE_TM_GMTOFF -/* Yield the difference between *A and *B, - measured in seconds, ignoring leap seconds. */ -# define tm_diff ftime_tm_diff -static int tm_diff (const struct tm *, const struct tm *) __THROW; -static int -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, - but it's OK to assume that A and B are close to each other. */ - int a4 = (a->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (a->tm_year & 3); - int b4 = (b->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (b->tm_year & 3); - int a100 = a4 / 25 - (a4 % 25 < 0); - int b100 = b4 / 25 - (b4 % 25 < 0); - int a400 = a100 >> 2; - int b400 = b100 >> 2; - int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400); - int years = a->tm_year - b->tm_year; - int days = (365 * years + intervening_leap_days - + (a->tm_yday - b->tm_yday)); - return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour)) - + (a->tm_min - b->tm_min)) - + (a->tm_sec - b->tm_sec)); -} -#endif /* ! HAVE_TM_GMTOFF */ - - - -/* The number of days from the first day of the first ISO week of this - year to the year day YDAY with week day WDAY. ISO weeks start on - Monday; the first ISO week has the year's first Thursday. YDAY may - be as small as YDAY_MINIMUM. */ -#define ISO_WEEK_START_WDAY 1 /* Monday */ -#define ISO_WEEK1_WDAY 4 /* Thursday */ -#define YDAY_MINIMUM (-366) -static int iso_week_days (int, int) __THROW; -#ifdef __GNUC__ -__inline__ -#endif -static int -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; - return (yday - - (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7 - + ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY); -} - - -#if !(defined _NL_CURRENT || HAVE_STRFTIME) -static CHAR_T const weekday_name[][10] = - { - L_("Sunday"), L_("Monday"), L_("Tuesday"), L_("Wednesday"), - L_("Thursday"), L_("Friday"), L_("Saturday") - }; -static CHAR_T const month_name[][10] = - { - L_("January"), L_("February"), L_("March"), L_("April"), L_("May"), - L_("June"), L_("July"), L_("August"), L_("September"), L_("October"), - L_("November"), L_("December") - }; -#endif - - -#ifdef emacs -# define my_strftime emacs_strftimeu -# define ut_argument , ut -# define ut_argument_spec , int ut -#else -# ifdef COMPILE_WIDE -# define my_strftime wcsftime -# define nl_get_alt_digit _nl_get_walt_digit -# else -# define my_strftime strftime -# define nl_get_alt_digit _nl_get_alt_digit -# endif -# define ut_argument -# define ut_argument_spec -/* 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 - LOCALE_PARAM) __THROW; - -/* Write information from TP into S according to the format - string FORMAT, writing no more that MAXSIZE characters - (including the terminating '\0') and returning number of - 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 (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. - Work around this bug by copying *tp before it might be munged. */ - struct tm tmcopy; - tmcopy = *tp; - tp = &tmcopy; -#endif - bool tzset_called = false; - return __strftime_internal (s, maxsize, format, tp, &tzset_called - ut_argument LOCALE_ARG); -} -#ifdef _LIBC -libc_hidden_def (my_strftime) -#endif - -static size_t -__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]; -#endif - - int hour12 = tp->tm_hour; -#ifdef _NL_CURRENT - /* We cannot make the following values variables since we must delay - the evaluation of these values until really needed since some - expressions might not be valid in every situation. The `struct tm' - might be generated by a strptime() call that initialized - 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 *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ - ? "?" : _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))) -# define f_wkday \ - ((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 *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ - ? "?" : _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))) -# define f_month \ - ((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))) - -# define aw_len STRLEN (a_wkday) -# define am_len STRLEN (a_month) -# define ap_len STRLEN (ampm) -#else -# if !HAVE_STRFTIME -# 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)) - - size_t aw_len = 3; - size_t am_len = 3; - size_t ap_len = 2; -# endif -#endif - const char *zone; - size_t i = 0; - CHAR_T *p = s; - const CHAR_T *f; -#if DO_MULTIBYTE && !defined COMPILE_WIDE - const char *format_end = NULL; -#endif - - zone = NULL; -#if HAVE_TM_ZONE - /* The POSIX test suite assumes that setting - the environment variable TZ to a new value before calling strftime() - will influence the result (the %Z format) even if the information in - TP is computed with a totally different time zone. - This is bogus: though POSIX allows bad behavior like this, - POSIX does not require it. Do the right thing instead. */ - zone = (const char *) tp->tm_zone; -#endif -#if HAVE_TZNAME - if (ut) - { - if (! (zone && *zone)) - zone = "GMT"; - } -#endif - - if (hour12 > 12) - hour12 -= 12; - else - if (hour12 == 0) - hour12 = 12; - - for (f = format; *f != '\0'; ++f) - { - int pad = 0; /* Padding for number ('-', '_', or 0). */ - int modifier; /* Field modifier ('E', 'O', or 0). */ - int digits; /* Max digits for numeric format. */ - int number_value; /* Numeric value to be printed. */ - int negative_number; /* 1 if the number is negative. */ - const CHAR_T *subfmt; - CHAR_T *bufp; - CHAR_T buf[1 + (sizeof (int) < sizeof (time_t) - ? INT_STRLEN_BOUND (time_t) - : INT_STRLEN_BOUND (int))]; - int width = -1; - int to_lowcase = 0; - int to_uppcase = 0; - int change_case = 0; - int format_char; - -#if DO_MULTIBYTE && !defined COMPILE_WIDE - switch (*f) - { - case L_('%'): - break; - - case L_('\b'): case L_('\t'): case L_('\n'): - case L_('\v'): case L_('\f'): case L_('\r'): - case L_(' '): case L_('!'): case L_('"'): case L_('#'): case L_('&'): - case L_('\''): case L_('('): case L_(')'): case L_('*'): case L_('+'): - case L_(','): case L_('-'): case L_('.'): case L_('/'): case L_('0'): - case L_('1'): case L_('2'): case L_('3'): case L_('4'): case L_('5'): - case L_('6'): case L_('7'): case L_('8'): case L_('9'): case L_(':'): - case L_(';'): case L_('<'): case L_('='): case L_('>'): case L_('?'): - case L_('A'): case L_('B'): case L_('C'): case L_('D'): case L_('E'): - case L_('F'): case L_('G'): case L_('H'): case L_('I'): case L_('J'): - case L_('K'): case L_('L'): case L_('M'): case L_('N'): case L_('O'): - case L_('P'): case L_('Q'): case L_('R'): case L_('S'): case L_('T'): - case L_('U'): case L_('V'): case L_('W'): case L_('X'): case L_('Y'): - case L_('Z'): case L_('['): case L_('\\'): case L_(']'): case L_('^'): - case L_('_'): case L_('a'): case L_('b'): case L_('c'): case L_('d'): - case L_('e'): case L_('f'): case L_('g'): case L_('h'): case L_('i'): - case L_('j'): case L_('k'): case L_('l'): case L_('m'): case L_('n'): - case L_('o'): case L_('p'): case L_('q'): case L_('r'): case L_('s'): - case L_('t'): case L_('u'): case L_('v'): case L_('w'): case L_('x'): - case L_('y'): case L_('z'): case L_('{'): case L_('|'): case L_('}'): - case L_('~'): - /* The C Standard requires these 98 characters (plus '%') to - be in the basic execution character set. None of these - characters can start a multibyte sequence, so they need - not be analyzed further. */ - add (1, *p = *f); - continue; - - default: - /* Copy this multibyte sequence until we reach its end, find - an error, or come back to the initial shift state. */ - { - mbstate_t mbstate = mbstate_zero; - size_t len = 0; - size_t fsize; - - if (! format_end) - format_end = f + strlen (f) + 1; - fsize = format_end - f; - - do - { - size_t bytes = mbrlen (f + len, fsize - len, &mbstate); - - if (bytes == 0) - break; - - if (bytes == (size_t) -2) - { - len += strlen (f + len); - break; - } - - if (bytes == (size_t) -1) - { - len++; - break; - } - - len += bytes; - } - while (! mbsinit (&mbstate)); - - cpy (len, f); - f += len - 1; - continue; - } - } - -#else /* ! DO_MULTIBYTE */ - - /* Either multibyte encodings are not supported, they are - safe for formats, so any non-'%' byte can be copied through, - or this is the wide character version. */ - if (*f != L_('%')) - { - add (1, *p = *f); - continue; - } - -#endif /* ! DO_MULTIBYTE */ - - /* Check for flags that can modify a format. */ - while (1) - { - switch (*++f) - { - /* This influences the number formats. */ - case L_('_'): - case L_('-'): - case L_('0'): - pad = *f; - continue; - - /* This changes textual output. */ - case L_('^'): - to_uppcase = 1; - continue; - case L_('#'): - change_case = 1; - continue; - - default: - break; - } - break; - } - - /* As a GNU extension we allow to specify the field width. */ - if (ISDIGIT (*f)) - { - width = 0; - do - { - if (width > INT_MAX / 10 - || (width == INT_MAX / 10 && *f - L_('0') > INT_MAX % 10)) - /* Avoid overflow. */ - width = INT_MAX; - else - { - width *= 10; - width += *f - L_('0'); - } - ++f; - } - while (ISDIGIT (*f)); - } - - /* Check for modifiers. */ - switch (*f) - { - case L_('E'): - case L_('O'): - modifier = *f++; - break; - - default: - modifier = 0; - break; - } - - /* Now do the specified format. */ - format_char = *f; - switch (format_char) - { -#define DO_NUMBER(d, v) \ - digits = d > width ? d : width; \ - number_value = v; goto do_number -#define DO_NUMBER_SPACEPAD(d, v) \ - digits = d > width ? d : width; \ - number_value = v; goto do_number_spacepad - - case L_('%'): - if (modifier != 0) - goto bad_format; - add (1, *p = *f); - break; - - case L_('a'): - if (modifier != 0) - goto bad_format; - if (change_case) - { - to_uppcase = 1; - to_lowcase = 0; - } -#if defined _NL_CURRENT || !HAVE_STRFTIME - cpy (aw_len, a_wkday); - break; -#else - goto underlying_strftime; -#endif - - case 'A': - if (modifier != 0) - goto bad_format; - if (change_case) - { - to_uppcase = 1; - to_lowcase = 0; - } -#if defined _NL_CURRENT || !HAVE_STRFTIME - cpy (STRLEN (f_wkday), f_wkday); - break; -#else - goto underlying_strftime; -#endif - - case L_('b'): - case L_('h'): - if (change_case) - { - to_uppcase = 1; - to_lowcase = 0; - } - if (modifier != 0) - goto bad_format; -#if defined _NL_CURRENT || !HAVE_STRFTIME - cpy (am_len, a_month); - break; -#else - goto underlying_strftime; -#endif - - case L_('B'): - if (modifier != 0) - goto bad_format; - if (change_case) - { - to_uppcase = 1; - to_lowcase = 0; - } -#if defined _NL_CURRENT || !HAVE_STRFTIME - cpy (STRLEN (f_month), f_month); - break; -#else - goto underlying_strftime; -#endif - - case L_('c'): - if (modifier == L_('O')) - goto bad_format; -#ifdef _NL_CURRENT - if (! (modifier == 'E' - && (*(subfmt = - (const CHAR_T *) _NL_CURRENT (LC_TIME, - NLW(ERA_D_T_FMT))) - != '\0'))) - subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_T_FMT)); -#else -# if HAVE_STRFTIME - goto underlying_strftime; -# else - subfmt = L_("%a %b %e %H:%M:%S %Y"); -# endif -#endif - - subformat: - { - CHAR_T *old_start = p; - 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) - { - *old_start = TOUPPER ((UCHAR_T) *old_start, loc); - ++old_start; - } - } - break; - -#if HAVE_STRFTIME && ! (defined _NL_CURRENT && HAVE_STRUCT_ERA_ENTRY) - underlying_strftime: - { - /* The relevant information is available only via the - underlying strftime implementation, so use that. */ - char ufmt[4]; - char *u = ufmt; - char ubuf[1024]; /* enough for any single format in practice */ - size_t len; - /* Make sure we're calling the actual underlying strftime. - In some cases, config.h contains something like - "#define strftime rpl_strftime". */ -# ifdef strftime -# undef strftime - size_t strftime (); -# endif - - *u++ = '%'; - if (modifier != 0) - *u++ = modifier; - *u++ = format_char; - *u = '\0'; - len = strftime (ubuf, sizeof ubuf, ufmt, tp); - if (len == 0 && ubuf[0] != '\0') - return 0; - cpy (len, ubuf); - } - break; -#endif - - case L_('C'): - if (modifier == L_('E')) - { -#if HAVE_STRUCT_ERA_ENTRY - struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); - if (era) - { -# ifdef COMPILE_WIDE - size_t len = __wcslen (era->era_wname); - cpy (len, era->era_wname); -# else - size_t len = strlen (era->era_name); - cpy (len, era->era_name); -# endif - break; - } -#else -# if HAVE_STRFTIME - goto underlying_strftime; -# endif -#endif - } - - { - int year = tp->tm_year + TM_YEAR_BASE; - DO_NUMBER (1, year / 100 - (year % 100 < 0)); - } - - case L_('x'): - if (modifier == L_('O')) - goto bad_format; -#ifdef _NL_CURRENT - if (! (modifier == L_('E') - && (*(subfmt = - (const CHAR_T *)_NL_CURRENT (LC_TIME, NLW(ERA_D_FMT))) - != L_('\0')))) - subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_FMT)); - goto subformat; -#else -# if HAVE_STRFTIME - goto underlying_strftime; -# else - /* Fall through. */ -# endif -#endif - case L_('D'): - if (modifier != 0) - goto bad_format; - subfmt = L_("%m/%d/%y"); - goto subformat; - - case L_('d'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, tp->tm_mday); - - case L_('e'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER_SPACEPAD (2, tp->tm_mday); - - /* All numeric formats set DIGITS and NUMBER_VALUE and then - jump to one of these two labels. */ - - do_number_spacepad: - /* Force `_' flag unless overwritten by `0' or '-' flag. */ - if (pad != L_('0') && pad != L_('-')) - pad = L_('_'); - - do_number: - /* Format the number according to the MODIFIER flag. */ - - if (modifier == L_('O') && 0 <= number_value) - { -#ifdef _NL_CURRENT - /* Get the locale specific alternate representation of - the number NUMBER_VALUE. If none exist NULL is returned. */ - const CHAR_T *cp = nl_get_alt_digit (number_value - HELPER_LOCALE_ARG); - - if (cp != NULL) - { - size_t digitlen = STRLEN (cp); - if (digitlen != 0) - { - cpy (digitlen, cp); - break; - } - } -#else -# if HAVE_STRFTIME - goto underlying_strftime; -# endif -#endif - } - { - unsigned int u = number_value; - - bufp = buf + sizeof (buf) / sizeof (buf[0]); - negative_number = number_value < 0; - - if (negative_number) - u = -u; - - do - *--bufp = u % 10 + L_('0'); - while ((u /= 10) != 0); - } - - do_number_sign_and_padding: - if (negative_number) - *--bufp = L_('-'); - - if (pad != L_('-')) - { - int padding = digits - (buf + (sizeof (buf) / sizeof (buf[0])) - - bufp); - - if (padding > 0) - { - if (pad == L_('_')) - { - if ((size_t) padding >= maxsize - i) - return 0; - - if (p) - memset_space (p, padding); - i += padding; - width = width > padding ? width - padding : 0; - } - else - { - if ((size_t) digits >= maxsize - i) - return 0; - - if (negative_number) - { - ++bufp; - - if (p) - *p++ = L_('-'); - ++i; - } - - if (p) - memset_zero (p, padding); - i += padding; - width = 0; - } - } - } - - cpy (buf + sizeof (buf) / sizeof (buf[0]) - bufp, bufp); - break; - - case L_('F'): - if (modifier != 0) - goto bad_format; - subfmt = L_("%Y-%m-%d"); - goto subformat; - - case L_('H'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, tp->tm_hour); - - case L_('I'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, hour12); - - case L_('k'): /* GNU extension. */ - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER_SPACEPAD (2, tp->tm_hour); - - case L_('l'): /* GNU extension. */ - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER_SPACEPAD (2, hour12); - - case L_('j'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (3, 1 + tp->tm_yday); - - case L_('M'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, tp->tm_min); - - case L_('m'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, tp->tm_mon + 1); - - case L_('n'): - add (1, *p = L_('\n')); - break; - - case L_('P'): - to_lowcase = 1; -#if !defined _NL_CURRENT && HAVE_STRFTIME - format_char = L_('p'); -#endif - /* FALLTHROUGH */ - - case L_('p'): - if (change_case) - { - to_uppcase = 0; - to_lowcase = 1; - } -#if defined _NL_CURRENT || !HAVE_STRFTIME - cpy (ap_len, ampm); - break; -#else - goto underlying_strftime; -#endif - - case L_('R'): - subfmt = L_("%H:%M"); - goto subformat; - - case L_('r'): -#if !defined _NL_CURRENT && HAVE_STRFTIME - goto underlying_strftime; -#else -# ifdef _NL_CURRENT - if (*(subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, - NLW(T_FMT_AMPM))) - == L_('\0')) -# endif - subfmt = L_("%I:%M:%S %p"); - goto subformat; -#endif - - case L_('S'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, tp->tm_sec); - - case L_('s'): /* GNU extension. */ - { - struct tm ltm; - time_t t; - - ltm = *tp; - t = mktime (<m); - - /* Generate string value for T using time_t arithmetic; - this works even if sizeof (long) < sizeof (time_t). */ - - bufp = buf + sizeof (buf) / sizeof (buf[0]); - negative_number = t < 0; - - do - { - int d = t % 10; - t /= 10; - - if (negative_number) - { - d = -d; - - /* Adjust if division truncates to minus infinity. */ - if (0 < -1 % 10 && d < 0) - { - t++; - d += 10; - } - } - - *--bufp = d + L_('0'); - } - while (t != 0); - - digits = 1; - goto do_number_sign_and_padding; - } - - case L_('X'): - if (modifier == L_('O')) - goto bad_format; -#ifdef _NL_CURRENT - if (! (modifier == L_('E') - && (*(subfmt = - (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_T_FMT))) - != L_('\0')))) - subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(T_FMT)); - goto subformat; -#else -# if HAVE_STRFTIME - goto underlying_strftime; -# else - /* Fall through. */ -# endif -#endif - case L_('T'): - subfmt = L_("%H:%M:%S"); - goto subformat; - - case L_('t'): - add (1, *p = L_('\t')); - break; - - case L_('u'): - DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1); - - case L_('U'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, (tp->tm_yday - tp->tm_wday + 7) / 7); - - case L_('V'): - case L_('g'): - case L_('G'): - if (modifier == L_('E')) - goto bad_format; - { - int year = tp->tm_year + TM_YEAR_BASE; - int days = iso_week_days (tp->tm_yday, tp->tm_wday); - - if (days < 0) - { - /* This ISO week belongs to the previous year. */ - year--; - days = iso_week_days (tp->tm_yday + (365 + __isleap (year)), - tp->tm_wday); - } - else - { - int d = iso_week_days (tp->tm_yday - (365 + __isleap (year)), - tp->tm_wday); - if (0 <= d) - { - /* This ISO week belongs to the next year. */ - year++; - days = d; - } - } - - switch (*f) - { - case L_('g'): - DO_NUMBER (2, (year % 100 + 100) % 100); - - case L_('G'): - DO_NUMBER (1, year); - - default: - DO_NUMBER (2, days / 7 + 1); - } - } - - case L_('W'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, (tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7); - - case L_('w'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (1, tp->tm_wday); - - case L_('Y'): - if (modifier == 'E') - { -#if HAVE_STRUCT_ERA_ENTRY - struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); - if (era) - { -# ifdef COMPILE_WIDE - subfmt = era->era_wformat; -# else - subfmt = era->era_format; -# endif - goto subformat; - } -#else -# if HAVE_STRFTIME - goto underlying_strftime; -# endif -#endif - } - if (modifier == L_('O')) - goto bad_format; - else - DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE); - - case L_('y'): - if (modifier == L_('E')) - { -#if HAVE_STRUCT_ERA_ENTRY - struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); - if (era) - { - int delta = tp->tm_year - era->start_date[0]; - DO_NUMBER (1, (era->offset - + delta * era->absolute_direction)); - } -#else -# if HAVE_STRFTIME - goto underlying_strftime; -# endif -#endif - } - DO_NUMBER (2, (tp->tm_year % 100 + 100) % 100); - - case L_('Z'): - if (change_case) - { - to_uppcase = 0; - to_lowcase = 1; - } - -#if HAVE_TZNAME - /* The tzset() call might have changed the value. */ - if (!(zone && *zone) && tp->tm_isdst >= 0) - { - /* POSIX.1 requires that local time zone information is used as - though strftime called tzset. */ -# if HAVE_TZSET - if (!*tzset_called) - { - tzset (); - *tzset_called = true; - } -# endif - zone = tp->tm_isdst <= 1 ? tzname[tp->tm_isdst] : "?"; - } -#endif - if (! zone) - zone = ""; - -#ifdef COMPILE_WIDE - { - /* The zone string is always given in multibyte form. We have - to transform it first. */ - wchar_t *wczone; - size_t len; - widen (zone, wczone, len); - cpy (len, wczone); - } -#else - cpy (strlen (zone), zone); -#endif - break; - - case L_('z'): - if (tp->tm_isdst < 0) - break; - - { - int diff; -#if HAVE_TM_GMTOFF - diff = tp->tm_gmtoff; -#else - if (ut) - diff = 0; - else - { - struct tm gtm; - struct tm ltm; - time_t lt; - - /* POSIX.1 requires that local time zone information is used as - though strftime called tzset. */ -# if HAVE_TZSET - if (!*tzset_called) - { - tzset (); - *tzset_called = true; - } -# endif - - ltm = *tp; - lt = mktime (<m); - - if (lt == (time_t) -1) - { - /* mktime returns -1 for errors, but -1 is also a - valid time_t value. Check whether an error really - occurred. */ - struct tm tm; - - if (! __localtime_r (<, &tm) - || ((ltm.tm_sec ^ tm.tm_sec) - | (ltm.tm_min ^ tm.tm_min) - | (ltm.tm_hour ^ tm.tm_hour) - | (ltm.tm_mday ^ tm.tm_mday) - | (ltm.tm_mon ^ tm.tm_mon) - | (ltm.tm_year ^ tm.tm_year))) - break; - } - - if (! __gmtime_r (<, >m)) - break; - - diff = tm_diff (<m, >m); - } -#endif - - if (diff < 0) - { - add (1, *p = L_('-')); - diff = -diff; - } - else - add (1, *p = L_('+')); - - diff /= 60; - DO_NUMBER (4, (diff / 60) * 100 + diff % 60); - } - - case L_('\0'): /* GNU extension: % at end of format. */ - --f; - /* Fall through. */ - default: - /* Unknown format; output the format, including the '%', - since this is most likely the right thing to do if a - multibyte string has been misparsed. */ - bad_format: - { - int flen; - for (flen = 1; f[1 - flen] != L_('%'); flen++) - continue; - cpy (flen, &f[1 - flen]); - } - break; - } - } - - if (p && maxsize != 0) - *p = L_('\0'); - return i; -} - - -#ifdef emacs -/* For Emacs we have a separate interface which corresponds to the normal - strftime function and does not have the extra information whether the - TP arguments comes from a `gmtime' call or not. */ -size_t -emacs_strftime (char *s, size_t maxsize, const char *format, - const struct tm *tp) -{ - return my_strftime (s, maxsize, format, tp, 0); -} -#endif - -#if defined _LIBC && !defined COMPILE_WIDE -weak_alias (__strftime_l, strftime_l) -#endif diff --git a/time/strptime.c b/time/strptime.c deleted file mode 100644 index 06463b364c..0000000000 --- a/time/strptime.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Convert a string representation of time to a time value. - Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* XXX This version of the implementation is not really complete. - Some of the fields cannot add information alone. But if seeing - some of them in the same format (such as year, week and weekday) - this is enough information for determining the date. */ - -#include <time.h> -#include <locale/localeinfo.h> - - -char * -strptime (const char *buf, const char *format, struct tm *tm) -{ - return __strptime_internal (buf, format, tm, NULL, _NL_CURRENT_LOCALE); -} -libc_hidden_def (strptime) diff --git a/time/strptime_l.c b/time/strptime_l.c deleted file mode 100644 index dbf4606982..0000000000 --- a/time/strptime_l.c +++ /dev/null @@ -1,1211 +0,0 @@ -/* Copyright (C) 2002-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <assert.h> -#include <ctype.h> -#include <langinfo.h> -#include <limits.h> -#include <string.h> -#include <time.h> -#include <stdbool.h> - -#ifdef _LIBC -# define HAVE_LOCALTIME_R 0 -# include "../locale/localeinfo.h" -#endif - - -#if ! HAVE_LOCALTIME_R && ! defined localtime_r -# ifdef _LIBC -# define localtime_r __localtime_r -# else -/* Approximate localtime_r as best we can in its absence. */ -# define localtime_r my_localtime_r -static struct tm *localtime_r (const time_t *, struct tm *); -static struct tm * -localtime_r (const time_t *t, struct tm *tp) -{ - struct tm *l = localtime (t); - if (! l) - return 0; - *tp = *l; - return tp; -} -# endif /* ! _LIBC */ -#endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */ - - -#define match_char(ch1, ch2) if (ch1 != ch2) return NULL -#if defined __GNUC__ && __GNUC__ >= 2 -# define match_string(cs1, s2) \ - ({ size_t len = strlen (cs1); \ - int result = __strncasecmp_l ((cs1), (s2), len, locale) == 0; \ - if (result) (s2) += len; \ - result; }) -#else -/* Oh come on. Get a reasonable compiler. */ -# define match_string(cs1, s2) \ - (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1)) -#endif -/* We intentionally do not use isdigit() for testing because this will - lead to problems with the wide character version. */ -#define get_number(from, to, n) \ - do { \ - int __n = n; \ - val = 0; \ - while (ISSPACE (*rp)) \ - ++rp; \ - if (*rp < '0' || *rp > '9') \ - return NULL; \ - do { \ - val *= 10; \ - val += *rp++ - '0'; \ - } while (--__n > 0 && val * 10 <= to && *rp >= '0' && *rp <= '9'); \ - if (val < from || val > to) \ - return NULL; \ - } while (0) -#ifdef _NL_CURRENT -# define get_alt_number(from, to, n) \ - ({ \ - __label__ do_normal; \ - \ - if (s.decided != raw) \ - { \ - val = _nl_parse_alt_digit (&rp HELPER_LOCALE_ARG); \ - if (val == -1 && s.decided != loc) \ - { \ - s.decided = loc; \ - goto do_normal; \ - } \ - if (val < from || val > to) \ - return NULL; \ - } \ - else \ - { \ - do_normal: \ - get_number (from, to, n); \ - } \ - 0; \ - }) -#else -# define get_alt_number(from, to, n) \ - /* We don't have the alternate representation. */ \ - get_number(from, to, n) -#endif -#define recursive(new_fmt) \ - (*(new_fmt) != '\0' \ - && (rp = __strptime_internal (rp, (new_fmt), tm, &s LOCALE_ARG)) != NULL) - - -#ifdef _LIBC -/* This is defined in locale/C-time.c in the GNU libc. */ -extern const struct __locale_data _nl_C_LC_TIME attribute_hidden; - -# define weekday_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (DAY_1)].string) -# define ab_weekday_name \ - (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABDAY_1)].string) -# define month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (MON_1)].string) -# define ab_month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)].string) -# define HERE_D_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string) -# define HERE_D_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_FMT)].string) -# define HERE_AM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (AM_STR)].string) -# define HERE_PM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (PM_STR)].string) -# define HERE_T_FMT_AMPM \ - (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT_AMPM)].string) -# define HERE_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT)].string) - -# define strncasecmp(s1, s2, n) __strncasecmp (s1, s2, n) -#else -static char const weekday_name[][10] = - { - "Sunday", "Monday", "Tuesday", "Wednesday", - "Thursday", "Friday", "Saturday" - }; -static char const ab_weekday_name[][4] = - { - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" - }; -static char const month_name[][10] = - { - "January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December" - }; -static char const ab_month_name[][4] = - { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" - }; -# define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y" -# define HERE_D_FMT "%m/%d/%y" -# define HERE_AM_STR "AM" -# define HERE_PM_STR "PM" -# define HERE_T_FMT_AMPM "%I:%M:%S %p" -# define HERE_T_FMT "%H:%M:%S" - -static const unsigned short int __mon_yday[2][13] = - { - /* Normal years. */ - { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, - /* Leap years. */ - { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } - }; -#endif - -#if defined _LIBC -/* 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) -# undef _NL_CURRENT_WORD -# define _NL_CURRENT_WORD(category, item) \ - (current->values[_NL_ITEM_INDEX (item)].word) -# define LOCALE_PARAM , __locale_t locale -# define LOCALE_ARG , locale -# define HELPER_LOCALE_ARG , current -# define ISSPACE(Ch) __isspace_l (Ch, locale) -#else -# define LOCALE_PARAM -# define LOCALE_ARG -# define HELPER_LOCALE_ARG -# define ISSPACE(Ch) isspace (Ch) -#endif - - - - -#ifndef __isleap -/* Nonzero if YEAR is a leap year (every 4 years, - except every 100th isn't, and every 400th is). */ -# define __isleap(year) \ - ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) -#endif - -/* Compute the day of the week. */ -static void -day_of_the_week (struct tm *tm) -{ - /* We know that January 1st 1970 was a Thursday (= 4). Compute the - difference between this data in the one on TM and so determine - the weekday. */ - int corr_year = 1900 + tm->tm_year - (tm->tm_mon < 2); - int wday = (-473 - + (365 * (tm->tm_year - 70)) - + (corr_year / 4) - - ((corr_year / 4) / 25) + ((corr_year / 4) % 25 < 0) - + (((corr_year / 4) / 25) / 4) - + __mon_yday[0][tm->tm_mon] - + tm->tm_mday - 1); - tm->tm_wday = ((wday % 7) + 7) % 7; -} - -/* Compute the day of the year. */ -static void -day_of_the_year (struct tm *tm) -{ - tm->tm_yday = (__mon_yday[__isleap (1900 + tm->tm_year)][tm->tm_mon] - + (tm->tm_mday - 1)); -} - - -#ifdef _LIBC -char * -internal_function -#else -static char * -#endif -__strptime_internal (const char *rp, const char *fmt, struct tm *tmp, - void *statep LOCALE_PARAM) -{ -#ifdef _LIBC - struct __locale_data *const current = locale->__locales[LC_TIME]; -#endif - - const char *rp_backup; - const char *rp_longest; - int cnt; - int cnt_longest; - size_t val; - size_t num_eras; - struct era_entry *era = NULL; - enum ptime_locale_status { not, loc, raw } decided_longest; - struct __strptime_state - { - unsigned int have_I : 1; - unsigned int have_wday : 1; - unsigned int have_yday : 1; - unsigned int have_mon : 1; - unsigned int have_mday : 1; - unsigned int have_uweek : 1; - unsigned int have_wweek : 1; - unsigned int is_pm : 1; - unsigned int want_century : 1; - unsigned int want_era : 1; - unsigned int want_xday : 1; - enum ptime_locale_status decided : 2; - signed char week_no; - signed char century; - int era_cnt; - } s; - struct tm tmb; - struct tm *tm; - - if (statep == NULL) - { - memset (&s, 0, sizeof (s)); - s.century = -1; - s.era_cnt = -1; -#ifdef _NL_CURRENT - s.decided = not; -#else - s.decided = raw; -#endif - tm = tmp; - } - else - { - s = *(struct __strptime_state *) statep; - tmb = *tmp; - tm = &tmb; - } - - while (*fmt != '\0') - { - /* A white space in the format string matches 0 more or white - space in the input string. */ - if (ISSPACE (*fmt)) - { - while (ISSPACE (*rp)) - ++rp; - ++fmt; - continue; - } - - /* Any character but `%' must be matched by the same character - in the iput string. */ - if (*fmt != '%') - { - match_char (*fmt++, *rp++); - continue; - } - - ++fmt; - /* We discard strftime modifiers. */ - while (*fmt == '-' || *fmt == '_' || *fmt == '0' - || *fmt == '^' || *fmt == '#') - ++fmt; - - /* And field width. */ - while (*fmt >= '0' && *fmt <= '9') - ++fmt; - -#ifndef _NL_CURRENT - /* We need this for handling the `E' modifier. */ - start_over: -#endif - - /* Make back up of current processing pointer. */ - rp_backup = rp; - - switch (*fmt++) - { - case '%': - /* Match the `%' character itself. */ - match_char ('%', *rp++); - break; - case 'a': - case 'A': - /* Match day of week. */ - rp_longest = NULL; - decided_longest = s.decided; - cnt_longest = -1; - for (cnt = 0; cnt < 7; ++cnt) - { - const char *trp; -#ifdef _NL_CURRENT - if (s.decided !=raw) - { - trp = rp; - if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), trp) - && trp > rp_longest) - { - rp_longest = trp; - cnt_longest = cnt; - if (s.decided == not - && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt), - weekday_name[cnt])) - decided_longest = loc; - } - trp = rp; - if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), trp) - && trp > rp_longest) - { - rp_longest = trp; - cnt_longest = cnt; - if (s.decided == not - && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), - ab_weekday_name[cnt])) - decided_longest = loc; - } - } -#endif - if (s.decided != loc - && (((trp = rp, match_string (weekday_name[cnt], trp)) - && trp > rp_longest) - || ((trp = rp, match_string (ab_weekday_name[cnt], rp)) - && trp > rp_longest))) - { - rp_longest = trp; - cnt_longest = cnt; - decided_longest = raw; - } - } - if (rp_longest == NULL) - /* Does not match a weekday name. */ - return NULL; - rp = rp_longest; - s.decided = decided_longest; - tm->tm_wday = cnt_longest; - s.have_wday = 1; - break; - case 'b': - case 'B': - case 'h': - /* Match month name. */ - rp_longest = NULL; - decided_longest = s.decided; - cnt_longest = -1; - for (cnt = 0; cnt < 12; ++cnt) - { - const char *trp; -#ifdef _NL_CURRENT - if (s.decided !=raw) - { - trp = rp; - if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), trp) - && trp > rp_longest) - { - rp_longest = trp; - cnt_longest = cnt; - if (s.decided == not - && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt), - month_name[cnt])) - decided_longest = loc; - } - trp = rp; - if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), trp) - && trp > rp_longest) - { - rp_longest = trp; - cnt_longest = cnt; - if (s.decided == not - && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), - ab_month_name[cnt])) - decided_longest = loc; - } - } -#endif - if (s.decided != loc - && (((trp = rp, match_string (month_name[cnt], trp)) - && trp > rp_longest) - || ((trp = rp, match_string (ab_month_name[cnt], trp)) - && trp > rp_longest))) - { - rp_longest = trp; - cnt_longest = cnt; - decided_longest = raw; - } - } - if (rp_longest == NULL) - /* Does not match a month name. */ - return NULL; - rp = rp_longest; - s.decided = decided_longest; - tm->tm_mon = cnt_longest; - s.have_mon = 1; - s.want_xday = 1; - break; - case 'c': - /* Match locale's date and time format. */ -#ifdef _NL_CURRENT - if (s.decided != raw) - { - if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT))) - { - if (s.decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (s.decided == not && - strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT)) - s.decided = loc; - s.want_xday = 1; - break; - } - s.decided = raw; - } -#endif - if (!recursive (HERE_D_T_FMT)) - return NULL; - s.want_xday = 1; - break; - case 'C': - /* Match century number. */ - match_century: - get_number (0, 99, 2); - s.century = val; - s.want_xday = 1; - break; - case 'd': - case 'e': - /* Match day of month. */ - get_number (1, 31, 2); - tm->tm_mday = val; - s.have_mday = 1; - s.want_xday = 1; - break; - case 'F': - if (!recursive ("%Y-%m-%d")) - return NULL; - s.want_xday = 1; - break; - case 'x': -#ifdef _NL_CURRENT - if (s.decided != raw) - { - if (!recursive (_NL_CURRENT (LC_TIME, D_FMT))) - { - if (s.decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (s.decided == not - && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT)) - s.decided = loc; - s.want_xday = 1; - break; - } - s.decided = raw; - } -#endif - /* Fall through. */ - case 'D': - /* Match standard day format. */ - if (!recursive (HERE_D_FMT)) - return NULL; - s.want_xday = 1; - break; - case 'k': - case 'H': - /* Match hour in 24-hour clock. */ - get_number (0, 23, 2); - tm->tm_hour = val; - s.have_I = 0; - break; - case 'l': - /* Match hour in 12-hour clock. GNU extension. */ - case 'I': - /* Match hour in 12-hour clock. */ - get_number (1, 12, 2); - tm->tm_hour = val % 12; - s.have_I = 1; - break; - case 'j': - /* Match day number of year. */ - get_number (1, 366, 3); - tm->tm_yday = val - 1; - s.have_yday = 1; - break; - case 'm': - /* Match number of month. */ - get_number (1, 12, 2); - tm->tm_mon = val - 1; - s.have_mon = 1; - s.want_xday = 1; - break; - case 'M': - /* Match minute. */ - get_number (0, 59, 2); - tm->tm_min = val; - break; - case 'n': - case 't': - /* Match any white space. */ - while (ISSPACE (*rp)) - ++rp; - break; - case 'p': - /* Match locale's equivalent of AM/PM. */ -#ifdef _NL_CURRENT - if (s.decided != raw) - { - if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp)) - { - if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR)) - s.decided = loc; - s.is_pm = 0; - break; - } - if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp)) - { - if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR)) - s.decided = loc; - s.is_pm = 1; - break; - } - s.decided = raw; - } -#endif - if (!match_string (HERE_AM_STR, rp)) - { - if (match_string (HERE_PM_STR, rp)) - s.is_pm = 1; - else - return NULL; - } - else - s.is_pm = 0; - break; - case 'r': -#ifdef _NL_CURRENT - if (s.decided != raw) - { - if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM))) - { - if (s.decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (s.decided == not && - strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM), - HERE_T_FMT_AMPM)) - s.decided = loc; - break; - } - s.decided = raw; - } -#endif - if (!recursive (HERE_T_FMT_AMPM)) - return NULL; - break; - case 'R': - if (!recursive ("%H:%M")) - return NULL; - break; - case 's': - { - /* The number of seconds may be very high so we cannot use - the `get_number' macro. Instead read the number - character for character and construct the result while - doing this. */ - time_t secs = 0; - if (*rp < '0' || *rp > '9') - /* We need at least one digit. */ - return NULL; - - do - { - secs *= 10; - secs += *rp++ - '0'; - } - while (*rp >= '0' && *rp <= '9'); - - if (localtime_r (&secs, tm) == NULL) - /* Error in function. */ - return NULL; - } - break; - case 'S': - get_number (0, 61, 2); - tm->tm_sec = val; - break; - case 'X': -#ifdef _NL_CURRENT - if (s.decided != raw) - { - if (!recursive (_NL_CURRENT (LC_TIME, T_FMT))) - { - if (s.decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (strcmp (_NL_CURRENT (LC_TIME, T_FMT), HERE_T_FMT)) - s.decided = loc; - break; - } - s.decided = raw; - } -#endif - /* Fall through. */ - case 'T': - if (!recursive (HERE_T_FMT)) - return NULL; - break; - case 'u': - get_number (1, 7, 1); - tm->tm_wday = val % 7; - s.have_wday = 1; - break; - case 'g': - get_number (0, 99, 2); - /* XXX This cannot determine any field in TM. */ - break; - case 'G': - if (*rp < '0' || *rp > '9') - return NULL; - /* XXX Ignore the number since we would need some more - information to compute a real date. */ - do - ++rp; - while (*rp >= '0' && *rp <= '9'); - break; - case 'U': - get_number (0, 53, 2); - s.week_no = val; - s.have_uweek = 1; - break; - case 'W': - get_number (0, 53, 2); - s.week_no = val; - s.have_wweek = 1; - break; - case 'V': - get_number (0, 53, 2); - /* XXX This cannot determine any field in TM without some - information. */ - break; - case 'w': - /* Match number of weekday. */ - get_number (0, 6, 1); - tm->tm_wday = val; - s.have_wday = 1; - break; - case 'y': - match_year_in_century: - /* Match year within century. */ - get_number (0, 99, 2); - /* The "Year 2000: The Millennium Rollover" paper suggests that - values in the range 69-99 refer to the twentieth century. */ - tm->tm_year = val >= 69 ? val : val + 100; - /* Indicate that we want to use the century, if specified. */ - s.want_century = 1; - s.want_xday = 1; - break; - case 'Y': - /* Match year including century number. */ - get_number (0, 9999, 4); - tm->tm_year = val - 1900; - s.want_century = 0; - s.want_xday = 1; - break; - case 'Z': - /* Read timezone but perform no conversion. */ - while (ISSPACE (*rp)) - rp++; - while (!ISSPACE (*rp) && *rp != '\0') - rp++; - break; - case 'z': - /* We recognize four formats: - 1. Two digits specify hours. - 2. Four digits specify hours and minutes. - 3. Two digits, ':', and two digits specify hours and minutes. - 4. 'Z' is equivalent to +0000. */ - { - val = 0; - while (ISSPACE (*rp)) - ++rp; - if (*rp == 'Z') - { - ++rp; - tm->tm_gmtoff = 0; - break; - } - if (*rp != '+' && *rp != '-') - return NULL; - bool neg = *rp++ == '-'; - int n = 0; - while (n < 4 && *rp >= '0' && *rp <= '9') - { - val = val * 10 + *rp++ - '0'; - ++n; - if (*rp == ':' && n == 2 && isdigit (*(rp + 1))) - ++rp; - } - if (n == 2) - val *= 100; - else if (n != 4) - /* Only two or four digits recognized. */ - return NULL; - else if (val % 100 >= 60) - /* Minutes valid range is 0 through 59. */ - return NULL; - tm->tm_gmtoff = (val / 100) * 3600 + (val % 100) * 60; - if (neg) - tm->tm_gmtoff = -tm->tm_gmtoff; - } - break; - case 'E': -#ifdef _NL_CURRENT - switch (*fmt++) - { - case 'c': - /* Match locale's alternate date and time format. */ - if (s.decided != raw) - { - const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT); - - if (*fmt == '\0') - fmt = _NL_CURRENT (LC_TIME, D_T_FMT); - - if (!recursive (fmt)) - { - if (s.decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (strcmp (fmt, HERE_D_T_FMT)) - s.decided = loc; - s.want_xday = 1; - break; - } - s.decided = raw; - } - /* The C locale has no era information, so use the - normal representation. */ - if (!recursive (HERE_D_T_FMT)) - return NULL; - s.want_xday = 1; - break; - case 'C': - if (s.decided != raw) - { - if (s.era_cnt >= 0) - { - era = _nl_select_era_entry (s.era_cnt HELPER_LOCALE_ARG); - if (era != NULL && match_string (era->era_name, rp)) - { - s.decided = loc; - break; - } - else - return NULL; - } - - num_eras = _NL_CURRENT_WORD (LC_TIME, - _NL_TIME_ERA_NUM_ENTRIES); - for (s.era_cnt = 0; s.era_cnt < (int) num_eras; - ++s.era_cnt, rp = rp_backup) - { - era = _nl_select_era_entry (s.era_cnt - HELPER_LOCALE_ARG); - if (era != NULL && match_string (era->era_name, rp)) - { - s.decided = loc; - break; - } - } - if (s.era_cnt != (int) num_eras) - break; - - s.era_cnt = -1; - if (s.decided == loc) - return NULL; - - s.decided = raw; - } - /* The C locale has no era information, so use the - normal representation. */ - goto match_century; - case 'y': - if (s.decided != raw) - { - get_number(0, 9999, 4); - tm->tm_year = val; - s.want_era = 1; - s.want_xday = 1; - s.want_century = 1; - - if (s.era_cnt >= 0) - { - assert (s.decided == loc); - - era = _nl_select_era_entry (s.era_cnt HELPER_LOCALE_ARG); - bool match = false; - if (era != NULL) - { - int delta = ((tm->tm_year - era->offset) - * era->absolute_direction); - match = (delta >= 0 - && delta < (((int64_t) era->stop_date[0] - - (int64_t) era->start_date[0]) - * era->absolute_direction)); - } - if (! match) - return NULL; - - break; - } - - num_eras = _NL_CURRENT_WORD (LC_TIME, - _NL_TIME_ERA_NUM_ENTRIES); - for (s.era_cnt = 0; s.era_cnt < (int) num_eras; ++s.era_cnt) - { - era = _nl_select_era_entry (s.era_cnt - HELPER_LOCALE_ARG); - if (era != NULL) - { - int delta = ((tm->tm_year - era->offset) - * era->absolute_direction); - if (delta >= 0 - && delta < (((int64_t) era->stop_date[0] - - (int64_t) era->start_date[0]) - * era->absolute_direction)) - { - s.decided = loc; - break; - } - } - } - if (s.era_cnt != (int) num_eras) - break; - - s.era_cnt = -1; - if (s.decided == loc) - return NULL; - - s.decided = raw; - } - - goto match_year_in_century; - case 'Y': - if (s.decided != raw) - { - num_eras = _NL_CURRENT_WORD (LC_TIME, - _NL_TIME_ERA_NUM_ENTRIES); - for (s.era_cnt = 0; s.era_cnt < (int) num_eras; - ++s.era_cnt, rp = rp_backup) - { - era = _nl_select_era_entry (s.era_cnt HELPER_LOCALE_ARG); - if (era != NULL && recursive (era->era_format)) - break; - } - if (s.era_cnt == (int) num_eras) - { - s.era_cnt = -1; - if (s.decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - s.decided = loc; - break; - } - - s.decided = raw; - } - get_number (0, 9999, 4); - tm->tm_year = val - 1900; - s.want_century = 0; - s.want_xday = 1; - break; - case 'x': - if (s.decided != raw) - { - const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_FMT); - - if (*fmt == '\0') - fmt = _NL_CURRENT (LC_TIME, D_FMT); - - if (!recursive (fmt)) - { - if (s.decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (strcmp (fmt, HERE_D_FMT)) - s.decided = loc; - break; - } - s.decided = raw; - } - if (!recursive (HERE_D_FMT)) - return NULL; - break; - case 'X': - if (s.decided != raw) - { - const char *fmt = _NL_CURRENT (LC_TIME, ERA_T_FMT); - - if (*fmt == '\0') - fmt = _NL_CURRENT (LC_TIME, T_FMT); - - if (!recursive (fmt)) - { - if (s.decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (strcmp (fmt, HERE_T_FMT)) - s.decided = loc; - break; - } - s.decided = raw; - } - if (!recursive (HERE_T_FMT)) - return NULL; - break; - default: - return NULL; - } - break; -#else - /* We have no information about the era format. Just use - the normal format. */ - if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y' - && *fmt != 'x' && *fmt != 'X') - /* This is an illegal format. */ - return NULL; - - goto start_over; -#endif - case 'O': - switch (*fmt++) - { - case 'd': - case 'e': - /* Match day of month using alternate numeric symbols. */ - get_alt_number (1, 31, 2); - tm->tm_mday = val; - s.have_mday = 1; - s.want_xday = 1; - break; - case 'H': - /* Match hour in 24-hour clock using alternate numeric - symbols. */ - get_alt_number (0, 23, 2); - tm->tm_hour = val; - s.have_I = 0; - break; - case 'I': - /* Match hour in 12-hour clock using alternate numeric - symbols. */ - get_alt_number (1, 12, 2); - tm->tm_hour = val % 12; - s.have_I = 1; - break; - case 'm': - /* Match month using alternate numeric symbols. */ - get_alt_number (1, 12, 2); - tm->tm_mon = val - 1; - s.have_mon = 1; - s.want_xday = 1; - break; - case 'M': - /* Match minutes using alternate numeric symbols. */ - get_alt_number (0, 59, 2); - tm->tm_min = val; - break; - case 'S': - /* Match seconds using alternate numeric symbols. */ - get_alt_number (0, 61, 2); - tm->tm_sec = val; - break; - case 'U': - get_alt_number (0, 53, 2); - s.week_no = val; - s.have_uweek = 1; - break; - case 'W': - get_alt_number (0, 53, 2); - s.week_no = val; - s.have_wweek = 1; - break; - case 'V': - get_alt_number (0, 53, 2); - /* XXX This cannot determine any field in TM without - further information. */ - break; - case 'w': - /* Match number of weekday using alternate numeric symbols. */ - get_alt_number (0, 6, 1); - tm->tm_wday = val; - s.have_wday = 1; - break; - case 'y': - /* Match year within century using alternate numeric symbols. */ - get_alt_number (0, 99, 2); - tm->tm_year = val >= 69 ? val : val + 100; - s.want_xday = 1; - break; - default: - return NULL; - } - break; - default: - return NULL; - } - } - - if (statep != NULL) - { - /* Recursive invocation, returning success, so - update parent's struct tm and state. */ - *(struct __strptime_state *) statep = s; - *tmp = tmb; - return (char *) rp; - } - - if (s.have_I && s.is_pm) - tm->tm_hour += 12; - - if (s.century != -1) - { - if (s.want_century) - tm->tm_year = tm->tm_year % 100 + (s.century - 19) * 100; - else - /* Only the century, but not the year. Strange, but so be it. */ - tm->tm_year = (s.century - 19) * 100; - } - - if (s.era_cnt != -1) - { - era = _nl_select_era_entry (s.era_cnt HELPER_LOCALE_ARG); - if (era == NULL) - return NULL; - if (s.want_era) - tm->tm_year = (era->start_date[0] - + ((tm->tm_year - era->offset) - * era->absolute_direction)); - else - /* Era start year assumed. */ - tm->tm_year = era->start_date[0]; - } - else - if (s.want_era) - { - /* No era found but we have seen an E modifier. Rectify some - values. */ - if (s.want_century && s.century == -1 && tm->tm_year < 69) - tm->tm_year += 100; - } - - if (s.want_xday && !s.have_wday) - { - if ( !(s.have_mon && s.have_mday) && s.have_yday) - { - /* We don't have tm_mon and/or tm_mday, compute them. */ - int t_mon = 0; - while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon] <= tm->tm_yday) - t_mon++; - if (!s.have_mon) - tm->tm_mon = t_mon - 1; - if (!s.have_mday) - tm->tm_mday = - (tm->tm_yday - - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1); - s.have_mon = 1; - s.have_mday = 1; - } - /* Don't crash in day_of_the_week if tm_mon is uninitialized. */ - if (s.have_mon || (unsigned) tm->tm_mon <= 11) - day_of_the_week (tm); - } - - if (s.want_xday && !s.have_yday && (s.have_mon || (unsigned) tm->tm_mon <= 11)) - day_of_the_year (tm); - - if ((s.have_uweek || s.have_wweek) && s.have_wday) - { - int save_wday = tm->tm_wday; - int save_mday = tm->tm_mday; - int save_mon = tm->tm_mon; - int w_offset = s.have_uweek ? 0 : 1; - - tm->tm_mday = 1; - tm->tm_mon = 0; - day_of_the_week (tm); - if (s.have_mday) - tm->tm_mday = save_mday; - if (s.have_mon) - tm->tm_mon = save_mon; - - if (!s.have_yday) - tm->tm_yday = ((7 - (tm->tm_wday - w_offset)) % 7 - + (s.week_no - 1) * 7 - + (save_wday - w_offset + 7) % 7); - - if (!s.have_mday || !s.have_mon) - { - int t_mon = 0; - while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon] - <= tm->tm_yday) - t_mon++; - if (!s.have_mon) - tm->tm_mon = t_mon - 1; - if (!s.have_mday) - tm->tm_mday = - (tm->tm_yday - - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1); - } - - tm->tm_wday = save_wday; - } - - return (char *) rp; -} - - -char * -strptime (const char *buf, const char *format, struct tm *tm LOCALE_PARAM) -{ - return __strptime_internal (buf, format, tm, NULL LOCALE_ARG); -} - -#ifdef _LIBC -weak_alias (__strptime_l, strptime_l) -#endif diff --git a/time/sys/time.h b/time/sys/time.h deleted file mode 100644 index 165296ac59..0000000000 --- a/time/sys/time.h +++ /dev/null @@ -1,188 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _SYS_TIME_H -#define _SYS_TIME_H 1 - -#include <features.h> - -#include <bits/types.h> -#include <bits/types/time_t.h> -#include <bits/types/struct_timeval.h> - -#ifndef __suseconds_t_defined -typedef __suseconds_t suseconds_t; -# define __suseconds_t_defined -#endif - -#include <sys/select.h> - -__BEGIN_DECLS - -#ifdef __USE_GNU -/* Macros for converting between `struct timeval' and `struct timespec'. */ -# define TIMEVAL_TO_TIMESPEC(tv, ts) { \ - (ts)->tv_sec = (tv)->tv_sec; \ - (ts)->tv_nsec = (tv)->tv_usec * 1000; \ -} -# define TIMESPEC_TO_TIMEVAL(tv, ts) { \ - (tv)->tv_sec = (ts)->tv_sec; \ - (tv)->tv_usec = (ts)->tv_nsec / 1000; \ -} -#endif - - -#ifdef __USE_MISC -/* Structure crudely representing a timezone. - This is obsolete and should never be used. */ -struct timezone - { - int tz_minuteswest; /* Minutes west of GMT. */ - int tz_dsttime; /* Nonzero if DST is ever in effect. */ - }; - -typedef struct timezone *__restrict __timezone_ptr_t; -#else -typedef void *__restrict __timezone_ptr_t; -#endif - -/* Get the current time of day and timezone information, - putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled. - Returns 0 on success, -1 on errors. - NOTE: This form of timezone information is obsolete. - Use the functions and variables declared in <time.h> instead. */ -extern int gettimeofday (struct timeval *__restrict __tv, - __timezone_ptr_t __tz) __THROW __nonnull ((1)); - -#ifdef __USE_MISC -/* Set the current time of day and timezone information. - This call is restricted to the super-user. */ -extern int settimeofday (const struct timeval *__tv, - const struct timezone *__tz) - __THROW; - -/* Adjust the current time of day by the amount in DELTA. - If OLDDELTA is not NULL, it is filled in with the amount - of time adjustment remaining to be done from the last `adjtime' call. - This call is restricted to the super-user. */ -extern int adjtime (const struct timeval *__delta, - struct timeval *__olddelta) __THROW; -#endif - - -/* Values for the first argument to `getitimer' and `setitimer'. */ -enum __itimer_which - { - /* Timers run in real time. */ - ITIMER_REAL = 0, -#define ITIMER_REAL ITIMER_REAL - /* Timers run only when the process is executing. */ - ITIMER_VIRTUAL = 1, -#define ITIMER_VIRTUAL ITIMER_VIRTUAL - /* Timers run when the process is executing and when - the system is executing on behalf of the process. */ - ITIMER_PROF = 2 -#define ITIMER_PROF ITIMER_PROF - }; - -/* Type of the second argument to `getitimer' and - the second and third arguments `setitimer'. */ -struct itimerval - { - /* Value to put into `it_value' when the timer expires. */ - struct timeval it_interval; - /* Time to the next timer expiration. */ - struct timeval it_value; - }; - -#if defined __USE_GNU && !defined __cplusplus -/* Use the nicer parameter type only in GNU mode and not for C++ since the - strict C++ rules prevent the automatic promotion. */ -typedef enum __itimer_which __itimer_which_t; -#else -typedef int __itimer_which_t; -#endif - -/* Set *VALUE to the current setting of timer WHICH. - Return 0 on success, -1 on errors. */ -extern int getitimer (__itimer_which_t __which, - struct itimerval *__value) __THROW; - -/* Set the timer WHICH to *NEW. If OLD is not NULL, - set *OLD to the old value of timer WHICH. - Returns 0 on success, -1 on errors. */ -extern int setitimer (__itimer_which_t __which, - const struct itimerval *__restrict __new, - struct itimerval *__restrict __old) __THROW; - -/* Change the access time of FILE to TVP[0] and the modification time of - FILE to TVP[1]. If TVP is a null pointer, use the current time instead. - Returns 0 on success, -1 on errors. */ -extern int utimes (const char *__file, const struct timeval __tvp[2]) - __THROW __nonnull ((1)); - -#ifdef __USE_MISC -/* Same as `utimes', but does not follow symbolic links. */ -extern int lutimes (const char *__file, const struct timeval __tvp[2]) - __THROW __nonnull ((1)); - -/* Same as `utimes', but takes an open file descriptor instead of a name. */ -extern int futimes (int __fd, const struct timeval __tvp[2]) __THROW; -#endif - -#ifdef __USE_GNU -/* Change the access time of FILE relative to FD to TVP[0] and the - modification time of FILE to TVP[1]. If TVP is a null pointer, use - the current time instead. Returns 0 on success, -1 on errors. */ -extern int futimesat (int __fd, const char *__file, - const struct timeval __tvp[2]) __THROW; -#endif - - -#ifdef __USE_MISC -/* Convenience macros for operations on timevals. - NOTE: `timercmp' does not work for >= or <=. */ -# define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) -# define timerclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0) -# define timercmp(a, b, CMP) \ - (((a)->tv_sec == (b)->tv_sec) ? \ - ((a)->tv_usec CMP (b)->tv_usec) : \ - ((a)->tv_sec CMP (b)->tv_sec)) -# define timeradd(a, b, result) \ - do { \ - (result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \ - (result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \ - if ((result)->tv_usec >= 1000000) \ - { \ - ++(result)->tv_sec; \ - (result)->tv_usec -= 1000000; \ - } \ - } while (0) -# define timersub(a, b, result) \ - do { \ - (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ - (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ - if ((result)->tv_usec < 0) { \ - --(result)->tv_sec; \ - (result)->tv_usec += 1000000; \ - } \ - } while (0) -#endif /* Misc. */ - -__END_DECLS - -#endif /* sys/time.h */ diff --git a/time/sys/timeb.h b/time/sys/timeb.h deleted file mode 100644 index 351aeaf619..0000000000 --- a/time/sys/timeb.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (C) 1994-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _SYS_TIMEB_H -#define _SYS_TIMEB_H 1 - -#include <features.h> - -#include <bits/types/time_t.h> - -__BEGIN_DECLS - -/* Structure returned by the `ftime' function. */ - -struct timeb - { - time_t time; /* Seconds since epoch, as from `time'. */ - unsigned short int millitm; /* Additional milliseconds. */ - short int timezone; /* Minutes west of GMT. */ - short int dstflag; /* Nonzero if Daylight Savings Time used. */ - }; - -/* Fill in TIMEBUF with information about the current time. */ - -extern int ftime (struct timeb *__timebuf); - -__END_DECLS - -#endif /* sys/timeb.h */ diff --git a/time/test_time.c b/time/test_time.c deleted file mode 100644 index 745acdd458..0000000000 --- a/time/test_time.c +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <stdlib.h> -#include <time.h> - - -int -main (int argc, char **argv) -{ - time_t t; - struct tm *tp; - struct tm tbuf; - int lose = 0; - - --argc; - ++argv; - - do - { - char buf[BUFSIZ]; - if (argc > 0) - { - static char buf[BUFSIZ]; - sprintf(buf, "TZ=%s", *argv); - if (putenv(buf)) - { - puts("putenv failed."); - lose = 1; - } - else - puts (buf); - } - tzset(); - tbuf.tm_year = 72; - tbuf.tm_mon = 0; - tbuf.tm_mday = 31; - tbuf.tm_hour = 6; - tbuf.tm_min = 14; - tbuf.tm_sec = 50; - tbuf.tm_isdst = -1; - doit:; - t = mktime(&tbuf); - if (t == (time_t) -1) - { - puts("mktime() failed?"); - lose = 1; - } - tp = localtime(&t); - if (tp == NULL) - { - puts("localtime() failed."); - lose = 1; - } - else if (strftime(buf, sizeof(buf), "%a %b %d %X %Z %Y", tp) == 0) - { - puts("strftime() failed."); - lose = 1; - } - else - puts(buf); - if (tbuf.tm_year == 101) - { - tbuf.tm_year = 97; - tbuf.tm_mon = 0; - goto doit; - } - ++argv; - } while (--argc > 0); - - { -#define SIZE 256 - char buffer[SIZE]; - time_t curtime; - struct tm *loctime; - - curtime = time (NULL); - - loctime = localtime (&curtime); - - fputs (asctime (loctime), stdout); - - strftime (buffer, SIZE, "Today is %A, %B %d.\n", loctime); - fputs (buffer, stdout); - strftime (buffer, SIZE, "The time is %I:%M %p.\n", loctime); - fputs (buffer, stdout); - - loctime->tm_year = 72; - loctime->tm_mon = 8; - loctime->tm_mday = 12; - loctime->tm_hour = 20; - loctime->tm_min = 49; - loctime->tm_sec = 05; - curtime = mktime (loctime); - strftime (buffer, SIZE, "%D %T was %w the %jth.\n", loctime); - fputs (buffer, stdout); - } - - return (lose ? EXIT_FAILURE : EXIT_SUCCESS); -} diff --git a/time/time.c b/time/time.c deleted file mode 100644 index e375035265..0000000000 --- a/time/time.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <time.h> - -/* Return the time now, and store it in *TIMER if not NULL. */ -time_t -time (time_t *timer) -{ - __set_errno (ENOSYS); - - if (timer != NULL) - *timer = (time_t) -1; - return (time_t) -1; -} -libc_hidden_def (time) - -stub_warning (time) diff --git a/time/time.h b/time/time.h deleted file mode 100644 index bb4994feee..0000000000 --- a/time/time.h +++ /dev/null @@ -1,309 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* - * ISO C99 Standard: 7.23 Date and time <time.h> - */ - -#ifndef _TIME_H -#define _TIME_H 1 - -#include <features.h> - -#define __need_size_t -#define __need_NULL -#include <stddef.h> - -/* This defines CLOCKS_PER_SEC, which is the number of processor clock - ticks per second, and possibly a number of other constants. */ -#include <bits/time.h> - -/* Many of the typedefs and structs whose official home is this header - may also need to be defined by other headers. */ -#include <bits/types/clock_t.h> -#include <bits/types/time_t.h> -#include <bits/types/struct_tm.h> - -#if defined __USE_POSIX199309 || defined __USE_ISOC11 -# include <bits/types/struct_timespec.h> -#endif - -#ifdef __USE_POSIX199309 -# include <bits/types/clockid_t.h> -# include <bits/types/timer_t.h> -# include <bits/types/struct_itimerspec.h> -struct sigevent; -#endif - -#ifdef __USE_XOPEN2K -# ifndef __pid_t_defined -typedef __pid_t pid_t; -# define __pid_t_defined -# endif -#endif - -#ifdef __USE_XOPEN2K8 -# include <xlocale.h> -#endif - -#ifdef __USE_ISOC11 -/* Time base values for timespec_get. */ -# define TIME_UTC 1 -#endif - -__BEGIN_DECLS - -/* Time used by the program so far (user time + system time). - The result / CLOCKS_PER_SECOND is program time in seconds. */ -extern clock_t clock (void) __THROW; - -/* Return the current time and put it in *TIMER if TIMER is not NULL. */ -extern time_t time (time_t *__timer) __THROW; - -/* Return the difference between TIME1 and TIME0. */ -extern double difftime (time_t __time1, time_t __time0) - __THROW __attribute__ ((__const__)); - -/* Return the `time_t' representation of TP and normalize TP. */ -extern time_t mktime (struct tm *__tp) __THROW; - - -/* Format TP into S according to FORMAT. - Write no more than MAXSIZE characters and return the number - of characters written, or 0 if it would exceed MAXSIZE. */ -extern size_t strftime (char *__restrict __s, size_t __maxsize, - const char *__restrict __format, - const struct tm *__restrict __tp) __THROW; - -#ifdef __USE_XOPEN -/* Parse S according to FORMAT and store binary time information in TP. - The return value is a pointer to the first unparsed character in S. */ -extern char *strptime (const char *__restrict __s, - const char *__restrict __fmt, struct tm *__tp) - __THROW; -#endif - -#ifdef __USE_XOPEN2K8 -/* Similar to the two functions above but take the information from - the provided locale and not the global locale. */ - -extern size_t strftime_l (char *__restrict __s, size_t __maxsize, - const char *__restrict __format, - const struct tm *__restrict __tp, - __locale_t __loc) __THROW; -#endif - -#ifdef __USE_GNU -extern char *strptime_l (const char *__restrict __s, - const char *__restrict __fmt, struct tm *__tp, - __locale_t __loc) __THROW; -#endif - - -/* Return the `struct tm' representation of *TIMER - in Universal Coordinated Time (aka Greenwich Mean Time). */ -extern struct tm *gmtime (const time_t *__timer) __THROW; - -/* Return the `struct tm' representation - of *TIMER in the local timezone. */ -extern struct tm *localtime (const time_t *__timer) __THROW; - -#ifdef __USE_POSIX -/* Return the `struct tm' representation of *TIMER in UTC, - using *TP to store the result. */ -extern struct tm *gmtime_r (const time_t *__restrict __timer, - struct tm *__restrict __tp) __THROW; - -/* Return the `struct tm' representation of *TIMER in local time, - using *TP to store the result. */ -extern struct tm *localtime_r (const time_t *__restrict __timer, - struct tm *__restrict __tp) __THROW; -#endif /* POSIX */ - -/* Return a string of the form "Day Mon dd hh:mm:ss yyyy\n" - that is the representation of TP in this format. */ -extern char *asctime (const struct tm *__tp) __THROW; - -/* Equivalent to `asctime (localtime (timer))'. */ -extern char *ctime (const time_t *__timer) __THROW; - -#ifdef __USE_POSIX -/* Reentrant versions of the above functions. */ - -/* Return in BUF a string of the form "Day Mon dd hh:mm:ss yyyy\n" - that is the representation of TP in this format. */ -extern char *asctime_r (const struct tm *__restrict __tp, - char *__restrict __buf) __THROW; - -/* Equivalent to `asctime_r (localtime_r (timer, *TMP*), buf)'. */ -extern char *ctime_r (const time_t *__restrict __timer, - char *__restrict __buf) __THROW; -#endif /* POSIX */ - - -/* Defined in localtime.c. */ -extern char *__tzname[2]; /* Current timezone names. */ -extern int __daylight; /* If daylight-saving time is ever in use. */ -extern long int __timezone; /* Seconds west of UTC. */ - - -#ifdef __USE_POSIX -/* Same as above. */ -extern char *tzname[2]; - -/* Set time conversion information from the TZ environment variable. - If TZ is not defined, a locale-dependent default is used. */ -extern void tzset (void) __THROW; -#endif - -#if defined __USE_MISC || defined __USE_XOPEN -extern int daylight; -extern long int timezone; -#endif - -#ifdef __USE_MISC -/* Set the system time to *WHEN. - This call is restricted to the superuser. */ -extern int stime (const time_t *__when) __THROW; -#endif - - -/* Nonzero if YEAR is a leap year (every 4 years, - except every 100th isn't, and every 400th is). */ -#define __isleap(year) \ - ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) - - -#ifdef __USE_MISC -/* Miscellaneous functions many Unices inherited from the public domain - localtime package. These are included only for compatibility. */ - -/* Like `mktime', but for TP represents Universal Time, not local time. */ -extern time_t timegm (struct tm *__tp) __THROW; - -/* Another name for `mktime'. */ -extern time_t timelocal (struct tm *__tp) __THROW; - -/* Return the number of days in YEAR. */ -extern int dysize (int __year) __THROW __attribute__ ((__const__)); -#endif - - -#ifdef __USE_POSIX199309 -/* Pause execution for a number of nanoseconds. - - This function is a cancellation point and therefore not marked with - __THROW. */ -extern int nanosleep (const struct timespec *__requested_time, - struct timespec *__remaining); - - -/* Get resolution of clock CLOCK_ID. */ -extern int clock_getres (clockid_t __clock_id, struct timespec *__res) __THROW; - -/* Get current value of clock CLOCK_ID and store it in TP. */ -extern int clock_gettime (clockid_t __clock_id, struct timespec *__tp) __THROW; - -/* Set clock CLOCK_ID to value TP. */ -extern int clock_settime (clockid_t __clock_id, const struct timespec *__tp) - __THROW; - -# ifdef __USE_XOPEN2K -/* High-resolution sleep with the specified clock. - - This function is a cancellation point and therefore not marked with - __THROW. */ -extern int clock_nanosleep (clockid_t __clock_id, int __flags, - const struct timespec *__req, - struct timespec *__rem); - -/* Return clock ID for CPU-time clock. */ -extern int clock_getcpuclockid (pid_t __pid, clockid_t *__clock_id) __THROW; -# endif - - -/* Create new per-process timer using CLOCK_ID. */ -extern int timer_create (clockid_t __clock_id, - struct sigevent *__restrict __evp, - timer_t *__restrict __timerid) __THROW; - -/* Delete timer TIMERID. */ -extern int timer_delete (timer_t __timerid) __THROW; - -/* Set timer TIMERID to VALUE, returning old value in OVALUE. */ -extern int timer_settime (timer_t __timerid, int __flags, - const struct itimerspec *__restrict __value, - struct itimerspec *__restrict __ovalue) __THROW; - -/* Get current value of timer TIMERID and store it in VALUE. */ -extern int timer_gettime (timer_t __timerid, struct itimerspec *__value) - __THROW; - -/* Get expiration overrun for timer TIMERID. */ -extern int timer_getoverrun (timer_t __timerid) __THROW; -#endif - - -#ifdef __USE_ISOC11 -/* Set TS to calendar time based in time base BASE. */ -extern int timespec_get (struct timespec *__ts, int __base) - __THROW __nonnull ((1)); -#endif - - -#ifdef __USE_XOPEN_EXTENDED -/* Set to one of the following values to indicate an error. - 1 the DATEMSK environment variable is null or undefined, - 2 the template file cannot be opened for reading, - 3 failed to get file status information, - 4 the template file is not a regular file, - 5 an error is encountered while reading the template file, - 6 memory allication failed (not enough memory available), - 7 there is no line in the template that matches the input, - 8 invalid input specification Example: February 31 or a time is - specified that can not be represented in a time_t (representing - the time in seconds since 00:00:00 UTC, January 1, 1970) */ -extern int getdate_err; - -/* Parse the given string as a date specification and return a value - representing the value. The templates from the file identified by - the environment variable DATEMSK are used. In case of an error - `getdate_err' is set. - - This function is a possible cancellation point and therefore not - marked with __THROW. */ -extern struct tm *getdate (const char *__string); -#endif - -#ifdef __USE_GNU -/* Since `getdate' is not reentrant because of the use of `getdate_err' - and the static buffer to return the result in, we provide a thread-safe - variant. The functionality is the same. The result is returned in - the buffer pointed to by RESBUFP and in case of an error the return - value is != 0 with the same values as given above for `getdate_err'. - - This function is not part of POSIX and therefore no official - cancellation point. But due to similarity with an POSIX interface - or due to the implementation it is a cancellation point and - therefore not marked with __THROW. */ -extern int getdate_r (const char *__restrict __string, - struct tm *__restrict __resbufp); -#endif - -__END_DECLS - -#endif /* time.h. */ diff --git a/time/timegm.c b/time/timegm.c deleted file mode 100644 index b0f5d16d16..0000000000 --- a/time/timegm.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Convert UTC calendar time to simple time. Like mktime but assumes UTC. - - Copyright (C) 1994-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#ifdef _LIBC -# include <time.h> -#else -# include "timegm.h" - -/* Portable standalone applications should supply a "time_r.h" that - declares a POSIX-compliant gmtime_r, for the benefit of older - implementations that lack gmtime_r or have a nonstandard one. - See the gnulib time_r module for one way to implement this. */ -# include <time_r.h> -# undef __gmtime_r -# define __gmtime_r gmtime_r -time_t __mktime_internal (struct tm *, - struct tm * (*) (time_t const *, struct tm *), - time_t *); -#endif - -time_t -timegm (struct tm *tmp) -{ - static time_t gmtime_offset; - tmp->tm_isdst = 0; - return __mktime_internal (tmp, __gmtime_r, &gmtime_offset); -} diff --git a/time/timespec_get.c b/time/timespec_get.c deleted file mode 100644 index 125612af14..0000000000 --- a/time/timespec_get.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2011-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <time.h> - - -/* Set TS to calendar time based in time base BASE. */ -int -timespec_get (struct timespec *ts, int base) -{ - switch (base) - { - case TIME_UTC: - /* Not supported. */ - return 0; - - default: - return 0; - } - - return base; -} -stub_warning (timespec_get) diff --git a/time/tst-ftime.c b/time/tst-ftime.c deleted file mode 100644 index 6df20be630..0000000000 --- a/time/tst-ftime.c +++ /dev/null @@ -1,59 +0,0 @@ -/* Verify that ftime is sane. - Copyright (C) 2014-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sys/timeb.h> -#include <stdio.h> - -static int -do_test (void) -{ - struct timeb prev, curr = {.time = 0, .millitm = 0}; - int sec = 0; - - while (sec != 3) - { - prev = curr; - - if (ftime (&curr)) - { - printf ("ftime returned an error\n"); - return 1; - } - - if (curr.time < prev.time) - { - printf ("ftime's time flowed backwards\n"); - return 1; - } - - if (curr.time == prev.time - && curr.millitm < prev.millitm) - { - printf ("ftime's millitm flowed backwards\n"); - return 1; - } - - if (curr.time > prev.time) - sec ++; - } - return 0; -} - -#define TIMEOUT 3 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/tst-ftime_l.c b/time/tst-ftime_l.c deleted file mode 100644 index 6690efeb9c..0000000000 --- a/time/tst-ftime_l.c +++ /dev/null @@ -1,129 +0,0 @@ -#include <locale.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <wchar.h> - - -static int -do_test (void) -{ - locale_t l; - locale_t old; - struct tm tm; - char buf[1000]; - wchar_t wbuf[1000]; - int result = 0; - size_t n; - - l = newlocale (LC_ALL_MASK, "de_DE.ISO-8859-1", NULL); - if (l == NULL) - { - puts ("newlocale failed"); - exit (1); - } - - memset (&tm, '\0', sizeof (tm)); - - tm.tm_year = 102; - tm.tm_mon = 2; - tm.tm_mday = 1; - - if (strftime (buf, sizeof (buf), "%e %^B %Y", &tm) == 0) - { - puts ("initial strftime failed"); - exit (1); - } - if (strcmp (buf, " 1 MARCH 2002") != 0) - { - printf ("initial strftime: expected \"%s\", got \"%s\"\n", - " 1 MARCH 2002", buf); - result = 1; - } - else - printf ("got \"%s\"\n", buf); - - /* Now using the extended locale model. */ - if (strftime_l (buf, sizeof (buf), "%e %^B %Y", &tm, l) == 0) - { - puts ("strftime_l failed"); - result = 1; - } - else if (strcmp (buf, " 1 M\xc4RZ 2002") != 0) - { - printf ("strftime_l: expected \"%s\", got \"%s\"\n", - " 1 M\xc4RZ 2002", buf); - result = 1; - } - else - { - setlocale (LC_ALL, "de_DE.ISO-8859-1"); - printf ("got \"%s\"\n", buf); - setlocale (LC_ALL, "C"); - } - - /* And the wide character version. */ - if (wcsftime_l (wbuf, sizeof (wbuf) / sizeof (wbuf[0]), L"%e %^B %Y", &tm, l) - == 0) - { - puts ("wcsftime_l failed"); - result = 1; - } - else if (wcscmp (wbuf, L" 1 M\x00c4RZ 2002") != 0) - { - printf ("wcsftime_l: expected \"%ls\", got \"%ls\"\n", - L" 1 M\x00c4RZ 2002", wbuf); - result = 1; - } - else - { - setlocale (LC_ALL, "de_DE.ISO-8859-1"); - printf ("got \"%ls\"\n", wbuf); - setlocale (LC_ALL, "C"); - } - - old = uselocale (l); - - n = strftime (buf, sizeof (buf), "%e %^B %Y", &tm); - - /* Switch back. */ - (void) uselocale (old); - - if (n == 0) - { - puts ("strftime after first uselocale failed"); - result = 1; - } - else if (strcmp (buf, " 1 M\xc4RZ 2002") != 0) - { - printf ("strftime in non-C locale: expected \"%s\", got \"%s\"\n", - " 1 M\xc4RZ 2002", buf); - result = 1; - } - else - { - setlocale (LC_ALL, "de_DE.ISO-8859-1"); - printf ("got \"%s\"\n", buf); - setlocale (LC_ALL, "C"); - } - - if (strftime (buf, sizeof (buf), "%e %^B %Y", &tm) == 0) - { - puts ("strftime after second uselocale failed"); - result = 1; - } - else if (strcmp (buf, " 1 MARCH 2002") != 0) - { - printf ("initial strftime: expected \"%s\", got \"%s\"\n", - " 1 MARCH 2002", buf); - result = 1; - } - else - printf ("got \"%s\"\n", buf); - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/tst-getdate.c b/time/tst-getdate.c deleted file mode 100644 index e4b34b7a5c..0000000000 --- a/time/tst-getdate.c +++ /dev/null @@ -1,126 +0,0 @@ -/* Test for getdate. - Copyright (C) 2000-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Andreas Jaeger <aj@suse.de>, 2000. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -static const struct -{ - const char *str; - const char *tz; - int err; - struct tm tm; -} tests [] = -{ - {"21:01:10 1999-1-31", "Universal", 0, {10, 1, 21, 31, 0, 99, 0, 0, 0}}, - {"21:01:10 1999-1-31", "Universal", 0, {10, 1, 21, 31, 0, 99, 0, 0, 0}}, - {" 21:01:10 1999-1-31", "Universal", 0, {10, 1, 21, 31, 0, 99, 0, 0, 0}}, - {"21:01:10 1999-1-31 ", "Universal", 0, {10, 1, 21, 31, 0, 99, 0, 0, 0}}, - {" 21:01:10 1999-1-31 ", "Universal", 0, {10, 1, 21, 31, 0, 99, 0, 0, 0}}, - {"21:01:10 1999-2-28", "Universal", 0, {10, 1, 21, 28, 1, 99, 0, 0, 0}}, - {"16:30:46 2000-2-29", "Universal", 0, {46, 30,16, 29, 1, 100, 0, 0, 0}}, - {"01-08-2000 05:06:07", "Europe/Berlin", 0, {7, 6, 5, 1, 7, 100, 0, 0, 0}} -}; - -static void -report_date_error (int err) -{ - switch(err) - { - case 1: - printf ("The environment variable DATEMSK is not defined or null.\n"); - break; - case 2: - printf ("The template file denoted by the DATEMSK environment variable cannot be opened.\n"); - break; - case 3: - printf ("Information about the template file cannot retrieved.\n"); - break; - case 4: - printf ("The template file is not a regular file.\n"); - break; - case 5: - printf ("An I/O error occurred while reading the template file.\n"); - break; - case 6: - printf ("Not enough memory available to execute the function.\n"); - break; - case 7: - printf ("The template file contains no matching template.\n"); - break; - case 8: - printf ("The input date is invalid, but would match a template otherwise.\n"); - break; - default: - printf("Unknown error code.\n"); - break; - } -} - - -static int -do_test (void) -{ - int errors = 0; - size_t i; - struct tm *tm; - - - for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i) - { - setenv ("TZ", tests[i].tz, 1); - - tm = getdate (tests[i].str); - - if (getdate_err != tests[i].err) - { - printf ("Failure for getdate (\"%s\"):\n", tests[i].str); - printf ("getdate_err should be %d but returned: %d which means:\n", - tests[i].err, getdate_err); - report_date_error (getdate_err); - ++errors; - } - else if (tests[i].tm.tm_mon != tm->tm_mon - || tests[i].tm.tm_year != tm->tm_year - || tests[i].tm.tm_mday != tm->tm_mday - || tests[i].tm.tm_hour != tm->tm_hour - || tests[i].tm.tm_min != tm->tm_min - || tests[i].tm.tm_sec != tm->tm_sec) - { - printf ("Failure for getdate (\"%s\"):\n", tests[i].str); - printf ("struct tm is: %d-%d-%d %d:%d:%d\n", - tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, - tm->tm_hour, tm->tm_min, tm->tm_sec); - printf ("but should be: %d-%d-%d %d:%d:%d\n", - tests[i].tm.tm_year + 1900, tests[i].tm.tm_mon + 1, - tests[i].tm.tm_mday, - tests[i].tm.tm_hour, tests[i].tm.tm_min, tests[i].tm.tm_sec); - ++errors; - } - } - - if (!errors) - printf ("No errors found.\n"); - return errors != 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/tst-mktime.c b/time/tst-mktime.c deleted file mode 100644 index c1473600dd..0000000000 --- a/time/tst-mktime.c +++ /dev/null @@ -1,73 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <time.h> - -static int -do_test (void) -{ - struct tm time_str, *tm; - time_t t; - char daybuf[20]; - int result; - - time_str.tm_year = 2001 - 1900; - time_str.tm_mon = 7 - 1; - time_str.tm_mday = 4; - time_str.tm_hour = 0; - time_str.tm_min = 0; - time_str.tm_sec = 1; - time_str.tm_isdst = -1; - - if (mktime (&time_str) == -1) - { - (void) puts ("-unknown-"); - result = 1; - } - else - { - (void) strftime (daybuf, sizeof (daybuf), "%A", &time_str); - (void) puts (daybuf); - result = strcmp (daybuf, "Wednesday") != 0; - } - - setenv ("TZ", "EST+5", 1); -#define EVENING69 1 * 60 * 60 + 2 * 60 + 29 - t = EVENING69; - tm = localtime (&t); - if (tm == NULL) - { - (void) puts ("localtime returned NULL"); - result = 1; - } - else - { - time_str = *tm; - t = mktime (&time_str); - if (t != EVENING69) - { - printf ("mktime returned %ld, expected %d\n", - (long) t, EVENING69); - result = 1; - } - else - (void) puts ("Dec 31 1969 EST test passed"); - - setenv ("TZ", "CET-1", 1); - t = mktime (&time_str); -#define EVENING69_CET (EVENING69 - (5 - -1) * 60 * 60) - if (t != EVENING69_CET) - { - printf ("mktime returned %ld, expected %ld\n", - (long) t, (long) EVENING69_CET); - result = 1; - } - else - (void) puts ("Dec 31 1969 CET test passed"); - } - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/tst-mktime2.c b/time/tst-mktime2.c deleted file mode 100644 index c41db3e3b7..0000000000 --- a/time/tst-mktime2.c +++ /dev/null @@ -1,158 +0,0 @@ -/* Test program from Paul Eggert and Tony Leneis. */ - -#include <limits.h> -#include <time.h> -#include <stdlib.h> -#include <unistd.h> - -/* True if the arithmetic type T is signed. */ -#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) - -/* The maximum and minimum values for the integer type T. These - macros have undefined behavior if T is signed and has padding bits. - If this is a problem for you, please let us know how to fix it for - your host. */ -#define TYPE_MINIMUM(t) \ - ((t) (! TYPE_SIGNED (t) \ - ? (t) 0 \ - : ~ TYPE_MAXIMUM (t))) -#define TYPE_MAXIMUM(t) \ - ((t) (! TYPE_SIGNED (t) \ - ? (t) -1 \ - : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) - -#ifndef TIME_T_MIN -# define TIME_T_MIN TYPE_MINIMUM (time_t) -#endif -#ifndef TIME_T_MAX -# define TIME_T_MAX TYPE_MAXIMUM (time_t) -#endif - -/* Values we'll use to set the TZ environment variable. */ -static const char *tz_strings[] = - { - (const char *) 0, "GMT0", "JST-9", - "EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" - }; -#define N_STRINGS ((int) (sizeof (tz_strings) / sizeof (tz_strings[0]))) - -/* Fail if mktime fails to convert a date in the spring-forward gap. - Based on a problem report from Andreas Jaeger. */ -static void -spring_forward_gap (void) -{ - /* glibc (up to about 1998-10-07) failed this test. */ - struct tm tm; - - /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" - instead of "TZ=America/Vancouver" in order to detect the bug even - on systems that don't support the Olson extension, or don't have the - full zoneinfo tables installed. */ - setenv ("TZ", "PST8PDT,M4.1.0,M10.5.0", 1); - - tm.tm_year = 98; - tm.tm_mon = 3; - tm.tm_mday = 5; - tm.tm_hour = 2; - tm.tm_min = 0; - tm.tm_sec = 0; - tm.tm_isdst = -1; - if (mktime (&tm) == (time_t)-1) - exit (1); -} - -static void -mktime_test1 (time_t now) -{ - struct tm *lt = localtime (&now); - if (lt && mktime (lt) != now) - exit (2); -} - -static void -mktime_test (time_t now) -{ - mktime_test1 (now); - mktime_test1 ((time_t) (TIME_T_MAX - now)); - mktime_test1 ((time_t) (TIME_T_MIN + now)); -} - -static void -irix_6_4_bug (void) -{ - /* Based on code from Ariel Faigon. */ - struct tm tm; - tm.tm_year = 96; - tm.tm_mon = 3; - tm.tm_mday = 0; - tm.tm_hour = 0; - tm.tm_min = 0; - tm.tm_sec = 0; - tm.tm_isdst = -1; - mktime (&tm); - if (tm.tm_mon != 2 || tm.tm_mday != 31) - exit (3); -} - -static void -bigtime_test (int j) -{ - struct tm tm; - time_t now; - tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; - tm.tm_isdst = -1; - now = mktime (&tm); - if (now != (time_t) -1) - { - struct tm *lt = localtime (&now); - if (! (lt - && lt->tm_year == tm.tm_year - && lt->tm_mon == tm.tm_mon - && lt->tm_mday == tm.tm_mday - && lt->tm_hour == tm.tm_hour - && lt->tm_min == tm.tm_min - && lt->tm_sec == tm.tm_sec - && lt->tm_yday == tm.tm_yday - && lt->tm_wday == tm.tm_wday - && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) - == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) - exit (4); - } -} - -static int -do_test (void) -{ - time_t t, delta; - int i; - unsigned int j; - - setenv ("TZ", "America/Sao_Paulo", 1); - /* This test makes some buggy mktime implementations loop. - Give up after 60 seconds; a mktime slower than that - isn't worth using anyway. */ - alarm (60); - - delta = TIME_T_MAX / 997; /* a suitable prime number */ - for (i = 0; i < N_STRINGS; i++) - { - if (tz_strings[i]) - setenv ("TZ", tz_strings[i], 1); - - for (t = 0; t <= TIME_T_MAX - delta; t += delta) - mktime_test (t); - mktime_test ((time_t) 1); - mktime_test ((time_t) (60 * 60)); - mktime_test ((time_t) (60 * 60 * 24)); - - for (j = 1; j <= INT_MAX; j *= 2) - bigtime_test (j); - bigtime_test (j - 1); - } - irix_6_4_bug (); - spring_forward_gap (); - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/tst-mktime3.c b/time/tst-mktime3.c deleted file mode 100644 index c738e5384a..0000000000 --- a/time/tst-mktime3.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Test program for mktime bugs with out-of-range tm_sec values. */ - -#include <stdlib.h> -#include <stdio.h> -#include <time.h> - -struct tm tests[] = -{ - { .tm_sec = -1, .tm_mday = 1, .tm_year = 104 }, - { .tm_sec = 65, .tm_min = 59, .tm_hour = 23, .tm_mday = 31, - .tm_mon = 11, .tm_year = 101 } -}; -struct tm expected[] = -{ - { .tm_sec = 59, .tm_min = 59, .tm_hour = 23, .tm_mday = 31, - .tm_mon = 11, .tm_year = 103, .tm_wday = 3, .tm_yday = 364 }, - { .tm_sec = 5, .tm_mday = 1, .tm_year = 102, .tm_wday = 2 } -}; - -static int -do_test (void) -{ - setenv ("TZ", "UTC", 1); - int i; - for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i) - { - if (mktime (&tests[i]) < 0) - { - printf ("mktime %d failed\n", i); - return 1; - } -#define CHECK(name) \ - if (tests[i].name != expected[i].name) \ - { \ - printf ("test %d " #name " got %d expected %d\n", \ - i, tests[i].name, expected[i].name); \ - return 1; \ - } - CHECK (tm_sec) - CHECK (tm_min) - CHECK (tm_hour) - CHECK (tm_mday) - CHECK (tm_mon) - CHECK (tm_year) - CHECK (tm_wday) - CHECK (tm_yday) - CHECK (tm_isdst) - } - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/tst-posixtz.c b/time/tst-posixtz.c deleted file mode 100644 index 9bec7ae4bb..0000000000 --- a/time/tst-posixtz.c +++ /dev/null @@ -1,123 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <stdint.h> - -struct -{ - time_t when; - const char *tz; - const char *result; -} tests[] = -{ - { 909312849L, "AEST-10AEDST-11,M10.5.0,M3.5.0", - "1998/10/25 21:54:09 dst=1 zone=AEDST" }, - { 924864849L, "AEST-10AEDST-11,M10.5.0,M3.5.0", - "1999/04/23 20:54:09 dst=0 zone=AEST" }, - { 919973892L, "AEST-10AEDST-11,M10.5.0,M3.5.0", - "1999/02/26 07:18:12 dst=1 zone=AEDST" }, - { 909312849L, "EST+5EDT,M4.1.0/2,M10.5.0/2", - "1998/10/25 05:54:09 dst=0 zone=EST" }, - { 909312849L, "EST5EDT,M4.1.0/2,M10.5.0/2", - "1998/10/25 05:54:09 dst=0 zone=EST" }, - { 909312849L, "<EST5>5EDT,M4.1.0/2,M10.5.0/2", - "1998/10/25 05:54:09 dst=0 zone=EST5" }, - { 924864849L, "EST+5EDT,M4.1.0/2,M10.5.0/2", - "1999/04/23 06:54:09 dst=1 zone=EDT" }, - { 919973892L, "EST+5EDT,M4.1.0/2,M10.5.0/2", - "1999/02/25 15:18:12 dst=0 zone=EST" }, -}; - -static int -do_test (void) -{ - int result = 0; - size_t cnt; - - for (cnt = 0; cnt < sizeof (tests) / sizeof (tests[0]); ++cnt) - { - char buf[100]; - struct tm *tmp; - - printf ("TZ = \"%s\", time = %jd => ", tests[cnt].tz, - (intmax_t) tests[cnt].when); - fflush (stdout); - - setenv ("TZ", tests[cnt].tz, 1); - - tmp = localtime (&tests[cnt].when); - - snprintf (buf, sizeof (buf), - "%04d/%02d/%02d %02d:%02d:%02d dst=%d zone=%s", - tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday, - tmp->tm_hour, tmp->tm_min, tmp->tm_sec, tmp->tm_isdst, - tzname[tmp->tm_isdst ? 1 : 0]); - - fputs (buf, stdout); - - if (strcmp (buf, tests[cnt].result) == 0) - puts (", OK"); - else - { - result = 1; - puts (", FAIL"); - } - } - - setenv ("TZ", "Universal", 1); - localtime (&tests[0].when); - printf ("TZ = \"Universal\" daylight %d tzname = { \"%s\", \"%s\" }", - daylight, tzname[0], tzname[1]); - if (! daylight) - puts (", OK"); - else - { - result = 1; - puts (", FAIL"); - } - - setenv ("TZ", "AEST-10AEDST-11,M10.5.0,M3.5.0", 1); - tzset (); - printf ("TZ = \"AEST-10AEDST-11,M10.5.0,M3.5.0\" daylight %d" - " tzname = { \"%s\", \"%s\" }", daylight, tzname[0], tzname[1]); - if (daylight - && strcmp (tzname[0], "AEST") == 0 && strcmp (tzname[1], "AEDST") == 0) - puts (", OK"); - else - { - result = 1; - puts (", FAIL"); - } - - setenv ("TZ", "<AB1>-10<AB2>-11,M10.5.0,M3.5.0", 1); - tzset (); - printf ("TZ = \"<AB1>-10<AB2>-11,M10.5.0,M3.5.0\" daylight %d" - " tzname = { \"%s\", \"%s\" }", daylight, tzname[0], tzname[1]); - if (daylight - && strcmp (tzname[0], "AB1") == 0 && strcmp (tzname[1], "AB2") == 0) - puts (", OK"); - else - { - result = 1; - puts (", FAIL"); - } - - setenv ("TZ", "<BB1>-10", 1); - tzset (); - printf ("TZ = \"<BB1>-10\" daylight %d" - " tzname = { \"%s\", \"%s\" }", daylight, tzname[0], tzname[1]); - if (daylight == 0 - && strcmp (tzname[0], "BB1") == 0 && strcmp (tzname[1], "BB1") == 0) - puts (", OK"); - else - { - result = 1; - puts (", FAIL"); - } - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/tst-strftime.c b/time/tst-strftime.c deleted file mode 100644 index af3ff72faf..0000000000 --- a/time/tst-strftime.c +++ /dev/null @@ -1,161 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - - -static int -do_bz18985 (void) -{ - char buf[1000]; - struct tm ttm; - int rc, ret = 0; - - memset (&ttm, 1, sizeof (ttm)); - ttm.tm_zone = NULL; /* Dereferenced directly if non-NULL. */ - rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm); - - if (rc == 66) - { - const char expected[] - = "? ? ? ? ? ? 16843009 16843009:16843009:16843009 16844909 +467836 ?"; - if (0 != strcmp (buf, expected)) - { - printf ("expected:\n %s\ngot:\n %s\n", expected, buf); - ret += 1; - } - } - else - { - printf ("expected 66, got %d\n", rc); - ret += 1; - } - - /* Check negative values as well. */ - memset (&ttm, 0xFF, sizeof (ttm)); - ttm.tm_zone = NULL; /* Dereferenced directly if non-NULL. */ - rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm); - - if (rc == 30) - { - const char expected[] = "? ? ? ? ? ? -1 -1:-1:-1 1899 "; - if (0 != strcmp (buf, expected)) - { - printf ("expected:\n %s\ngot:\n %s\n", expected, buf); - ret += 1; - } - } - else - { - printf ("expected 30, got %d\n", rc); - ret += 1; - } - - return ret; -} - -static struct -{ - const char *fmt; - size_t min; - size_t max; -} tests[] = - { - { "%2000Y", 2000, 4000 }, - { "%02000Y", 2000, 4000 }, - { "%_2000Y", 2000, 4000 }, - { "%-2000Y", 2000, 4000 }, - }; -#define ntests (sizeof (tests) / sizeof (tests[0])) - - -static int -do_test (void) -{ - size_t cnt; - int result = 0; - - time_t tnow = time (NULL); - struct tm *now = localtime (&tnow); - - for (cnt = 0; cnt < ntests; ++cnt) - { - size_t size = 0; - int res; - char *buf = NULL; - - do - { - size += 500; - buf = (char *) realloc (buf, size); - if (buf == NULL) - { - puts ("out of memory"); - exit (1); - } - - res = strftime (buf, size, tests[cnt].fmt, now); - if (res != 0) - break; - } - while (size < tests[cnt].max); - - if (res == 0) - { - printf ("%Zu: %s: res == 0 despite size == %Zu\n", - cnt, tests[cnt].fmt, size); - result = 1; - } - else if (size < tests[cnt].min) - { - printf ("%Zu: %s: size == %Zu was enough\n", - cnt, tests[cnt].fmt, size); - result = 1; - } - else - printf ("%Zu: %s: size == %Zu: OK\n", cnt, tests[cnt].fmt, size); - - free (buf); - } - - struct tm ttm = - { - /* Initialize the fields which are needed in the tests. */ - .tm_mday = 1, - .tm_hour = 2 - }; - const struct - { - const char *fmt; - const char *exp; - size_t n; - } ftests[] = - { - { "%-e", "1", 1 }, - { "%-k", "2", 1 }, - { "%-l", "2", 1 }, - }; -#define nftests (sizeof (ftests) / sizeof (ftests[0])) - for (cnt = 0; cnt < nftests; ++cnt) - { - char buf[100]; - size_t r = strftime (buf, sizeof (buf), ftests[cnt].fmt, &ttm); - if (r != ftests[cnt].n) - { - printf ("strftime(\"%s\") returned %zu not %zu\n", - ftests[cnt].fmt, r, ftests[cnt].n); - result = 1; - } - if (strcmp (buf, ftests[cnt].exp) != 0) - { - printf ("strftime(\"%s\") produced \"%s\" not \"%s\"\n", - ftests[cnt].fmt, buf, ftests[cnt].exp); - result = 1; - } - } - - return result + do_bz18985 (); -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/tst-strptime-whitespace.c b/time/tst-strptime-whitespace.c deleted file mode 100644 index 90d4da80ca..0000000000 --- a/time/tst-strptime-whitespace.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Verify that strptime accepts arbitrary whitespace between tokens. - - Copyright (C) 2013-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define _XOPEN_SOURCE -#include <time.h> -#include <stdio.h> -#include <string.h> - -int -do_test (void) -{ - struct tm t; - const char *in = "Tuesday \t 22 \t July\t1942"; - - char *r = strptime (in, "%A%d %b%Y", &t); - - if (r == NULL || r != in + strlen (in)) - { - printf ("strptime failed\n"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/tst-strptime.c b/time/tst-strptime.c deleted file mode 100644 index 4e9e38c8f3..0000000000 --- a/time/tst-strptime.c +++ /dev/null @@ -1,199 +0,0 @@ -/* Test for strptime. - Copyright (C) 1998-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <locale.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - - -static const struct -{ - const char *locale; - const char *input; - const char *format; - int wday; - int yday; - int mon; - int mday; -} day_tests[] = -{ - { "C", "2000-01-01", "%Y-%m-%d", 6, 0, 0, 1 }, - { "C", "03/03/00", "%D", 5, 62, 2, 3 }, - { "C", "9/9/99", "%x", 4, 251, 8, 9 }, - { "C", "19990502123412", "%Y%m%d%H%M%S", 0, 121, 4, 2 }, - { "C", "2001 20 Mon", "%Y %U %a", 1, 140, 4, 21 }, - { "C", "2001 21 Mon", "%Y %W %a", 1, 140, 4, 21 }, - { "C", "2001 21 Mon", "%2000Y %W %a", 1, 140, 4, 21 }, - { "C", "2001 21 Mon", "%^Y %W %a", 1, 140, 4, 21 }, - { "C", "2001 EST 21 Mon", "%Y %Z %W %a", 1, 140, 4, 21 }, - { "C", "2012 00 Sun", "%Y %W %a", 0, 0, 0, 1 }, - { "ja_JP.EUC-JP", "2000-01-01 08:12:21 AM", "%Y-%m-%d %I:%M:%S %p", - 6, 0, 0, 1 }, - { "en_US.ISO-8859-1", "2000-01-01 08:12:21 PM", "%Y-%m-%d %I:%M:%S %p", - 6, 0, 0, 1 }, - { "ja_JP.EUC-JP", "2001 20 \xb7\xee", "%Y %U %a", 1, 140, 4, 21 }, - { "ja_JP.EUC-JP", "2001 21 \xb7\xee", "%Y %W %a", 1, 140, 4, 21 }, -}; - - -static const struct -{ - const char *input; - const char *format; - const char *output; - int wday; - int yday; -} tm_tests [] = -{ - {"17410105012000", "%H%M%S%d%m%Y", "2000-01-05 17:41:01", 3, 4} -}; - - - -static int -test_tm (void) -{ - struct tm tm; - size_t i; - int result = 0; - char buf[100]; - - for (i = 0; i < sizeof (tm_tests) / sizeof (tm_tests[0]); ++i) - { - memset (&tm, '\0', sizeof (tm)); - - char *ret = strptime (tm_tests[i].input, tm_tests[i].format, &tm); - if (ret == NULL) - { - printf ("strptime returned NULL for `%s'\n", tm_tests[i].input); - result = 1; - continue; - } - else if (*ret != '\0') - { - printf ("not all of `%s' read\n", tm_tests[i].input); - result = 1; - } - strftime (buf, sizeof (buf), "%F %T", &tm); - printf ("strptime (\"%s\", \"%s\", ...)\n" - "\tshould be: %s, wday = %d, yday = %3d\n" - "\t is: %s, wday = %d, yday = %3d\n", - tm_tests[i].input, tm_tests[i].format, - tm_tests[i].output, - tm_tests[i].wday, tm_tests[i].yday, - buf, tm.tm_wday, tm.tm_yday); - - if (strcmp (buf, tm_tests[i].output) != 0) - { - printf ("Time and date are not correct.\n"); - result = 1; - } - if (tm.tm_wday != tm_tests[i].wday) - { - printf ("weekday for `%s' incorrect: %d instead of %d\n", - tm_tests[i].input, tm.tm_wday, tm_tests[i].wday); - result = 1; - } - if (tm.tm_yday != tm_tests[i].yday) - { - printf ("yearday for `%s' incorrect: %d instead of %d\n", - tm_tests[i].input, tm.tm_yday, tm_tests[i].yday); - result = 1; - } - } - - return result; -} - - -static int -do_test (void) -{ - struct tm tm; - size_t i; - int result = 0; - - for (i = 0; i < sizeof (day_tests) / sizeof (day_tests[0]); ++i) - { - memset (&tm, '\0', sizeof (tm)); - - if (setlocale (LC_ALL, day_tests[i].locale) == NULL) - { - printf ("cannot set locale %s: %m\n", day_tests[i].locale); - exit (EXIT_FAILURE); - } - - char *ret = strptime (day_tests[i].input, day_tests[i].format, &tm); - if (ret == NULL) - { - printf ("strptime returned NULL for `%s'\n", day_tests[i].input); - result = 1; - continue; - } - else if (*ret != '\0') - { - printf ("not all of `%s' read\n", day_tests[i].input); - result = 1; - } - - printf ("strptime (\"%s\", \"%s\", ...)\n" - "\tshould be: wday = %d, yday = %3d, mon = %2d, mday = %2d\n" - "\t is: wday = %d, yday = %3d, mon = %2d, mday = %2d\n", - day_tests[i].input, day_tests[i].format, - day_tests[i].wday, day_tests[i].yday, - day_tests[i].mon, day_tests[i].mday, - tm.tm_wday, tm.tm_yday, tm.tm_mon, tm.tm_mday); - - if (tm.tm_wday != day_tests[i].wday) - { - printf ("weekday for `%s' incorrect: %d instead of %d\n", - day_tests[i].input, tm.tm_wday, day_tests[i].wday); - result = 1; - } - if (tm.tm_yday != day_tests[i].yday) - { - printf ("yearday for `%s' incorrect: %d instead of %d\n", - day_tests[i].input, tm.tm_yday, day_tests[i].yday); - result = 1; - } - if (tm.tm_mon != day_tests[i].mon) - { - printf ("month for `%s' incorrect: %d instead of %d\n", - day_tests[i].input, tm.tm_mon, day_tests[i].mon); - result = 1; - } - if (tm.tm_mday != day_tests[i].mday) - { - printf ("monthday for `%s' incorrect: %d instead of %d\n", - day_tests[i].input, tm.tm_mday, day_tests[i].mday); - result = 1; - } - } - - setlocale (LC_ALL, "C"); - - result |= test_tm (); - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/tst-strptime2.c b/time/tst-strptime2.c deleted file mode 100644 index 8019e7f5d8..0000000000 --- a/time/tst-strptime2.c +++ /dev/null @@ -1,235 +0,0 @@ -/* tst-strptime2 - Test strptime %z timezone offset specifier. */ - -#include <limits.h> -#include <stdbool.h> -#include <stdio.h> -#include <time.h> -#include <libc-diag.h> - -/* Dummy string is used to match strptime's %s specifier. */ - -static const char dummy_string[] = "1113472456"; - -/* buffer_size contains the maximum test string length, including - trailing NUL. */ - -enum -{ - buffer_size = 20, -}; - -/* Verbose execution, set with --verbose command line option. */ - -static bool verbose; - - -/* mkbuf - Write a test string for strptime with the specified time - value and number of digits into the supplied buffer, and return - the expected strptime test result. - - The test string, buf, is written with the following content: - a dummy string matching strptime "%s" format specifier, - whitespace matching strptime " " format specifier, and - timezone string matching strptime "%z" format specifier. - - Note that a valid timezone string is either "Z" or contains the - following fields: - Sign field consisting of a '+' or '-' sign, - Hours field in two decimal digits, and - optional Minutes field in two decimal digits. Optionally, - a ':' is used to seperate hours and minutes. - - This function may write test strings with minutes values outside - the valid range 00-59. These are invalid strings and useful for - testing strptime's rejection of invalid strings. - - The ndigits parameter is used to limit the number of timezone - string digits to be written and may range from 0 to 4. Note that - only 2 and 4 digit strings are valid input to strptime; strings - with 0, 1 or 3 digits are invalid and useful for testing strptime's - rejection of invalid strings. - - This function returns the behavior expected of strptime resulting - from parsing the the test string. For valid strings, the function - returns the expected tm_gmtoff value. For invalid strings, - LONG_MAX is returned. LONG_MAX indicates the expectation that - strptime will return NULL; for example, if the number of digits - are not correct, or minutes part of the time is outside the valid - range of 00 to 59. */ - -static long int -mkbuf (char *buf, bool neg, bool colon, unsigned int hhmm, size_t ndigits) -{ - const int mm_max = 59; - char sign = neg ? '-' : '+'; - int i; - unsigned int hh = hhmm / 100; - unsigned int mm = hhmm % 100; - long int expect = LONG_MAX; - - i = sprintf (buf, "%s %c", dummy_string, sign); -#if __GNUC_PREREQ (7, 0) - /* GCC issues a warning when it thinks the snprintf buffer may be too short. - This test is explicitly using short buffers to force snprintf to truncate - the output so we ignore the warnings. */ - DIAG_PUSH_NEEDS_COMMENT; - DIAG_IGNORE_NEEDS_COMMENT (7.0, "-Wformat-truncation"); -#endif - if (colon) - snprintf (buf + i, ndigits + 2, "%02u:%02u", hh, mm); - else - snprintf (buf + i, ndigits + 1, "%04u", hhmm); -#if __GNUC_PREREQ (7, 0) - DIAG_POP_NEEDS_COMMENT; -#endif - - if (mm <= mm_max && (ndigits == 2 || ndigits == 4)) - { - long int tm_gmtoff = hh * 3600 + mm * 60; - - expect = neg ? -tm_gmtoff : tm_gmtoff; - } - - return expect; -} - - -/* Write a description of expected or actual test result to stdout. */ - -static void -describe (bool string_valid, long int tm_gmtoff) -{ - if (string_valid) - printf ("valid, tm.tm_gmtoff %ld", tm_gmtoff); - else - printf ("invalid, return value NULL"); -} - - -/* Using buffer buf, run strptime. Compare results against expect, - the expected result. Report failures and verbose results to stdout. - Update the result counts. Return 1 if test failed, 0 if passed. */ - -static int -compare (const char *buf, long int expect, unsigned int *nresult) -{ - struct tm tm; - char *p; - bool test_string_valid; - long int test_result; - bool fail; - int result; - - p = strptime (buf, "%s %z", &tm); - test_string_valid = p != NULL; - test_result = test_string_valid ? tm.tm_gmtoff : LONG_MAX; - fail = test_result != expect; - - if (fail || verbose) - { - bool expect_string_valid = expect != LONG_MAX; - - printf ("%s: input \"%s\", expected: ", fail ? "FAIL" : "PASS", buf); - describe (expect_string_valid, expect); - - if (fail) - { - printf (", got: "); - describe (test_string_valid, test_result); - } - - printf ("\n"); - } - - result = fail ? 1 : 0; - nresult[result]++; - - return result; -} - - -static int -do_test (void) -{ - char buf[buffer_size]; - long int expect; - int result = 0; - /* Number of tests run with passing (index==0) and failing (index==1) - results. */ - unsigned int nresult[2]; - unsigned int ndigits; - unsigned int step; - unsigned int hhmm; - - nresult[0] = 0; - nresult[1] = 0; - - /* Create and test input string with no sign and four digits input - (invalid format). */ - - sprintf (buf, "%s 1030", dummy_string); - expect = LONG_MAX; - result |= compare (buf, expect, nresult); - - /* Create and test input string with "Z" input (valid format). - Expect tm_gmtoff of 0. */ - - sprintf (buf, "%s Z", dummy_string); - expect = 0; - result |= compare (buf, expect, nresult); - - /* Create and test input strings with sign and digits: - 0 digits (invalid format), - 1 digit (invalid format), - 2 digits (valid format), - 3 digits (invalid format), - 4 digits (valid format if and only if minutes is in range 00-59, - otherwise invalid). - If format is valid, the returned tm_gmtoff is checked. */ - - for (ndigits = 0, step = 10000; ndigits <= 4; ndigits++, step /= 10) - for (hhmm = 0; hhmm <= 9999; hhmm += step) - { - /* Test both positive and negative signs. */ - - expect = mkbuf (buf, false, false, hhmm, ndigits); - result |= compare (buf, expect, nresult); - - expect = mkbuf (buf, true, false, hhmm, ndigits); - result |= compare (buf, expect, nresult); - - /* Test with colon as well. */ - - if (ndigits >= 3) - { - expect = mkbuf (buf, false, true, hhmm, ndigits); - result |= compare (buf, expect, nresult); - - expect = mkbuf (buf, true, true, hhmm, ndigits); - result |= compare (buf, expect, nresult); - } - } - - if (result > 0 || verbose) - printf ("%s: %u input strings: %u fail, %u pass\n", - result > 0 ? "FAIL" : "PASS", - nresult[1] + nresult[0], nresult[1], nresult[0]); - - return result; -} - - -/* Add a "--verbose" command line option to test-skeleton.c. */ - -#define OPT_VERBOSE 10000 - -#define CMDLINE_OPTIONS \ - { "verbose", no_argument, NULL, OPT_VERBOSE, }, - -#define CMDLINE_PROCESS \ - case OPT_VERBOSE: \ - verbose = true; \ - break; - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/tst-strptime3.c b/time/tst-strptime3.c deleted file mode 100644 index d53f51ee22..0000000000 --- a/time/tst-strptime3.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - - -static int -do_test (void) -{ - int result = 0; - struct tm tm; - - memset (&tm, 0xaa, sizeof (tm)); - - /* Test we don't crash on uninitialized struct tm. - Some fields might contain bogus values until everything - needed is initialized, but we shouldn't crash. */ - if (strptime ("2007", "%Y", &tm) == NULL - || strptime ("12", "%d", &tm) == NULL - || strptime ("Feb", "%b", &tm) == NULL - || strptime ("13", "%M", &tm) == NULL - || strptime ("21", "%S", &tm) == NULL - || strptime ("16", "%H", &tm) == NULL) - { - puts ("strptimes failed"); - result = 1; - } - - if (tm.tm_sec != 21 || tm.tm_min != 13 || tm.tm_hour != 16 - || tm.tm_mday != 12 || tm.tm_mon != 1 || tm.tm_year != 107 - || tm.tm_wday != 1 || tm.tm_yday != 42) - { - puts ("unexpected tm content"); - result = 1; - } - - if (strptime ("8", "%d", &tm) == NULL) - { - puts ("strptime failed"); - result = 1; - } - - if (tm.tm_sec != 21 || tm.tm_min != 13 || tm.tm_hour != 16 - || tm.tm_mday != 8 || tm.tm_mon != 1 || tm.tm_year != 107 - || tm.tm_wday != 4 || tm.tm_yday != 38) - { - puts ("unexpected tm content"); - result = 1; - } - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/tst-tzname.c b/time/tst-tzname.c deleted file mode 100644 index f0ce13f835..0000000000 --- a/time/tst-tzname.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Test that tzset sets tzname correctly (BZ #19253). - Copyright (C) 2015-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -static int -do_test (void) -{ - int result = 0; - - setenv ("TZ", TZDEFRULES, 1); - tzset (); - const char *stdtz = strdup (tzname[0]); - setenv ("TZ", "STD-1DST", 1); - tzset (); - if (strcmp (tzname[0], "STD") != 0) - { - printf ("FAIL: TZ=STD-1DST, tzname[0] = %s\n", tzname[0]); - result = 1; - } - setenv ("TZ", TZDEFRULES, 1); - tzset (); - if (strcmp (tzname[0], stdtz) != 0) - { - printf ("FAIL: TZ=%s, tzname[0] = %s\n", TZDEFRULES, tzname[0]); - result = 1; - } - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/time/tst_wcsftime.c b/time/tst_wcsftime.c deleted file mode 100644 index 3f6f0d9f77..0000000000 --- a/time/tst_wcsftime.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <time.h> -#include <wchar.h> - -int -main (int argc, char *argv[]) -{ - wchar_t buf[200]; - time_t t; - struct tm *tp; - int result = 0; - size_t n; - - time (&t); - tp = gmtime (&t); - - n = wcsftime (buf, sizeof (buf) / sizeof (buf[0]), - L"%H:%M:%S %Y-%m-%d\n", tp); - if (n != 21) - result = 1; - - wprintf (L"It is now %ls", buf); - - wcsftime (buf, sizeof (buf) / sizeof (buf[0]), L"%A\n", tp); - - wprintf (L"The weekday is %ls", buf); - - return result; -} diff --git a/time/tzfile.c b/time/tzfile.c deleted file mode 100644 index d41246980b..0000000000 --- a/time/tzfile.c +++ /dev/null @@ -1,832 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <limits.h> -#include <stdio.h> -#include <stdio_ext.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <unistd.h> -#include <sys/stat.h> -#include <stdint.h> - -#include <timezone/tzfile.h> - -int __use_tzfile; -static dev_t tzfile_dev; -static ino64_t tzfile_ino; -static time_t tzfile_mtime; - -struct ttinfo - { - long int offset; /* Seconds east of GMT. */ - unsigned char isdst; /* Used to set tm_isdst. */ - unsigned char idx; /* Index into `zone_names'. */ - unsigned char isstd; /* Transition times are in standard time. */ - unsigned char isgmt; /* Transition times are in GMT. */ - }; - -struct leap - { - time_t transition; /* Time the transition takes effect. */ - long int change; /* Seconds of correction to apply. */ - }; - -static size_t num_transitions; -libc_freeres_ptr (static time_t *transitions); -static unsigned char *type_idxs; -static size_t num_types; -static struct ttinfo *types; -static char *zone_names; -static long int rule_stdoff; -static long int rule_dstoff; -static size_t num_leaps; -static struct leap *leaps; -static char *tzspec; - -#include <endian.h> -#include <byteswap.h> - -/* Decode the four bytes at PTR as a signed integer in network byte order. */ -static inline int -__attribute ((always_inline)) -decode (const void *ptr) -{ - if (BYTE_ORDER == BIG_ENDIAN && sizeof (int) == 4) - return *(const int *) ptr; - if (sizeof (int) == 4) - return bswap_32 (*(const int *) ptr); - - const unsigned char *p = ptr; - int result = *p & (1 << (CHAR_BIT - 1)) ? ~0 : 0; - - result = (result << 8) | *p++; - result = (result << 8) | *p++; - result = (result << 8) | *p++; - result = (result << 8) | *p++; - - return result; -} - - -static inline int64_t -__attribute ((always_inline)) -decode64 (const void *ptr) -{ - if ((BYTE_ORDER == BIG_ENDIAN)) - return *(const int64_t *) ptr; - - return bswap_64 (*(const int64_t *) ptr); -} - - -void -__tzfile_read (const char *file, size_t extra, char **extrap) -{ - static const char default_tzdir[] = TZDIR; - size_t num_isstd, num_isgmt; - FILE *f; - struct tzhead tzhead; - size_t chars; - size_t i; - size_t total_size; - size_t types_idx; - size_t leaps_idx; - int was_using_tzfile = __use_tzfile; - int trans_width = 4; - size_t tzspec_len; - char *new = NULL; - - if (sizeof (time_t) != 4 && sizeof (time_t) != 8) - abort (); - - __use_tzfile = 0; - - if (file == NULL) - /* No user specification; use the site-wide default. */ - file = TZDEFAULT; - else if (*file == '\0') - /* User specified the empty string; use UTC with no leap seconds. */ - goto ret_free_transitions; - else - { - /* We must not allow to read an arbitrary file in a setuid - program. So we fail for any file which is not in the - directory hierachy starting at TZDIR - and which is not the system wide default TZDEFAULT. */ - if (__libc_enable_secure - && ((*file == '/' - && memcmp (file, TZDEFAULT, sizeof TZDEFAULT) - && memcmp (file, default_tzdir, sizeof (default_tzdir) - 1)) - || strstr (file, "../") != NULL)) - /* This test is certainly a bit too restrictive but it should - catch all critical cases. */ - goto ret_free_transitions; - } - - if (*file != '/') - { - const char *tzdir; - - tzdir = getenv ("TZDIR"); - if (tzdir == NULL || *tzdir == '\0') - tzdir = default_tzdir; - if (__asprintf (&new, "%s/%s", tzdir, file) == -1) - goto ret_free_transitions; - file = new; - } - - /* If we were already using tzfile, check whether the file changed. */ - struct stat64 st; - if (was_using_tzfile - && stat64 (file, &st) == 0 - && tzfile_ino == st.st_ino && tzfile_dev == st.st_dev - && tzfile_mtime == st.st_mtime) - goto done; /* Nothing to do. */ - - /* Note the file is opened with cancellation in the I/O functions - disabled and if available FD_CLOEXEC set. */ - f = fopen (file, "rce"); - if (f == NULL) - goto ret_free_transitions; - - /* Get information about the file we are actually using. */ - if (fstat64 (__fileno (f), &st) != 0) - { - fclose (f); - goto ret_free_transitions; - } - - free ((void *) transitions); - transitions = NULL; - - /* Remember the inode and device number and modification time. */ - tzfile_dev = st.st_dev; - tzfile_ino = st.st_ino; - tzfile_mtime = st.st_mtime; - - /* No threads reading this stream. */ - __fsetlocking (f, FSETLOCKING_BYCALLER); - - read_again: - if (__builtin_expect (__fread_unlocked ((void *) &tzhead, sizeof (tzhead), - 1, f) != 1, 0) - || memcmp (tzhead.tzh_magic, TZ_MAGIC, sizeof (tzhead.tzh_magic)) != 0) - goto lose; - - num_transitions = (size_t) decode (tzhead.tzh_timecnt); - num_types = (size_t) decode (tzhead.tzh_typecnt); - chars = (size_t) decode (tzhead.tzh_charcnt); - num_leaps = (size_t) decode (tzhead.tzh_leapcnt); - num_isstd = (size_t) decode (tzhead.tzh_ttisstdcnt); - num_isgmt = (size_t) decode (tzhead.tzh_ttisgmtcnt); - - if (__glibc_unlikely (num_isstd > num_types || num_isgmt > num_types)) - goto lose; - - /* For platforms with 64-bit time_t we use the new format if available. */ - if (sizeof (time_t) == 8 && trans_width == 4 - && tzhead.tzh_version[0] != '\0') - { - /* We use the 8-byte format. */ - trans_width = 8; - - /* Position the stream before the second header. */ - size_t to_skip = (num_transitions * (4 + 1) - + num_types * 6 - + chars - + num_leaps * 8 - + num_isstd - + num_isgmt); - if (fseek (f, to_skip, SEEK_CUR) != 0) - goto lose; - - goto read_again; - } - - if (__builtin_expect (num_transitions - > ((SIZE_MAX - (__alignof__ (struct ttinfo) - 1)) - / (sizeof (time_t) + 1)), 0)) - goto lose; - total_size = num_transitions * (sizeof (time_t) + 1); - total_size = ((total_size + __alignof__ (struct ttinfo) - 1) - & ~(__alignof__ (struct ttinfo) - 1)); - types_idx = total_size; - if (__builtin_expect (num_types - > (SIZE_MAX - total_size) / sizeof (struct ttinfo), 0)) - goto lose; - total_size += num_types * sizeof (struct ttinfo); - if (__glibc_unlikely (chars > SIZE_MAX - total_size)) - goto lose; - total_size += chars; - if (__builtin_expect (__alignof__ (struct leap) - 1 - > SIZE_MAX - total_size, 0)) - goto lose; - total_size = ((total_size + __alignof__ (struct leap) - 1) - & ~(__alignof__ (struct leap) - 1)); - leaps_idx = total_size; - if (__builtin_expect (num_leaps - > (SIZE_MAX - total_size) / sizeof (struct leap), 0)) - goto lose; - total_size += num_leaps * sizeof (struct leap); - tzspec_len = 0; - if (sizeof (time_t) == 8 && trans_width == 8) - { - off_t rem = st.st_size - __ftello (f); - if (__builtin_expect (rem < 0 - || (size_t) rem < (num_transitions * (8 + 1) - + num_types * 6 - + chars), 0)) - goto lose; - tzspec_len = (size_t) rem - (num_transitions * (8 + 1) - + num_types * 6 - + chars); - if (__builtin_expect (num_leaps > SIZE_MAX / 12 - || tzspec_len < num_leaps * 12, 0)) - goto lose; - tzspec_len -= num_leaps * 12; - if (__glibc_unlikely (tzspec_len < num_isstd)) - goto lose; - tzspec_len -= num_isstd; - if (__glibc_unlikely (tzspec_len == 0 || tzspec_len - 1 < num_isgmt)) - goto lose; - tzspec_len -= num_isgmt + 1; - if (__glibc_unlikely (tzspec_len == 0 - || SIZE_MAX - total_size < tzspec_len)) - goto lose; - } - if (__glibc_unlikely (SIZE_MAX - total_size - tzspec_len < extra)) - goto lose; - - /* Allocate enough memory including the extra block requested by the - caller. */ - transitions = (time_t *) malloc (total_size + tzspec_len + extra); - if (transitions == NULL) - goto lose; - - type_idxs = (unsigned char *) transitions + (num_transitions - * sizeof (time_t)); - types = (struct ttinfo *) ((char *) transitions + types_idx); - zone_names = (char *) types + num_types * sizeof (struct ttinfo); - leaps = (struct leap *) ((char *) transitions + leaps_idx); - if (sizeof (time_t) == 8 && trans_width == 8) - tzspec = (char *) leaps + num_leaps * sizeof (struct leap) + extra; - else - tzspec = NULL; - if (extra > 0) - *extrap = (char *) &leaps[num_leaps]; - - if (sizeof (time_t) == 4 || __builtin_expect (trans_width == 8, 1)) - { - if (__builtin_expect (__fread_unlocked (transitions, trans_width + 1, - num_transitions, f) - != num_transitions, 0)) - goto lose; - } - else - { - if (__builtin_expect (__fread_unlocked (transitions, 4, - num_transitions, f) - != num_transitions, 0) - || __builtin_expect (__fread_unlocked (type_idxs, 1, num_transitions, - f) != num_transitions, 0)) - goto lose; - } - - /* Check for bogus indices in the data file, so we can hereafter - safely use type_idxs[T] as indices into `types' and never crash. */ - for (i = 0; i < num_transitions; ++i) - if (__glibc_unlikely (type_idxs[i] >= num_types)) - goto lose; - - if ((BYTE_ORDER != BIG_ENDIAN && (sizeof (time_t) == 4 || trans_width == 4)) - || (BYTE_ORDER == BIG_ENDIAN && sizeof (time_t) == 8 - && trans_width == 4)) - { - /* Decode the transition times, stored as 4-byte integers in - network (big-endian) byte order. We work from the end of - the array so as not to clobber the next element to be - processed when sizeof (time_t) > 4. */ - i = num_transitions; - while (i-- > 0) - transitions[i] = decode ((char *) transitions + i * 4); - } - else if (BYTE_ORDER != BIG_ENDIAN && sizeof (time_t) == 8) - { - /* Decode the transition times, stored as 8-byte integers in - network (big-endian) byte order. */ - for (i = 0; i < num_transitions; ++i) - transitions[i] = decode64 ((char *) transitions + i * 8); - } - - for (i = 0; i < num_types; ++i) - { - unsigned char x[4]; - int c; - if (__builtin_expect (__fread_unlocked (x, 1, - sizeof (x), f) != sizeof (x), - 0)) - goto lose; - c = getc_unlocked (f); - if (__glibc_unlikely ((unsigned int) c > 1u)) - goto lose; - types[i].isdst = c; - c = getc_unlocked (f); - if (__glibc_unlikely ((size_t) c > chars)) - /* Bogus index in data file. */ - goto lose; - types[i].idx = c; - types[i].offset = (long int) decode (x); - } - - if (__glibc_unlikely (__fread_unlocked (zone_names, 1, chars, f) != chars)) - goto lose; - - for (i = 0; i < num_leaps; ++i) - { - unsigned char x[8]; - if (__builtin_expect (__fread_unlocked (x, 1, trans_width, f) - != trans_width, 0)) - goto lose; - if (sizeof (time_t) == 4 || trans_width == 4) - leaps[i].transition = (time_t) decode (x); - else - leaps[i].transition = (time_t) decode64 (x); - - if (__glibc_unlikely (__fread_unlocked (x, 1, 4, f) != 4)) - goto lose; - leaps[i].change = (long int) decode (x); - } - - for (i = 0; i < num_isstd; ++i) - { - int c = getc_unlocked (f); - if (__glibc_unlikely (c == EOF)) - goto lose; - types[i].isstd = c != 0; - } - while (i < num_types) - types[i++].isstd = 0; - - for (i = 0; i < num_isgmt; ++i) - { - int c = getc_unlocked (f); - if (__glibc_unlikely (c == EOF)) - goto lose; - types[i].isgmt = c != 0; - } - while (i < num_types) - types[i++].isgmt = 0; - - /* Read the POSIX TZ-style information if possible. */ - if (sizeof (time_t) == 8 && tzspec != NULL) - { - /* Skip over the newline first. */ - if (getc_unlocked (f) != '\n' - || (__fread_unlocked (tzspec, 1, tzspec_len - 1, f) - != tzspec_len - 1)) - tzspec = NULL; - else - tzspec[tzspec_len - 1] = '\0'; - } - else if (sizeof (time_t) == 4 && tzhead.tzh_version[0] != '\0') - { - /* Get the TZ string. */ - if (__builtin_expect (__fread_unlocked ((void *) &tzhead, - sizeof (tzhead), 1, f) != 1, 0) - || (memcmp (tzhead.tzh_magic, TZ_MAGIC, sizeof (tzhead.tzh_magic)) - != 0)) - goto lose; - - size_t num_transitions2 = (size_t) decode (tzhead.tzh_timecnt); - size_t num_types2 = (size_t) decode (tzhead.tzh_typecnt); - size_t chars2 = (size_t) decode (tzhead.tzh_charcnt); - size_t num_leaps2 = (size_t) decode (tzhead.tzh_leapcnt); - size_t num_isstd2 = (size_t) decode (tzhead.tzh_ttisstdcnt); - size_t num_isgmt2 = (size_t) decode (tzhead.tzh_ttisgmtcnt); - - /* Position the stream before the second header. */ - size_t to_skip = (num_transitions2 * (8 + 1) - + num_types2 * 6 - + chars2 - + num_leaps2 * 12 - + num_isstd2 - + num_isgmt2); - off_t off; - if (fseek (f, to_skip, SEEK_CUR) != 0 - || (off = __ftello (f)) < 0 - || st.st_size < off + 2) - goto lose; - - tzspec_len = st.st_size - off - 1; - if (tzspec_len == 0) - goto lose; - char *tzstr = malloc (tzspec_len); - if (tzstr == NULL) - goto lose; - if (getc_unlocked (f) != '\n' - || (__fread_unlocked (tzstr, 1, tzspec_len - 1, f) - != tzspec_len - 1)) - { - free (tzstr); - goto lose; - } - tzstr[tzspec_len - 1] = '\0'; - tzspec = __tzstring (tzstr); - free (tzstr); - } - - /* Don't use an empty TZ string. */ - if (tzspec != NULL && tzspec[0] == '\0') - tzspec = NULL; - - fclose (f); - - /* First "register" all timezone names. */ - for (i = 0; i < num_types; ++i) - (void) __tzstring (&zone_names[types[i].idx]); - - /* Find the standard and daylight time offsets used by the rule file. - We choose the offsets in the types of each flavor that are - transitioned to earliest in time. */ - __tzname[0] = NULL; - __tzname[1] = NULL; - for (i = num_transitions; i > 0; ) - { - int type = type_idxs[--i]; - int dst = types[type].isdst; - - if (__tzname[dst] == NULL) - { - int idx = types[type].idx; - - __tzname[dst] = __tzstring (&zone_names[idx]); - - if (__tzname[1 - dst] != NULL) - break; - } - } - if (__tzname[0] == NULL) - { - /* This should only happen if there are no transition rules. - In this case there should be only one single type. */ - assert (num_types == 1); - __tzname[0] = __tzstring (zone_names); - } - if (__tzname[1] == NULL) - __tzname[1] = __tzname[0]; - - if (num_transitions == 0) - /* Use the first rule (which should also be the only one). */ - rule_stdoff = rule_dstoff = types[0].offset; - else - { - int stdoff_set = 0, dstoff_set = 0; - rule_stdoff = rule_dstoff = 0; - i = num_transitions - 1; - do - { - if (!stdoff_set && !types[type_idxs[i]].isdst) - { - stdoff_set = 1; - rule_stdoff = types[type_idxs[i]].offset; - } - else if (!dstoff_set && types[type_idxs[i]].isdst) - { - dstoff_set = 1; - rule_dstoff = types[type_idxs[i]].offset; - } - if (stdoff_set && dstoff_set) - break; - } - while (i-- > 0); - - if (!dstoff_set) - rule_dstoff = rule_stdoff; - } - - __daylight = rule_stdoff != rule_dstoff; - __timezone = -rule_stdoff; - - done: - __use_tzfile = 1; - free (new); - return; - - lose: - fclose (f); - ret_free_transitions: - free (new); - free ((void *) transitions); - transitions = NULL; -} - -/* The user specified a hand-made timezone, but not its DST rules. - We will use the names and offsets from the user, and the rules - from the TZDEFRULES file. */ - -void -__tzfile_default (const char *std, const char *dst, - long int stdoff, long int dstoff) -{ - size_t stdlen = strlen (std) + 1; - size_t dstlen = strlen (dst) + 1; - size_t i; - int isdst; - char *cp; - - __tzfile_read (TZDEFRULES, stdlen + dstlen, &cp); - if (!__use_tzfile) - return; - - if (num_types < 2) - { - __use_tzfile = 0; - return; - } - - /* Ignore the zone names read from the file and use the given ones - instead. */ - __mempcpy (__mempcpy (cp, std, stdlen), dst, dstlen); - zone_names = cp; - - /* Now there are only two zones, regardless of what the file contained. */ - num_types = 2; - - /* Now correct the transition times for the user-specified standard and - daylight offsets from GMT. */ - isdst = 0; - for (i = 0; i < num_transitions; ++i) - { - struct ttinfo *trans_type = &types[type_idxs[i]]; - - /* We will use only types 0 (standard) and 1 (daylight). - Fix up this transition to point to whichever matches - the flavor of its original type. */ - type_idxs[i] = trans_type->isdst; - - if (trans_type->isgmt) - /* The transition time is in GMT. No correction to apply. */ ; - else if (isdst && !trans_type->isstd) - /* The type says this transition is in "local wall clock time", and - wall clock time as of the previous transition was DST. Correct - for the difference between the rule's DST offset and the user's - DST offset. */ - transitions[i] += dstoff - rule_dstoff; - else - /* This transition is in "local wall clock time", and wall clock - time as of this iteration is non-DST. Correct for the - difference between the rule's standard offset and the user's - standard offset. */ - transitions[i] += stdoff - rule_stdoff; - - /* The DST state of "local wall clock time" for the next iteration is - as specified by this transition. */ - isdst = trans_type->isdst; - } - - /* Now that we adjusted the transitions to the requested offsets, - reset the rule_stdoff and rule_dstoff values appropriately. They - are used elsewhere. */ - rule_stdoff = stdoff; - rule_dstoff = dstoff; - - /* Reset types 0 and 1 to describe the user's settings. */ - types[0].idx = 0; - types[0].offset = stdoff; - types[0].isdst = 0; - types[1].idx = stdlen; - types[1].offset = dstoff; - types[1].isdst = 1; - - /* Reset the zone names to point to the user's names. */ - __tzname[0] = (char *) std; - __tzname[1] = (char *) dst; - - /* Set the timezone. */ - __timezone = -types[0].offset; - - /* Invalidate the tzfile attribute cache to force rereading - TZDEFRULES the next time it is used. */ - tzfile_dev = 0; - tzfile_ino = 0; - tzfile_mtime = 0; -} - -void -__tzfile_compute (time_t timer, int use_localtime, - long int *leap_correct, int *leap_hit, - struct tm *tp) -{ - size_t i; - - if (use_localtime) - { - __tzname[0] = NULL; - __tzname[1] = NULL; - - if (__glibc_unlikely (num_transitions == 0 || timer < transitions[0])) - { - /* TIMER is before any transition (or there are no transitions). - Choose the first non-DST type - (or the first if they're all DST types). */ - i = 0; - while (i < num_types && types[i].isdst) - { - if (__tzname[1] == NULL) - __tzname[1] = __tzstring (&zone_names[types[i].idx]); - - ++i; - } - - if (i == num_types) - i = 0; - __tzname[0] = __tzstring (&zone_names[types[i].idx]); - if (__tzname[1] == NULL) - { - size_t j = i; - while (j < num_types) - if (types[j].isdst) - { - __tzname[1] = __tzstring (&zone_names[types[j].idx]); - break; - } - else - ++j; - } - } - else if (__glibc_unlikely (timer >= transitions[num_transitions - 1])) - { - if (__glibc_unlikely (tzspec == NULL)) - { - use_last: - i = num_transitions; - goto found; - } - - /* Parse the POSIX TZ-style string. */ - __tzset_parse_tz (tzspec); - - /* Convert to broken down structure. If this fails do not - use the string. */ - if (__glibc_unlikely (! __offtime (&timer, 0, tp))) - goto use_last; - - /* Use the rules from the TZ string to compute the change. */ - __tz_compute (timer, tp, 1); - - /* If tzspec comes from posixrules loaded by __tzfile_default, - override the STD and DST zone names with the ones user - requested in TZ envvar. */ - if (__glibc_unlikely (zone_names == (char *) &leaps[num_leaps])) - { - assert (num_types == 2); - __tzname[0] = __tzstring (zone_names); - __tzname[1] = __tzstring (&zone_names[strlen (zone_names) + 1]); - } - - goto leap; - } - else - { - /* Find the first transition after TIMER, and - then pick the type of the transition before it. */ - size_t lo = 0; - size_t hi = num_transitions - 1; - /* Assume that DST is changing twice a year and guess initial - search spot from it. - Half of a gregorian year has on average 365.2425 * 86400 / 2 - = 15778476 seconds. */ - i = (transitions[num_transitions - 1] - timer) / 15778476; - if (i < num_transitions) - { - i = num_transitions - 1 - i; - if (timer < transitions[i]) - { - if (i < 10 || timer >= transitions[i - 10]) - { - /* Linear search. */ - while (timer < transitions[i - 1]) - --i; - goto found; - } - hi = i - 10; - } - else - { - if (i + 10 >= num_transitions || timer < transitions[i + 10]) - { - /* Linear search. */ - while (timer >= transitions[i]) - ++i; - goto found; - } - lo = i + 10; - } - } - - /* Binary search. */ - /* assert (timer >= transitions[lo] && timer < transitions[hi]); */ - while (lo + 1 < hi) - { - i = (lo + hi) / 2; - if (timer < transitions[i]) - hi = i; - else - lo = i; - } - i = hi; - - found: - /* assert (timer >= transitions[i - 1] - && (i == num_transitions || timer < transitions[i])); */ - __tzname[types[type_idxs[i - 1]].isdst] - = __tzstring (&zone_names[types[type_idxs[i - 1]].idx]); - size_t j = i; - while (j < num_transitions) - { - int type = type_idxs[j]; - int dst = types[type].isdst; - int idx = types[type].idx; - - if (__tzname[dst] == NULL) - { - __tzname[dst] = __tzstring (&zone_names[idx]); - - if (__tzname[1 - dst] != NULL) - break; - } - - ++j; - } - - if (__glibc_unlikely (__tzname[0] == NULL)) - __tzname[0] = __tzname[1]; - - i = type_idxs[i - 1]; - } - - struct ttinfo *info = &types[i]; - __daylight = rule_stdoff != rule_dstoff; - __timezone = -rule_stdoff; - - if (__tzname[0] == NULL) - { - /* This should only happen if there are no transition rules. - In this case there should be only one single type. */ - assert (num_types == 1); - __tzname[0] = __tzstring (zone_names); - } - if (__tzname[1] == NULL) - /* There is no daylight saving time. */ - __tzname[1] = __tzname[0]; - tp->tm_isdst = info->isdst; - assert (strcmp (&zone_names[info->idx], __tzname[tp->tm_isdst]) == 0); - tp->tm_zone = __tzname[tp->tm_isdst]; - tp->tm_gmtoff = info->offset; - } - - leap: - *leap_correct = 0L; - *leap_hit = 0; - - /* Find the last leap second correction transition time before TIMER. */ - i = num_leaps; - do - if (i-- == 0) - return; - while (timer < leaps[i].transition); - - /* Apply its correction. */ - *leap_correct = leaps[i].change; - - if (timer == leaps[i].transition && /* Exactly at the transition time. */ - ((i == 0 && leaps[i].change > 0) || - leaps[i].change > leaps[i - 1].change)) - { - *leap_hit = 1; - while (i > 0 - && leaps[i].transition == leaps[i - 1].transition + 1 - && leaps[i].change == leaps[i - 1].change + 1) - { - ++*leap_hit; - --i; - } - } -} diff --git a/time/tzset.c b/time/tzset.c deleted file mode 100644 index 8868e9aada..0000000000 --- a/time/tzset.c +++ /dev/null @@ -1,632 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <ctype.h> -#include <errno.h> -#include <libc-lock.h> -#include <stdbool.h> -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -#include <timezone/tzfile.h> - -char *__tzname[2] = { (char *) "GMT", (char *) "GMT" }; -int __daylight = 0; -long int __timezone = 0L; - -weak_alias (__tzname, tzname) -weak_alias (__daylight, daylight) -weak_alias (__timezone, timezone) - -/* This locks all the state variables in tzfile.c and this file. */ -__libc_lock_define_initialized (static, tzset_lock) - -/* This structure contains all the information about a - timezone given in the POSIX standard TZ envariable. */ -typedef struct - { - const char *name; - - /* When to change. */ - enum { J0, J1, M } type; /* Interpretation of: */ - unsigned short int m, n, d; /* Month, week, day. */ - int secs; /* Time of day. */ - - long int offset; /* Seconds east of GMT (west if < 0). */ - - /* We cache the computed time of change for a - given year so we don't have to recompute it. */ - time_t change; /* When to change to this zone. */ - int computed_for; /* Year above is computed for. */ - } tz_rule; - -/* tz_rules[0] is standard, tz_rules[1] is daylight. */ -static tz_rule tz_rules[2]; - - -static void compute_change (tz_rule *rule, int year) __THROW internal_function; -static void tzset_internal (int always); - -/* List of buffers containing time zone strings. */ -struct tzstring_l -{ - struct tzstring_l *next; - size_t len; /* strlen(data) - doesn't count terminating NUL! */ - char data[0]; -}; - -static struct tzstring_l *tzstring_list; - -/* Allocate a permanent home for the first LEN characters of S. It - will never be moved or deallocated, but may share space with other - strings. Don't modify the returned string. */ -static char * -__tzstring_len (const char *s, size_t len) -{ - char *p; - struct tzstring_l *t, *u, *new; - - /* Walk the list and look for a match. If this string is the same - as the end of an already-allocated string, it can share space. */ - for (u = t = tzstring_list; t; u = t, t = t->next) - if (len <= t->len) - { - p = &t->data[t->len - len]; - if (memcmp (s, p, len) == 0) - return p; - } - - /* Not found; allocate a new buffer. */ - new = malloc (sizeof (struct tzstring_l) + len + 1); - if (!new) - return NULL; - - new->next = NULL; - new->len = len; - memcpy (new->data, s, len); - new->data[len] = '\0'; - - if (u) - u->next = new; - else - tzstring_list = new; - - return new->data; -} - -/* Allocate a permanent home for S. It will never be moved or - deallocated, but may share space with other strings. Don't modify - the returned string. */ -char * -__tzstring (const char *s) -{ - return __tzstring_len (s, strlen (s)); -} - -static char *old_tz; - -static void -internal_function -update_vars (void) -{ - __daylight = tz_rules[0].offset != tz_rules[1].offset; - __timezone = -tz_rules[0].offset; - __tzname[0] = (char *) tz_rules[0].name; - __tzname[1] = (char *) tz_rules[1].name; -} - - -static unsigned int -compute_offset (unsigned int ss, unsigned int mm, unsigned int hh) -{ - if (ss > 59) - ss = 59; - if (mm > 59) - mm = 59; - if (hh > 24) - hh = 24; - return ss + mm * 60 + hh * 60 * 60; -} - -/* Parses the time zone name at *TZP, and writes a pointer to an - interned string to tz_rules[WHICHRULE].name. On success, advances - *TZP, and returns true. Returns false otherwise. */ -static bool -parse_tzname (const char **tzp, int whichrule) -{ - const char *start = *tzp; - const char *p = start; - while (('a' <= *p && *p <= 'z') - || ('A' <= *p && *p <= 'Z')) - ++p; - size_t len = p - start; - if (len < 3) - { - p = *tzp; - if (__glibc_unlikely (*p++ != '<')) - return false; - start = p; - while (('a' <= *p && *p <= 'z') - || ('A' <= *p && *p <= 'Z') - || ('0' <= *p && *p <= '9') - || *p == '+' || *p == '-') - ++p; - len = p - start; - if (*p++ != '>' || len < 3) - return false; - } - - const char *name = __tzstring_len (start, len); - if (name == NULL) - return false; - tz_rules[whichrule].name = name; - - *tzp = p; - return true; -} - -/* Parses the time zone offset at *TZP, and writes it to - tz_rules[WHICHRULE].offset. Returns true if the parse was - successful. */ -static bool -parse_offset (const char **tzp, int whichrule) -{ - const char *tz = *tzp; - if (whichrule == 0 - && (*tz == '\0' || (*tz != '+' && *tz != '-' && !isdigit (*tz)))) - return false; - - long sign; - if (*tz == '-' || *tz == '+') - sign = *tz++ == '-' ? 1L : -1L; - else - sign = -1L; - *tzp = tz; - - unsigned short int hh; - unsigned short mm = 0; - unsigned short ss = 0; - int consumed = 0; - if (sscanf (tz, "%hu%n:%hu%n:%hu%n", - &hh, &consumed, &mm, &consumed, &ss, &consumed) > 0) - tz_rules[whichrule].offset = sign * compute_offset (ss, mm, hh); - else - /* Nothing could be parsed. */ - if (whichrule == 0) - { - /* Standard time defaults to offset zero. */ - tz_rules[0].offset = 0; - return false; - } - else - /* DST defaults to one hour later than standard time. */ - tz_rules[1].offset = tz_rules[0].offset + (60 * 60); - *tzp = tz + consumed; - return true; -} - -/* Parses the standard <-> DST rules at *TZP. Updates - tz_rule[WHICHRULE]. On success, advances *TZP and returns true. - Otherwise, returns false. */ -static bool -parse_rule (const char **tzp, int whichrule) -{ - const char *tz = *tzp; - tz_rule *tzr = &tz_rules[whichrule]; - - /* Ignore comma to support string following the incorrect - specification in early POSIX.1 printings. */ - tz += *tz == ','; - - /* Get the date of the change. */ - if (*tz == 'J' || isdigit (*tz)) - { - char *end; - tzr->type = *tz == 'J' ? J1 : J0; - if (tzr->type == J1 && !isdigit (*++tz)) - return false; - unsigned long int d = strtoul (tz, &end, 10); - if (end == tz || d > 365) - return false; - if (tzr->type == J1 && d == 0) - return false; - tzr->d = d; - tz = end; - } - else if (*tz == 'M') - { - tzr->type = M; - int consumed; - if (sscanf (tz, "M%hu.%hu.%hu%n", - &tzr->m, &tzr->n, &tzr->d, &consumed) != 3 - || tzr->m < 1 || tzr->m > 12 - || tzr->n < 1 || tzr->n > 5 || tzr->d > 6) - return false; - tz += consumed; - } - else if (*tz == '\0') - { - /* Daylight time rules in the U.S. are defined in the U.S. Code, - Title 15, Chapter 6, Subchapter IX - Standard Time. These - dates were established by Congress in the Energy Policy Act - of 2005 [Pub. L. no. 109-58, 119 Stat 594 (2005)]. - Below is the equivalent of "M3.2.0,M11.1.0" [/2 not needed - since 2:00AM is the default]. */ - tzr->type = M; - if (tzr == &tz_rules[0]) - { - tzr->m = 3; - tzr->n = 2; - tzr->d = 0; - } - else - { - tzr->m = 11; - tzr->n = 1; - tzr->d = 0; - } - } - else - return false; - - if (*tz != '\0' && *tz != '/' && *tz != ',') - return false; - else if (*tz == '/') - { - /* Get the time of day of the change. */ - int negative; - ++tz; - if (*tz == '\0') - return false; - negative = *tz == '-'; - tz += negative; - /* Default to 2:00 AM. */ - unsigned short hh = 2; - unsigned short mm = 0; - unsigned short ss = 0; - int consumed = 0; - sscanf (tz, "%hu%n:%hu%n:%hu%n", - &hh, &consumed, &mm, &consumed, &ss, &consumed);; - tz += consumed; - tzr->secs = (negative ? -1 : 1) * ((hh * 60 * 60) + (mm * 60) + ss); - } - else - /* Default to 2:00 AM. */ - tzr->secs = 2 * 60 * 60; - - tzr->computed_for = -1; - *tzp = tz; - return true; -} - -/* Parse the POSIX TZ-style string. */ -void -__tzset_parse_tz (const char *tz) -{ - /* Clear out old state and reset to unnamed UTC. */ - memset (tz_rules, '\0', sizeof tz_rules); - tz_rules[0].name = tz_rules[1].name = ""; - - /* Get the standard timezone name. */ - if (parse_tzname (&tz, 0) && parse_offset (&tz, 0)) - { - /* Get the DST timezone name (if any). */ - if (*tz != '\0') - { - if (parse_tzname (&tz, 1)) - { - parse_offset (&tz, 1); - if (*tz == '\0' || (tz[0] == ',' && tz[1] == '\0')) - { - /* There is no rule. See if there is a default rule - file. */ - __tzfile_default (tz_rules[0].name, tz_rules[1].name, - tz_rules[0].offset, tz_rules[1].offset); - if (__use_tzfile) - { - free (old_tz); - old_tz = NULL; - return; - } - } - } - /* Figure out the standard <-> DST rules. */ - if (parse_rule (&tz, 0)) - parse_rule (&tz, 1); - } - else - { - /* There is no DST. */ - tz_rules[1].name = tz_rules[0].name; - tz_rules[1].offset = tz_rules[0].offset; - } - } - - update_vars (); -} - -/* Interpret the TZ envariable. */ -static void -tzset_internal (int always) -{ - static int is_initialized; - const char *tz; - - if (is_initialized && !always) - return; - is_initialized = 1; - - /* Examine the TZ environment variable. */ - tz = getenv ("TZ"); - if (tz && *tz == '\0') - /* User specified the empty string; use UTC explicitly. */ - tz = "Universal"; - - /* A leading colon means "implementation defined syntax". - We ignore the colon and always use the same algorithm: - try a data file, and if none exists parse the 1003.1 syntax. */ - if (tz && *tz == ':') - ++tz; - - /* Check whether the value changed since the last run. */ - if (old_tz != NULL && tz != NULL && strcmp (tz, old_tz) == 0) - /* No change, simply return. */ - return; - - if (tz == NULL) - /* No user specification; use the site-wide default. */ - tz = TZDEFAULT; - - tz_rules[0].name = NULL; - tz_rules[1].name = NULL; - - /* Save the value of `tz'. */ - free (old_tz); - old_tz = tz ? __strdup (tz) : NULL; - - /* Try to read a data file. */ - __tzfile_read (tz, 0, NULL); - if (__use_tzfile) - return; - - /* No data file found. Default to UTC if nothing specified. */ - - if (tz == NULL || *tz == '\0' - || (TZDEFAULT != NULL && strcmp (tz, TZDEFAULT) == 0)) - { - memset (tz_rules, '\0', sizeof tz_rules); - tz_rules[0].name = tz_rules[1].name = "UTC"; - if (J0 != 0) - tz_rules[0].type = tz_rules[1].type = J0; - tz_rules[0].change = tz_rules[1].change = (time_t) -1; - update_vars (); - return; - } - - __tzset_parse_tz (tz); -} - -/* Figure out the exact time (as a time_t) in YEAR - when the change described by RULE will occur and - put it in RULE->change, saving YEAR in RULE->computed_for. */ -static void -internal_function -compute_change (tz_rule *rule, int year) -{ - time_t t; - - if (year != -1 && rule->computed_for == year) - /* Operations on times in 2 BC will be slower. Oh well. */ - return; - - /* First set T to January 1st, 0:00:00 GMT in YEAR. */ - if (year > 1970) - t = ((year - 1970) * 365 - + /* Compute the number of leapdays between 1970 and YEAR - (exclusive). There is a leapday every 4th year ... */ - + ((year - 1) / 4 - 1970 / 4) - /* ... except every 100th year ... */ - - ((year - 1) / 100 - 1970 / 100) - /* ... but still every 400th year. */ - + ((year - 1) / 400 - 1970 / 400)) * SECSPERDAY; - else - t = 0; - - switch (rule->type) - { - case J1: - /* Jn - Julian day, 1 == January 1, 60 == March 1 even in leap years. - In non-leap years, or if the day number is 59 or less, just - add SECSPERDAY times the day number-1 to the time of - January 1, midnight, to get the day. */ - t += (rule->d - 1) * SECSPERDAY; - if (rule->d >= 60 && __isleap (year)) - t += SECSPERDAY; - break; - - case J0: - /* n - Day of year. - Just add SECSPERDAY times the day number to the time of Jan 1st. */ - t += rule->d * SECSPERDAY; - break; - - case M: - /* Mm.n.d - Nth "Dth day" of month M. */ - { - unsigned int i; - int d, m1, yy0, yy1, yy2, dow; - const unsigned short int *myday = - &__mon_yday[__isleap (year)][rule->m]; - - /* First add SECSPERDAY for each day in months before M. */ - t += myday[-1] * SECSPERDAY; - - /* Use Zeller's Congruence to get day-of-week of first day of month. */ - m1 = (rule->m + 9) % 12 + 1; - yy0 = (rule->m <= 2) ? (year - 1) : year; - yy1 = yy0 / 100; - yy2 = yy0 % 100; - dow = ((26 * m1 - 2) / 10 + 1 + yy2 + yy2 / 4 + yy1 / 4 - 2 * yy1) % 7; - if (dow < 0) - dow += 7; - - /* DOW is the day-of-week of the first day of the month. Get the - day-of-month (zero-origin) of the first DOW day of the month. */ - d = rule->d - dow; - if (d < 0) - d += 7; - for (i = 1; i < rule->n; ++i) - { - if (d + 7 >= (int) myday[0] - myday[-1]) - break; - d += 7; - } - - /* D is the day-of-month (zero-origin) of the day we want. */ - t += d * SECSPERDAY; - } - break; - } - - /* T is now the Epoch-relative time of 0:00:00 GMT on the day we want. - Just add the time of day and local offset from GMT, and we're done. */ - - rule->change = t - rule->offset + rule->secs; - rule->computed_for = year; -} - - -/* Figure out the correct timezone for TM and set `__tzname', - `__timezone', and `__daylight' accordingly. */ -void -internal_function -__tz_compute (time_t timer, struct tm *tm, int use_localtime) -{ - compute_change (&tz_rules[0], 1900 + tm->tm_year); - compute_change (&tz_rules[1], 1900 + tm->tm_year); - - if (use_localtime) - { - int isdst; - - /* We have to distinguish between northern and southern - hemisphere. For the latter the daylight saving time - ends in the next year. */ - if (__builtin_expect (tz_rules[0].change - > tz_rules[1].change, 0)) - isdst = (timer < tz_rules[1].change - || timer >= tz_rules[0].change); - else - isdst = (timer >= tz_rules[0].change - && timer < tz_rules[1].change); - tm->tm_isdst = isdst; - tm->tm_zone = __tzname[isdst]; - tm->tm_gmtoff = tz_rules[isdst].offset; - } -} - -/* Reinterpret the TZ environment variable and set `tzname'. */ -#undef tzset - -void -__tzset (void) -{ - __libc_lock_lock (tzset_lock); - - tzset_internal (1); - - if (!__use_tzfile) - { - /* Set `tzname'. */ - __tzname[0] = (char *) tz_rules[0].name; - __tzname[1] = (char *) tz_rules[1].name; - } - - __libc_lock_unlock (tzset_lock); -} -weak_alias (__tzset, tzset) - -/* Return the `struct tm' representation of *TIMER in the local timezone. - Use local time if USE_LOCALTIME is nonzero, UTC otherwise. */ -struct tm * -__tz_convert (const time_t *timer, int use_localtime, struct tm *tp) -{ - long int leap_correction; - int leap_extra_secs; - - if (timer == NULL) - { - __set_errno (EINVAL); - return NULL; - } - - __libc_lock_lock (tzset_lock); - - /* Update internal database according to current TZ setting. - POSIX.1 8.3.7.2 says that localtime_r is not required to set tzname. - This is a good idea since this allows at least a bit more parallelism. */ - tzset_internal (tp == &_tmbuf && use_localtime); - - if (__use_tzfile) - __tzfile_compute (*timer, use_localtime, &leap_correction, - &leap_extra_secs, tp); - else - { - if (! __offtime (timer, 0, tp)) - tp = NULL; - else - __tz_compute (*timer, tp, use_localtime); - leap_correction = 0L; - leap_extra_secs = 0; - } - - __libc_lock_unlock (tzset_lock); - - if (tp) - { - if (! use_localtime) - { - tp->tm_isdst = 0; - tp->tm_zone = "GMT"; - tp->tm_gmtoff = 0L; - } - - if (__offtime (timer, tp->tm_gmtoff - leap_correction, tp)) - tp->tm_sec += leap_extra_secs; - else - tp = NULL; - } - - return tp; -} - - -libc_freeres_fn (free_mem) -{ - while (tzstring_list != NULL) - { - struct tzstring_l *old = tzstring_list; - - tzstring_list = tzstring_list->next; - free (old); - } - free (old_tz); - old_tz = NULL; -} diff --git a/time/wcsftime.c b/time/wcsftime.c deleted file mode 100644 index cbc4161cb5..0000000000 --- a/time/wcsftime.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (C) 1991-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <wchar.h> -#include <locale/localeinfo.h> - - -size_t -wcsftime (wchar_t *s, size_t maxsize, const wchar_t *format, - const struct tm *tp) -{ - return __wcsftime_l (s, maxsize, format, tp, _NL_CURRENT_LOCALE); -} -libc_hidden_def (wcsftime) diff --git a/time/wcsftime_l.c b/time/wcsftime_l.c deleted file mode 100644 index 32101064e3..0000000000 --- a/time/wcsftime_l.c +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (C) 2002-2017 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <wchar.h> -#include <wctype.h> - -#define USE_IN_EXTENDED_LOCALE_MODEL 1 -#define COMPILE_WIDE 1 -#include "strftime_l.c" - -weak_alias (__wcsftime_l, wcsftime_l) |