1 | /* Copyright (C) 1991-2024 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. */ |
456 | |