diff options
| author | Paul Eggert <eggert@cs.ucla.edu> | 2019-04-30 09:44:38 -0700 | 
|---|---|---|
| committer | Paul Eggert <eggert@cs.ucla.edu> | 2019-04-30 09:45:08 -0700 | 
| commit | 46b434a62cea06bdcb3c8d9ee18284ab59e9b012 (patch) | |
| tree | b14b9963adc009ecbf2f380630bf443a57f2ee87 /lib | |
| parent | 826f1e260121edc5185e0ed3fa20a781fbddc9a2 (diff) | |
| download | emacs-46b434a62cea06bdcb3c8d9ee18284ab59e9b012.tar.gz | |
Update from Gnulib
* build-aux/config.guess, doc/misc/texinfo.tex:
* lib/mktime-internal.h, lib/mktime.c, lib/timegm.c:
Copy from Gnulib.
* lib/gnulib.mk.in: Regenerate.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/gnulib.mk.in | 1 | ||||
| -rw-r--r-- | lib/mktime-internal.h | 60 | ||||
| -rw-r--r-- | lib/mktime.c | 71 | ||||
| -rw-r--r-- | lib/timegm.c | 32 | 
4 files changed, 116 insertions, 48 deletions
| diff --git a/lib/gnulib.mk.in b/lib/gnulib.mk.in index ade4ff8ebdb..1cbbff212bb 100644 --- a/lib/gnulib.mk.in +++ b/lib/gnulib.mk.in @@ -1046,6 +1046,7 @@ datadir = @datadir@  datarootdir = @datarootdir@  docdir = @docdir@  dvidir = @dvidir@ +emacs_major_version = @emacs_major_version@  etcdir = @etcdir@  etcdocdir = @etcdocdir@  exec_prefix = @exec_prefix@ diff --git a/lib/mktime-internal.h b/lib/mktime-internal.h index d13d89cfae7..52ab7814429 100644 --- a/lib/mktime-internal.h +++ b/lib/mktime-internal.h @@ -1,40 +1,56 @@ -/* mktime variant that also uses an offset guess - +/* Internals of mktime and related functions     Copyright 2016-2019 Free Software Foundation, Inc. +   This file is part of the GNU C Library. +   Contributed by Paul Eggert <eggert@cs.ucla.edu>. -   This program is free software; you can redistribute it and/or +   The GNU C Library is free software; you can redistribute it and/or     modify it under the terms of the GNU General Public     License as published by the Free Software Foundation; either     version 3 of the License, or (at your option) any later version. -   This program is distributed in the hope that it will be useful, +   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     General Public License for more details.     You should have received a copy of the GNU General Public -   License along with this program; if not, see +   License along with the GNU C Library; if not, see     <https://www.gnu.org/licenses/>.  */ -#include <time.h> +#ifndef _LIBC +# include <time.h> +#endif  /* mktime_offset_t is a signed type wide enough to hold a UTC offset     in seconds, and used as part of the type of the offset-guess -   argument to mktime_internal.  Use time_t on platforms where time_t +   argument to mktime_internal.  In Glibc, it is always long int. +   When in Gnulib, use time_t on platforms where time_t     is signed, to be compatible with platforms like BeOS that export     this implementation detail of mktime.  On platforms where time_t is     unsigned, GNU and POSIX code can assume 'int' is at least 32 bits     which is wide enough for a UTC offset.  */ - -#if TIME_T_IS_SIGNED +#ifdef _LIBC +typedef long int mktime_offset_t; +#elif defined TIME_T_IS_SIGNED  typedef time_t mktime_offset_t;  #else  typedef int mktime_offset_t;  #endif -time_t mktime_internal (struct tm *, -                        struct tm * (*) (time_t const *, struct tm *), -                        mktime_offset_t *); +/* The source code uses identifiers like __time64_t for glibc +   timestamps that can contain 64-bit values even when time_t is only +   32 bits.  These are just macros for the ordinary identifiers unless +   compiling within glibc when time_t is 32 bits.  */ +#if ! (defined _LIBC && __TIMESIZE != 64) +# undef __time64_t +# define __time64_t time_t +# define __gmtime64_r __gmtime_r +# define __localtime64_r __localtime_r +# define __mktime64 mktime +# define __timegm64 timegm +#endif + +#ifndef _LIBC  /* Although glibc source code uses leading underscores, Gnulib wants     ordinary names. @@ -45,9 +61,19 @@ time_t mktime_internal (struct tm *,     Similarly for gmtime_r.  See the gnulib time_r module for one way     to implement this.  */ -#undef __gmtime_r -#undef __localtime_r -#define __gmtime_r gmtime_r -#define __localtime_r localtime_r +# undef __gmtime_r +# undef __localtime_r +# define __gmtime_r gmtime_r +# define __localtime_r localtime_r + +# define __mktime_internal mktime_internal + +#endif -#define __mktime_internal mktime_internal +/* 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 __time64_t __mktime_internal (struct tm *tp, +                                     struct tm *(*func) (__time64_t const *, +                                                         struct tm *), +                                     mktime_offset_t *offset) attribute_hidden; diff --git a/lib/mktime.c b/lib/mktime.c index e3783d7a95e..b00af96c8c4 100644 --- a/lib/mktime.c +++ b/lib/mktime.c @@ -112,11 +112,11 @@ my_tzset (void)     added to them, and then with another timestamp added, without     worrying about overflow. -   Much of the code uses long_int to represent time_t values, to -   lessen the hassle of dealing with platforms where time_t is +   Much of the code uses long_int to represent __time64_t values, to +   lessen the hassle of dealing with platforms where __time64_t is     unsigned, and because long_int should suffice to represent all -   time_t values that mktime can generate even on platforms where -   time_t is excessively wide.  */ +   __time64_t values that mktime can generate even on platforms where +   __time64_t is wider than the int components of struct tm.  */  #if INT_MAX <= LONG_MAX / 4 / 366 / 24 / 60 / 60  typedef long int long_int; @@ -144,16 +144,15 @@ shr (long_int a, int b)  	  : a / (one << b) - (a % (one << b) < 0));  } -/* Bounds for the intersection of time_t and long_int.  */ +/* Bounds for the intersection of __time64_t and long_int.  */  static long_int const mktime_min -  = ((TYPE_SIGNED (time_t) && TYPE_MINIMUM (time_t) < TYPE_MINIMUM (long_int)) -     ? TYPE_MINIMUM (long_int) : TYPE_MINIMUM (time_t)); +  = ((TYPE_SIGNED (__time64_t) +      && TYPE_MINIMUM (__time64_t) < TYPE_MINIMUM (long_int)) +     ? TYPE_MINIMUM (long_int) : TYPE_MINIMUM (__time64_t));  static long_int const mktime_max -  = (TYPE_MAXIMUM (long_int) < TYPE_MAXIMUM (time_t) -     ? TYPE_MAXIMUM (long_int) : TYPE_MAXIMUM (time_t)); - -verify (TYPE_IS_INTEGER (time_t)); +  = (TYPE_MAXIMUM (long_int) < TYPE_MAXIMUM (__time64_t) +     ? TYPE_MAXIMUM (long_int) : TYPE_MAXIMUM (__time64_t));  #define EPOCH_YEAR 1970  #define TM_YEAR_BASE 1900 @@ -252,23 +251,23 @@ tm_diff (long_int year, long_int yday, int hour, int min, int sec,  }  /* Use CONVERT to convert T to a struct tm value in *TM.  T must be in -   range for time_t.  Return TM if successful, NULL (setting errno) on +   range for __time64_t.  Return TM if successful, NULL (setting errno) on     failure.  */  static struct tm * -convert_time (struct tm *(*convert) (const time_t *, struct tm *), +convert_time (struct tm *(*convert) (const __time64_t *, struct tm *),  	      long_int t, struct tm *tm)  { -  time_t x = t; +  __time64_t x = t;    return convert (&x, tm);  }  /* 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. -   A value is in range if it fits in both time_t and long_int. +   A value is in range if it fits in both __time64_t and long_int.     Return TP on success, NULL (setting errno) on failure.  */  static struct tm * -ranged_convert (struct tm *(*convert) (const time_t *, struct tm *), +ranged_convert (struct tm *(*convert) (const __time64_t *, struct tm *),  		long_int *t, struct tm *tp)  {    long_int t1 = (*t < mktime_min ? mktime_min @@ -310,7 +309,7 @@ ranged_convert (struct tm *(*convert) (const time_t *, struct tm *),  } -/* Convert *TP to a time_t value, inverting +/* Convert *TP to a __time64_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. @@ -318,9 +317,9 @@ ranged_convert (struct tm *(*convert) (const time_t *, struct tm *),     If successful, set *TP to the canonicalized struct tm;     otherwise leave *TP alone, return ((time_t) -1) and set errno.     This function is external because it is used also by timegm.c.  */ -time_t +__time64_t  __mktime_internal (struct tm *tp, -		   struct tm *(*convert) (const time_t *, struct tm *), +		   struct tm *(*convert) (const __time64_t *, struct tm *),  		   mktime_offset_t *offset)  {    struct tm tm; @@ -520,9 +519,9 @@ __mktime_internal (struct tm *tp,  #if defined _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS -/* Convert *TP to a time_t value.  */ -time_t -mktime (struct tm *tp) +/* Convert *TP to a __time64_t value.  */ +__time64_t +__mktime64 (struct tm *tp)  {    /* POSIX.1 8.1.1 requires that whenever mktime() is called, the       time zone names contained in the external variable 'tzname' shall @@ -531,7 +530,7 @@ mktime (struct tm *tp)  # if defined _LIBC || NEED_MKTIME_WORKING    static mktime_offset_t localtime_offset; -  return __mktime_internal (tp, __localtime_r, &localtime_offset); +  return __mktime_internal (tp, __localtime64_r, &localtime_offset);  # else  #  undef mktime    return mktime (tp); @@ -539,11 +538,29 @@ mktime (struct tm *tp)  }  #endif /* _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS */ -#ifdef weak_alias -weak_alias (mktime, timelocal) +#if defined _LIBC && __TIMESIZE != 64 + +libc_hidden_def (__mktime64) + +time_t +mktime (struct tm *tp) +{ +  struct tm tm = *tp; +  __time64_t t = __mktime64 (&tm); +  if (in_time_t_range (t)) +    { +      *tp = tm; +      return t; +    } +  else +    { +      __set_errno (EOVERFLOW); +      return -1; +    } +} +  #endif -#ifdef _LIBC +weak_alias (mktime, timelocal)  libc_hidden_def (mktime)  libc_hidden_weak (timelocal) -#endif diff --git a/lib/timegm.c b/lib/timegm.c index 2ca57444d43..c440480cb2d 100644 --- a/lib/timegm.c +++ b/lib/timegm.c @@ -18,17 +18,41 @@     <http://www.gnu.org/licenses/>.  */  #ifndef _LIBC -# include <config.h> +# include <libc-config.h>  #endif  #include <time.h> +#include <errno.h>  #include "mktime-internal.h" -time_t -timegm (struct tm *tmp) +__time64_t +__timegm64 (struct tm *tmp)  {    static mktime_offset_t gmtime_offset;    tmp->tm_isdst = 0; -  return __mktime_internal (tmp, __gmtime_r, &gmtime_offset); +  return __mktime_internal (tmp, __gmtime64_r, &gmtime_offset);  } + +#if defined _LIBC && __TIMESIZE != 64 + +libc_hidden_def (__timegm64) + +time_t +timegm (struct tm *tmp) +{ +  struct tm tm = *tmp; +  __time64_t t = __timegm64 (&tm); +  if (in_time_t_range (t)) +    { +      *tmp = tm; +      return t; +    } +  else +    { +      __set_errno (EOVERFLOW); +      return -1; +    } +} + +#endif | 
