glibc (2.38)

(root)/
include/
time.h
       1  /* Copyright (C) 1991-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  /*
      19   *	ISO C99 Standard: 7.23 Date and time	<time.h>
      20   */
      21  
      22  #ifndef	_TIME_H
      23  #define _TIME_H	1
      24  
      25  #include <features.h>
      26  
      27  #define __need_size_t
      28  #define __need_NULL
      29  #include <stddef.h>
      30  
      31  /* This defines CLOCKS_PER_SEC, which is the number of processor clock
      32     ticks per second, and possibly a number of other constants.   */
      33  #include <bits/time.h>
      34  
      35  /* Many of the typedefs and structs whose official home is this header
      36     may also need to be defined by other headers.  */
      37  #include <bits/types/clock_t.h>
      38  #include <bits/types/time_t.h>
      39  #include <bits/types/struct_tm.h>
      40  
      41  #if defined __USE_POSIX199309 || defined __USE_ISOC11
      42  # include <bits/types/struct_timespec.h>
      43  #endif
      44  
      45  #ifdef __USE_POSIX199309
      46  # include <bits/types/clockid_t.h>
      47  # include <bits/types/timer_t.h>
      48  # include <bits/types/struct_itimerspec.h>
      49  struct sigevent;
      50  #endif
      51  
      52  #ifdef __USE_XOPEN2K
      53  # ifndef __pid_t_defined
      54  typedef __pid_t pid_t;
      55  #  define __pid_t_defined
      56  # endif
      57  #endif
      58  
      59  #ifdef __USE_XOPEN2K8
      60  # include <bits/types/locale_t.h>
      61  #endif
      62  
      63  #ifdef __USE_ISOC11
      64  /* Time base values for timespec_get.  */
      65  # define TIME_UTC 1
      66  #endif
      67  
      68  __BEGIN_DECLS
      69  
      70  /* Time used by the program so far (user time + system time).
      71     The result / CLOCKS_PER_SEC is program time in seconds.  */
      72  extern clock_t clock (void) __THROW;
      73  
      74  #ifndef __USE_TIME_BITS64
      75  /* Return the current time and put it in *TIMER if TIMER is not NULL.  */
      76  extern time_t time (time_t *__timer) __THROW;
      77  
      78  /* Return the difference between TIME1 and TIME0.  */
      79  extern double difftime (time_t __time1, time_t __time0)
      80       __THROW __attribute__ ((__const__));
      81  
      82  /* Return the `time_t' representation of TP and normalize TP.  */
      83  extern time_t mktime (struct tm *__tp) __THROW;
      84  #else
      85  # ifdef __REDIRECT_NTH
      86  extern time_t __REDIRECT_NTH (time, (time_t *__timer), __time64);
      87  extern double __REDIRECT_NTH (difftime, (time_t __time1, time_t __time0),
      88                                __difftime64) __attribute__ ((__const__));
      89  extern time_t __REDIRECT_NTH (mktime, (struct tm *__tp), __mktime64);
      90  # else
      91  #  define time __time64
      92  #  define difftime __difftime64
      93  #  define mktime __mktime64
      94  # endif
      95  #endif
      96  
      97  /* Format TP into S according to FORMAT.
      98     Write no more than MAXSIZE characters and return the number
      99     of characters written, or 0 if it would exceed MAXSIZE.  */
     100  extern size_t strftime (char *__restrict __s, size_t __maxsize,
     101  			const char *__restrict __format,
     102  			const struct tm *__restrict __tp)
     103  			__THROW __nonnull((1, 3, 4));
     104  
     105  #ifdef __USE_XOPEN
     106  /* Parse S according to FORMAT and store binary time information in TP.
     107     The return value is a pointer to the first unparsed character in S.  */
     108  extern char *strptime (const char *__restrict __s,
     109  		       const char *__restrict __fmt, struct tm *__tp)
     110       __THROW;
     111  #endif
     112  
     113  #ifdef __USE_XOPEN2K8
     114  /* Similar to the two functions above but take the information from
     115     the provided locale and not the global locale.  */
     116  
     117  extern size_t strftime_l (char *__restrict __s, size_t __maxsize,
     118  			  const char *__restrict __format,
     119  			  const struct tm *__restrict __tp,
     120  			  locale_t __loc) __THROW;
     121  #endif
     122  
     123  #ifdef __USE_GNU
     124  extern char *strptime_l (const char *__restrict __s,
     125  			 const char *__restrict __fmt, struct tm *__tp,
     126  			 locale_t __loc) __THROW;
     127  #endif
     128  
     129  
     130  #ifndef __USE_TIME_BITS64
     131  /* Return the `struct tm' representation of *TIMER
     132     in Universal Coordinated Time (aka Greenwich Mean Time).  */
     133  extern struct tm *gmtime (const time_t *__timer) __THROW;
     134  
     135  /* Return the `struct tm' representation
     136     of *TIMER in the local timezone.  */
     137  extern struct tm *localtime (const time_t *__timer) __THROW;
     138  
     139  #else
     140  # ifdef __REDIRECT_NTH
     141  extern struct tm*__REDIRECT_NTH (gmtime, (const time_t *__timer), __gmtime64);
     142  extern struct tm *__REDIRECT_NTH (localtime, (const time_t *__timer),
     143  				  __localtime64);
     144  # else
     145  #  define gmtime __gmtime64
     146  #  define localtime __localtime64
     147  # endif
     148  #endif
     149  
     150  
     151  #if defined __USE_POSIX || __GLIBC_USE (ISOC2X)
     152  # ifndef __USE_TIME_BITS64
     153  /* Return the `struct tm' representation of *TIMER in UTC,
     154     using *TP to store the result.  */
     155  extern struct tm *gmtime_r (const time_t *__restrict __timer,
     156  			    struct tm *__restrict __tp) __THROW;
     157  
     158  /* Return the `struct tm' representation of *TIMER in local time,
     159     using *TP to store the result.  */
     160  extern struct tm *localtime_r (const time_t *__restrict __timer,
     161  			       struct tm *__restrict __tp) __THROW;
     162  # else
     163  #  ifdef __REDIRECT_NTH
     164  extern struct tm*__REDIRECT_NTH (gmtime_r, (const time_t *__restrict __timer,
     165                                              struct tm *__restrict __tp),
     166                                   __gmtime64_r);
     167  
     168  extern struct tm*__REDIRECT_NTH (localtime_r, (const time_t *__restrict __t,
     169                                                 struct tm *__restrict __tp),
     170                                   __localtime64_r);
     171  #  else
     172  #   define gmtime_r __gmtime64_r
     173  #   define localtime_r __localtime_r
     174  #  endif
     175  # endif
     176  #endif	/* POSIX || C2X */
     177  
     178  /* Return a string of the form "Day Mon dd hh:mm:ss yyyy\n"
     179     that is the representation of TP in this format.  */
     180  extern char *asctime (const struct tm *__tp) __THROW;
     181  
     182  /* Equivalent to `asctime (localtime (timer))'.  */
     183  #ifndef __USE_TIME_BITS64
     184  extern char *ctime (const time_t *__timer) __THROW;
     185  #else
     186  # ifdef __REDIRECT_NTH
     187  extern char *__REDIRECT_NTH (ctime, (const time_t *__timer), __ctime64);
     188  # else
     189  #  define ctime __ctime64
     190  # endif
     191  #endif
     192  
     193  #ifdef __USE_POSIX
     194  /* Reentrant versions of the above functions.  */
     195  
     196  /* Return in BUF a string of the form "Day Mon dd hh:mm:ss yyyy\n"
     197     that is the representation of TP in this format.  */
     198  extern char *asctime_r (const struct tm *__restrict __tp,
     199  			char *__restrict __buf) __THROW;
     200  
     201  /* Equivalent to `asctime_r (localtime_r (timer, *TMP*), buf)'.  */
     202  #ifndef __USE_TIME_BITS64
     203  extern char *ctime_r (const time_t *__restrict __timer,
     204  		      char *__restrict __buf) __THROW;
     205  #else
     206  # ifdef __REDIRECT_NTH
     207  extern char *__REDIRECT_NTH (ctime_r, (const time_t *__restrict __timer,
     208                                         char *__restrict __buf), __ctime64_r);
     209  # else
     210  #  define ctime_r __ctime64_r
     211  # endif
     212  #endif
     213  
     214  #endif	/* POSIX */
     215  
     216  
     217  /* Defined in localtime.c.  */
     218  extern char *__tzname[2];	/* Current time zone abbreviations.  */
     219  extern int __daylight;		/* If daylight-saving time is ever in use.  */
     220  extern long int __timezone;	/* Seconds west of UTC.  */
     221  
     222  
     223  #ifdef	__USE_POSIX
     224  /* Same as above.  */
     225  extern char *tzname[2];
     226  
     227  /* Set time conversion information from the TZ environment variable.
     228     If TZ is not defined, a locale-dependent default is used.  */
     229  extern void tzset (void) __THROW;
     230  #endif
     231  
     232  #if defined __USE_MISC || defined __USE_XOPEN
     233  extern int daylight;
     234  extern long int timezone;
     235  #endif
     236  
     237  
     238  /* Nonzero if YEAR is a leap year (every 4 years,
     239     except every 100th isn't, and every 400th is).  */
     240  #define __isleap(year)	\
     241    ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
     242  
     243  
     244  #if defined __USE_MISC || __GLIBC_USE (ISOC2X)
     245  # ifndef __USE_TIME_BITS64
     246  /* Like `mktime', but for TP represents Universal Time, not local time.  */
     247  extern time_t timegm (struct tm *__tp) __THROW;
     248  # else
     249  #  ifdef __REDIRECT_NTH
     250  extern time_t __REDIRECT_NTH (timegm, (struct tm *__tp), __timegm64);
     251  #  else
     252  #   define timegm __timegm64
     253  #  endif
     254  # endif
     255  #endif
     256  
     257  
     258  #ifdef __USE_MISC
     259  /* Miscellaneous functions many Unices inherited from the public domain
     260     localtime package.  These are included only for compatibility.  */
     261  
     262  #ifndef __USE_TIME_BITS64
     263  /* Another name for `mktime'.  */
     264  extern time_t timelocal (struct tm *__tp) __THROW;
     265  #else
     266  # ifdef __REDIRECT_NTH
     267  extern time_t __REDIRECT_NTH (timelocal, (struct tm *__tp), __mktime64);
     268  # endif
     269  #endif
     270  
     271  /* Return the number of days in YEAR.  */
     272  extern int dysize (int __year) __THROW  __attribute__ ((__const__));
     273  #endif
     274  
     275  
     276  #ifdef __USE_POSIX199309
     277  # ifndef __USE_TIME_BITS64
     278  /* Pause execution for a number of nanoseconds.
     279  
     280     This function is a cancellation point and therefore not marked with
     281     __THROW.  */
     282  extern int nanosleep (const struct timespec *__requested_time,
     283  		      struct timespec *__remaining);
     284  
     285  /* Get resolution of clock CLOCK_ID.  */
     286  extern int clock_getres (clockid_t __clock_id, struct timespec *__res) __THROW;
     287  
     288  /* Get current value of clock CLOCK_ID and store it in TP.  */
     289  extern int clock_gettime (clockid_t __clock_id, struct timespec *__tp)
     290       __THROW __nonnull((2));
     291  
     292  /* Set clock CLOCK_ID to value TP.  */
     293  extern int clock_settime (clockid_t __clock_id, const struct timespec *__tp)
     294       __THROW __nonnull((2));
     295  # else
     296  #  ifdef __REDIRECT
     297  extern int __REDIRECT (nanosleep, (const struct timespec *__requested_time,
     298                                     struct timespec *__remaining),
     299                         __nanosleep64);
     300  extern int __REDIRECT_NTH (clock_getres, (clockid_t __clock_id,
     301                                            struct timespec *__res),
     302                             __clock_getres64);
     303  extern int __REDIRECT_NTH (clock_gettime, (clockid_t __clock_id, struct
     304                                             timespec *__tp), __clock_gettime64)
     305                             __nonnull((2));
     306  extern int __REDIRECT_NTH (clock_settime, (clockid_t __clock_id, const struct
     307                                             timespec *__tp), __clock_settime64)
     308                             __nonnull((2));
     309  #  else
     310  #   define nanosleep __nanosleep64
     311  #   define clock_getres __clock_getres64
     312  #   define clock_gettime __clock_gettime64
     313  #   define clock_settime __clock_settime64
     314  #  endif
     315  # endif
     316  
     317  
     318  # ifdef __USE_XOPEN2K
     319  /* High-resolution sleep with the specified clock.
     320  
     321     This function is a cancellation point and therefore not marked with
     322     __THROW.  */
     323  #  ifndef __USE_TIME_BITS64
     324  extern int clock_nanosleep (clockid_t __clock_id, int __flags,
     325  			    const struct timespec *__req,
     326  			    struct timespec *__rem);
     327  #  else
     328  #   ifdef __REDIRECT
     329  extern int __REDIRECT (clock_nanosleep, (clockid_t __clock_id, int __flags,
     330                                           const struct timespec *__req,
     331                                           struct timespec *__rem),
     332                         __clock_nanosleep_time64);
     333  #   else
     334  #    define clock_nanosleep __clock_nanosleep_time64
     335  #   endif
     336  #  endif
     337  
     338  /* Return clock ID for CPU-time clock.  */
     339  extern int clock_getcpuclockid (pid_t __pid, clockid_t *__clock_id) __THROW;
     340  # endif
     341  
     342  
     343  /* Create new per-process timer using CLOCK_ID.  */
     344  extern int timer_create (clockid_t __clock_id,
     345  			 struct sigevent *__restrict __evp,
     346  			 timer_t *__restrict __timerid) __THROW;
     347  
     348  /* Delete timer TIMERID.  */
     349  extern int timer_delete (timer_t __timerid) __THROW;
     350  
     351  /* Set timer TIMERID to VALUE, returning old value in OVALUE.  */
     352  # ifndef __USE_TIME_BITS64
     353  extern int timer_settime (timer_t __timerid, int __flags,
     354  			  const struct itimerspec *__restrict __value,
     355  			  struct itimerspec *__restrict __ovalue) __THROW;
     356  
     357  /* Get current value of timer TIMERID and store it in VALUE.  */
     358  extern int timer_gettime (timer_t __timerid, struct itimerspec *__value)
     359       __THROW;
     360  # else
     361  #  ifdef __REDIRECT_NTH
     362  extern int __REDIRECT_NTH (timer_settime, (timer_t __timerid, int __flags,
     363       const struct itimerspec *__restrict __value,
     364       struct itimerspec *__restrict __ovalue),
     365                            __timer_settime64);
     366  
     367  extern int __REDIRECT_NTH (timer_gettime, (timer_t __timerid,
     368                                             struct itimerspec *__value),
     369                             __timer_gettime64);
     370  #  else
     371  #   define timer_settime __timer_settime64
     372  #   define timer_gettime __timer_gettime64
     373  #  endif
     374  # endif
     375  
     376  /* Get expiration overrun for timer TIMERID.  */
     377  extern int timer_getoverrun (timer_t __timerid) __THROW;
     378  #endif
     379  
     380  
     381  #ifdef __USE_ISOC11
     382  # ifndef __USE_TIME_BITS64
     383  /* Set TS to calendar time based in time base BASE.  */
     384  extern int timespec_get (struct timespec *__ts, int __base)
     385       __THROW __nonnull ((1));
     386  # else
     387  #  ifdef __REDIRECT_NTH
     388  extern int __REDIRECT_NTH (timespec_get, (struct timespec *__ts, int __base),
     389                             __timespec_get64) __nonnull ((1));
     390  #  else
     391  #   define timespec_get __timespec_get64
     392  #  endif
     393  # endif
     394  #endif
     395  
     396  
     397  #if __GLIBC_USE (ISOC2X)
     398  # ifndef __USE_TIME_BITS64
     399  /* Set TS to resolution of time base BASE.  */
     400  extern int timespec_getres (struct timespec *__ts, int __base)
     401       __THROW;
     402  # else
     403  #  ifdef __REDIRECT_NTH
     404  extern int __REDIRECT_NTH (timespec_getres, (struct timespec *__ts,
     405                                               int __base),
     406                             __timespec_getres64);
     407  #  else
     408  #   define timespec_getres __timespec_getres64
     409  #  endif
     410  # endif
     411  #endif
     412  
     413  
     414  #ifdef __USE_XOPEN_EXTENDED
     415  /* Set to one of the following values to indicate an error.
     416       1  the DATEMSK environment variable is null or undefined,
     417       2  the template file cannot be opened for reading,
     418       3  failed to get file status information,
     419       4  the template file is not a regular file,
     420       5  an error is encountered while reading the template file,
     421       6  memory allication failed (not enough memory available),
     422       7  there is no line in the template that matches the input,
     423       8  invalid input specification Example: February 31 or a time is
     424  	specified that can not be represented in a time_t (representing
     425  	the time in seconds since 00:00:00 UTC, January 1, 1970) */
     426  extern int getdate_err;
     427  
     428  /* Parse the given string as a date specification and return a value
     429     representing the value.  The templates from the file identified by
     430     the environment variable DATEMSK are used.  In case of an error
     431     `getdate_err' is set.
     432  
     433     This function is a possible cancellation point and therefore not
     434     marked with __THROW.  */
     435  extern struct tm *getdate (const char *__string);
     436  #endif
     437  
     438  #ifdef __USE_GNU
     439  /* Since `getdate' is not reentrant because of the use of `getdate_err'
     440     and the static buffer to return the result in, we provide a thread-safe
     441     variant.  The functionality is the same.  The result is returned in
     442     the buffer pointed to by RESBUFP and in case of an error the return
     443     value is != 0 with the same values as given above for `getdate_err'.
     444  
     445     This function is not part of POSIX and therefore no official
     446     cancellation point.  But due to similarity with an POSIX interface
     447     or due to the implementation it is a cancellation point and
     448     therefore not marked with __THROW.  */
     449  extern int getdate_r (const char *__restrict __string,
     450  		      struct tm *__restrict __resbufp);
     451  #endif
     452  
     453  __END_DECLS
     454  
     455  #endif /* time.h.  */