1 | /* Copyright (C) 1991-2022 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) __THROW; |
103 | |
104 | #ifdef __USE_XOPEN |
105 | /* Parse S according to FORMAT and store binary time information in TP. |
106 | The return value is a pointer to the first unparsed character in S. */ |
107 | extern char *strptime (const char *__restrict __s, |
108 | const char *__restrict __fmt, struct tm *__tp) |
109 | __THROW; |
110 | #endif |
111 | |
112 | #ifdef __USE_XOPEN2K8 |
113 | /* Similar to the two functions above but take the information from |
114 | the provided locale and not the global locale. */ |
115 | |
116 | extern size_t strftime_l (char *__restrict __s, size_t __maxsize, |
117 | const char *__restrict __format, |
118 | const struct tm *__restrict __tp, |
119 | locale_t __loc) __THROW; |
120 | #endif |
121 | |
122 | #ifdef __USE_GNU |
123 | extern char *strptime_l (const char *__restrict __s, |
124 | const char *__restrict __fmt, struct tm *__tp, |
125 | locale_t __loc) __THROW; |
126 | #endif |
127 | |
128 | |
129 | #ifndef __USE_TIME_BITS64 |
130 | /* Return the `struct tm' representation of *TIMER |
131 | in Universal Coordinated Time (aka Greenwich Mean Time). */ |
132 | extern struct tm *gmtime (const time_t *__timer) __THROW; |
133 | |
134 | /* Return the `struct tm' representation |
135 | of *TIMER in the local timezone. */ |
136 | extern struct tm *localtime (const time_t *__timer) __THROW; |
137 | |
138 | #else |
139 | # ifdef __REDIRECT_NTH |
140 | extern struct tm*__REDIRECT_NTH (gmtime, (const time_t *__timer), __gmtime64); |
141 | extern struct tm *__REDIRECT_NTH (localtime, (const time_t *__timer), |
142 | __localtime64); |
143 | # else |
144 | # define gmtime __gmtime64 |
145 | # define localtime __localtime64 |
146 | # endif |
147 | #endif |
148 | |
149 | |
150 | #if defined __USE_POSIX || __GLIBC_USE (ISOC2X) |
151 | # ifndef __USE_TIME_BITS64 |
152 | /* Return the `struct tm' representation of *TIMER in UTC, |
153 | using *TP to store the result. */ |
154 | extern struct tm *gmtime_r (const time_t *__restrict __timer, |
155 | struct tm *__restrict __tp) __THROW; |
156 | |
157 | /* Return the `struct tm' representation of *TIMER in local time, |
158 | using *TP to store the result. */ |
159 | extern struct tm *localtime_r (const time_t *__restrict __timer, |
160 | struct tm *__restrict __tp) __THROW; |
161 | # else |
162 | # ifdef __REDIRECT_NTH |
163 | extern struct tm*__REDIRECT_NTH (gmtime_r, (const time_t *__restrict __timer, |
164 | struct tm *__restrict __tp), |
165 | __gmtime64_r); |
166 | |
167 | extern struct tm*__REDIRECT_NTH (localtime_r, (const time_t *__restrict __t, |
168 | struct tm *__restrict __tp), |
169 | __localtime64_r); |
170 | # else |
171 | # define gmtime_r __gmtime64_r |
172 | # define localtime_r __localtime_r |
173 | # endif |
174 | # endif |
175 | #endif /* POSIX || C2X */ |
176 | |
177 | /* Return a string of the form "Day Mon dd hh:mm:ss yyyy\n" |
178 | that is the representation of TP in this format. */ |
179 | extern char *asctime (const struct tm *__tp) __THROW; |
180 | |
181 | /* Equivalent to `asctime (localtime (timer))'. */ |
182 | #ifndef __USE_TIME_BITS64 |
183 | extern char *ctime (const time_t *__timer) __THROW; |
184 | #else |
185 | # ifdef __REDIRECT_NTH |
186 | extern char *__REDIRECT_NTH (ctime, (const time_t *__timer), __ctime64); |
187 | # else |
188 | # define ctime __ctime64 |
189 | # endif |
190 | #endif |
191 | |
192 | #ifdef __USE_POSIX |
193 | /* Reentrant versions of the above functions. */ |
194 | |
195 | /* Return in BUF a string of the form "Day Mon dd hh:mm:ss yyyy\n" |
196 | that is the representation of TP in this format. */ |
197 | extern char *asctime_r (const struct tm *__restrict __tp, |
198 | char *__restrict __buf) __THROW; |
199 | |
200 | /* Equivalent to `asctime_r (localtime_r (timer, *TMP*), buf)'. */ |
201 | #ifndef __USE_TIME_BITS64 |
202 | extern char *ctime_r (const time_t *__restrict __timer, |
203 | char *__restrict __buf) __THROW; |
204 | #else |
205 | # ifdef __REDIRECT_NTH |
206 | extern char *__REDIRECT_NTH (ctime_r, (const time_t *__restrict __timer, |
207 | char *__restrict __buf), __ctime64_r); |
208 | # else |
209 | # define ctime_r __ctime64_r |
210 | # endif |
211 | #endif |
212 | |
213 | #endif /* POSIX */ |
214 | |
215 | |
216 | /* Defined in localtime.c. */ |
217 | extern char *__tzname[2]; /* Current timezone names. */ |
218 | extern int __daylight; /* If daylight-saving time is ever in use. */ |
219 | extern long int __timezone; /* Seconds west of UTC. */ |
220 | |
221 | |
222 | #ifdef __USE_POSIX |
223 | /* Same as above. */ |
224 | extern char *tzname[2]; |
225 | |
226 | /* Set time conversion information from the TZ environment variable. |
227 | If TZ is not defined, a locale-dependent default is used. */ |
228 | extern void tzset (void) __THROW; |
229 | #endif |
230 | |
231 | #if defined __USE_MISC || defined __USE_XOPEN |
232 | extern int daylight; |
233 | extern long int timezone; |
234 | #endif |
235 | |
236 | |
237 | /* Nonzero if YEAR is a leap year (every 4 years, |
238 | except every 100th isn't, and every 400th is). */ |
239 | #define __isleap(year) \ |
240 | ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) |
241 | |
242 | |
243 | #ifdef __USE_MISC |
244 | /* Miscellaneous functions many Unices inherited from the public domain |
245 | localtime package. These are included only for compatibility. */ |
246 | |
247 | #ifndef __USE_TIME_BITS64 |
248 | /* Like `mktime', but for TP represents Universal Time, not local time. */ |
249 | extern time_t timegm (struct tm *__tp) __THROW; |
250 | /* Another name for `mktime'. */ |
251 | extern time_t timelocal (struct tm *__tp) __THROW; |
252 | #else |
253 | # ifdef __REDIRECT_NTH |
254 | extern time_t __REDIRECT_NTH (timegm, (struct tm *__tp), __timegm64); |
255 | extern time_t __REDIRECT_NTH (timelocal, (struct tm *__tp), __mktime64); |
256 | # else |
257 | # define timegm __timegm64 |
258 | # endif |
259 | #endif |
260 | |
261 | /* Return the number of days in YEAR. */ |
262 | extern int dysize (int __year) __THROW __attribute__ ((__const__)); |
263 | #endif |
264 | |
265 | |
266 | #ifdef __USE_POSIX199309 |
267 | # ifndef __USE_TIME_BITS64 |
268 | /* Pause execution for a number of nanoseconds. |
269 | |
270 | This function is a cancellation point and therefore not marked with |
271 | __THROW. */ |
272 | extern int nanosleep (const struct timespec *__requested_time, |
273 | struct timespec *__remaining); |
274 | |
275 | /* Get resolution of clock CLOCK_ID. */ |
276 | extern int clock_getres (clockid_t __clock_id, struct timespec *__res) __THROW; |
277 | |
278 | /* Get current value of clock CLOCK_ID and store it in TP. */ |
279 | extern int clock_gettime (clockid_t __clock_id, struct timespec *__tp) __THROW; |
280 | |
281 | /* Set clock CLOCK_ID to value TP. */ |
282 | extern int clock_settime (clockid_t __clock_id, const struct timespec *__tp) |
283 | __THROW; |
284 | # else |
285 | # ifdef __REDIRECT |
286 | extern int __REDIRECT (nanosleep, (const struct timespec *__requested_time, |
287 | struct timespec *__remaining), |
288 | __nanosleep64); |
289 | extern int __REDIRECT_NTH (clock_getres, (clockid_t __clock_id, |
290 | struct timespec *__res), |
291 | __clock_getres64); |
292 | extern int __REDIRECT_NTH (clock_gettime, (clockid_t __clock_id, struct |
293 | timespec *__tp), __clock_gettime64); |
294 | extern int __REDIRECT_NTH (clock_settime, (clockid_t __clock_id, const struct |
295 | timespec *__tp), __clock_settime64); |
296 | # else |
297 | # define nanosleep __nanosleep64 |
298 | # define clock_getres __clock_getres64 |
299 | # define clock_gettime __clock_gettime64 |
300 | # define clock_settime __clock_settime64 |
301 | # endif |
302 | # endif |
303 | |
304 | |
305 | # ifdef __USE_XOPEN2K |
306 | /* High-resolution sleep with the specified clock. |
307 | |
308 | This function is a cancellation point and therefore not marked with |
309 | __THROW. */ |
310 | # ifndef __USE_TIME_BITS64 |
311 | extern int clock_nanosleep (clockid_t __clock_id, int __flags, |
312 | const struct timespec *__req, |
313 | struct timespec *__rem); |
314 | # else |
315 | # ifdef __REDIRECT |
316 | extern int __REDIRECT (clock_nanosleep, (clockid_t __clock_id, int __flags, |
317 | const struct timespec *__req, |
318 | struct timespec *__rem), |
319 | __clock_nanosleep_time64); |
320 | # else |
321 | # define clock_nanosleep __clock_nanosleep_time64 |
322 | # endif |
323 | # endif |
324 | |
325 | /* Return clock ID for CPU-time clock. */ |
326 | extern int clock_getcpuclockid (pid_t __pid, clockid_t *__clock_id) __THROW; |
327 | # endif |
328 | |
329 | |
330 | /* Create new per-process timer using CLOCK_ID. */ |
331 | extern int timer_create (clockid_t __clock_id, |
332 | struct sigevent *__restrict __evp, |
333 | timer_t *__restrict __timerid) __THROW; |
334 | |
335 | /* Delete timer TIMERID. */ |
336 | extern int timer_delete (timer_t __timerid) __THROW; |
337 | |
338 | /* Set timer TIMERID to VALUE, returning old value in OVALUE. */ |
339 | # ifndef __USE_TIME_BITS64 |
340 | extern int timer_settime (timer_t __timerid, int __flags, |
341 | const struct itimerspec *__restrict __value, |
342 | struct itimerspec *__restrict __ovalue) __THROW; |
343 | |
344 | /* Get current value of timer TIMERID and store it in VALUE. */ |
345 | extern int timer_gettime (timer_t __timerid, struct itimerspec *__value) |
346 | __THROW; |
347 | # else |
348 | # ifdef __REDIRECT_NTH |
349 | extern int __REDIRECT_NTH (timer_settime, (timer_t __timerid, int __flags, |
350 | const struct itimerspec *__restrict __value, |
351 | struct itimerspec *__restrict __ovalue), |
352 | __timer_settime64); |
353 | |
354 | extern int __REDIRECT_NTH (timer_gettime, (timer_t __timerid, |
355 | struct itimerspec *__value), |
356 | __timer_gettime64); |
357 | # else |
358 | # define timer_settime __timer_settime64 |
359 | # define timer_gettime __timer_gettime64 |
360 | # endif |
361 | # endif |
362 | |
363 | /* Get expiration overrun for timer TIMERID. */ |
364 | extern int timer_getoverrun (timer_t __timerid) __THROW; |
365 | #endif |
366 | |
367 | |
368 | #ifdef __USE_ISOC11 |
369 | # ifndef __USE_TIME_BITS64 |
370 | /* Set TS to calendar time based in time base BASE. */ |
371 | extern int timespec_get (struct timespec *__ts, int __base) |
372 | __THROW __nonnull ((1)); |
373 | # else |
374 | # ifdef __REDIRECT_NTH |
375 | extern int __REDIRECT_NTH (timespec_get, (struct timespec *__ts, int __base), |
376 | __timespec_get64) __nonnull ((1)); |
377 | # else |
378 | # define timespec_get __timespec_get64 |
379 | # endif |
380 | # endif |
381 | #endif |
382 | |
383 | |
384 | #if __GLIBC_USE (ISOC2X) |
385 | # ifndef __USE_TIME_BITS64 |
386 | /* Set TS to resolution of time base BASE. */ |
387 | extern int timespec_getres (struct timespec *__ts, int __base) |
388 | __THROW; |
389 | # else |
390 | # ifdef __REDIRECT_NTH |
391 | extern int __REDIRECT_NTH (timespec_getres, (struct timespec *__ts, |
392 | int __base), |
393 | __timespec_getres64); |
394 | # else |
395 | # define timespec_getres __timespec_getres64 |
396 | # endif |
397 | # endif |
398 | #endif |
399 | |
400 | |
401 | #ifdef __USE_XOPEN_EXTENDED |
402 | /* Set to one of the following values to indicate an error. |
403 | 1 the DATEMSK environment variable is null or undefined, |
404 | 2 the template file cannot be opened for reading, |
405 | 3 failed to get file status information, |
406 | 4 the template file is not a regular file, |
407 | 5 an error is encountered while reading the template file, |
408 | 6 memory allication failed (not enough memory available), |
409 | 7 there is no line in the template that matches the input, |
410 | 8 invalid input specification Example: February 31 or a time is |
411 | specified that can not be represented in a time_t (representing |
412 | the time in seconds since 00:00:00 UTC, January 1, 1970) */ |
413 | extern int getdate_err; |
414 | |
415 | /* Parse the given string as a date specification and return a value |
416 | representing the value. The templates from the file identified by |
417 | the environment variable DATEMSK are used. In case of an error |
418 | `getdate_err' is set. |
419 | |
420 | This function is a possible cancellation point and therefore not |
421 | marked with __THROW. */ |
422 | extern struct tm *getdate (const char *__string); |
423 | #endif |
424 | |
425 | #ifdef __USE_GNU |
426 | /* Since `getdate' is not reentrant because of the use of `getdate_err' |
427 | and the static buffer to return the result in, we provide a thread-safe |
428 | variant. The functionality is the same. The result is returned in |
429 | the buffer pointed to by RESBUFP and in case of an error the return |
430 | value is != 0 with the same values as given above for `getdate_err'. |
431 | |
432 | This function is not part of POSIX and therefore no official |
433 | cancellation point. But due to similarity with an POSIX interface |
434 | or due to the implementation it is a cancellation point and |
435 | therefore not marked with __THROW. */ |
436 | extern int getdate_r (const char *__restrict __string, |
437 | struct tm *__restrict __resbufp); |
438 | #endif |
439 | |
440 | __END_DECLS |
441 | |
442 | #endif /* time.h. */ |
443 | |