Home | History | Annotate | Line # | Download | only in import
      1      1.1  christos /* A more-standard <time.h>.
      2      1.1  christos 
      3  1.1.1.2  christos    Copyright (C) 2007-2022 Free Software Foundation, Inc.
      4      1.1  christos 
      5  1.1.1.2  christos    This file is free software: you can redistribute it and/or modify
      6  1.1.1.2  christos    it under the terms of the GNU Lesser General Public License as
      7  1.1.1.2  christos    published by the Free Software Foundation; either version 2.1 of the
      8  1.1.1.2  christos    License, or (at your option) any later version.
      9      1.1  christos 
     10  1.1.1.2  christos    This file is distributed in the hope that it will be useful,
     11      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  1.1.1.2  christos    GNU Lesser General Public License for more details.
     14      1.1  christos 
     15  1.1.1.2  christos    You should have received a copy of the GNU Lesser General Public License
     16  1.1.1.2  christos    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
     17      1.1  christos 
     18      1.1  christos #if __GNUC__ >= 3
     19      1.1  christos @PRAGMA_SYSTEM_HEADER@
     20      1.1  christos #endif
     21      1.1  christos @PRAGMA_COLUMNS@
     22      1.1  christos 
     23      1.1  christos /* Don't get in the way of glibc when it includes time.h merely to
     24      1.1  christos    declare a few standard symbols, rather than to declare all the
     25      1.1  christos    symbols.  (However, skip this for MinGW as it treats __need_time_t
     26      1.1  christos    incompatibly.)  Also, Solaris 8 <time.h> eventually includes itself
     27      1.1  christos    recursively; if that is happening, just include the system <time.h>
     28      1.1  christos    without adding our own declarations.  */
     29      1.1  christos #if (((defined __need_time_t || defined __need_clock_t \
     30      1.1  christos        || defined __need_timespec)                     \
     31      1.1  christos       && !defined __MINGW32__)                         \
     32      1.1  christos      || defined _@GUARD_PREFIX@_TIME_H)
     33      1.1  christos 
     34      1.1  christos # @INCLUDE_NEXT@ @NEXT_TIME_H@
     35      1.1  christos 
     36      1.1  christos #else
     37      1.1  christos 
     38      1.1  christos # define _@GUARD_PREFIX@_TIME_H
     39      1.1  christos 
     40      1.1  christos /* mingw's <time.h> provides the functions asctime_r, ctime_r, gmtime_r,
     41      1.1  christos    localtime_r only if <unistd.h> or <pthread.h> has been included before.  */
     42      1.1  christos # if defined __MINGW32__
     43      1.1  christos #  include <unistd.h>
     44      1.1  christos # endif
     45      1.1  christos 
     46      1.1  christos # @INCLUDE_NEXT@ @NEXT_TIME_H@
     47      1.1  christos 
     48      1.1  christos /* NetBSD 5.0 mis-defines NULL.  */
     49      1.1  christos # include <stddef.h>
     50      1.1  christos 
     51      1.1  christos /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
     52      1.1  christos 
     53      1.1  christos /* The definition of _GL_ARG_NONNULL is copied here.  */
     54      1.1  christos 
     55      1.1  christos /* The definition of _GL_WARN_ON_USE is copied here.  */
     56      1.1  christos 
     57      1.1  christos /* Some systems don't define struct timespec (e.g., AIX 4.1).
     58      1.1  christos    Or they define it with the wrong member names or define it in <sys/time.h>
     59      1.1  christos    (e.g., FreeBSD circa 1997).  Stock Mingw prior to 3.0 does not define it,
     60      1.1  christos    but the pthreads-win32 library defines it in <pthread.h>.  */
     61      1.1  christos # if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@
     62      1.1  christos #  if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
     63      1.1  christos #   include <sys/time.h>
     64      1.1  christos #  elif @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
     65      1.1  christos #   include <pthread.h>
     66      1.1  christos #  elif @UNISTD_H_DEFINES_STRUCT_TIMESPEC@
     67      1.1  christos #   include <unistd.h>
     68      1.1  christos #  else
     69      1.1  christos 
     70      1.1  christos #   ifdef __cplusplus
     71      1.1  christos extern "C" {
     72      1.1  christos #   endif
     73      1.1  christos 
     74      1.1  christos #   if !GNULIB_defined_struct_timespec
     75      1.1  christos #    undef timespec
     76      1.1  christos #    define timespec rpl_timespec
     77      1.1  christos struct timespec
     78      1.1  christos {
     79      1.1  christos   time_t tv_sec;
     80      1.1  christos   long int tv_nsec;
     81      1.1  christos };
     82      1.1  christos #    define GNULIB_defined_struct_timespec 1
     83      1.1  christos #   endif
     84      1.1  christos 
     85      1.1  christos #   ifdef __cplusplus
     86      1.1  christos }
     87      1.1  christos #   endif
     88      1.1  christos 
     89      1.1  christos #  endif
     90      1.1  christos # endif
     91      1.1  christos 
     92      1.1  christos # if !GNULIB_defined_struct_time_t_must_be_integral
     93      1.1  christos /* https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html
     94      1.1  christos    requires time_t to be an integer type, even though C99 permits floating
     95      1.1  christos    point.  We don't know of any implementation that uses floating
     96      1.1  christos    point, and it is much easier to write code that doesn't have to
     97      1.1  christos    worry about that corner case, so we force the issue.  */
     98      1.1  christos struct __time_t_must_be_integral {
     99      1.1  christos   unsigned int __floating_time_t_unsupported : (time_t) 1;
    100      1.1  christos };
    101      1.1  christos #  define GNULIB_defined_struct_time_t_must_be_integral 1
    102      1.1  christos # endif
    103      1.1  christos 
    104  1.1.1.2  christos /* Define TIME_UTC, a positive integer constant used for timespec_get().  */
    105  1.1.1.2  christos # if ! @TIME_H_DEFINES_TIME_UTC@
    106  1.1.1.2  christos #  if !GNULIB_defined_TIME_UTC
    107  1.1.1.2  christos #   define TIME_UTC 1
    108  1.1.1.2  christos #   define GNULIB_defined_TIME_UTC 1
    109  1.1.1.2  christos #  endif
    110  1.1.1.2  christos # endif
    111  1.1.1.2  christos 
    112  1.1.1.2  christos /* Set *TS to the current time, and return BASE.
    113  1.1.1.2  christos    Upon failure, return 0.  */
    114  1.1.1.2  christos # if @GNULIB_TIMESPEC_GET@
    115  1.1.1.2  christos #  if ! @HAVE_TIMESPEC_GET@
    116  1.1.1.2  christos _GL_FUNCDECL_SYS (timespec_get, int, (struct timespec *ts, int base)
    117  1.1.1.2  christos                                      _GL_ARG_NONNULL ((1)));
    118  1.1.1.2  christos #  endif
    119  1.1.1.2  christos _GL_CXXALIAS_SYS (timespec_get, int, (struct timespec *ts, int base));
    120  1.1.1.2  christos _GL_CXXALIASWARN (timespec_get);
    121  1.1.1.2  christos # endif
    122  1.1.1.2  christos 
    123  1.1.1.2  christos /* Set *TS to the current time resolution, and return BASE.
    124  1.1.1.2  christos    Upon failure, return 0.  */
    125  1.1.1.2  christos # if @GNULIB_TIMESPEC_GETRES@
    126  1.1.1.2  christos #  if ! @HAVE_TIMESPEC_GETRES@
    127  1.1.1.2  christos _GL_FUNCDECL_SYS (timespec_getres, int, (struct timespec *ts, int base)
    128  1.1.1.2  christos                                         _GL_ARG_NONNULL ((1)));
    129  1.1.1.2  christos #  endif
    130  1.1.1.2  christos _GL_CXXALIAS_SYS (timespec_getres, int, (struct timespec *ts, int base));
    131  1.1.1.2  christos _GL_CXXALIASWARN (timespec_getres);
    132  1.1.1.2  christos # endif
    133  1.1.1.2  christos 
    134      1.1  christos /* Sleep for at least RQTP seconds unless interrupted,  If interrupted,
    135      1.1  christos    return -1 and store the remaining time into RMTP.  See
    136      1.1  christos    <https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html>.  */
    137      1.1  christos # if @GNULIB_NANOSLEEP@
    138      1.1  christos #  if @REPLACE_NANOSLEEP@
    139      1.1  christos #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
    140      1.1  christos #    define nanosleep rpl_nanosleep
    141      1.1  christos #   endif
    142      1.1  christos _GL_FUNCDECL_RPL (nanosleep, int,
    143      1.1  christos                   (struct timespec const *__rqtp, struct timespec *__rmtp)
    144      1.1  christos                   _GL_ARG_NONNULL ((1)));
    145      1.1  christos _GL_CXXALIAS_RPL (nanosleep, int,
    146      1.1  christos                   (struct timespec const *__rqtp, struct timespec *__rmtp));
    147      1.1  christos #  else
    148      1.1  christos #   if ! @HAVE_NANOSLEEP@
    149      1.1  christos _GL_FUNCDECL_SYS (nanosleep, int,
    150      1.1  christos                   (struct timespec const *__rqtp, struct timespec *__rmtp)
    151      1.1  christos                   _GL_ARG_NONNULL ((1)));
    152      1.1  christos #   endif
    153      1.1  christos _GL_CXXALIAS_SYS (nanosleep, int,
    154      1.1  christos                   (struct timespec const *__rqtp, struct timespec *__rmtp));
    155      1.1  christos #  endif
    156      1.1  christos _GL_CXXALIASWARN (nanosleep);
    157      1.1  christos # endif
    158      1.1  christos 
    159      1.1  christos /* Initialize time conversion information.  */
    160      1.1  christos # if @GNULIB_TZSET@
    161      1.1  christos #  if @REPLACE_TZSET@
    162      1.1  christos #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
    163      1.1  christos #    undef tzset
    164      1.1  christos #    define tzset rpl_tzset
    165      1.1  christos #   endif
    166      1.1  christos _GL_FUNCDECL_RPL (tzset, void, (void));
    167      1.1  christos _GL_CXXALIAS_RPL (tzset, void, (void));
    168  1.1.1.2  christos #  elif defined _WIN32 && !defined __CYGWIN__
    169  1.1.1.2  christos #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
    170  1.1.1.2  christos #    undef tzset
    171  1.1.1.2  christos #    define tzset _tzset
    172  1.1.1.2  christos #   endif
    173  1.1.1.2  christos _GL_CXXALIAS_MDA (tzset, void, (void));
    174      1.1  christos #  else
    175  1.1.1.2  christos _GL_CXXALIAS_SYS (tzset, void, (void));
    176  1.1.1.2  christos #  endif
    177  1.1.1.2  christos _GL_CXXALIASWARN (tzset);
    178  1.1.1.2  christos # elif @GNULIB_MDA_TZSET@
    179  1.1.1.2  christos /* On native Windows, map 'tzset' to '_tzset', so that -loldnames is not
    180  1.1.1.2  christos    required.  In C++ with GNULIB_NAMESPACE, avoid differences between
    181  1.1.1.2  christos    platforms by defining GNULIB_NAMESPACE::tzset always.  */
    182  1.1.1.2  christos #  if defined _WIN32 && !defined __CYGWIN__
    183  1.1.1.2  christos #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
    184  1.1.1.2  christos #    undef tzset
    185  1.1.1.2  christos #    define tzset _tzset
    186      1.1  christos #   endif
    187  1.1.1.2  christos _GL_CXXALIAS_MDA (tzset, void, (void));
    188  1.1.1.2  christos #  else
    189      1.1  christos _GL_CXXALIAS_SYS (tzset, void, (void));
    190      1.1  christos #  endif
    191      1.1  christos _GL_CXXALIASWARN (tzset);
    192      1.1  christos # endif
    193      1.1  christos 
    194      1.1  christos /* Return the 'time_t' representation of TP and normalize TP.  */
    195      1.1  christos # if @GNULIB_MKTIME@
    196      1.1  christos #  if @REPLACE_MKTIME@
    197      1.1  christos #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
    198      1.1  christos #    define mktime rpl_mktime
    199      1.1  christos #   endif
    200      1.1  christos _GL_FUNCDECL_RPL (mktime, time_t, (struct tm *__tp) _GL_ARG_NONNULL ((1)));
    201      1.1  christos _GL_CXXALIAS_RPL (mktime, time_t, (struct tm *__tp));
    202      1.1  christos #  else
    203      1.1  christos _GL_CXXALIAS_SYS (mktime, time_t, (struct tm *__tp));
    204      1.1  christos #  endif
    205      1.1  christos #  if __GLIBC__ >= 2
    206      1.1  christos _GL_CXXALIASWARN (mktime);
    207      1.1  christos #  endif
    208      1.1  christos # endif
    209      1.1  christos 
    210      1.1  christos /* Convert TIMER to RESULT, assuming local time and UTC respectively.  See
    211      1.1  christos    <https://pubs.opengroup.org/onlinepubs/9699919799/functions/localtime_r.html> and
    212      1.1  christos    <https://pubs.opengroup.org/onlinepubs/9699919799/functions/gmtime_r.html>.  */
    213      1.1  christos # if @GNULIB_TIME_R@
    214      1.1  christos #  if @REPLACE_LOCALTIME_R@
    215      1.1  christos #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
    216      1.1  christos #    undef localtime_r
    217      1.1  christos #    define localtime_r rpl_localtime_r
    218      1.1  christos #   endif
    219      1.1  christos _GL_FUNCDECL_RPL (localtime_r, struct tm *, (time_t const *restrict __timer,
    220      1.1  christos                                              struct tm *restrict __result)
    221      1.1  christos                                             _GL_ARG_NONNULL ((1, 2)));
    222      1.1  christos _GL_CXXALIAS_RPL (localtime_r, struct tm *, (time_t const *restrict __timer,
    223      1.1  christos                                              struct tm *restrict __result));
    224      1.1  christos #  else
    225      1.1  christos #   if ! @HAVE_DECL_LOCALTIME_R@
    226      1.1  christos _GL_FUNCDECL_SYS (localtime_r, struct tm *, (time_t const *restrict __timer,
    227      1.1  christos                                              struct tm *restrict __result)
    228      1.1  christos                                             _GL_ARG_NONNULL ((1, 2)));
    229      1.1  christos #   endif
    230      1.1  christos _GL_CXXALIAS_SYS (localtime_r, struct tm *, (time_t const *restrict __timer,
    231      1.1  christos                                              struct tm *restrict __result));
    232      1.1  christos #  endif
    233      1.1  christos #  if @HAVE_DECL_LOCALTIME_R@
    234      1.1  christos _GL_CXXALIASWARN (localtime_r);
    235      1.1  christos #  endif
    236      1.1  christos #  if @REPLACE_LOCALTIME_R@
    237      1.1  christos #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
    238      1.1  christos #    undef gmtime_r
    239      1.1  christos #    define gmtime_r rpl_gmtime_r
    240      1.1  christos #   endif
    241      1.1  christos _GL_FUNCDECL_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer,
    242      1.1  christos                                           struct tm *restrict __result)
    243      1.1  christos                                          _GL_ARG_NONNULL ((1, 2)));
    244      1.1  christos _GL_CXXALIAS_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer,
    245      1.1  christos                                           struct tm *restrict __result));
    246      1.1  christos #  else
    247      1.1  christos #   if ! @HAVE_DECL_LOCALTIME_R@
    248      1.1  christos _GL_FUNCDECL_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer,
    249      1.1  christos                                           struct tm *restrict __result)
    250      1.1  christos                                          _GL_ARG_NONNULL ((1, 2)));
    251      1.1  christos #   endif
    252      1.1  christos _GL_CXXALIAS_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer,
    253      1.1  christos                                           struct tm *restrict __result));
    254      1.1  christos #  endif
    255      1.1  christos #  if @HAVE_DECL_LOCALTIME_R@
    256      1.1  christos _GL_CXXALIASWARN (gmtime_r);
    257      1.1  christos #  endif
    258      1.1  christos # endif
    259      1.1  christos 
    260      1.1  christos /* Convert TIMER to RESULT, assuming local time and UTC respectively.  See
    261      1.1  christos    <https://pubs.opengroup.org/onlinepubs/9699919799/functions/localtime.html> and
    262      1.1  christos    <https://pubs.opengroup.org/onlinepubs/9699919799/functions/gmtime.html>.  */
    263      1.1  christos # if @GNULIB_LOCALTIME@ || @REPLACE_LOCALTIME@
    264      1.1  christos #  if @REPLACE_LOCALTIME@
    265      1.1  christos #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
    266      1.1  christos #    undef localtime
    267      1.1  christos #    define localtime rpl_localtime
    268      1.1  christos #   endif
    269      1.1  christos _GL_FUNCDECL_RPL (localtime, struct tm *, (time_t const *__timer)
    270      1.1  christos                                           _GL_ARG_NONNULL ((1)));
    271      1.1  christos _GL_CXXALIAS_RPL (localtime, struct tm *, (time_t const *__timer));
    272      1.1  christos #  else
    273      1.1  christos _GL_CXXALIAS_SYS (localtime, struct tm *, (time_t const *__timer));
    274      1.1  christos #  endif
    275      1.1  christos #  if __GLIBC__ >= 2
    276      1.1  christos _GL_CXXALIASWARN (localtime);
    277      1.1  christos #  endif
    278      1.1  christos # endif
    279      1.1  christos 
    280      1.1  christos # if 0 || @REPLACE_GMTIME@
    281      1.1  christos #  if @REPLACE_GMTIME@
    282      1.1  christos #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
    283      1.1  christos #    undef gmtime
    284      1.1  christos #    define gmtime rpl_gmtime
    285      1.1  christos #   endif
    286      1.1  christos _GL_FUNCDECL_RPL (gmtime, struct tm *, (time_t const *__timer)
    287      1.1  christos                                        _GL_ARG_NONNULL ((1)));
    288      1.1  christos _GL_CXXALIAS_RPL (gmtime, struct tm *, (time_t const *__timer));
    289      1.1  christos #  else
    290      1.1  christos _GL_CXXALIAS_SYS (gmtime, struct tm *, (time_t const *__timer));
    291      1.1  christos #  endif
    292      1.1  christos _GL_CXXALIASWARN (gmtime);
    293      1.1  christos # endif
    294      1.1  christos 
    295      1.1  christos /* Parse BUF as a timestamp, assuming FORMAT specifies its layout, and store
    296      1.1  christos    the resulting broken-down time into TM.  See
    297      1.1  christos    <https://pubs.opengroup.org/onlinepubs/9699919799/functions/strptime.html>.  */
    298      1.1  christos # if @GNULIB_STRPTIME@
    299      1.1  christos #  if ! @HAVE_STRPTIME@
    300      1.1  christos _GL_FUNCDECL_SYS (strptime, char *, (char const *restrict __buf,
    301      1.1  christos                                      char const *restrict __format,
    302      1.1  christos                                      struct tm *restrict __tm)
    303      1.1  christos                                     _GL_ARG_NONNULL ((1, 2, 3)));
    304      1.1  christos #  endif
    305      1.1  christos _GL_CXXALIAS_SYS (strptime, char *, (char const *restrict __buf,
    306      1.1  christos                                      char const *restrict __format,
    307      1.1  christos                                      struct tm *restrict __tm));
    308      1.1  christos _GL_CXXALIASWARN (strptime);
    309      1.1  christos # endif
    310      1.1  christos 
    311      1.1  christos /* Convert *TP to a date and time string.  See
    312      1.1  christos    <https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctime.html>.  */
    313      1.1  christos # if @GNULIB_CTIME@
    314      1.1  christos #  if @REPLACE_CTIME@
    315      1.1  christos #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
    316      1.1  christos #    define ctime rpl_ctime
    317      1.1  christos #   endif
    318      1.1  christos _GL_FUNCDECL_RPL (ctime, char *, (time_t const *__tp)
    319      1.1  christos                                  _GL_ARG_NONNULL ((1)));
    320      1.1  christos _GL_CXXALIAS_RPL (ctime, char *, (time_t const *__tp));
    321      1.1  christos #  else
    322      1.1  christos _GL_CXXALIAS_SYS (ctime, char *, (time_t const *__tp));
    323      1.1  christos #  endif
    324      1.1  christos #  if __GLIBC__ >= 2
    325      1.1  christos _GL_CXXALIASWARN (ctime);
    326      1.1  christos #  endif
    327      1.1  christos # endif
    328      1.1  christos 
    329      1.1  christos /* Convert *TP to a date and time string.  See
    330      1.1  christos    <https://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html>.  */
    331      1.1  christos # if @GNULIB_STRFTIME@
    332      1.1  christos #  if @REPLACE_STRFTIME@
    333      1.1  christos #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
    334      1.1  christos #    define strftime rpl_strftime
    335      1.1  christos #   endif
    336      1.1  christos _GL_FUNCDECL_RPL (strftime, size_t,
    337      1.1  christos                   (char *restrict __buf, size_t __bufsize,
    338      1.1  christos                    const char *restrict __fmt, const struct tm *restrict __tp)
    339      1.1  christos                   _GL_ARG_NONNULL ((1, 3, 4)));
    340      1.1  christos _GL_CXXALIAS_RPL (strftime, size_t,
    341      1.1  christos                   (char *restrict __buf, size_t __bufsize,
    342      1.1  christos                    const char *restrict __fmt, const struct tm *restrict __tp));
    343      1.1  christos #  else
    344      1.1  christos _GL_CXXALIAS_SYS (strftime, size_t,
    345      1.1  christos                   (char *restrict __buf, size_t __bufsize,
    346      1.1  christos                    const char *restrict __fmt, const struct tm *restrict __tp));
    347      1.1  christos #  endif
    348      1.1  christos #  if __GLIBC__ >= 2
    349      1.1  christos _GL_CXXALIASWARN (strftime);
    350      1.1  christos #  endif
    351      1.1  christos # endif
    352      1.1  christos 
    353      1.1  christos # if defined _GNU_SOURCE && @GNULIB_TIME_RZ@ && ! @HAVE_TIMEZONE_T@
    354  1.1.1.2  christos /* Functions that use a first-class time zone data type, instead of
    355  1.1.1.2  christos    relying on an implicit global time zone.
    356  1.1.1.2  christos    Inspired by NetBSD.  */
    357  1.1.1.2  christos 
    358  1.1.1.2  christos /* Represents a time zone.
    359  1.1.1.2  christos    (timezone_t) NULL stands for UTC.  */
    360      1.1  christos typedef struct tm_zone *timezone_t;
    361  1.1.1.2  christos 
    362  1.1.1.2  christos /* tzalloc (name)
    363  1.1.1.2  christos    Returns a time zone object for the given time zone NAME.  This object
    364  1.1.1.2  christos    represents the time zone that other functions would use it the TZ
    365  1.1.1.2  christos    environment variable was set to NAME.
    366  1.1.1.2  christos    If NAME is NULL, the result represents the time zone that other functions
    367  1.1.1.2  christos    would use it the TZ environment variable was unset.
    368  1.1.1.2  christos    May return NULL if NAME is invalid (this is platform dependent) or
    369  1.1.1.2  christos    upon memory allocation failure.  */
    370      1.1  christos _GL_FUNCDECL_SYS (tzalloc, timezone_t, (char const *__name));
    371      1.1  christos _GL_CXXALIAS_SYS (tzalloc, timezone_t, (char const *__name));
    372  1.1.1.2  christos 
    373  1.1.1.2  christos /* tzfree (tz)
    374  1.1.1.2  christos    Frees a time zone object.
    375  1.1.1.2  christos    The argument must have been returned by tzalloc().  */
    376      1.1  christos _GL_FUNCDECL_SYS (tzfree, void, (timezone_t __tz));
    377      1.1  christos _GL_CXXALIAS_SYS (tzfree, void, (timezone_t __tz));
    378  1.1.1.2  christos 
    379  1.1.1.2  christos /* localtime_rz (tz, &t, &result)
    380  1.1.1.2  christos    Converts an absolute time T to a broken-down time RESULT, assuming the
    381  1.1.1.2  christos    time zone TZ.
    382  1.1.1.2  christos    This function is like 'localtime_r', but relies on the argument TZ instead
    383  1.1.1.2  christos    of an implicit global time zone.  */
    384      1.1  christos _GL_FUNCDECL_SYS (localtime_rz, struct tm *,
    385      1.1  christos                   (timezone_t __tz, time_t const *restrict __timer,
    386      1.1  christos                    struct tm *restrict __result) _GL_ARG_NONNULL ((2, 3)));
    387      1.1  christos _GL_CXXALIAS_SYS (localtime_rz, struct tm *,
    388      1.1  christos                   (timezone_t __tz, time_t const *restrict __timer,
    389      1.1  christos                    struct tm *restrict __result));
    390  1.1.1.2  christos 
    391  1.1.1.2  christos /* mktime_z (tz, &tm)
    392  1.1.1.2  christos    Normalizes the broken-down time TM and converts it to an absolute time,
    393  1.1.1.2  christos    assuming the time zone TZ.  Returns the absolute time.
    394  1.1.1.2  christos    This function is like 'mktime', but relies on the argument TZ instead
    395  1.1.1.2  christos    of an implicit global time zone.  */
    396      1.1  christos _GL_FUNCDECL_SYS (mktime_z, time_t,
    397  1.1.1.2  christos                   (timezone_t __tz, struct tm *restrict __tm)
    398      1.1  christos                   _GL_ARG_NONNULL ((2)));
    399      1.1  christos _GL_CXXALIAS_SYS (mktime_z, time_t,
    400  1.1.1.2  christos                   (timezone_t __tz, struct tm *restrict __tm));
    401  1.1.1.2  christos 
    402  1.1.1.2  christos /* Time zone abbreviation strings (returned by 'localtime_rz' or 'mktime_z'
    403  1.1.1.2  christos    in the 'tm_zone' member of 'struct tm') are valid as long as
    404  1.1.1.2  christos      - the 'struct tm' argument is not destroyed or overwritten,
    405  1.1.1.2  christos    and
    406  1.1.1.2  christos      - the 'timezone_t' argument is not freed through tzfree().  */
    407  1.1.1.2  christos 
    408      1.1  christos # endif
    409      1.1  christos 
    410      1.1  christos /* Convert TM to a time_t value, assuming UTC.  */
    411      1.1  christos # if @GNULIB_TIMEGM@
    412      1.1  christos #  if @REPLACE_TIMEGM@
    413      1.1  christos #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
    414      1.1  christos #    undef timegm
    415      1.1  christos #    define timegm rpl_timegm
    416      1.1  christos #   endif
    417      1.1  christos _GL_FUNCDECL_RPL (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1)));
    418      1.1  christos _GL_CXXALIAS_RPL (timegm, time_t, (struct tm *__tm));
    419      1.1  christos #  else
    420      1.1  christos #   if ! @HAVE_TIMEGM@
    421      1.1  christos _GL_FUNCDECL_SYS (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1)));
    422      1.1  christos #   endif
    423      1.1  christos _GL_CXXALIAS_SYS (timegm, time_t, (struct tm *__tm));
    424      1.1  christos #  endif
    425      1.1  christos _GL_CXXALIASWARN (timegm);
    426      1.1  christos # endif
    427      1.1  christos 
    428      1.1  christos /* Encourage applications to avoid unsafe functions that can overrun
    429      1.1  christos    buffers when given outlandish struct tm values.  Portable
    430      1.1  christos    applications should use strftime (or even sprintf) instead.  */
    431      1.1  christos # if defined GNULIB_POSIXCHECK
    432      1.1  christos #  undef asctime
    433      1.1  christos _GL_WARN_ON_USE (asctime, "asctime can overrun buffers in some cases - "
    434      1.1  christos                  "better use strftime (or even sprintf) instead");
    435      1.1  christos # endif
    436      1.1  christos # if defined GNULIB_POSIXCHECK
    437      1.1  christos #  undef asctime_r
    438  1.1.1.2  christos _GL_WARN_ON_USE (asctime_r, "asctime_r can overrun buffers in some cases - "
    439      1.1  christos                  "better use strftime (or even sprintf) instead");
    440      1.1  christos # endif
    441      1.1  christos # if defined GNULIB_POSIXCHECK
    442      1.1  christos #  undef ctime
    443  1.1.1.2  christos _GL_WARN_ON_USE (ctime, "ctime can overrun buffers in some cases - "
    444      1.1  christos                  "better use strftime (or even sprintf) instead");
    445      1.1  christos # endif
    446      1.1  christos # if defined GNULIB_POSIXCHECK
    447      1.1  christos #  undef ctime_r
    448  1.1.1.2  christos _GL_WARN_ON_USE (ctime_r, "ctime_r can overrun buffers in some cases - "
    449      1.1  christos                  "better use strftime (or even sprintf) instead");
    450      1.1  christos # endif
    451      1.1  christos 
    452      1.1  christos #endif
    453