diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-12-22 20:10:10 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-12-22 20:10:10 +0000 |
commit | a334319f6530564d22e775935d9c91663623a1b4 (patch) | |
tree | b5877475619e4c938e98757d518bb1e9cbead751 /time | |
parent | 0ecb606cb6cf65de1d9fc8a919bceb4be476c602 (diff) | |
download | glibc-a334319f6530564d22e775935d9c91663623a1b4.tar glibc-a334319f6530564d22e775935d9c91663623a1b4.tar.gz glibc-a334319f6530564d22e775935d9c91663623a1b4.tar.bz2 glibc-a334319f6530564d22e775935d9c91663623a1b4.zip |
(CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.
Diffstat (limited to 'time')
-rw-r--r-- | time/Makefile | 5 | ||||
-rw-r--r-- | time/adjtime.c | 37 | ||||
-rw-r--r-- | time/asctime.c | 66 | ||||
-rw-r--r-- | time/bug-asctime.c | 33 | ||||
-rw-r--r-- | time/bug-asctime_r.c | 32 | ||||
-rw-r--r-- | time/bug-mktime1.c | 17 | ||||
-rw-r--r-- | time/clock.c | 32 | ||||
-rw-r--r-- | time/ftime.c | 43 | ||||
-rw-r--r-- | time/getitimer.c | 42 | ||||
-rw-r--r-- | time/gettimeofday.c | 39 | ||||
-rw-r--r-- | time/mktime.c | 73 | ||||
-rw-r--r-- | time/setitimer.c | 44 | ||||
-rw-r--r-- | time/settimeofday.c | 35 | ||||
-rw-r--r-- | time/stime.c | 40 | ||||
-rw-r--r-- | time/strptime_l.c | 57 | ||||
-rw-r--r-- | time/sys/time.h | 20 | ||||
-rw-r--r-- | time/time.c | 36 | ||||
-rw-r--r-- | time/time.h | 5 | ||||
-rw-r--r-- | time/tst-strptime.c | 22 | ||||
-rw-r--r-- | time/tst-strptime2.c | 59 | ||||
-rw-r--r-- | time/tst-strptime3.c | 55 | ||||
-rw-r--r-- | time/tzfile.c | 111 |
22 files changed, 90 insertions, 813 deletions
diff --git a/time/Makefile b/time/Makefile index 8ce34e4565..7acc964fdc 100644 --- a/time/Makefile +++ b/time/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991-2003, 2004, 2005, 2007 Free Software Foundation, Inc. +# Copyright (C) 1991-2002,2003,2004 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 @@ -35,8 +35,7 @@ distribute := datemsk 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 + tst-mktime3 include ../Rules diff --git a/time/adjtime.c b/time/adjtime.c deleted file mode 100644 index 8645652188..0000000000 --- a/time/adjtime.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 1991, 1995, 1996, 1997 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, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#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 (delta, olddelta) - const struct timeval *delta; - struct timeval *olddelta; -{ - __set_errno (ENOSYS); - return -1; -} -stub_warning (adjtime) - -weak_alias (__adjtime, adjtime) -#include <stub-tag.h> diff --git a/time/asctime.c b/time/asctime.c index dc4fd54f4e..f20b311bb5 100644 --- a/time/asctime.c +++ b/time/asctime.c @@ -1,5 +1,4 @@ -/* Copyright (C) 1991,1993,1995-1997,2000,2002,2005 - Free Software Foundation, Inc. +/* Copyright (C) 1991,1993,1995-1997,2000,2002 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 @@ -19,7 +18,6 @@ #include "../locale/localeinfo.h" #include <errno.h> -#include <limits.h> #include <stdio.h> #include <time.h> @@ -31,9 +29,17 @@ extern const struct locale_data _nl_C_LC_TIME attribute_hidden; 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]; +/* 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_r (tp, result); +} +libc_hidden_def (asctime) -static char * -asctime_internal (const struct tm *tp, char *buf, size_t buflen) +char * +__asctime_r (const struct tm *tp, char *buf) { if (tp == NULL) { @@ -41,51 +47,15 @@ asctime_internal (const struct tm *tp, char *buf, size_t buflen) 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 (__builtin_expect (tp->tm_year > INT_MAX - 1900, 0)) - { - 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) + if (sprintf (buf, 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) < 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/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-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 99dc5f47e0..0000000000 --- a/time/clock.c +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (C) 1991, 1995, 1996, 1997 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, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#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 () -{ - __set_errno (ENOSYS); - return (clock_t) -1; -} - -stub_warning (clock) -#include <stub-tag.h> diff --git a/time/ftime.c b/time/ftime.c deleted file mode 100644 index 94dfbcc98b..0000000000 --- a/time/ftime.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (C) 1994, 1996, 1997, 2001 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, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include <errno.h> -#include <time.h> -#include <sys/timeb.h> - -int -ftime (timebuf) - 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/getitimer.c b/time/getitimer.c deleted file mode 100644 index d9f3063e1e..0000000000 --- a/time/getitimer.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (C) 1991, 1994, 1995, 1996, 1997 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, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#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 (which, value) - 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) -#include <stub-tag.h> diff --git a/time/gettimeofday.c b/time/gettimeofday.c deleted file mode 100644 index f4a170c9e7..0000000000 --- a/time/gettimeofday.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (C) 1991, 1995, 1996, 1997, 2002 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, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include <errno.h> -#include <sys/time.h> - -#undef __gettimeofday - -/* 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 (tv, tz) - struct timeval *tv; - struct timezone *tz; -{ - __set_errno (ENOSYS); - return -1; -} -stub_warning (gettimeofday) - -INTDEF(__gettimeofday) -weak_alias (__gettimeofday, gettimeofday) -#include <stub-tag.h> diff --git a/time/mktime.c b/time/mktime.c index 8f00c72e09..c6ae56ee60 100644 --- a/time/mktime.c +++ b/time/mktime.c @@ -1,7 +1,7 @@ /* Convert a `struct tm' to a time_t value. - Copyright (C) 1993-1999, 2002-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1993-1999, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Paul Eggert <eggert@twinsun.com>. + 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 @@ -38,11 +38,10 @@ #include <limits.h> -#include <string.h> /* For the real memcpy prototype. */ - #if DEBUG # include <stdio.h> # include <stdlib.h> +# include <string.h> /* Make it work even if the system's libc has its own mktime routine. */ # define mktime my_mktime #endif /* DEBUG */ @@ -62,38 +61,13 @@ ? (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, ones' complement, or signed magnitude representation, - respectively. Much GNU code assumes two's complement, but some - people like to be portable to all possible C hosts. */ -#define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1) -#define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0) -#define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1) - -/* True if the arithmetic type T is signed. */ +/* The extra casts work around common compiler bugs. */ #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_SIGNED_MAGNITUDE (t) \ - ? ~ (t) 0 \ - : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))) -#define TYPE_MAXIMUM(t) \ - ((t) (! TYPE_SIGNED (t) \ - ? (t) -1 \ - : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))) +/* The outer cast is needed to work around a bug in Cray C 5.0.3.0. + It is necessary at least when t == time_t. */ +#define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \ + ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0)) +#define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t))) #ifndef TIME_T_MIN # define TIME_T_MIN TYPE_MINIMUM (time_t) @@ -106,8 +80,8 @@ /* Verify a requirement at compile-time (unlike assert, which is runtime). */ #define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } -verify (time_t_is_integer, TYPE_IS_INTEGER (time_t)); -verify (twos_complement_arithmetic, TYPE_TWOS_COMPLEMENT (int)); +verify (time_t_is_integer, (time_t) 0.5 == 0); +verify (twos_complement_arithmetic, -1 == ~1 + 1); /* The code also assumes that signed integer overflow silently wraps around, but this assumption can't be stated without causing a diagnostic on some hosts. */ @@ -216,11 +190,10 @@ guess_time_tm (long int year, long int yday, int hour, int min, int sec, /* 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. */ + match. */ 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)); + ? TIME_T_MIN + (*t == TIME_T_MIN) + : TIME_T_MAX - (*t == TIME_T_MAX)); } /* Use CONVERT to convert *T to a broken down time in *TP. @@ -230,12 +203,13 @@ 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); + struct tm *r; - if (!r && *t) + if (! (r = (*convert) (t, tp)) && *t) { time_t bad = *t; time_t ok = 0; + struct tm tm; /* 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 @@ -245,9 +219,11 @@ ranged_convert (struct tm *(*convert) (const time_t *, struct tm *), time_t mid = *t = (bad < 0 ? bad + ((ok - bad) >> 1) : ok + ((bad - ok) >> 1)); - r = convert (t, tp); - if (r) - ok = mid; + if ((r = (*convert) (t, tp))) + { + tm = *r; + ok = mid; + } else bad = mid; } @@ -257,7 +233,8 @@ ranged_convert (struct tm *(*convert) (const time_t *, struct tm *), /* The last conversion attempt failed; revert to the most recent successful attempt. */ *t = ok; - r = convert (t, tp); + *tp = tm; + r = tp; } } @@ -486,7 +463,7 @@ __mktime_internal (struct tm *tp, t2 = t1 + sec_adjustment; if (((t1 < t) != (sec_requested < 0)) | ((t2 < t1) != (sec_adjustment < 0)) - | ! convert (&t2, &tm)) + | ! (*convert) (&t2, &tm)) return -1; t = t2; } diff --git a/time/setitimer.c b/time/setitimer.c deleted file mode 100644 index 755fa06a7b..0000000000 --- a/time/setitimer.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (C) 1991, 1994, 1995, 1996, 1997 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, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#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 (which, new, old) - 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) -#include <stub-tag.h> diff --git a/time/settimeofday.c b/time/settimeofday.c deleted file mode 100644 index abff6f92a1..0000000000 --- a/time/settimeofday.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 1991, 1995, 1996, 1997 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, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#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 (tv, tz) - const struct timeval *tv; - const struct timezone *tz; -{ - __set_errno (ENOSYS); - return -1; -} -stub_warning (settimeofday) - -weak_alias (__settimeofday, settimeofday) -#include <stub-tag.h> diff --git a/time/stime.c b/time/stime.c deleted file mode 100644 index 5ed1b040e2..0000000000 --- a/time/stime.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 1992, 1995, 1996, 1997 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, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include <errno.h> -#include <time.h> -#include <stddef.h> - -/* Set the system clock to *WHEN. */ - -int -stime (when) - const time_t *when; -{ - if (when == NULL) - { - __set_errno (EINVAL); - return -1; - } - - __set_errno (ENOSYS); - return -1; -} - -stub_warning (stime) -#include <stub-tag.h> diff --git a/time/strptime_l.c b/time/strptime_l.c index 443a6fa88e..df98099f0a 100644 --- a/time/strptime_l.c +++ b/time/strptime_l.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2004, 2005, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2004 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 @@ -400,7 +400,6 @@ __strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM) /* Does not match a month name. */ return NULL; tm->tm_mon = cnt; - have_mon = 1; want_xday = 1; break; case 'c': @@ -540,12 +539,10 @@ __strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM) } #endif if (!match_string (HERE_AM_STR, rp)) - { - if (match_string (HERE_PM_STR, rp)) - is_pm = 1; - else - return NULL; - } + if (match_string (HERE_PM_STR, rp)) + is_pm = 1; + else + return NULL; break; case 'r': #ifdef _NL_CURRENT @@ -688,42 +685,6 @@ __strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM) case 'Z': /* XXX How to handle this? */ break; - case 'z': - /* We recognize two formats: if two digits are given, these - specify hours. If fours digits are used, minutes are - also specified. */ - { - val = 0; - while (*rp == ' ') - ++rp; - 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 (n == 2) - val *= 100; - else if (n != 4) - /* Only two or four digits recognized. */ - return NULL; - else - { - /* We have to convert the minutes into decimal. */ - if (val % 100 >= 60) - return NULL; - val = (val / 100) * 100 + ((val % 100) * 50) / 30; - } - if (val > 1200) - return NULL; - tm->tm_gmtoff = (val * 3600) / 100; - if (neg) - tm->tm_gmtoff = -tm->tm_gmtoff; - } - break; case 'E': #ifdef _NL_CURRENT switch (*fmt++) @@ -1086,15 +1047,11 @@ __strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM) tm->tm_mday = (tm->tm_yday - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1); - have_mon = 1; - have_mday = 1; } - /* Don't crash in day_of_the_week if tm_mon is uninitialized. */ - if (have_mon || (unsigned) tm->tm_mon <= 11) - day_of_the_week (tm); + day_of_the_week (tm); } - if (want_xday && !have_yday && (have_mon || (unsigned) tm->tm_mon <= 11)) + if (want_xday && !have_yday) day_of_the_year (tm); if ((have_uweek || have_wweek) && have_wday) diff --git a/time/sys/time.h b/time/sys/time.h index 177696b08a..515ea7ec68 100644 --- a/time/sys/time.h +++ b/time/sys/time.h @@ -1,5 +1,4 @@ -/* Copyright (C) 1991-1994,1996-2002,2003,2005,2006 - Free Software Foundation, Inc. +/* Copyright (C) 1991-1994,1996-2002,2003 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 @@ -71,14 +70,13 @@ typedef void *__restrict __timezone_ptr_t; 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)); + __timezone_ptr_t __tz) __THROW; #ifdef __USE_BSD /* 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 __nonnull ((1)); + __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 @@ -138,25 +136,17 @@ extern int setitimer (__itimer_which_t __which, 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)); + __THROW; #ifdef __USE_BSD /* Same as `utimes', but does not follow symbolic links. */ extern int lutimes (__const char *__file, __const struct timeval __tvp[2]) - __THROW __nonnull ((1)); + __THROW; /* 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_ATFILE -/* 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_BSD /* Convenience macros for operations on timevals. diff --git a/time/time.c b/time/time.c deleted file mode 100644 index ec66f119df..0000000000 --- a/time/time.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 1991,96,97,2002 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, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include <errno.h> -#include <time.h> - -/* Return the time now, and store it in *TIMER if not NULL. */ -time_t -time (timer) - time_t *timer; -{ - __set_errno (ENOSYS); - - if (timer != NULL) - *timer = (time_t) -1; - return (time_t) -1; -} -libc_hidden_def (time) - -stub_warning (time) -#include <stub-tag.h> diff --git a/time/time.h b/time/time.h index 6c8f79d422..27e0d8bc36 100644 --- a/time/time.h +++ b/time/time.h @@ -1,5 +1,4 @@ -/* Copyright (C) 1991-1999,2000,2001,2002,2003,2006 - Free Software Foundation, Inc. +/* Copyright (C) 1991-1999,2000,2001,2002,2003 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 @@ -114,8 +113,6 @@ typedef __timer_t timer_t; defined __need_timespec) # define __timespec_defined 1 -# include <bits/types.h> /* This defines __time_t for us. */ - /* POSIX.1b structure for a time value. This is like a `struct timeval' but has nanoseconds instead of microseconds. */ struct timespec diff --git a/time/tst-strptime.c b/time/tst-strptime.c index 6356aa0d41..a0b2ebedd2 100644 --- a/time/tst-strptime.c +++ b/time/tst-strptime.c @@ -42,10 +42,6 @@ static const struct { "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 }, - { "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 }, }; @@ -77,14 +73,7 @@ test_tm (void) { 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') + if (*strptime (tm_tests[i].input, tm_tests[i].format, &tm) != '\0') { printf ("not all of `%s' read\n", tm_tests[i].input); result = 1; @@ -138,14 +127,7 @@ main (int argc, char *argv[]) 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') + if (*strptime (day_tests[i].input, day_tests[i].format, &tm) != '\0') { printf ("not all of `%s' read\n", day_tests[i].input); result = 1; diff --git a/time/tst-strptime2.c b/time/tst-strptime2.c deleted file mode 100644 index 73552bb8f8..0000000000 --- a/time/tst-strptime2.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <limits.h> -#include <stdio.h> -#include <time.h> - - -static const struct -{ - const char *fmt; - long int gmtoff; -} tests[] = - { - { "1113472456 +1000", 36000 }, - { "1113472456 -1000", -36000 }, - { "1113472456 +10", 36000 }, - { "1113472456 -10", -36000 }, - { "1113472456 +1030", 37800 }, - { "1113472456 -1030", -37800 }, - { "1113472456 +0030", 1800 }, - { "1113472456 -0030", -1800 }, - { "1113472456 -1330", LONG_MAX }, - { "1113472456 +1330", LONG_MAX }, - { "1113472456 -1060", LONG_MAX }, - { "1113472456 +1060", LONG_MAX }, - { "1113472456 1030", LONG_MAX }, - }; -#define ntests (sizeof (tests) / sizeof (tests[0])) - - -int -main (void) -{ - int result = 0; - - for (int i = 0; i < ntests; ++i) - { - struct tm tm; - - if (strptime (tests[i].fmt, "%s %z", &tm) == NULL) - { - if (tests[i].gmtoff != LONG_MAX) - { - printf ("round %d: strptime unexpectedly failed\n", i); - result = 1; - } - continue; - } - - if (tm.tm_gmtoff != tests[i].gmtoff) - { - printf ("round %d: tm_gmtoff is %ld\n", i, (long int) tm.tm_gmtoff); - result = 1; - } - } - - if (result == 0) - puts ("all OK"); - - return 0; -} diff --git a/time/tst-strptime3.c b/time/tst-strptime3.c deleted file mode 100644 index 9a8c6485e7..0000000000 --- a/time/tst-strptime3.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - - -int -main (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; - } - - if (result == 0) - puts ("all OK"); - - return 0; -} diff --git a/time/tzfile.c b/time/tzfile.c index 6e7ee4a240..e95fd55f36 100644 --- a/time/tzfile.c +++ b/time/tzfile.c @@ -71,34 +71,24 @@ static inline int __attribute ((always_inline)) decode (const void *ptr) { - if (BYTE_ORDER == BIG_ENDIAN && sizeof (int) == 4) + if ((BYTE_ORDER == BIG_ENDIAN) && sizeof (int) == 4) return *(const int *) ptr; - if (sizeof (int) == 4) + else if (BYTE_ORDER == LITTLE_ENDIAN && sizeof (int) == 4) return bswap_32 (*(const int *) ptr); + else + { + const unsigned char *p = ptr; + int result = *p & (1 << (CHAR_BIT - 1)) ? ~0 : 0; - 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; -} - + result = (result << 8) | *p++; + result = (result << 8) | *p++; + result = (result << 8) | *p++; + result = (result << 8) | *p++; -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); + return result; + } } - void __tzfile_read (const char *file, size_t extra, char **extrap) { @@ -112,10 +102,6 @@ __tzfile_read (const char *file, size_t extra, char **extrap) size_t types_idx; size_t leaps_idx; int was_using_tzfile = __use_tzfile; - int trans_width = 4; - - if (sizeof (time_t) != 4 && sizeof (time_t) != 8) - abort (); __use_tzfile = 0; @@ -199,10 +185,8 @@ __tzfile_read (const char *file, size_t extra, char **extrap) /* 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) + 1, f) != 1, 0)) goto lose; num_transitions = (size_t) decode (tzhead.tzh_timecnt); @@ -212,26 +196,6 @@ __tzfile_read (const char *file, size_t extra, char **extrap) num_isstd = (size_t) decode (tzhead.tzh_ttisstdcnt); num_isgmt = (size_t) decode (tzhead.tzh_ttisgmtcnt); - /* 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; - } - total_size = num_transitions * (sizeof (time_t) + 1); total_size = ((total_size + __alignof__ (struct ttinfo) - 1) & ~(__alignof__ (struct ttinfo) - 1)); @@ -241,10 +205,10 @@ __tzfile_read (const char *file, size_t extra, char **extrap) & ~(__alignof__ (struct leap) - 1)); leaps_idx = total_size; total_size += num_leaps * sizeof (struct leap); + /* This is for the extra memory required by the caller. */ + total_size += extra; - /* Allocate enough memory including the extra block requested by the - caller. */ - transitions = (time_t *) malloc (total_size + extra); + transitions = (time_t *) malloc (total_size); if (transitions == NULL) goto lose; @@ -256,11 +220,14 @@ __tzfile_read (const char *file, size_t extra, char **extrap) if (extra > 0) *extrap = (char *) &leaps[num_leaps]; - if (sizeof (time_t) == 4 || trans_width == 8) + if (sizeof (time_t) < 4) + abort (); + + if (sizeof (time_t) == 4) { - if (__builtin_expect (fread_unlocked (transitions, trans_width + 1, - num_transitions, f) - != num_transitions, 0)) + if (__builtin_expect (fread_unlocked (transitions, 1, + (4 + 1) * num_transitions, f) + != (4 + 1) * num_transitions, 0)) goto lose; } else @@ -278,9 +245,7 @@ __tzfile_read (const char *file, size_t extra, char **extrap) if (__builtin_expect (type_idxs[i] >= num_types, 0)) 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)) + if (BYTE_ORDER != BIG_ENDIAN || sizeof (time_t) != 4) { /* Decode the transition times, stored as 4-byte integers in network (big-endian) byte order. We work from the end of @@ -290,13 +255,6 @@ __tzfile_read (const char *file, size_t extra, char **extrap) 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) { @@ -322,16 +280,13 @@ __tzfile_read (const char *file, size_t extra, char **extrap) for (i = 0; i < num_leaps; ++i) { - unsigned char x[8]; - if (__builtin_expect (fread_unlocked (x, 1, trans_width, f) - != trans_width, 0)) + unsigned char x[4]; + if (__builtin_expect (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x), + 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 (__builtin_expect (fread_unlocked (x, 1, 4, f) != 4, 0)) + leaps[i].transition = (time_t) decode (x); + if (__builtin_expect (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x), + 0)) goto lose; leaps[i].change = (long int) decode (x); } @@ -356,12 +311,6 @@ __tzfile_read (const char *file, size_t extra, char **extrap) while (i < num_types) types[i++].isgmt = 0; - /* XXX When a version 2 file is available it can contain a POSIX TZ-style - formatted string which specifies how times past the last one specified - are supposed to be handled. We might want to handle this at some - point. But it might be overhead since most/all? files have an - open-ended last entry. */ - fclose (f); /* First "register" all timezone names. */ |