xref: /aosp_15_r20/bionic/libc/tzcode/private.h (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /* Private header for tzdb code.  */
2*8d67ca89SAndroid Build Coastguard Worker 
3*8d67ca89SAndroid Build Coastguard Worker #ifndef PRIVATE_H
4*8d67ca89SAndroid Build Coastguard Worker 
5*8d67ca89SAndroid Build Coastguard Worker #define PRIVATE_H
6*8d67ca89SAndroid Build Coastguard Worker 
7*8d67ca89SAndroid Build Coastguard Worker /*
8*8d67ca89SAndroid Build Coastguard Worker ** This file is in the public domain, so clarified as of
9*8d67ca89SAndroid Build Coastguard Worker ** 1996-06-05 by Arthur David Olson.
10*8d67ca89SAndroid Build Coastguard Worker */
11*8d67ca89SAndroid Build Coastguard Worker 
12*8d67ca89SAndroid Build Coastguard Worker /*
13*8d67ca89SAndroid Build Coastguard Worker ** This header is for use ONLY with the time conversion code.
14*8d67ca89SAndroid Build Coastguard Worker ** There is no guarantee that it will remain unchanged,
15*8d67ca89SAndroid Build Coastguard Worker ** or that it will remain at all.
16*8d67ca89SAndroid Build Coastguard Worker ** Do NOT copy it to any system include directory.
17*8d67ca89SAndroid Build Coastguard Worker ** Thank you!
18*8d67ca89SAndroid Build Coastguard Worker */
19*8d67ca89SAndroid Build Coastguard Worker 
20*8d67ca89SAndroid Build Coastguard Worker /* PORT_TO_C89 means the code should work even if the underlying
21*8d67ca89SAndroid Build Coastguard Worker    compiler and library support only C89.  SUPPORT_C89 means the
22*8d67ca89SAndroid Build Coastguard Worker    tzcode library should support C89 callers in addition to the usual
23*8d67ca89SAndroid Build Coastguard Worker    support for C99-and-later callers.  These macros are obsolescent,
24*8d67ca89SAndroid Build Coastguard Worker    and the plan is to remove them along with any code needed only when
25*8d67ca89SAndroid Build Coastguard Worker    they are nonzero.  */
26*8d67ca89SAndroid Build Coastguard Worker #ifndef PORT_TO_C89
27*8d67ca89SAndroid Build Coastguard Worker # define PORT_TO_C89 0
28*8d67ca89SAndroid Build Coastguard Worker #endif
29*8d67ca89SAndroid Build Coastguard Worker #ifndef SUPPORT_C89
30*8d67ca89SAndroid Build Coastguard Worker # define SUPPORT_C89 0
31*8d67ca89SAndroid Build Coastguard Worker #endif
32*8d67ca89SAndroid Build Coastguard Worker 
33*8d67ca89SAndroid Build Coastguard Worker #ifndef __STDC_VERSION__
34*8d67ca89SAndroid Build Coastguard Worker # define __STDC_VERSION__ 0
35*8d67ca89SAndroid Build Coastguard Worker #endif
36*8d67ca89SAndroid Build Coastguard Worker 
37*8d67ca89SAndroid Build Coastguard Worker /* Define true, false and bool if they don't work out of the box.  */
38*8d67ca89SAndroid Build Coastguard Worker #if PORT_TO_C89 && __STDC_VERSION__ < 199901
39*8d67ca89SAndroid Build Coastguard Worker # define true 1
40*8d67ca89SAndroid Build Coastguard Worker # define false 0
41*8d67ca89SAndroid Build Coastguard Worker # define bool int
42*8d67ca89SAndroid Build Coastguard Worker #elif __STDC_VERSION__ < 202311
43*8d67ca89SAndroid Build Coastguard Worker # include <stdbool.h>
44*8d67ca89SAndroid Build Coastguard Worker #endif
45*8d67ca89SAndroid Build Coastguard Worker 
46*8d67ca89SAndroid Build Coastguard Worker #if __STDC_VERSION__ < 202311
47*8d67ca89SAndroid Build Coastguard Worker # define static_assert(cond) extern int static_assert_check[(cond) ? 1 : -1]
48*8d67ca89SAndroid Build Coastguard Worker #endif
49*8d67ca89SAndroid Build Coastguard Worker 
50*8d67ca89SAndroid Build Coastguard Worker /*
51*8d67ca89SAndroid Build Coastguard Worker ** zdump has been made independent of the rest of the time
52*8d67ca89SAndroid Build Coastguard Worker ** conversion package to increase confidence in the verification it provides.
53*8d67ca89SAndroid Build Coastguard Worker ** You can use zdump to help in verifying other implementations.
54*8d67ca89SAndroid Build Coastguard Worker ** To do this, compile with -DUSE_LTZ=0 and link without the tz library.
55*8d67ca89SAndroid Build Coastguard Worker */
56*8d67ca89SAndroid Build Coastguard Worker #ifndef USE_LTZ
57*8d67ca89SAndroid Build Coastguard Worker # define USE_LTZ 1
58*8d67ca89SAndroid Build Coastguard Worker #endif
59*8d67ca89SAndroid Build Coastguard Worker 
60*8d67ca89SAndroid Build Coastguard Worker /* This string was in the Factory zone through version 2016f.  */
61*8d67ca89SAndroid Build Coastguard Worker #define GRANDPARENTED	"Local time zone must be set--see zic manual page"
62*8d67ca89SAndroid Build Coastguard Worker 
63*8d67ca89SAndroid Build Coastguard Worker /*
64*8d67ca89SAndroid Build Coastguard Worker ** Defaults for preprocessor symbols.
65*8d67ca89SAndroid Build Coastguard Worker ** You can override these in your C compiler options, e.g. '-DHAVE_GETTEXT=1'.
66*8d67ca89SAndroid Build Coastguard Worker */
67*8d67ca89SAndroid Build Coastguard Worker 
68*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_DECL_ASCTIME_R
69*8d67ca89SAndroid Build Coastguard Worker # define HAVE_DECL_ASCTIME_R 1
70*8d67ca89SAndroid Build Coastguard Worker #endif
71*8d67ca89SAndroid Build Coastguard Worker 
72*8d67ca89SAndroid Build Coastguard Worker #if !defined HAVE__GENERIC && defined __has_extension
73*8d67ca89SAndroid Build Coastguard Worker # if __has_extension(c_generic_selections)
74*8d67ca89SAndroid Build Coastguard Worker #  define HAVE__GENERIC 1
75*8d67ca89SAndroid Build Coastguard Worker # else
76*8d67ca89SAndroid Build Coastguard Worker #  define HAVE__GENERIC 0
77*8d67ca89SAndroid Build Coastguard Worker # endif
78*8d67ca89SAndroid Build Coastguard Worker #endif
79*8d67ca89SAndroid Build Coastguard Worker /* _Generic is buggy in pre-4.9 GCC.  */
80*8d67ca89SAndroid Build Coastguard Worker #if !defined HAVE__GENERIC && defined __GNUC__ && !defined __STRICT_ANSI__
81*8d67ca89SAndroid Build Coastguard Worker # define HAVE__GENERIC (4 < __GNUC__ + (9 <= __GNUC_MINOR__))
82*8d67ca89SAndroid Build Coastguard Worker #endif
83*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE__GENERIC
84*8d67ca89SAndroid Build Coastguard Worker # define HAVE__GENERIC (201112 <= __STDC_VERSION__)
85*8d67ca89SAndroid Build Coastguard Worker #endif
86*8d67ca89SAndroid Build Coastguard Worker 
87*8d67ca89SAndroid Build Coastguard Worker #if !defined HAVE_GETTEXT && defined __has_include
88*8d67ca89SAndroid Build Coastguard Worker # if __has_include(<libintl.h>)
89*8d67ca89SAndroid Build Coastguard Worker #  define HAVE_GETTEXT true
90*8d67ca89SAndroid Build Coastguard Worker # endif
91*8d67ca89SAndroid Build Coastguard Worker #endif
92*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_GETTEXT
93*8d67ca89SAndroid Build Coastguard Worker # define HAVE_GETTEXT false
94*8d67ca89SAndroid Build Coastguard Worker #endif
95*8d67ca89SAndroid Build Coastguard Worker 
96*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_INCOMPATIBLE_CTIME_R
97*8d67ca89SAndroid Build Coastguard Worker # define HAVE_INCOMPATIBLE_CTIME_R 0
98*8d67ca89SAndroid Build Coastguard Worker #endif
99*8d67ca89SAndroid Build Coastguard Worker 
100*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_LINK
101*8d67ca89SAndroid Build Coastguard Worker # define HAVE_LINK 1
102*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined HAVE_LINK */
103*8d67ca89SAndroid Build Coastguard Worker 
104*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_MALLOC_ERRNO
105*8d67ca89SAndroid Build Coastguard Worker # define HAVE_MALLOC_ERRNO 1
106*8d67ca89SAndroid Build Coastguard Worker #endif
107*8d67ca89SAndroid Build Coastguard Worker 
108*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_POSIX_DECLS
109*8d67ca89SAndroid Build Coastguard Worker # define HAVE_POSIX_DECLS 1
110*8d67ca89SAndroid Build Coastguard Worker #endif
111*8d67ca89SAndroid Build Coastguard Worker 
112*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_SETENV
113*8d67ca89SAndroid Build Coastguard Worker # define HAVE_SETENV 1
114*8d67ca89SAndroid Build Coastguard Worker #endif
115*8d67ca89SAndroid Build Coastguard Worker 
116*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_STRDUP
117*8d67ca89SAndroid Build Coastguard Worker # define HAVE_STRDUP 1
118*8d67ca89SAndroid Build Coastguard Worker #endif
119*8d67ca89SAndroid Build Coastguard Worker 
120*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_SYMLINK
121*8d67ca89SAndroid Build Coastguard Worker # define HAVE_SYMLINK 1
122*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined HAVE_SYMLINK */
123*8d67ca89SAndroid Build Coastguard Worker 
124*8d67ca89SAndroid Build Coastguard Worker #if !defined HAVE_SYS_STAT_H && defined __has_include
125*8d67ca89SAndroid Build Coastguard Worker # if !__has_include(<sys/stat.h>)
126*8d67ca89SAndroid Build Coastguard Worker #  define HAVE_SYS_STAT_H false
127*8d67ca89SAndroid Build Coastguard Worker # endif
128*8d67ca89SAndroid Build Coastguard Worker #endif
129*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_SYS_STAT_H
130*8d67ca89SAndroid Build Coastguard Worker # define HAVE_SYS_STAT_H true
131*8d67ca89SAndroid Build Coastguard Worker #endif
132*8d67ca89SAndroid Build Coastguard Worker 
133*8d67ca89SAndroid Build Coastguard Worker #if !defined HAVE_UNISTD_H && defined __has_include
134*8d67ca89SAndroid Build Coastguard Worker # if !__has_include(<unistd.h>)
135*8d67ca89SAndroid Build Coastguard Worker #  define HAVE_UNISTD_H false
136*8d67ca89SAndroid Build Coastguard Worker # endif
137*8d67ca89SAndroid Build Coastguard Worker #endif
138*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_UNISTD_H
139*8d67ca89SAndroid Build Coastguard Worker # define HAVE_UNISTD_H true
140*8d67ca89SAndroid Build Coastguard Worker #endif
141*8d67ca89SAndroid Build Coastguard Worker 
142*8d67ca89SAndroid Build Coastguard Worker #ifndef NETBSD_INSPIRED
143*8d67ca89SAndroid Build Coastguard Worker # define NETBSD_INSPIRED 1
144*8d67ca89SAndroid Build Coastguard Worker #endif
145*8d67ca89SAndroid Build Coastguard Worker 
146*8d67ca89SAndroid Build Coastguard Worker #if HAVE_INCOMPATIBLE_CTIME_R
147*8d67ca89SAndroid Build Coastguard Worker # define asctime_r _incompatible_asctime_r
148*8d67ca89SAndroid Build Coastguard Worker # define ctime_r _incompatible_ctime_r
149*8d67ca89SAndroid Build Coastguard Worker #endif /* HAVE_INCOMPATIBLE_CTIME_R */
150*8d67ca89SAndroid Build Coastguard Worker 
151*8d67ca89SAndroid Build Coastguard Worker /* Enable tm_gmtoff, tm_zone, and environ on GNUish systems.  */
152*8d67ca89SAndroid Build Coastguard Worker #define _GNU_SOURCE 1
153*8d67ca89SAndroid Build Coastguard Worker /* Fix asctime_r on Solaris 11.  */
154*8d67ca89SAndroid Build Coastguard Worker #define _POSIX_PTHREAD_SEMANTICS 1
155*8d67ca89SAndroid Build Coastguard Worker /* Enable strtoimax on pre-C99 Solaris 11.  */
156*8d67ca89SAndroid Build Coastguard Worker #define __EXTENSIONS__ 1
157*8d67ca89SAndroid Build Coastguard Worker 
158*8d67ca89SAndroid Build Coastguard Worker /* On GNUish systems where time_t might be 32 or 64 bits, use 64.
159*8d67ca89SAndroid Build Coastguard Worker    On these platforms _FILE_OFFSET_BITS must also be 64; otherwise
160*8d67ca89SAndroid Build Coastguard Worker    setting _TIME_BITS to 64 does not work.  The code does not
161*8d67ca89SAndroid Build Coastguard Worker    otherwise rely on _FILE_OFFSET_BITS being 64, since it does not
162*8d67ca89SAndroid Build Coastguard Worker    use off_t or functions like 'stat' that depend on off_t.  */
163*8d67ca89SAndroid Build Coastguard Worker #ifndef _FILE_OFFSET_BITS
164*8d67ca89SAndroid Build Coastguard Worker # define _FILE_OFFSET_BITS 64
165*8d67ca89SAndroid Build Coastguard Worker #endif
166*8d67ca89SAndroid Build Coastguard Worker #if !defined _TIME_BITS && _FILE_OFFSET_BITS == 64
167*8d67ca89SAndroid Build Coastguard Worker # define _TIME_BITS 64
168*8d67ca89SAndroid Build Coastguard Worker #endif
169*8d67ca89SAndroid Build Coastguard Worker 
170*8d67ca89SAndroid Build Coastguard Worker /*
171*8d67ca89SAndroid Build Coastguard Worker ** Nested includes
172*8d67ca89SAndroid Build Coastguard Worker */
173*8d67ca89SAndroid Build Coastguard Worker 
174*8d67ca89SAndroid Build Coastguard Worker /* Avoid clashes with NetBSD by renaming NetBSD's declarations.
175*8d67ca89SAndroid Build Coastguard Worker    If defining the 'timezone' variable, avoid a clash with FreeBSD's
176*8d67ca89SAndroid Build Coastguard Worker    'timezone' function by renaming its declaration.  */
177*8d67ca89SAndroid Build Coastguard Worker #define localtime_rz sys_localtime_rz
178*8d67ca89SAndroid Build Coastguard Worker #define mktime_z sys_mktime_z
179*8d67ca89SAndroid Build Coastguard Worker #define posix2time_z sys_posix2time_z
180*8d67ca89SAndroid Build Coastguard Worker #define time2posix_z sys_time2posix_z
181*8d67ca89SAndroid Build Coastguard Worker #if defined USG_COMPAT && USG_COMPAT == 2
182*8d67ca89SAndroid Build Coastguard Worker # define timezone sys_timezone
183*8d67ca89SAndroid Build Coastguard Worker #endif
184*8d67ca89SAndroid Build Coastguard Worker #define timezone_t sys_timezone_t
185*8d67ca89SAndroid Build Coastguard Worker #define tzalloc sys_tzalloc
186*8d67ca89SAndroid Build Coastguard Worker #define tzfree sys_tzfree
187*8d67ca89SAndroid Build Coastguard Worker #include <time.h>
188*8d67ca89SAndroid Build Coastguard Worker #undef localtime_rz
189*8d67ca89SAndroid Build Coastguard Worker #undef mktime_z
190*8d67ca89SAndroid Build Coastguard Worker #undef posix2time_z
191*8d67ca89SAndroid Build Coastguard Worker #undef time2posix_z
192*8d67ca89SAndroid Build Coastguard Worker #if defined USG_COMPAT && USG_COMPAT == 2
193*8d67ca89SAndroid Build Coastguard Worker # undef timezone
194*8d67ca89SAndroid Build Coastguard Worker #endif
195*8d67ca89SAndroid Build Coastguard Worker #undef timezone_t
196*8d67ca89SAndroid Build Coastguard Worker #undef tzalloc
197*8d67ca89SAndroid Build Coastguard Worker #undef tzfree
198*8d67ca89SAndroid Build Coastguard Worker 
199*8d67ca89SAndroid Build Coastguard Worker #include <stddef.h>
200*8d67ca89SAndroid Build Coastguard Worker #include <string.h>
201*8d67ca89SAndroid Build Coastguard Worker #if !PORT_TO_C89
202*8d67ca89SAndroid Build Coastguard Worker # include <inttypes.h>
203*8d67ca89SAndroid Build Coastguard Worker #endif
204*8d67ca89SAndroid Build Coastguard Worker #include <limits.h>	/* for CHAR_BIT et al. */
205*8d67ca89SAndroid Build Coastguard Worker #include <stdlib.h>
206*8d67ca89SAndroid Build Coastguard Worker 
207*8d67ca89SAndroid Build Coastguard Worker #include <errno.h>
208*8d67ca89SAndroid Build Coastguard Worker 
209*8d67ca89SAndroid Build Coastguard Worker #ifndef EINVAL
210*8d67ca89SAndroid Build Coastguard Worker # define EINVAL ERANGE
211*8d67ca89SAndroid Build Coastguard Worker #endif
212*8d67ca89SAndroid Build Coastguard Worker 
213*8d67ca89SAndroid Build Coastguard Worker #ifndef ELOOP
214*8d67ca89SAndroid Build Coastguard Worker # define ELOOP EINVAL
215*8d67ca89SAndroid Build Coastguard Worker #endif
216*8d67ca89SAndroid Build Coastguard Worker #ifndef ENAMETOOLONG
217*8d67ca89SAndroid Build Coastguard Worker # define ENAMETOOLONG EINVAL
218*8d67ca89SAndroid Build Coastguard Worker #endif
219*8d67ca89SAndroid Build Coastguard Worker #ifndef ENOMEM
220*8d67ca89SAndroid Build Coastguard Worker # define ENOMEM EINVAL
221*8d67ca89SAndroid Build Coastguard Worker #endif
222*8d67ca89SAndroid Build Coastguard Worker #ifndef ENOTSUP
223*8d67ca89SAndroid Build Coastguard Worker # define ENOTSUP EINVAL
224*8d67ca89SAndroid Build Coastguard Worker #endif
225*8d67ca89SAndroid Build Coastguard Worker #ifndef EOVERFLOW
226*8d67ca89SAndroid Build Coastguard Worker # define EOVERFLOW EINVAL
227*8d67ca89SAndroid Build Coastguard Worker #endif
228*8d67ca89SAndroid Build Coastguard Worker 
229*8d67ca89SAndroid Build Coastguard Worker #if HAVE_GETTEXT
230*8d67ca89SAndroid Build Coastguard Worker # include <libintl.h>
231*8d67ca89SAndroid Build Coastguard Worker #endif /* HAVE_GETTEXT */
232*8d67ca89SAndroid Build Coastguard Worker 
233*8d67ca89SAndroid Build Coastguard Worker #if HAVE_UNISTD_H
234*8d67ca89SAndroid Build Coastguard Worker # include <unistd.h> /* for R_OK, and other POSIX goodness */
235*8d67ca89SAndroid Build Coastguard Worker #endif /* HAVE_UNISTD_H */
236*8d67ca89SAndroid Build Coastguard Worker 
237*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_STRFTIME_L
238*8d67ca89SAndroid Build Coastguard Worker # if _POSIX_VERSION < 200809
239*8d67ca89SAndroid Build Coastguard Worker #  define HAVE_STRFTIME_L 0
240*8d67ca89SAndroid Build Coastguard Worker # else
241*8d67ca89SAndroid Build Coastguard Worker #  define HAVE_STRFTIME_L 1
242*8d67ca89SAndroid Build Coastguard Worker # endif
243*8d67ca89SAndroid Build Coastguard Worker #endif
244*8d67ca89SAndroid Build Coastguard Worker 
245*8d67ca89SAndroid Build Coastguard Worker #ifndef USG_COMPAT
246*8d67ca89SAndroid Build Coastguard Worker # ifndef _XOPEN_VERSION
247*8d67ca89SAndroid Build Coastguard Worker #  define USG_COMPAT 0
248*8d67ca89SAndroid Build Coastguard Worker # else
249*8d67ca89SAndroid Build Coastguard Worker #  define USG_COMPAT 1
250*8d67ca89SAndroid Build Coastguard Worker # endif
251*8d67ca89SAndroid Build Coastguard Worker #endif
252*8d67ca89SAndroid Build Coastguard Worker 
253*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_TZNAME
254*8d67ca89SAndroid Build Coastguard Worker # if _POSIX_VERSION < 198808 && !USG_COMPAT
255*8d67ca89SAndroid Build Coastguard Worker #  define HAVE_TZNAME 0
256*8d67ca89SAndroid Build Coastguard Worker # else
257*8d67ca89SAndroid Build Coastguard Worker #  define HAVE_TZNAME 1
258*8d67ca89SAndroid Build Coastguard Worker # endif
259*8d67ca89SAndroid Build Coastguard Worker #endif
260*8d67ca89SAndroid Build Coastguard Worker 
261*8d67ca89SAndroid Build Coastguard Worker #ifndef ALTZONE
262*8d67ca89SAndroid Build Coastguard Worker # if defined __sun || defined _M_XENIX
263*8d67ca89SAndroid Build Coastguard Worker #  define ALTZONE 1
264*8d67ca89SAndroid Build Coastguard Worker # else
265*8d67ca89SAndroid Build Coastguard Worker #  define ALTZONE 0
266*8d67ca89SAndroid Build Coastguard Worker # endif
267*8d67ca89SAndroid Build Coastguard Worker #endif
268*8d67ca89SAndroid Build Coastguard Worker 
269*8d67ca89SAndroid Build Coastguard Worker #ifndef R_OK
270*8d67ca89SAndroid Build Coastguard Worker # define R_OK 4
271*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined R_OK */
272*8d67ca89SAndroid Build Coastguard Worker 
273*8d67ca89SAndroid Build Coastguard Worker #if PORT_TO_C89
274*8d67ca89SAndroid Build Coastguard Worker 
275*8d67ca89SAndroid Build Coastguard Worker /*
276*8d67ca89SAndroid Build Coastguard Worker ** Define HAVE_STDINT_H's default value here, rather than at the
277*8d67ca89SAndroid Build Coastguard Worker ** start, since __GLIBC__ and INTMAX_MAX's values depend on
278*8d67ca89SAndroid Build Coastguard Worker ** previously included files.  glibc 2.1 and Solaris 10 and later have
279*8d67ca89SAndroid Build Coastguard Worker ** stdint.h, even with pre-C99 compilers.
280*8d67ca89SAndroid Build Coastguard Worker */
281*8d67ca89SAndroid Build Coastguard Worker #if !defined HAVE_STDINT_H && defined __has_include
282*8d67ca89SAndroid Build Coastguard Worker # define HAVE_STDINT_H true /* C23 __has_include implies C99 stdint.h.  */
283*8d67ca89SAndroid Build Coastguard Worker #endif
284*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_STDINT_H
285*8d67ca89SAndroid Build Coastguard Worker # define HAVE_STDINT_H \
286*8d67ca89SAndroid Build Coastguard Worker    (199901 <= __STDC_VERSION__ \
287*8d67ca89SAndroid Build Coastguard Worker     || 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__) \
288*8d67ca89SAndroid Build Coastguard Worker     || __CYGWIN__ || INTMAX_MAX)
289*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined HAVE_STDINT_H */
290*8d67ca89SAndroid Build Coastguard Worker 
291*8d67ca89SAndroid Build Coastguard Worker #if HAVE_STDINT_H
292*8d67ca89SAndroid Build Coastguard Worker # include <stdint.h>
293*8d67ca89SAndroid Build Coastguard Worker #endif /* !HAVE_STDINT_H */
294*8d67ca89SAndroid Build Coastguard Worker 
295*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_INTTYPES_H
296*8d67ca89SAndroid Build Coastguard Worker # define HAVE_INTTYPES_H HAVE_STDINT_H
297*8d67ca89SAndroid Build Coastguard Worker #endif
298*8d67ca89SAndroid Build Coastguard Worker #if HAVE_INTTYPES_H
299*8d67ca89SAndroid Build Coastguard Worker # include <inttypes.h>
300*8d67ca89SAndroid Build Coastguard Worker #endif
301*8d67ca89SAndroid Build Coastguard Worker 
302*8d67ca89SAndroid Build Coastguard Worker /* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX.  */
303*8d67ca89SAndroid Build Coastguard Worker #if defined __LONG_LONG_MAX__ && !defined __STRICT_ANSI__
304*8d67ca89SAndroid Build Coastguard Worker # ifndef LLONG_MAX
305*8d67ca89SAndroid Build Coastguard Worker #  define LLONG_MAX __LONG_LONG_MAX__
306*8d67ca89SAndroid Build Coastguard Worker # endif
307*8d67ca89SAndroid Build Coastguard Worker # ifndef LLONG_MIN
308*8d67ca89SAndroid Build Coastguard Worker #  define LLONG_MIN (-1 - LLONG_MAX)
309*8d67ca89SAndroid Build Coastguard Worker # endif
310*8d67ca89SAndroid Build Coastguard Worker # ifndef ULLONG_MAX
311*8d67ca89SAndroid Build Coastguard Worker #  define ULLONG_MAX (LLONG_MAX * 2ull + 1)
312*8d67ca89SAndroid Build Coastguard Worker # endif
313*8d67ca89SAndroid Build Coastguard Worker #endif
314*8d67ca89SAndroid Build Coastguard Worker 
315*8d67ca89SAndroid Build Coastguard Worker #ifndef INT_FAST64_MAX
316*8d67ca89SAndroid Build Coastguard Worker # if 1 <= LONG_MAX >> 31 >> 31
317*8d67ca89SAndroid Build Coastguard Worker typedef long int_fast64_t;
318*8d67ca89SAndroid Build Coastguard Worker #  define INT_FAST64_MIN LONG_MIN
319*8d67ca89SAndroid Build Coastguard Worker #  define INT_FAST64_MAX LONG_MAX
320*8d67ca89SAndroid Build Coastguard Worker # else
321*8d67ca89SAndroid Build Coastguard Worker /* If this fails, compile with -DHAVE_STDINT_H or with a better compiler.  */
322*8d67ca89SAndroid Build Coastguard Worker typedef long long int_fast64_t;
323*8d67ca89SAndroid Build Coastguard Worker #  define INT_FAST64_MIN LLONG_MIN
324*8d67ca89SAndroid Build Coastguard Worker #  define INT_FAST64_MAX LLONG_MAX
325*8d67ca89SAndroid Build Coastguard Worker # endif
326*8d67ca89SAndroid Build Coastguard Worker #endif
327*8d67ca89SAndroid Build Coastguard Worker 
328*8d67ca89SAndroid Build Coastguard Worker #ifndef PRIdFAST64
329*8d67ca89SAndroid Build Coastguard Worker # if INT_FAST64_MAX == LONG_MAX
330*8d67ca89SAndroid Build Coastguard Worker #  define PRIdFAST64 "ld"
331*8d67ca89SAndroid Build Coastguard Worker # else
332*8d67ca89SAndroid Build Coastguard Worker #  define PRIdFAST64 "lld"
333*8d67ca89SAndroid Build Coastguard Worker # endif
334*8d67ca89SAndroid Build Coastguard Worker #endif
335*8d67ca89SAndroid Build Coastguard Worker 
336*8d67ca89SAndroid Build Coastguard Worker #ifndef SCNdFAST64
337*8d67ca89SAndroid Build Coastguard Worker # define SCNdFAST64 PRIdFAST64
338*8d67ca89SAndroid Build Coastguard Worker #endif
339*8d67ca89SAndroid Build Coastguard Worker 
340*8d67ca89SAndroid Build Coastguard Worker #ifndef INT_FAST32_MAX
341*8d67ca89SAndroid Build Coastguard Worker # if INT_MAX >> 31 == 0
342*8d67ca89SAndroid Build Coastguard Worker typedef long int_fast32_t;
343*8d67ca89SAndroid Build Coastguard Worker #  define INT_FAST32_MAX LONG_MAX
344*8d67ca89SAndroid Build Coastguard Worker #  define INT_FAST32_MIN LONG_MIN
345*8d67ca89SAndroid Build Coastguard Worker # else
346*8d67ca89SAndroid Build Coastguard Worker typedef int int_fast32_t;
347*8d67ca89SAndroid Build Coastguard Worker #  define INT_FAST32_MAX INT_MAX
348*8d67ca89SAndroid Build Coastguard Worker #  define INT_FAST32_MIN INT_MIN
349*8d67ca89SAndroid Build Coastguard Worker # endif
350*8d67ca89SAndroid Build Coastguard Worker #endif
351*8d67ca89SAndroid Build Coastguard Worker 
352*8d67ca89SAndroid Build Coastguard Worker #ifndef INTMAX_MAX
353*8d67ca89SAndroid Build Coastguard Worker # ifdef LLONG_MAX
354*8d67ca89SAndroid Build Coastguard Worker typedef long long intmax_t;
355*8d67ca89SAndroid Build Coastguard Worker #  ifndef HAVE_STRTOLL
356*8d67ca89SAndroid Build Coastguard Worker #   define HAVE_STRTOLL true
357*8d67ca89SAndroid Build Coastguard Worker #  endif
358*8d67ca89SAndroid Build Coastguard Worker #  if HAVE_STRTOLL
359*8d67ca89SAndroid Build Coastguard Worker #   define strtoimax strtoll
360*8d67ca89SAndroid Build Coastguard Worker #  endif
361*8d67ca89SAndroid Build Coastguard Worker #  define INTMAX_MAX LLONG_MAX
362*8d67ca89SAndroid Build Coastguard Worker #  define INTMAX_MIN LLONG_MIN
363*8d67ca89SAndroid Build Coastguard Worker # else
364*8d67ca89SAndroid Build Coastguard Worker typedef long intmax_t;
365*8d67ca89SAndroid Build Coastguard Worker #  define INTMAX_MAX LONG_MAX
366*8d67ca89SAndroid Build Coastguard Worker #  define INTMAX_MIN LONG_MIN
367*8d67ca89SAndroid Build Coastguard Worker # endif
368*8d67ca89SAndroid Build Coastguard Worker # ifndef strtoimax
369*8d67ca89SAndroid Build Coastguard Worker #  define strtoimax strtol
370*8d67ca89SAndroid Build Coastguard Worker # endif
371*8d67ca89SAndroid Build Coastguard Worker #endif
372*8d67ca89SAndroid Build Coastguard Worker 
373*8d67ca89SAndroid Build Coastguard Worker #ifndef PRIdMAX
374*8d67ca89SAndroid Build Coastguard Worker # if INTMAX_MAX == LLONG_MAX
375*8d67ca89SAndroid Build Coastguard Worker #  define PRIdMAX "lld"
376*8d67ca89SAndroid Build Coastguard Worker # else
377*8d67ca89SAndroid Build Coastguard Worker #  define PRIdMAX "ld"
378*8d67ca89SAndroid Build Coastguard Worker # endif
379*8d67ca89SAndroid Build Coastguard Worker #endif
380*8d67ca89SAndroid Build Coastguard Worker 
381*8d67ca89SAndroid Build Coastguard Worker #ifndef PTRDIFF_MAX
382*8d67ca89SAndroid Build Coastguard Worker # define PTRDIFF_MAX MAXVAL(ptrdiff_t, TYPE_BIT(ptrdiff_t))
383*8d67ca89SAndroid Build Coastguard Worker #endif
384*8d67ca89SAndroid Build Coastguard Worker 
385*8d67ca89SAndroid Build Coastguard Worker #ifndef UINT_FAST32_MAX
386*8d67ca89SAndroid Build Coastguard Worker typedef unsigned long uint_fast32_t;
387*8d67ca89SAndroid Build Coastguard Worker #endif
388*8d67ca89SAndroid Build Coastguard Worker 
389*8d67ca89SAndroid Build Coastguard Worker #ifndef UINT_FAST64_MAX
390*8d67ca89SAndroid Build Coastguard Worker # if 3 <= ULONG_MAX >> 31 >> 31
391*8d67ca89SAndroid Build Coastguard Worker typedef unsigned long uint_fast64_t;
392*8d67ca89SAndroid Build Coastguard Worker #  define UINT_FAST64_MAX ULONG_MAX
393*8d67ca89SAndroid Build Coastguard Worker # else
394*8d67ca89SAndroid Build Coastguard Worker /* If this fails, compile with -DHAVE_STDINT_H or with a better compiler.  */
395*8d67ca89SAndroid Build Coastguard Worker typedef unsigned long long uint_fast64_t;
396*8d67ca89SAndroid Build Coastguard Worker #  define UINT_FAST64_MAX ULLONG_MAX
397*8d67ca89SAndroid Build Coastguard Worker # endif
398*8d67ca89SAndroid Build Coastguard Worker #endif
399*8d67ca89SAndroid Build Coastguard Worker 
400*8d67ca89SAndroid Build Coastguard Worker #ifndef UINTMAX_MAX
401*8d67ca89SAndroid Build Coastguard Worker # ifdef ULLONG_MAX
402*8d67ca89SAndroid Build Coastguard Worker typedef unsigned long long uintmax_t;
403*8d67ca89SAndroid Build Coastguard Worker #  define UINTMAX_MAX ULLONG_MAX
404*8d67ca89SAndroid Build Coastguard Worker # else
405*8d67ca89SAndroid Build Coastguard Worker typedef unsigned long uintmax_t;
406*8d67ca89SAndroid Build Coastguard Worker #  define UINTMAX_MAX ULONG_MAX
407*8d67ca89SAndroid Build Coastguard Worker # endif
408*8d67ca89SAndroid Build Coastguard Worker #endif
409*8d67ca89SAndroid Build Coastguard Worker 
410*8d67ca89SAndroid Build Coastguard Worker #ifndef PRIuMAX
411*8d67ca89SAndroid Build Coastguard Worker # ifdef ULLONG_MAX
412*8d67ca89SAndroid Build Coastguard Worker #  define PRIuMAX "llu"
413*8d67ca89SAndroid Build Coastguard Worker # else
414*8d67ca89SAndroid Build Coastguard Worker #  define PRIuMAX "lu"
415*8d67ca89SAndroid Build Coastguard Worker # endif
416*8d67ca89SAndroid Build Coastguard Worker #endif
417*8d67ca89SAndroid Build Coastguard Worker 
418*8d67ca89SAndroid Build Coastguard Worker #ifndef SIZE_MAX
419*8d67ca89SAndroid Build Coastguard Worker # define SIZE_MAX ((size_t) -1)
420*8d67ca89SAndroid Build Coastguard Worker #endif
421*8d67ca89SAndroid Build Coastguard Worker 
422*8d67ca89SAndroid Build Coastguard Worker #endif /* PORT_TO_C89 */
423*8d67ca89SAndroid Build Coastguard Worker 
424*8d67ca89SAndroid Build Coastguard Worker /* The maximum size of any created object, as a signed integer.
425*8d67ca89SAndroid Build Coastguard Worker    Although the C standard does not outright prohibit larger objects,
426*8d67ca89SAndroid Build Coastguard Worker    behavior is undefined if the result of pointer subtraction does not
427*8d67ca89SAndroid Build Coastguard Worker    fit into ptrdiff_t, and the code assumes in several places that
428*8d67ca89SAndroid Build Coastguard Worker    pointer subtraction works.  As a practical matter it's OK to not
429*8d67ca89SAndroid Build Coastguard Worker    support objects larger than this.  */
430*8d67ca89SAndroid Build Coastguard Worker #define INDEX_MAX ((ptrdiff_t) min(PTRDIFF_MAX, SIZE_MAX))
431*8d67ca89SAndroid Build Coastguard Worker 
432*8d67ca89SAndroid Build Coastguard Worker /* Support ckd_add, ckd_sub, ckd_mul on C23 or recent-enough GCC-like
433*8d67ca89SAndroid Build Coastguard Worker    hosts, unless compiled with -DHAVE_STDCKDINT_H=0 or with pre-C23 EDG.  */
434*8d67ca89SAndroid Build Coastguard Worker #if !defined HAVE_STDCKDINT_H && defined __has_include
435*8d67ca89SAndroid Build Coastguard Worker # if __has_include(<stdckdint.h>)
436*8d67ca89SAndroid Build Coastguard Worker #  define HAVE_STDCKDINT_H true
437*8d67ca89SAndroid Build Coastguard Worker # endif
438*8d67ca89SAndroid Build Coastguard Worker #endif
439*8d67ca89SAndroid Build Coastguard Worker #ifdef HAVE_STDCKDINT_H
440*8d67ca89SAndroid Build Coastguard Worker # if HAVE_STDCKDINT_H
441*8d67ca89SAndroid Build Coastguard Worker #  include <stdckdint.h>
442*8d67ca89SAndroid Build Coastguard Worker # endif
443*8d67ca89SAndroid Build Coastguard Worker #elif defined __EDG__
444*8d67ca89SAndroid Build Coastguard Worker /* Do nothing, to work around EDG bug <https://bugs.gnu.org/53256>.  */
445*8d67ca89SAndroid Build Coastguard Worker #elif defined __has_builtin
446*8d67ca89SAndroid Build Coastguard Worker # if __has_builtin(__builtin_add_overflow)
447*8d67ca89SAndroid Build Coastguard Worker #  define ckd_add(r, a, b) __builtin_add_overflow(a, b, r)
448*8d67ca89SAndroid Build Coastguard Worker # endif
449*8d67ca89SAndroid Build Coastguard Worker # if __has_builtin(__builtin_sub_overflow)
450*8d67ca89SAndroid Build Coastguard Worker #  define ckd_sub(r, a, b) __builtin_sub_overflow(a, b, r)
451*8d67ca89SAndroid Build Coastguard Worker # endif
452*8d67ca89SAndroid Build Coastguard Worker # if __has_builtin(__builtin_mul_overflow)
453*8d67ca89SAndroid Build Coastguard Worker #  define ckd_mul(r, a, b) __builtin_mul_overflow(a, b, r)
454*8d67ca89SAndroid Build Coastguard Worker # endif
455*8d67ca89SAndroid Build Coastguard Worker #elif 7 <= __GNUC__
456*8d67ca89SAndroid Build Coastguard Worker # define ckd_add(r, a, b) __builtin_add_overflow(a, b, r)
457*8d67ca89SAndroid Build Coastguard Worker # define ckd_sub(r, a, b) __builtin_sub_overflow(a, b, r)
458*8d67ca89SAndroid Build Coastguard Worker # define ckd_mul(r, a, b) __builtin_mul_overflow(a, b, r)
459*8d67ca89SAndroid Build Coastguard Worker #endif
460*8d67ca89SAndroid Build Coastguard Worker 
461*8d67ca89SAndroid Build Coastguard Worker #if 3 <= __GNUC__
462*8d67ca89SAndroid Build Coastguard Worker # define ATTRIBUTE_MALLOC __attribute__((malloc))
463*8d67ca89SAndroid Build Coastguard Worker # define ATTRIBUTE_FORMAT(spec) __attribute__((format spec))
464*8d67ca89SAndroid Build Coastguard Worker #else
465*8d67ca89SAndroid Build Coastguard Worker # define ATTRIBUTE_MALLOC /* empty */
466*8d67ca89SAndroid Build Coastguard Worker # define ATTRIBUTE_FORMAT(spec) /* empty */
467*8d67ca89SAndroid Build Coastguard Worker #endif
468*8d67ca89SAndroid Build Coastguard Worker 
469*8d67ca89SAndroid Build Coastguard Worker #if (defined __has_c_attribute \
470*8d67ca89SAndroid Build Coastguard Worker      && (202311 <= __STDC_VERSION__ || !defined __STRICT_ANSI__))
471*8d67ca89SAndroid Build Coastguard Worker # define HAVE___HAS_C_ATTRIBUTE true
472*8d67ca89SAndroid Build Coastguard Worker #else
473*8d67ca89SAndroid Build Coastguard Worker # define HAVE___HAS_C_ATTRIBUTE false
474*8d67ca89SAndroid Build Coastguard Worker #endif
475*8d67ca89SAndroid Build Coastguard Worker 
476*8d67ca89SAndroid Build Coastguard Worker #if HAVE___HAS_C_ATTRIBUTE
477*8d67ca89SAndroid Build Coastguard Worker # if __has_c_attribute(deprecated)
478*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_DEPRECATED [[deprecated]]
479*8d67ca89SAndroid Build Coastguard Worker # endif
480*8d67ca89SAndroid Build Coastguard Worker #endif
481*8d67ca89SAndroid Build Coastguard Worker #ifndef ATTRIBUTE_DEPRECATED
482*8d67ca89SAndroid Build Coastguard Worker # if 3 < __GNUC__ + (2 <= __GNUC_MINOR__)
483*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_DEPRECATED __attribute__((deprecated))
484*8d67ca89SAndroid Build Coastguard Worker # else
485*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_DEPRECATED /* empty */
486*8d67ca89SAndroid Build Coastguard Worker # endif
487*8d67ca89SAndroid Build Coastguard Worker #endif
488*8d67ca89SAndroid Build Coastguard Worker 
489*8d67ca89SAndroid Build Coastguard Worker #if HAVE___HAS_C_ATTRIBUTE
490*8d67ca89SAndroid Build Coastguard Worker # if __has_c_attribute(fallthrough)
491*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_FALLTHROUGH [[fallthrough]]
492*8d67ca89SAndroid Build Coastguard Worker # endif
493*8d67ca89SAndroid Build Coastguard Worker #endif
494*8d67ca89SAndroid Build Coastguard Worker #ifndef ATTRIBUTE_FALLTHROUGH
495*8d67ca89SAndroid Build Coastguard Worker # if 7 <= __GNUC__
496*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_FALLTHROUGH __attribute__((fallthrough))
497*8d67ca89SAndroid Build Coastguard Worker # else
498*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_FALLTHROUGH ((void) 0)
499*8d67ca89SAndroid Build Coastguard Worker # endif
500*8d67ca89SAndroid Build Coastguard Worker #endif
501*8d67ca89SAndroid Build Coastguard Worker 
502*8d67ca89SAndroid Build Coastguard Worker #if HAVE___HAS_C_ATTRIBUTE
503*8d67ca89SAndroid Build Coastguard Worker # if __has_c_attribute(maybe_unused)
504*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_MAYBE_UNUSED [[maybe_unused]]
505*8d67ca89SAndroid Build Coastguard Worker # endif
506*8d67ca89SAndroid Build Coastguard Worker #endif
507*8d67ca89SAndroid Build Coastguard Worker #ifndef ATTRIBUTE_MAYBE_UNUSED
508*8d67ca89SAndroid Build Coastguard Worker # if 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
509*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_MAYBE_UNUSED __attribute__((unused))
510*8d67ca89SAndroid Build Coastguard Worker # else
511*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_MAYBE_UNUSED /* empty */
512*8d67ca89SAndroid Build Coastguard Worker # endif
513*8d67ca89SAndroid Build Coastguard Worker #endif
514*8d67ca89SAndroid Build Coastguard Worker 
515*8d67ca89SAndroid Build Coastguard Worker #if HAVE___HAS_C_ATTRIBUTE
516*8d67ca89SAndroid Build Coastguard Worker # if __has_c_attribute(noreturn)
517*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_NORETURN [[noreturn]]
518*8d67ca89SAndroid Build Coastguard Worker # endif
519*8d67ca89SAndroid Build Coastguard Worker #endif
520*8d67ca89SAndroid Build Coastguard Worker #ifndef ATTRIBUTE_NORETURN
521*8d67ca89SAndroid Build Coastguard Worker # if 201112 <= __STDC_VERSION__
522*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_NORETURN _Noreturn
523*8d67ca89SAndroid Build Coastguard Worker # elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__)
524*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_NORETURN __attribute__((noreturn))
525*8d67ca89SAndroid Build Coastguard Worker # else
526*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_NORETURN /* empty */
527*8d67ca89SAndroid Build Coastguard Worker # endif
528*8d67ca89SAndroid Build Coastguard Worker #endif
529*8d67ca89SAndroid Build Coastguard Worker 
530*8d67ca89SAndroid Build Coastguard Worker #if HAVE___HAS_C_ATTRIBUTE
531*8d67ca89SAndroid Build Coastguard Worker # if __has_c_attribute(reproducible)
532*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_REPRODUCIBLE [[reproducible]]
533*8d67ca89SAndroid Build Coastguard Worker # endif
534*8d67ca89SAndroid Build Coastguard Worker #endif
535*8d67ca89SAndroid Build Coastguard Worker #ifndef ATTRIBUTE_REPRODUCIBLE
536*8d67ca89SAndroid Build Coastguard Worker # if 3 <= __GNUC__
537*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_REPRODUCIBLE __attribute__((pure))
538*8d67ca89SAndroid Build Coastguard Worker # else
539*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_REPRODUCIBLE /* empty */
540*8d67ca89SAndroid Build Coastguard Worker # endif
541*8d67ca89SAndroid Build Coastguard Worker #endif
542*8d67ca89SAndroid Build Coastguard Worker 
543*8d67ca89SAndroid Build Coastguard Worker #if HAVE___HAS_C_ATTRIBUTE
544*8d67ca89SAndroid Build Coastguard Worker # if __has_c_attribute(unsequenced)
545*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_UNSEQUENCED [[unsequenced]]
546*8d67ca89SAndroid Build Coastguard Worker # endif
547*8d67ca89SAndroid Build Coastguard Worker #endif
548*8d67ca89SAndroid Build Coastguard Worker #ifndef ATTRIBUTE_UNSEQUENCED
549*8d67ca89SAndroid Build Coastguard Worker # if 3 <= __GNUC__
550*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_UNSEQUENCED __attribute__((const))
551*8d67ca89SAndroid Build Coastguard Worker # else
552*8d67ca89SAndroid Build Coastguard Worker #  define ATTRIBUTE_UNSEQUENCED /* empty */
553*8d67ca89SAndroid Build Coastguard Worker # endif
554*8d67ca89SAndroid Build Coastguard Worker #endif
555*8d67ca89SAndroid Build Coastguard Worker 
556*8d67ca89SAndroid Build Coastguard Worker #if (__STDC_VERSION__ < 199901 && !defined restrict \
557*8d67ca89SAndroid Build Coastguard Worker      && (PORT_TO_C89 || defined _MSC_VER))
558*8d67ca89SAndroid Build Coastguard Worker # define restrict /* empty */
559*8d67ca89SAndroid Build Coastguard Worker #endif
560*8d67ca89SAndroid Build Coastguard Worker 
561*8d67ca89SAndroid Build Coastguard Worker /*
562*8d67ca89SAndroid Build Coastguard Worker ** Workarounds for compilers/systems.
563*8d67ca89SAndroid Build Coastguard Worker */
564*8d67ca89SAndroid Build Coastguard Worker 
565*8d67ca89SAndroid Build Coastguard Worker #ifndef EPOCH_LOCAL
566*8d67ca89SAndroid Build Coastguard Worker # define EPOCH_LOCAL 0
567*8d67ca89SAndroid Build Coastguard Worker #endif
568*8d67ca89SAndroid Build Coastguard Worker #ifndef EPOCH_OFFSET
569*8d67ca89SAndroid Build Coastguard Worker # define EPOCH_OFFSET 0
570*8d67ca89SAndroid Build Coastguard Worker #endif
571*8d67ca89SAndroid Build Coastguard Worker #ifndef RESERVE_STD_EXT_IDS
572*8d67ca89SAndroid Build Coastguard Worker # define RESERVE_STD_EXT_IDS 0
573*8d67ca89SAndroid Build Coastguard Worker #endif
574*8d67ca89SAndroid Build Coastguard Worker 
575*8d67ca89SAndroid Build Coastguard Worker /* If standard C identifiers with external linkage (e.g., localtime)
576*8d67ca89SAndroid Build Coastguard Worker    are reserved and are not already being renamed anyway, rename them
577*8d67ca89SAndroid Build Coastguard Worker    as if compiling with '-Dtime_tz=time_t'.  */
578*8d67ca89SAndroid Build Coastguard Worker #if !defined time_tz && RESERVE_STD_EXT_IDS && USE_LTZ
579*8d67ca89SAndroid Build Coastguard Worker # define time_tz time_t
580*8d67ca89SAndroid Build Coastguard Worker #endif
581*8d67ca89SAndroid Build Coastguard Worker 
582*8d67ca89SAndroid Build Coastguard Worker /*
583*8d67ca89SAndroid Build Coastguard Worker ** Compile with -Dtime_tz=T to build the tz package with a private
584*8d67ca89SAndroid Build Coastguard Worker ** time_t type equivalent to T rather than the system-supplied time_t.
585*8d67ca89SAndroid Build Coastguard Worker ** This debugging feature can test unusual design decisions
586*8d67ca89SAndroid Build Coastguard Worker ** (e.g., time_t wider than 'long', or unsigned time_t) even on
587*8d67ca89SAndroid Build Coastguard Worker ** typical platforms.
588*8d67ca89SAndroid Build Coastguard Worker */
589*8d67ca89SAndroid Build Coastguard Worker #if defined time_tz || EPOCH_LOCAL || EPOCH_OFFSET != 0
590*8d67ca89SAndroid Build Coastguard Worker # define TZ_TIME_T 1
591*8d67ca89SAndroid Build Coastguard Worker #else
592*8d67ca89SAndroid Build Coastguard Worker # define TZ_TIME_T 0
593*8d67ca89SAndroid Build Coastguard Worker #endif
594*8d67ca89SAndroid Build Coastguard Worker 
595*8d67ca89SAndroid Build Coastguard Worker #if defined LOCALTIME_IMPLEMENTATION && TZ_TIME_T
sys_time(time_t * x)596*8d67ca89SAndroid Build Coastguard Worker static time_t sys_time(time_t *x) { return time(x); }
597*8d67ca89SAndroid Build Coastguard Worker #endif
598*8d67ca89SAndroid Build Coastguard Worker 
599*8d67ca89SAndroid Build Coastguard Worker #if TZ_TIME_T
600*8d67ca89SAndroid Build Coastguard Worker 
601*8d67ca89SAndroid Build Coastguard Worker typedef time_tz tz_time_t;
602*8d67ca89SAndroid Build Coastguard Worker 
603*8d67ca89SAndroid Build Coastguard Worker # undef  asctime
604*8d67ca89SAndroid Build Coastguard Worker # define asctime tz_asctime
605*8d67ca89SAndroid Build Coastguard Worker # undef  asctime_r
606*8d67ca89SAndroid Build Coastguard Worker # define asctime_r tz_asctime_r
607*8d67ca89SAndroid Build Coastguard Worker # undef  ctime
608*8d67ca89SAndroid Build Coastguard Worker # define ctime tz_ctime
609*8d67ca89SAndroid Build Coastguard Worker # undef  ctime_r
610*8d67ca89SAndroid Build Coastguard Worker # define ctime_r tz_ctime_r
611*8d67ca89SAndroid Build Coastguard Worker # undef  difftime
612*8d67ca89SAndroid Build Coastguard Worker # define difftime tz_difftime
613*8d67ca89SAndroid Build Coastguard Worker # undef  gmtime
614*8d67ca89SAndroid Build Coastguard Worker # define gmtime tz_gmtime
615*8d67ca89SAndroid Build Coastguard Worker # undef  gmtime_r
616*8d67ca89SAndroid Build Coastguard Worker # define gmtime_r tz_gmtime_r
617*8d67ca89SAndroid Build Coastguard Worker # undef  localtime
618*8d67ca89SAndroid Build Coastguard Worker # define localtime tz_localtime
619*8d67ca89SAndroid Build Coastguard Worker # undef  localtime_r
620*8d67ca89SAndroid Build Coastguard Worker # define localtime_r tz_localtime_r
621*8d67ca89SAndroid Build Coastguard Worker # undef  localtime_rz
622*8d67ca89SAndroid Build Coastguard Worker # define localtime_rz tz_localtime_rz
623*8d67ca89SAndroid Build Coastguard Worker # undef  mktime
624*8d67ca89SAndroid Build Coastguard Worker # define mktime tz_mktime
625*8d67ca89SAndroid Build Coastguard Worker # undef  mktime_z
626*8d67ca89SAndroid Build Coastguard Worker # define mktime_z tz_mktime_z
627*8d67ca89SAndroid Build Coastguard Worker # undef  offtime
628*8d67ca89SAndroid Build Coastguard Worker # define offtime tz_offtime
629*8d67ca89SAndroid Build Coastguard Worker # undef  posix2time
630*8d67ca89SAndroid Build Coastguard Worker # define posix2time tz_posix2time
631*8d67ca89SAndroid Build Coastguard Worker # undef  posix2time_z
632*8d67ca89SAndroid Build Coastguard Worker # define posix2time_z tz_posix2time_z
633*8d67ca89SAndroid Build Coastguard Worker # undef  strftime
634*8d67ca89SAndroid Build Coastguard Worker # define strftime tz_strftime
635*8d67ca89SAndroid Build Coastguard Worker # undef  time
636*8d67ca89SAndroid Build Coastguard Worker # define time tz_time
637*8d67ca89SAndroid Build Coastguard Worker # undef  time2posix
638*8d67ca89SAndroid Build Coastguard Worker # define time2posix tz_time2posix
639*8d67ca89SAndroid Build Coastguard Worker # undef  time2posix_z
640*8d67ca89SAndroid Build Coastguard Worker # define time2posix_z tz_time2posix_z
641*8d67ca89SAndroid Build Coastguard Worker # undef  time_t
642*8d67ca89SAndroid Build Coastguard Worker # define time_t tz_time_t
643*8d67ca89SAndroid Build Coastguard Worker # undef  timegm
644*8d67ca89SAndroid Build Coastguard Worker # define timegm tz_timegm
645*8d67ca89SAndroid Build Coastguard Worker # undef  timelocal
646*8d67ca89SAndroid Build Coastguard Worker # define timelocal tz_timelocal
647*8d67ca89SAndroid Build Coastguard Worker # undef  timeoff
648*8d67ca89SAndroid Build Coastguard Worker # define timeoff tz_timeoff
649*8d67ca89SAndroid Build Coastguard Worker # undef  tzalloc
650*8d67ca89SAndroid Build Coastguard Worker # define tzalloc tz_tzalloc
651*8d67ca89SAndroid Build Coastguard Worker # undef  tzfree
652*8d67ca89SAndroid Build Coastguard Worker # define tzfree tz_tzfree
653*8d67ca89SAndroid Build Coastguard Worker # undef  tzset
654*8d67ca89SAndroid Build Coastguard Worker # define tzset tz_tzset
655*8d67ca89SAndroid Build Coastguard Worker # if HAVE_STRFTIME_L
656*8d67ca89SAndroid Build Coastguard Worker #  undef  strftime_l
657*8d67ca89SAndroid Build Coastguard Worker #  define strftime_l tz_strftime_l
658*8d67ca89SAndroid Build Coastguard Worker # endif
659*8d67ca89SAndroid Build Coastguard Worker # if HAVE_TZNAME
660*8d67ca89SAndroid Build Coastguard Worker #  undef  tzname
661*8d67ca89SAndroid Build Coastguard Worker #  define tzname tz_tzname
662*8d67ca89SAndroid Build Coastguard Worker # endif
663*8d67ca89SAndroid Build Coastguard Worker # if USG_COMPAT
664*8d67ca89SAndroid Build Coastguard Worker #  undef  daylight
665*8d67ca89SAndroid Build Coastguard Worker #  define daylight tz_daylight
666*8d67ca89SAndroid Build Coastguard Worker #  undef  timezone
667*8d67ca89SAndroid Build Coastguard Worker #  define timezone tz_timezone
668*8d67ca89SAndroid Build Coastguard Worker # endif
669*8d67ca89SAndroid Build Coastguard Worker # if ALTZONE
670*8d67ca89SAndroid Build Coastguard Worker #  undef  altzone
671*8d67ca89SAndroid Build Coastguard Worker #  define altzone tz_altzone
672*8d67ca89SAndroid Build Coastguard Worker # endif
673*8d67ca89SAndroid Build Coastguard Worker 
674*8d67ca89SAndroid Build Coastguard Worker # if __STDC_VERSION__ < 202311
675*8d67ca89SAndroid Build Coastguard Worker #  define DEPRECATED_IN_C23 /* empty */
676*8d67ca89SAndroid Build Coastguard Worker # else
677*8d67ca89SAndroid Build Coastguard Worker #  define DEPRECATED_IN_C23 ATTRIBUTE_DEPRECATED
678*8d67ca89SAndroid Build Coastguard Worker # endif
679*8d67ca89SAndroid Build Coastguard Worker DEPRECATED_IN_C23 char *asctime(struct tm const *);
680*8d67ca89SAndroid Build Coastguard Worker char *asctime_r(struct tm const *restrict, char *restrict);
681*8d67ca89SAndroid Build Coastguard Worker DEPRECATED_IN_C23 char *ctime(time_t const *);
682*8d67ca89SAndroid Build Coastguard Worker char *ctime_r(time_t const *, char *);
683*8d67ca89SAndroid Build Coastguard Worker ATTRIBUTE_UNSEQUENCED double difftime(time_t, time_t);
684*8d67ca89SAndroid Build Coastguard Worker size_t strftime(char *restrict, size_t, char const *restrict,
685*8d67ca89SAndroid Build Coastguard Worker 		struct tm const *restrict);
686*8d67ca89SAndroid Build Coastguard Worker # if HAVE_STRFTIME_L
687*8d67ca89SAndroid Build Coastguard Worker size_t strftime_l(char *restrict, size_t, char const *restrict,
688*8d67ca89SAndroid Build Coastguard Worker 		  struct tm const *restrict, locale_t);
689*8d67ca89SAndroid Build Coastguard Worker # endif
690*8d67ca89SAndroid Build Coastguard Worker struct tm *gmtime(time_t const *);
691*8d67ca89SAndroid Build Coastguard Worker struct tm *gmtime_r(time_t const *restrict, struct tm *restrict);
692*8d67ca89SAndroid Build Coastguard Worker struct tm *localtime(time_t const *);
693*8d67ca89SAndroid Build Coastguard Worker struct tm *localtime_r(time_t const *restrict, struct tm *restrict);
694*8d67ca89SAndroid Build Coastguard Worker time_t mktime(struct tm *);
695*8d67ca89SAndroid Build Coastguard Worker time_t time(time_t *);
696*8d67ca89SAndroid Build Coastguard Worker time_t timegm(struct tm *);
697*8d67ca89SAndroid Build Coastguard Worker void tzset(void);
698*8d67ca89SAndroid Build Coastguard Worker #endif
699*8d67ca89SAndroid Build Coastguard Worker 
700*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_DECL_TIMEGM
701*8d67ca89SAndroid Build Coastguard Worker # if (202311 <= __STDC_VERSION__ \
702*8d67ca89SAndroid Build Coastguard Worker       || defined __GLIBC__ || defined __tm_zone /* musl */ \
703*8d67ca89SAndroid Build Coastguard Worker       || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ \
704*8d67ca89SAndroid Build Coastguard Worker       || (defined __APPLE__ && defined __MACH__))
705*8d67ca89SAndroid Build Coastguard Worker #  define HAVE_DECL_TIMEGM true
706*8d67ca89SAndroid Build Coastguard Worker # else
707*8d67ca89SAndroid Build Coastguard Worker #  define HAVE_DECL_TIMEGM false
708*8d67ca89SAndroid Build Coastguard Worker # endif
709*8d67ca89SAndroid Build Coastguard Worker #endif
710*8d67ca89SAndroid Build Coastguard Worker #if !HAVE_DECL_TIMEGM && !defined timegm
711*8d67ca89SAndroid Build Coastguard Worker time_t timegm(struct tm *);
712*8d67ca89SAndroid Build Coastguard Worker #endif
713*8d67ca89SAndroid Build Coastguard Worker 
714*8d67ca89SAndroid Build Coastguard Worker #if !HAVE_DECL_ASCTIME_R && !defined asctime_r
715*8d67ca89SAndroid Build Coastguard Worker extern char *asctime_r(struct tm const *restrict, char *restrict);
716*8d67ca89SAndroid Build Coastguard Worker #endif
717*8d67ca89SAndroid Build Coastguard Worker 
718*8d67ca89SAndroid Build Coastguard Worker #ifndef HAVE_DECL_ENVIRON
719*8d67ca89SAndroid Build Coastguard Worker # if defined environ || defined __USE_GNU
720*8d67ca89SAndroid Build Coastguard Worker #  define HAVE_DECL_ENVIRON 1
721*8d67ca89SAndroid Build Coastguard Worker # else
722*8d67ca89SAndroid Build Coastguard Worker #  define HAVE_DECL_ENVIRON 0
723*8d67ca89SAndroid Build Coastguard Worker # endif
724*8d67ca89SAndroid Build Coastguard Worker #endif
725*8d67ca89SAndroid Build Coastguard Worker 
726*8d67ca89SAndroid Build Coastguard Worker #if !HAVE_DECL_ENVIRON
727*8d67ca89SAndroid Build Coastguard Worker extern char **environ;
728*8d67ca89SAndroid Build Coastguard Worker #endif
729*8d67ca89SAndroid Build Coastguard Worker 
730*8d67ca89SAndroid Build Coastguard Worker #if 2 <= HAVE_TZNAME + (TZ_TIME_T || !HAVE_POSIX_DECLS)
731*8d67ca89SAndroid Build Coastguard Worker extern char *tzname[];
732*8d67ca89SAndroid Build Coastguard Worker #endif
733*8d67ca89SAndroid Build Coastguard Worker #if 2 <= USG_COMPAT + (TZ_TIME_T || !HAVE_POSIX_DECLS)
734*8d67ca89SAndroid Build Coastguard Worker extern long timezone;
735*8d67ca89SAndroid Build Coastguard Worker extern int daylight;
736*8d67ca89SAndroid Build Coastguard Worker #endif
737*8d67ca89SAndroid Build Coastguard Worker #if 2 <= ALTZONE + (TZ_TIME_T || !HAVE_POSIX_DECLS)
738*8d67ca89SAndroid Build Coastguard Worker extern long altzone;
739*8d67ca89SAndroid Build Coastguard Worker #endif
740*8d67ca89SAndroid Build Coastguard Worker 
741*8d67ca89SAndroid Build Coastguard Worker /*
742*8d67ca89SAndroid Build Coastguard Worker ** The STD_INSPIRED functions are similar, but most also need
743*8d67ca89SAndroid Build Coastguard Worker ** declarations if time_tz is defined.
744*8d67ca89SAndroid Build Coastguard Worker */
745*8d67ca89SAndroid Build Coastguard Worker 
746*8d67ca89SAndroid Build Coastguard Worker #ifndef STD_INSPIRED
747*8d67ca89SAndroid Build Coastguard Worker # define STD_INSPIRED 0
748*8d67ca89SAndroid Build Coastguard Worker #endif
749*8d67ca89SAndroid Build Coastguard Worker #if STD_INSPIRED
750*8d67ca89SAndroid Build Coastguard Worker # if TZ_TIME_T || !defined offtime
751*8d67ca89SAndroid Build Coastguard Worker struct tm *offtime(time_t const *, long);
752*8d67ca89SAndroid Build Coastguard Worker # endif
753*8d67ca89SAndroid Build Coastguard Worker # if TZ_TIME_T || !defined timelocal
754*8d67ca89SAndroid Build Coastguard Worker time_t timelocal(struct tm *);
755*8d67ca89SAndroid Build Coastguard Worker # endif
756*8d67ca89SAndroid Build Coastguard Worker # if TZ_TIME_T || !defined timeoff
757*8d67ca89SAndroid Build Coastguard Worker time_t timeoff(struct tm *, long);
758*8d67ca89SAndroid Build Coastguard Worker # endif
759*8d67ca89SAndroid Build Coastguard Worker # if TZ_TIME_T || !defined time2posix
760*8d67ca89SAndroid Build Coastguard Worker time_t time2posix(time_t);
761*8d67ca89SAndroid Build Coastguard Worker # endif
762*8d67ca89SAndroid Build Coastguard Worker # if TZ_TIME_T || !defined posix2time
763*8d67ca89SAndroid Build Coastguard Worker time_t posix2time(time_t);
764*8d67ca89SAndroid Build Coastguard Worker # endif
765*8d67ca89SAndroid Build Coastguard Worker #endif
766*8d67ca89SAndroid Build Coastguard Worker 
767*8d67ca89SAndroid Build Coastguard Worker /* Infer TM_ZONE on systems where this information is known, but suppress
768*8d67ca89SAndroid Build Coastguard Worker    guessing if NO_TM_ZONE is defined.  Similarly for TM_GMTOFF.  */
769*8d67ca89SAndroid Build Coastguard Worker #if (defined __GLIBC__ \
770*8d67ca89SAndroid Build Coastguard Worker      || defined __tm_zone /* musl */ \
771*8d67ca89SAndroid Build Coastguard Worker      || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ \
772*8d67ca89SAndroid Build Coastguard Worker      || (defined __APPLE__ && defined __MACH__))
773*8d67ca89SAndroid Build Coastguard Worker # if !defined TM_GMTOFF && !defined NO_TM_GMTOFF
774*8d67ca89SAndroid Build Coastguard Worker #  define TM_GMTOFF tm_gmtoff
775*8d67ca89SAndroid Build Coastguard Worker # endif
776*8d67ca89SAndroid Build Coastguard Worker # if !defined TM_ZONE && !defined NO_TM_ZONE
777*8d67ca89SAndroid Build Coastguard Worker #  define TM_ZONE tm_zone
778*8d67ca89SAndroid Build Coastguard Worker # endif
779*8d67ca89SAndroid Build Coastguard Worker #endif
780*8d67ca89SAndroid Build Coastguard Worker 
781*8d67ca89SAndroid Build Coastguard Worker /*
782*8d67ca89SAndroid Build Coastguard Worker ** Define functions that are ABI compatible with NetBSD but have
783*8d67ca89SAndroid Build Coastguard Worker ** better prototypes.  NetBSD 6.1.4 defines a pointer type timezone_t
784*8d67ca89SAndroid Build Coastguard Worker ** and labors under the misconception that 'const timezone_t' is a
785*8d67ca89SAndroid Build Coastguard Worker ** pointer to a constant.  This use of 'const' is ineffective, so it
786*8d67ca89SAndroid Build Coastguard Worker ** is not done here.  What we call 'struct state' NetBSD calls
787*8d67ca89SAndroid Build Coastguard Worker ** 'struct __state', but this is a private name so it doesn't matter.
788*8d67ca89SAndroid Build Coastguard Worker */
789*8d67ca89SAndroid Build Coastguard Worker #if NETBSD_INSPIRED
790*8d67ca89SAndroid Build Coastguard Worker typedef struct state *timezone_t;
791*8d67ca89SAndroid Build Coastguard Worker struct tm *localtime_rz(timezone_t restrict, time_t const *restrict,
792*8d67ca89SAndroid Build Coastguard Worker 			struct tm *restrict);
793*8d67ca89SAndroid Build Coastguard Worker time_t mktime_z(timezone_t restrict, struct tm *restrict);
794*8d67ca89SAndroid Build Coastguard Worker timezone_t tzalloc(char const *);
795*8d67ca89SAndroid Build Coastguard Worker void tzfree(timezone_t);
796*8d67ca89SAndroid Build Coastguard Worker # if STD_INSPIRED
797*8d67ca89SAndroid Build Coastguard Worker #  if TZ_TIME_T || !defined posix2time_z
798*8d67ca89SAndroid Build Coastguard Worker ATTRIBUTE_REPRODUCIBLE time_t posix2time_z(timezone_t, time_t);
799*8d67ca89SAndroid Build Coastguard Worker #  endif
800*8d67ca89SAndroid Build Coastguard Worker #  if TZ_TIME_T || !defined time2posix_z
801*8d67ca89SAndroid Build Coastguard Worker ATTRIBUTE_REPRODUCIBLE time_t time2posix_z(timezone_t, time_t);
802*8d67ca89SAndroid Build Coastguard Worker #  endif
803*8d67ca89SAndroid Build Coastguard Worker # endif
804*8d67ca89SAndroid Build Coastguard Worker #endif
805*8d67ca89SAndroid Build Coastguard Worker 
806*8d67ca89SAndroid Build Coastguard Worker /*
807*8d67ca89SAndroid Build Coastguard Worker ** Finally, some convenience items.
808*8d67ca89SAndroid Build Coastguard Worker */
809*8d67ca89SAndroid Build Coastguard Worker 
810*8d67ca89SAndroid Build Coastguard Worker #define TYPE_BIT(type) (CHAR_BIT * (ptrdiff_t) sizeof(type))
811*8d67ca89SAndroid Build Coastguard Worker #define TYPE_SIGNED(type) (((type) -1) < 0)
812*8d67ca89SAndroid Build Coastguard Worker #define TWOS_COMPLEMENT(t) ((t) ~ (t) 0 < 0)
813*8d67ca89SAndroid Build Coastguard Worker 
814*8d67ca89SAndroid Build Coastguard Worker /* Minimum and maximum of two values.  Use lower case to avoid
815*8d67ca89SAndroid Build Coastguard Worker    naming clashes with standard include files.  */
816*8d67ca89SAndroid Build Coastguard Worker #define max(a, b) ((a) > (b) ? (a) : (b))
817*8d67ca89SAndroid Build Coastguard Worker #define min(a, b) ((a) < (b) ? (a) : (b))
818*8d67ca89SAndroid Build Coastguard Worker 
819*8d67ca89SAndroid Build Coastguard Worker /* Max and min values of the integer type T, of which only the bottom
820*8d67ca89SAndroid Build Coastguard Worker    B bits are used, and where the highest-order used bit is considered
821*8d67ca89SAndroid Build Coastguard Worker    to be a sign bit if T is signed.  */
822*8d67ca89SAndroid Build Coastguard Worker #define MAXVAL(t, b)						\
823*8d67ca89SAndroid Build Coastguard Worker   ((t) (((t) 1 << ((b) - 1 - TYPE_SIGNED(t)))			\
824*8d67ca89SAndroid Build Coastguard Worker 	- 1 + ((t) 1 << ((b) - 1 - TYPE_SIGNED(t)))))
825*8d67ca89SAndroid Build Coastguard Worker #define MINVAL(t, b)						\
826*8d67ca89SAndroid Build Coastguard Worker   ((t) (TYPE_SIGNED(t) ? - TWOS_COMPLEMENT(t) - MAXVAL(t, b) : 0))
827*8d67ca89SAndroid Build Coastguard Worker 
828*8d67ca89SAndroid Build Coastguard Worker /* The extreme time values, assuming no padding.  */
829*8d67ca89SAndroid Build Coastguard Worker #define TIME_T_MIN_NO_PADDING MINVAL(time_t, TYPE_BIT(time_t))
830*8d67ca89SAndroid Build Coastguard Worker #define TIME_T_MAX_NO_PADDING MAXVAL(time_t, TYPE_BIT(time_t))
831*8d67ca89SAndroid Build Coastguard Worker 
832*8d67ca89SAndroid Build Coastguard Worker /* The extreme time values.  These are macros, not constants, so that
833*8d67ca89SAndroid Build Coastguard Worker    any portability problems occur only when compiling .c files that use
834*8d67ca89SAndroid Build Coastguard Worker    the macros, which is safer for applications that need only zdump and zic.
835*8d67ca89SAndroid Build Coastguard Worker    This implementation assumes no padding if time_t is signed and
836*8d67ca89SAndroid Build Coastguard Worker    either the compiler lacks support for _Generic or time_t is not one
837*8d67ca89SAndroid Build Coastguard Worker    of the standard signed integer types.  */
838*8d67ca89SAndroid Build Coastguard Worker #if HAVE__GENERIC
839*8d67ca89SAndroid Build Coastguard Worker # define TIME_T_MIN \
840*8d67ca89SAndroid Build Coastguard Worker     _Generic((time_t) 0, \
841*8d67ca89SAndroid Build Coastguard Worker 	     signed char: SCHAR_MIN, short: SHRT_MIN, \
842*8d67ca89SAndroid Build Coastguard Worker 	     int: INT_MIN, long: LONG_MIN, long long: LLONG_MIN, \
843*8d67ca89SAndroid Build Coastguard Worker 	     default: TIME_T_MIN_NO_PADDING)
844*8d67ca89SAndroid Build Coastguard Worker # define TIME_T_MAX \
845*8d67ca89SAndroid Build Coastguard Worker     (TYPE_SIGNED(time_t) \
846*8d67ca89SAndroid Build Coastguard Worker      ? _Generic((time_t) 0, \
847*8d67ca89SAndroid Build Coastguard Worker 		signed char: SCHAR_MAX, short: SHRT_MAX, \
848*8d67ca89SAndroid Build Coastguard Worker 		int: INT_MAX, long: LONG_MAX, long long: LLONG_MAX, \
849*8d67ca89SAndroid Build Coastguard Worker 		default: TIME_T_MAX_NO_PADDING)			    \
850*8d67ca89SAndroid Build Coastguard Worker      : (time_t) -1)
851*8d67ca89SAndroid Build Coastguard Worker enum { SIGNED_PADDING_CHECK_NEEDED
852*8d67ca89SAndroid Build Coastguard Worker          = _Generic((time_t) 0,
853*8d67ca89SAndroid Build Coastguard Worker 		    signed char: false, short: false,
854*8d67ca89SAndroid Build Coastguard Worker 		    int: false, long: false, long long: false,
855*8d67ca89SAndroid Build Coastguard Worker 		    default: true) };
856*8d67ca89SAndroid Build Coastguard Worker #else
857*8d67ca89SAndroid Build Coastguard Worker # define TIME_T_MIN TIME_T_MIN_NO_PADDING
858*8d67ca89SAndroid Build Coastguard Worker # define TIME_T_MAX TIME_T_MAX_NO_PADDING
859*8d67ca89SAndroid Build Coastguard Worker enum { SIGNED_PADDING_CHECK_NEEDED = true };
860*8d67ca89SAndroid Build Coastguard Worker #endif
861*8d67ca89SAndroid Build Coastguard Worker /* Try to check the padding assumptions.  Although TIME_T_MAX and the
862*8d67ca89SAndroid Build Coastguard Worker    following check can both have undefined behavior on oddball
863*8d67ca89SAndroid Build Coastguard Worker    platforms due to shifts exceeding widths of signed integers, these
864*8d67ca89SAndroid Build Coastguard Worker    platforms' compilers are likely to diagnose these issues in integer
865*8d67ca89SAndroid Build Coastguard Worker    constant expressions, so it shouldn't hurt to check statically.  */
866*8d67ca89SAndroid Build Coastguard Worker static_assert(! TYPE_SIGNED(time_t) || ! SIGNED_PADDING_CHECK_NEEDED
867*8d67ca89SAndroid Build Coastguard Worker 	      || TIME_T_MAX >> (TYPE_BIT(time_t) - 2) == 1);
868*8d67ca89SAndroid Build Coastguard Worker 
869*8d67ca89SAndroid Build Coastguard Worker /*
870*8d67ca89SAndroid Build Coastguard Worker ** 302 / 1000 is log10(2.0) rounded up.
871*8d67ca89SAndroid Build Coastguard Worker ** Subtract one for the sign bit if the type is signed;
872*8d67ca89SAndroid Build Coastguard Worker ** add one for integer division truncation;
873*8d67ca89SAndroid Build Coastguard Worker ** add one more for a minus sign if the type is signed.
874*8d67ca89SAndroid Build Coastguard Worker */
875*8d67ca89SAndroid Build Coastguard Worker #define INT_STRLEN_MAXIMUM(type) \
876*8d67ca89SAndroid Build Coastguard Worker 	((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + \
877*8d67ca89SAndroid Build Coastguard Worker 	1 + TYPE_SIGNED(type))
878*8d67ca89SAndroid Build Coastguard Worker 
879*8d67ca89SAndroid Build Coastguard Worker /*
880*8d67ca89SAndroid Build Coastguard Worker ** INITIALIZE(x)
881*8d67ca89SAndroid Build Coastguard Worker */
882*8d67ca89SAndroid Build Coastguard Worker 
883*8d67ca89SAndroid Build Coastguard Worker #ifdef GCC_LINT
884*8d67ca89SAndroid Build Coastguard Worker # define INITIALIZE(x)	((x) = 0)
885*8d67ca89SAndroid Build Coastguard Worker #else
886*8d67ca89SAndroid Build Coastguard Worker # define INITIALIZE(x)
887*8d67ca89SAndroid Build Coastguard Worker #endif
888*8d67ca89SAndroid Build Coastguard Worker 
889*8d67ca89SAndroid Build Coastguard Worker /* Whether memory access must strictly follow the C standard.
890*8d67ca89SAndroid Build Coastguard Worker    If 0, it's OK to read uninitialized storage so long as the value is
891*8d67ca89SAndroid Build Coastguard Worker    not relied upon.  Defining it to 0 lets mktime access parts of
892*8d67ca89SAndroid Build Coastguard Worker    struct tm that might be uninitialized, as a heuristic when the
893*8d67ca89SAndroid Build Coastguard Worker    standard doesn't say what to return and when tm_gmtoff can help
894*8d67ca89SAndroid Build Coastguard Worker    mktime likely infer a better value.  */
895*8d67ca89SAndroid Build Coastguard Worker #ifndef UNINIT_TRAP
896*8d67ca89SAndroid Build Coastguard Worker # define UNINIT_TRAP 0
897*8d67ca89SAndroid Build Coastguard Worker #endif
898*8d67ca89SAndroid Build Coastguard Worker 
899*8d67ca89SAndroid Build Coastguard Worker #ifdef DEBUG
900*8d67ca89SAndroid Build Coastguard Worker # undef unreachable
901*8d67ca89SAndroid Build Coastguard Worker # define unreachable() abort()
902*8d67ca89SAndroid Build Coastguard Worker #elif !defined unreachable
903*8d67ca89SAndroid Build Coastguard Worker # ifdef __has_builtin
904*8d67ca89SAndroid Build Coastguard Worker #  if __has_builtin(__builtin_unreachable)
905*8d67ca89SAndroid Build Coastguard Worker #   define unreachable() __builtin_unreachable()
906*8d67ca89SAndroid Build Coastguard Worker #  endif
907*8d67ca89SAndroid Build Coastguard Worker # elif 4 < __GNUC__ + (5 <= __GNUC_MINOR__)
908*8d67ca89SAndroid Build Coastguard Worker #  define unreachable() __builtin_unreachable()
909*8d67ca89SAndroid Build Coastguard Worker # endif
910*8d67ca89SAndroid Build Coastguard Worker # ifndef unreachable
911*8d67ca89SAndroid Build Coastguard Worker #  define unreachable() ((void) 0)
912*8d67ca89SAndroid Build Coastguard Worker # endif
913*8d67ca89SAndroid Build Coastguard Worker #endif
914*8d67ca89SAndroid Build Coastguard Worker 
915*8d67ca89SAndroid Build Coastguard Worker /*
916*8d67ca89SAndroid Build Coastguard Worker ** For the benefit of GNU folk...
917*8d67ca89SAndroid Build Coastguard Worker ** '_(MSGID)' uses the current locale's message library string for MSGID.
918*8d67ca89SAndroid Build Coastguard Worker ** The default is to use gettext if available, and use MSGID otherwise.
919*8d67ca89SAndroid Build Coastguard Worker */
920*8d67ca89SAndroid Build Coastguard Worker 
921*8d67ca89SAndroid Build Coastguard Worker #if HAVE_GETTEXT
922*8d67ca89SAndroid Build Coastguard Worker #define _(msgid) gettext(msgid)
923*8d67ca89SAndroid Build Coastguard Worker #else /* !HAVE_GETTEXT */
924*8d67ca89SAndroid Build Coastguard Worker #define _(msgid) msgid
925*8d67ca89SAndroid Build Coastguard Worker #endif /* !HAVE_GETTEXT */
926*8d67ca89SAndroid Build Coastguard Worker 
927*8d67ca89SAndroid Build Coastguard Worker #if !defined TZ_DOMAIN && defined HAVE_GETTEXT
928*8d67ca89SAndroid Build Coastguard Worker # define TZ_DOMAIN "tz"
929*8d67ca89SAndroid Build Coastguard Worker #endif
930*8d67ca89SAndroid Build Coastguard Worker 
931*8d67ca89SAndroid Build Coastguard Worker #if HAVE_INCOMPATIBLE_CTIME_R
932*8d67ca89SAndroid Build Coastguard Worker #undef asctime_r
933*8d67ca89SAndroid Build Coastguard Worker #undef ctime_r
934*8d67ca89SAndroid Build Coastguard Worker char *asctime_r(struct tm const *restrict, char *restrict);
935*8d67ca89SAndroid Build Coastguard Worker char *ctime_r(time_t const *, char *);
936*8d67ca89SAndroid Build Coastguard Worker #endif /* HAVE_INCOMPATIBLE_CTIME_R */
937*8d67ca89SAndroid Build Coastguard Worker 
938*8d67ca89SAndroid Build Coastguard Worker /* Handy macros that are independent of tzfile implementation.  */
939*8d67ca89SAndroid Build Coastguard Worker 
940*8d67ca89SAndroid Build Coastguard Worker enum {
941*8d67ca89SAndroid Build Coastguard Worker   SECSPERMIN = 60,
942*8d67ca89SAndroid Build Coastguard Worker   MINSPERHOUR = 60,
943*8d67ca89SAndroid Build Coastguard Worker   SECSPERHOUR = SECSPERMIN * MINSPERHOUR,
944*8d67ca89SAndroid Build Coastguard Worker   HOURSPERDAY = 24,
945*8d67ca89SAndroid Build Coastguard Worker   DAYSPERWEEK = 7,
946*8d67ca89SAndroid Build Coastguard Worker   DAYSPERNYEAR = 365,
947*8d67ca89SAndroid Build Coastguard Worker   DAYSPERLYEAR = DAYSPERNYEAR + 1,
948*8d67ca89SAndroid Build Coastguard Worker   MONSPERYEAR = 12,
949*8d67ca89SAndroid Build Coastguard Worker   YEARSPERREPEAT = 400	/* years before a Gregorian repeat */
950*8d67ca89SAndroid Build Coastguard Worker };
951*8d67ca89SAndroid Build Coastguard Worker 
952*8d67ca89SAndroid Build Coastguard Worker #define SECSPERDAY	((int_fast32_t) SECSPERHOUR * HOURSPERDAY)
953*8d67ca89SAndroid Build Coastguard Worker 
954*8d67ca89SAndroid Build Coastguard Worker #define DAYSPERREPEAT		((int_fast32_t) 400 * 365 + 100 - 4 + 1)
955*8d67ca89SAndroid Build Coastguard Worker #define SECSPERREPEAT		((int_fast64_t) DAYSPERREPEAT * SECSPERDAY)
956*8d67ca89SAndroid Build Coastguard Worker #define AVGSECSPERYEAR		(SECSPERREPEAT / YEARSPERREPEAT)
957*8d67ca89SAndroid Build Coastguard Worker 
958*8d67ca89SAndroid Build Coastguard Worker enum {
959*8d67ca89SAndroid Build Coastguard Worker   TM_SUNDAY,
960*8d67ca89SAndroid Build Coastguard Worker   TM_MONDAY,
961*8d67ca89SAndroid Build Coastguard Worker   TM_TUESDAY,
962*8d67ca89SAndroid Build Coastguard Worker   TM_WEDNESDAY,
963*8d67ca89SAndroid Build Coastguard Worker   TM_THURSDAY,
964*8d67ca89SAndroid Build Coastguard Worker   TM_FRIDAY,
965*8d67ca89SAndroid Build Coastguard Worker   TM_SATURDAY
966*8d67ca89SAndroid Build Coastguard Worker };
967*8d67ca89SAndroid Build Coastguard Worker 
968*8d67ca89SAndroid Build Coastguard Worker enum {
969*8d67ca89SAndroid Build Coastguard Worker   TM_JANUARY,
970*8d67ca89SAndroid Build Coastguard Worker   TM_FEBRUARY,
971*8d67ca89SAndroid Build Coastguard Worker   TM_MARCH,
972*8d67ca89SAndroid Build Coastguard Worker   TM_APRIL,
973*8d67ca89SAndroid Build Coastguard Worker   TM_MAY,
974*8d67ca89SAndroid Build Coastguard Worker   TM_JUNE,
975*8d67ca89SAndroid Build Coastguard Worker   TM_JULY,
976*8d67ca89SAndroid Build Coastguard Worker   TM_AUGUST,
977*8d67ca89SAndroid Build Coastguard Worker   TM_SEPTEMBER,
978*8d67ca89SAndroid Build Coastguard Worker   TM_OCTOBER,
979*8d67ca89SAndroid Build Coastguard Worker   TM_NOVEMBER,
980*8d67ca89SAndroid Build Coastguard Worker   TM_DECEMBER
981*8d67ca89SAndroid Build Coastguard Worker };
982*8d67ca89SAndroid Build Coastguard Worker 
983*8d67ca89SAndroid Build Coastguard Worker enum {
984*8d67ca89SAndroid Build Coastguard Worker   TM_YEAR_BASE = 1900,
985*8d67ca89SAndroid Build Coastguard Worker   TM_WDAY_BASE = TM_MONDAY,
986*8d67ca89SAndroid Build Coastguard Worker   EPOCH_YEAR = 1970,
987*8d67ca89SAndroid Build Coastguard Worker   EPOCH_WDAY = TM_THURSDAY
988*8d67ca89SAndroid Build Coastguard Worker };
989*8d67ca89SAndroid Build Coastguard Worker 
990*8d67ca89SAndroid Build Coastguard Worker #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
991*8d67ca89SAndroid Build Coastguard Worker 
992*8d67ca89SAndroid Build Coastguard Worker /*
993*8d67ca89SAndroid Build Coastguard Worker ** Since everything in isleap is modulo 400 (or a factor of 400), we know that
994*8d67ca89SAndroid Build Coastguard Worker **	isleap(y) == isleap(y % 400)
995*8d67ca89SAndroid Build Coastguard Worker ** and so
996*8d67ca89SAndroid Build Coastguard Worker **	isleap(a + b) == isleap((a + b) % 400)
997*8d67ca89SAndroid Build Coastguard Worker ** or
998*8d67ca89SAndroid Build Coastguard Worker **	isleap(a + b) == isleap(a % 400 + b % 400)
999*8d67ca89SAndroid Build Coastguard Worker ** This is true even if % means modulo rather than Fortran remainder
1000*8d67ca89SAndroid Build Coastguard Worker ** (which is allowed by C89 but not by C99 or later).
1001*8d67ca89SAndroid Build Coastguard Worker ** We use this to avoid addition overflow problems.
1002*8d67ca89SAndroid Build Coastguard Worker */
1003*8d67ca89SAndroid Build Coastguard Worker 
1004*8d67ca89SAndroid Build Coastguard Worker #define isleap_sum(a, b)	isleap((a) % 400 + (b) % 400)
1005*8d67ca89SAndroid Build Coastguard Worker 
1006*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined PRIVATE_H */
1007