12708Swollman#ifndef PRIVATE_H
22708Swollman
32708Swollman#define PRIVATE_H
4130461Sstefanf
517209Swollman/*
617209Swollman** This file is in the public domain, so clarified as of
7192625Sedwin** 1996-06-05 by Arthur David Olson.
892991Sobrien**
992991Sobrien** $FreeBSD$
1017209Swollman*/
112708Swollman
122741Swollman/* Stuff moved from Makefile.inc to reduce clutter */
132741Swollman#ifndef TM_GMTOFF
142741Swollman#define TM_GMTOFF	tm_gmtoff
152741Swollman#define TM_ZONE		tm_zone
162741Swollman#define STD_INSPIRED	1
172741Swollman#define PCTS		1
182741Swollman#define HAVE_LONG_DOUBLE 1
1917209Swollman#define HAVE_STRERROR	1
2017209Swollman#define	HAVE_UNISTD_H	1
2117209Swollman#define	LOCALE_HOME	_PATH_LOCALE
222741Swollman#define TZDIR		"/usr/share/zoneinfo"
232741Swollman#endif /* ndef TM_GMTOFF */
242741Swollman
252708Swollman/*
262708Swollman** This header is for use ONLY with the time conversion code.
272708Swollman** There is no guarantee that it will remain unchanged,
282708Swollman** or that it will remain at all.
292708Swollman** Do NOT copy it to any system include directory.
302708Swollman** Thank you!
312708Swollman*/
322708Swollman
332708Swollman/*
342708Swollman** ID
352708Swollman*/
362708Swollman
372708Swollman#ifndef lint
382708Swollman#ifndef NOID
3917209Swollman/*
40192625Sedwinstatic char	privatehid[] = "@(#)private.h	8.6";
4117209Swollman*/
422708Swollman#endif /* !defined NOID */
432708Swollman#endif /* !defined lint */
442708Swollman
45192625Sedwin#define GRANDPARENTED	"Local time zone must be set--see zic manual page"
46192625Sedwin
472708Swollman/*
489936Swollman** Defaults for preprocessor symbols.
499936Swollman** You can override these in your C compiler options, e.g. `-DHAVE_ADJTIME=0'.
502708Swollman*/
512708Swollman
529936Swollman#ifndef HAVE_ADJTIME
539936Swollman#define HAVE_ADJTIME		1
549936Swollman#endif /* !defined HAVE_ADJTIME */
552708Swollman
5617209Swollman#ifndef HAVE_GETTEXT
5717209Swollman#define HAVE_GETTEXT		0
5817209Swollman#endif /* !defined HAVE_GETTEXT */
5917209Swollman
60130461Sstefanf#ifndef HAVE_INCOMPATIBLE_CTIME_R
61130461Sstefanf#define HAVE_INCOMPATIBLE_CTIME_R	0
62130461Sstefanf#endif /* !defined INCOMPATIBLE_CTIME_R */
63130461Sstefanf
649936Swollman#ifndef HAVE_SETTIMEOFDAY
659936Swollman#define HAVE_SETTIMEOFDAY	3
669936Swollman#endif /* !defined HAVE_SETTIMEOFDAY */
679936Swollman
68130461Sstefanf#ifndef HAVE_SYMLINK
69130461Sstefanf#define HAVE_SYMLINK		1
70130461Sstefanf#endif /* !defined HAVE_SYMLINK */
71130461Sstefanf
72130461Sstefanf#ifndef HAVE_SYS_STAT_H
73130461Sstefanf#define HAVE_SYS_STAT_H		1
74130461Sstefanf#endif /* !defined HAVE_SYS_STAT_H */
75130461Sstefanf
76130461Sstefanf#ifndef HAVE_SYS_WAIT_H
77130461Sstefanf#define HAVE_SYS_WAIT_H		1
78130461Sstefanf#endif /* !defined HAVE_SYS_WAIT_H */
79130461Sstefanf
809936Swollman#ifndef HAVE_UNISTD_H
819936Swollman#define HAVE_UNISTD_H		1
829936Swollman#endif /* !defined HAVE_UNISTD_H */
839936Swollman
8417209Swollman#ifndef HAVE_UTMPX_H
8517209Swollman#define HAVE_UTMPX_H		0
8617209Swollman#endif /* !defined HAVE_UTMPX_H */
8717209Swollman
8817209Swollman#ifndef LOCALE_HOME
8917209Swollman#define LOCALE_HOME		"/usr/lib/locale"
9017209Swollman#endif /* !defined LOCALE_HOME */
9117209Swollman
92130461Sstefanf#if HAVE_INCOMPATIBLE_CTIME_R
93130461Sstefanf#define asctime_r _incompatible_asctime_r
94130461Sstefanf#define ctime_r _incompatible_ctime_r
95130461Sstefanf#endif /* HAVE_INCOMPATIBLE_CTIME_R */
96130461Sstefanf
972708Swollman/*
989936Swollman** Nested includes
992708Swollman*/
1002708Swollman
1019936Swollman#include "sys/types.h"	/* for time_t */
1029936Swollman#include "stdio.h"
1039936Swollman#include "errno.h"
1049936Swollman#include "string.h"
105192625Sedwin#include "limits.h"	/* for CHAR_BIT et al. */
1069936Swollman#include "time.h"
1079936Swollman#include "stdlib.h"
1089936Swollman
109192625Sedwin#if HAVE_GETTEXT
11017209Swollman#include "libintl.h"
111192625Sedwin#endif /* HAVE_GETTEXT */
11217209Swollman
113192625Sedwin#if HAVE_SYS_WAIT_H
114130461Sstefanf#include <sys/wait.h>	/* for WIFEXITED and WEXITSTATUS */
115192625Sedwin#endif /* HAVE_SYS_WAIT_H */
116130461Sstefanf
117130461Sstefanf#ifndef WIFEXITED
118130461Sstefanf#define WIFEXITED(status)	(((status) & 0xff) == 0)
119130461Sstefanf#endif /* !defined WIFEXITED */
120130461Sstefanf#ifndef WEXITSTATUS
121130461Sstefanf#define WEXITSTATUS(status)	(((status) >> 8) & 0xff)
122130461Sstefanf#endif /* !defined WEXITSTATUS */
123130461Sstefanf
124192625Sedwin#if HAVE_UNISTD_H
125192625Sedwin#include "unistd.h"	/* for F_OK, R_OK, and other POSIX goodness */
126192625Sedwin#endif /* HAVE_UNISTD_H */
1279936Swollman
128192625Sedwin#if !(HAVE_UNISTD_H)
1299936Swollman#ifndef F_OK
1309936Swollman#define F_OK	0
1319936Swollman#endif /* !defined F_OK */
1329936Swollman#ifndef R_OK
1339936Swollman#define R_OK	4
1349936Swollman#endif /* !defined R_OK */
135192625Sedwin#endif /* !(HAVE_UNISTD_H) */
1369936Swollman
137192625Sedwin/* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX. */
13817209Swollman#define is_digit(c) ((unsigned)(c) - '0' <= 9)
13917209Swollman
1409936Swollman/*
141192625Sedwin** Define HAVE_STDINT_H's default value here, rather than at the
142192625Sedwin** start, since __GLIBC__'s value depends on previously-included
143192625Sedwin** files.
144192625Sedwin** (glibc 2.1 and later have stdint.h, even with pre-C99 compilers.)
1459936Swollman*/
146192625Sedwin#ifndef HAVE_STDINT_H
147192625Sedwin#define HAVE_STDINT_H \
148192625Sedwin	(199901 <= __STDC_VERSION__ || \
149192625Sedwin	2 < (__GLIBC__ + (0 < __GLIBC_MINOR__)))
150192625Sedwin#endif /* !defined HAVE_STDINT_H */
1519936Swollman
152192625Sedwin#if HAVE_STDINT_H
153192625Sedwin#include "stdint.h"
154192625Sedwin#endif /* !HAVE_STDINT_H */
1552708Swollman
156192625Sedwin#ifndef INT_FAST64_MAX
157192625Sedwin/* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX.  */
158192625Sedwin#if defined LLONG_MAX || defined __LONG_LONG_MAX__
159192625Sedwintypedef long long	int_fast64_t;
160192625Sedwin#else /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */
161192625Sedwin#if (LONG_MAX >> 31) < 0xffffffff
162192625SedwinPlease use a compiler that supports a 64-bit integer type (or wider);
163192625Sedwinyou may need to compile with "-DHAVE_STDINT_H".
164192625Sedwin#endif /* (LONG_MAX >> 31) < 0xffffffff */
165192625Sedwintypedef long		int_fast64_t;
166192625Sedwin#endif /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */
167192625Sedwin#endif /* !defined INT_FAST64_MAX */
1682708Swollman
169192625Sedwin#ifndef INT32_MAX
170192625Sedwin#define INT32_MAX 0x7fffffff
171192625Sedwin#endif /* !defined INT32_MAX */
172192625Sedwin#ifndef INT32_MIN
173192625Sedwin#define INT32_MIN (-1 - INT32_MAX)
174192625Sedwin#endif /* !defined INT32_MIN */
1752708Swollman
176192625Sedwin/*
177192625Sedwin** Workarounds for compilers/systems.
178192625Sedwin*/
1792708Swollman
1809936Swollman/*
181192625Sedwin** Some time.h implementations don't declare asctime_r.
182192625Sedwin** Others might define it as a macro.
183192625Sedwin** Fix the former without affecting the latter.
184192625Sedwin*/
185192625Sedwin
186192625Sedwin#ifndef asctime_r
187192625Sedwinextern char *	asctime_r(struct tm const *, char *);
188192625Sedwin#endif
189192625Sedwin
190192625Sedwin/*
191130461Sstefanf** Private function declarations.
192130461Sstefanf*/
193130461Sstefanf
194192625Sedwinchar *		icalloc(int nelem, int elsize);
195192625Sedwinchar *		icatalloc(char * old, const char * new);
196192625Sedwinchar *		icpyalloc(const char * string);
197192625Sedwinchar *		imalloc(int n);
198192625Sedwinvoid *		irealloc(void * pointer, int size);
199192625Sedwinvoid		icfree(char * pointer);
200192625Sedwinvoid		ifree(char * pointer);
201192625Sedwinconst char *	scheck(const char * string, const char * format);
202130461Sstefanf
203130461Sstefanf/*
2049936Swollman** Finally, some convenience items.
2052708Swollman*/
2062708Swollman
2072708Swollman#ifndef TRUE
2082708Swollman#define TRUE	1
2092708Swollman#endif /* !defined TRUE */
2102708Swollman
2112708Swollman#ifndef FALSE
2122708Swollman#define FALSE	0
2132708Swollman#endif /* !defined FALSE */
2142708Swollman
21517209Swollman#ifndef TYPE_BIT
21617209Swollman#define TYPE_BIT(type)	(sizeof (type) * CHAR_BIT)
21717209Swollman#endif /* !defined TYPE_BIT */
21817209Swollman
21917209Swollman#ifndef TYPE_SIGNED
22017209Swollman#define TYPE_SIGNED(type) (((type) -1) < 0)
22117209Swollman#endif /* !defined TYPE_SIGNED */
22217209Swollman
223192625Sedwin/*
224192625Sedwin** Since the definition of TYPE_INTEGRAL contains floating point numbers,
225192625Sedwin** it cannot be used in preprocessor directives.
226192625Sedwin*/
227192625Sedwin
228192625Sedwin#ifndef TYPE_INTEGRAL
229192625Sedwin#define	TYPE_INTEGRAL(type) (((type) 0.5) != 0.5)
230192625Sedwin#endif /* !defined TYPE_INTEGRAL */
231192625Sedwin
232192625Sedwin/*
233192625Sedwin** Since the definition of TYPE_INTEGRAL contains floating point numbers,
234192625Sedwin** it cannot be used in preprocessor directives.
235192625Sedwin*/
236192625Sedwin
237192625Sedwin#ifndef TYPE_INTEGRAL
238192625Sedwin#define TYPE_INTEGRAL(type) (((type) 0.5) != 0.5)
239192625Sedwin#endif /* !defined TYPE_INTEGRAL */
240192625Sedwin
2412708Swollman#ifndef INT_STRLEN_MAXIMUM
2422708Swollman/*
2432708Swollman** 302 / 1000 is log10(2.0) rounded up.
24417209Swollman** Subtract one for the sign bit if the type is signed;
2452708Swollman** add one for integer division truncation;
24617209Swollman** add one more for a minus sign if the type is signed.
2472708Swollman*/
2482708Swollman#define INT_STRLEN_MAXIMUM(type) \
249192625Sedwin	((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + \
250192625Sedwin	1 + TYPE_SIGNED(type))
2512708Swollman#endif /* !defined INT_STRLEN_MAXIMUM */
2522708Swollman
2532708Swollman/*
2549936Swollman** INITIALIZE(x)
2552708Swollman*/
2562708Swollman
2579936Swollman#ifndef GNUC_or_lint
2589936Swollman#ifdef lint
2599936Swollman#define GNUC_or_lint
2609936Swollman#endif /* defined lint */
2619936Swollman#ifndef lint
2629936Swollman#ifdef __GNUC__
2639936Swollman#define GNUC_or_lint
2649936Swollman#endif /* defined __GNUC__ */
2659936Swollman#endif /* !defined lint */
2669936Swollman#endif /* !defined GNUC_or_lint */
2679936Swollman
2689936Swollman#ifndef INITIALIZE
2699936Swollman#ifdef GNUC_or_lint
2709936Swollman#define INITIALIZE(x)	((x) = 0)
2719936Swollman#endif /* defined GNUC_or_lint */
2729936Swollman#ifndef GNUC_or_lint
2739936Swollman#define INITIALIZE(x)
2749936Swollman#endif /* !defined GNUC_or_lint */
2759936Swollman#endif /* !defined INITIALIZE */
2769936Swollman
2779936Swollman/*
27817209Swollman** For the benefit of GNU folk...
27917209Swollman** `_(MSGID)' uses the current locale's message library string for MSGID.
28017209Swollman** The default is to use gettext if available, and use MSGID otherwise.
28117209Swollman*/
28217209Swollman
28317209Swollman#ifndef _
284192625Sedwin#if HAVE_GETTEXT
28517209Swollman#define _(msgid) gettext(msgid)
286192625Sedwin#else /* !HAVE_GETTEXT */
28717209Swollman#define _(msgid) msgid
288192625Sedwin#endif /* !HAVE_GETTEXT */
28917209Swollman#endif /* !defined _ */
29017209Swollman
29117209Swollman#ifndef TZ_DOMAIN
29217209Swollman#define TZ_DOMAIN "tz"
29317209Swollman#endif /* !defined TZ_DOMAIN */
29417209Swollman
295130461Sstefanf#if HAVE_INCOMPATIBLE_CTIME_R
296130461Sstefanf#undef asctime_r
297130461Sstefanf#undef ctime_r
298130461Sstefanfchar *asctime_r(struct tm const *, char *);
299130461Sstefanfchar *ctime_r(time_t const *, char *);
300130461Sstefanf#endif /* HAVE_INCOMPATIBLE_CTIME_R */
301192625Sedwin
302192625Sedwin#ifndef YEARSPERREPEAT
303192625Sedwin#define YEARSPERREPEAT		400	/* years before a Gregorian repeat */
304192625Sedwin#endif /* !defined YEARSPERREPEAT */
305130461Sstefanf
30617209Swollman/*
307192625Sedwin** The Gregorian year averages 365.2425 days, which is 31556952 seconds.
308192625Sedwin*/
309192625Sedwin
310192625Sedwin#ifndef AVGSECSPERYEAR
311192625Sedwin#define AVGSECSPERYEAR		31556952L
312192625Sedwin#endif /* !defined AVGSECSPERYEAR */
313192625Sedwin
314192625Sedwin#ifndef SECSPERREPEAT
315192625Sedwin#define SECSPERREPEAT		((int_fast64_t) YEARSPERREPEAT * (int_fast64_t) AVGSECSPERYEAR)
316192625Sedwin#endif /* !defined SECSPERREPEAT */
317192625Sedwin
318192625Sedwin#ifndef SECSPERREPEAT_BITS
319192625Sedwin#define SECSPERREPEAT_BITS	34	/* ceil(log2(SECSPERREPEAT)) */
320192625Sedwin#endif /* !defined SECSPERREPEAT_BITS */
321192625Sedwin
322192625Sedwin/*
323130461Sstefanf** UNIX was a registered trademark of The Open Group in 2003.
3249936Swollman*/
3259936Swollman
3262708Swollman#endif /* !defined PRIVATE_H */
327