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