diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2019-03-18 14:14:15 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2019-04-30 09:02:17 -0700 |
commit | 20aa5819586ac7ad11f711bab64feda307965191 (patch) | |
tree | 81a1ab6c9d471bf99609784cbd3a446c67ef2471 /include | |
parent | 87c266d758d29e52bfb717f90025ef1fe2663d38 (diff) | |
download | glibc-20aa5819586ac7ad11f711bab64feda307965191.tar glibc-20aa5819586ac7ad11f711bab64feda307965191.tar.gz glibc-20aa5819586ac7ad11f711bab64feda307965191.tar.bz2 glibc-20aa5819586ac7ad11f711bab64feda307965191.zip |
Make mktime etc. compatible with __time64_t
Keep these functions compatible with Gnulib while adding
__time64_t support. The basic idea is to move private API
declarations from include/time.h to time/mktime-internal.h, since
the former file cannot easily be shared with Gnulib whereas the
latter can.
Also, do some other minor cleanup while in the neighborhood.
* include/time.h: Include stdbool.h, time/mktime-internal.h.
(__mktime_internal): Move this prototype to time/mktime-internal.h,
since Gnulib needs it.
(__localtime64_r, __gmtime64_r) [__TIMESIZE == 64]:
Move these macros to time/mktime-internal.h, since Gnulib needs them.
(__mktime64, __timegm64) [__TIMESIZE != 64]: New prototypes.
(in_time_t_range): New static function.
* posix/bits/types.h (__time64_t) [__TIMESIZE == 64 && !defined __LIBC]:
Do not define as a macro in this case, so that portable code is
less tempted to use __time64_t.
* time/mktime-internal.h: Rewrite so that it does both glibc
and Gnulib work. Include time.h if not _LIBC.
(mktime_offset_t) [!_LIBC]: Define for gnulib.
(__time64_t, __gmtime64_r, __localtime64_r, __mktime64, __timegm64)
[!_LIBC || __TIMESIZE == 64]: New macros, mostly moved here
from include/time.h.
(__gmtime_r, __localtime_r, __mktime_internal) [!_LIBC]:
New macros, taken from GNulib.
(__mktime_internal): New prototype, moved here from include/time.h.
* time/mktime.c (mktime_min, mktime_max, convert_time)
(ranged_convert, __mktime_internal, __mktime64):
* time/timegm.c (__timegm64):
Use __time64_t, not time_t.
* time/mktime.c: Stop worrying about whether time_t is floating-point.
(__mktime64) [! (_LIBC && __TIMESIZE != 64)]:
Rename from mktime.
(mktime) [_LIBC && __TIMESIZE != 64]: New function.
* time/timegm.c [!_LIBC]: Include libc-config.h, not config.h,
for libc_hidden_def.
Include errno.h.
(__timegm64) [! (_LIBC && __TIMESIZE != 64)]:
Rename from timegm.
(timegm) [_LIBC && __TIMESIZE != 64]: New function.
First cut at publicizing __time64_t
Diffstat (limited to 'include')
-rw-r--r-- | include/time.h | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/include/time.h b/include/time.h index 61dd9e180b..ac3163c2a5 100644 --- a/include/time.h +++ b/include/time.h @@ -3,6 +3,8 @@ #ifndef _ISOMAC # include <bits/types/locale_t.h> +# include <stdbool.h> +# include <time/mktime-internal.h> extern __typeof (strftime_l) __strftime_l; libc_hidden_proto (__strftime_l) @@ -49,19 +51,11 @@ extern void __tzset_parse_tz (const char *tz) attribute_hidden; extern void __tz_compute (__time64_t timer, struct tm *tm, int use_localtime) __THROW attribute_hidden; -/* Subroutine of `mktime'. Return the `time_t' representation of TP and - normalize TP, given that a `struct tm *' maps to a `time_t' as performed - by FUNC. Record next guess for localtime-gmtime offset in *OFFSET. */ -extern time_t __mktime_internal (struct tm *__tp, - struct tm *(*__func) (const time_t *, - struct tm *), - long int *__offset) attribute_hidden; - #if __TIMESIZE == 64 # define __ctime64 ctime #else extern char *__ctime64 (const __time64_t *__timer) __THROW; -libc_hidden_proto (__ctime64); +libc_hidden_proto (__ctime64) #endif #if __TIMESIZE == 64 @@ -69,7 +63,7 @@ libc_hidden_proto (__ctime64); #else extern char *__ctime64_r (const __time64_t *__restrict __timer, char *__restrict __buf) __THROW; -libc_hidden_proto (__ctime64_r); +libc_hidden_proto (__ctime64_r) #endif #if __TIMESIZE == 64 @@ -81,13 +75,13 @@ libc_hidden_proto (__localtime64) extern struct tm *__localtime_r (const time_t *__timer, struct tm *__tp) attribute_hidden; - -#if __TIMESIZE == 64 -# define __localtime64_r __localtime_r -#else +#if __TIMESIZE != 64 extern struct tm *__localtime64_r (const __time64_t *__timer, struct tm *__tp); libc_hidden_proto (__localtime64_r) + +extern __time64_t __mktime64 (struct tm *__tp) __THROW; +libc_hidden_proto (__mktime64) #endif extern struct tm *__gmtime_r (const time_t *__restrict __timer, @@ -99,14 +93,13 @@ libc_hidden_proto (__gmtime_r) #else extern struct tm *__gmtime64 (const __time64_t *__timer); libc_hidden_proto (__gmtime64) -#endif -#if __TIMESIZE == 64 -# define __gmtime64_r __gmtime_r -#else extern struct tm *__gmtime64_r (const __time64_t *__restrict __timer, struct tm *__restrict __tp); -libc_hidden_proto (__gmtime64_r); +libc_hidden_proto (__gmtime64_r) + +extern __time64_t __timegm64 (struct tm *__tp) __THROW; +libc_hidden_proto (__timegm64) #endif /* Compute the `struct tm' representation of T, @@ -155,5 +148,13 @@ extern double __difftime (time_t time1, time_t time0); actual clock ID. */ #define CLOCK_IDFIELD_SIZE 3 +/* Check whether T fits in time_t. */ +static inline bool +in_time_t_range (__time64_t t) +{ + time_t s = t; + return s == t; +} + #endif #endif |