1#ifndef PRIVATE_H 2 3#define PRIVATE_H 4 5/* 6** This file is in the public domain, so clarified as of 7** 1996-06-05 by Arthur David Olson. 8*/ 9 10/* 11** This header is for use ONLY with the time conversion code. 12** There is no guarantee that it will remain unchanged, 13** or that it will remain at all. 14** Do NOT copy it to any system include directory. 15** Thank you! 16*/ 17 18#define GRANDPARENTED "Local time zone must be set--see zic manual page" 19 20/* 21** Defaults for preprocessor symbols. 22** You can override these in your C compiler options, e.g. '-DHAVE_GETTEXT=1'. 23*/ 24 25#ifndef HAVE_DECL_ASCTIME_R 26#define HAVE_DECL_ASCTIME_R 1 27#endif 28 29#ifndef HAVE_GETTEXT 30#define HAVE_GETTEXT 0 31#endif /* !defined HAVE_GETTEXT */ 32 33#ifndef HAVE_INCOMPATIBLE_CTIME_R 34#define HAVE_INCOMPATIBLE_CTIME_R 0 35#endif /* !defined INCOMPATIBLE_CTIME_R */ 36 37#ifndef HAVE_LINK 38#define HAVE_LINK 1 39#endif /* !defined HAVE_LINK */ 40 41#ifndef HAVE_POSIX_DECLS 42#define HAVE_POSIX_DECLS 1 43#endif 44 45#ifndef HAVE_STRDUP 46#define HAVE_STRDUP 1 47#endif 48 49#ifndef HAVE_SYMLINK 50#define HAVE_SYMLINK 1 51#endif /* !defined HAVE_SYMLINK */ 52 53#ifndef HAVE_SYS_STAT_H 54#define HAVE_SYS_STAT_H 1 55#endif /* !defined HAVE_SYS_STAT_H */ 56 57#ifndef HAVE_SYS_WAIT_H 58#define HAVE_SYS_WAIT_H 1 59#endif /* !defined HAVE_SYS_WAIT_H */ 60 61#ifndef HAVE_UNISTD_H 62#define HAVE_UNISTD_H 1 63#endif /* !defined HAVE_UNISTD_H */ 64 65#ifndef HAVE_UTMPX_H 66#define HAVE_UTMPX_H 1 67#endif /* !defined HAVE_UTMPX_H */ 68 69#ifndef NETBSD_INSPIRED 70# define NETBSD_INSPIRED 1 71#endif 72 73#if HAVE_INCOMPATIBLE_CTIME_R 74#define asctime_r _incompatible_asctime_r 75#define ctime_r _incompatible_ctime_r 76#endif /* HAVE_INCOMPATIBLE_CTIME_R */ 77 78/* Enable tm_gmtoff and tm_zone on GNUish systems. */ 79#define _GNU_SOURCE 1 80/* Fix asctime_r on Solaris 10. */ 81#define _POSIX_PTHREAD_SEMANTICS 1 82/* Enable strtoimax on Solaris 10. */ 83#define __EXTENSIONS__ 1 84 85/* 86** Nested includes 87*/ 88 89/* Avoid clashes with NetBSD by renaming NetBSD's declarations. */ 90#define localtime_rz sys_localtime_rz 91#define mktime_z sys_mktime_z 92#define posix2time_z sys_posix2time_z 93#define time2posix_z sys_time2posix_z 94#define timezone_t sys_timezone_t 95#define tzalloc sys_tzalloc 96#define tzfree sys_tzfree 97#include <time.h> 98#undef localtime_rz 99#undef mktime_z 100#undef posix2time_z 101#undef time2posix_z 102#undef timezone_t 103#undef tzalloc 104#undef tzfree 105 106#include "sys/types.h" /* for time_t */ 107#include "stdio.h" 108#include "string.h" 109#include "limits.h" /* for CHAR_BIT et al. */ 110#include "stdlib.h" 111 112#include "errno.h" 113 114#ifndef ENAMETOOLONG 115# define ENAMETOOLONG EINVAL 116#endif 117#ifndef ENOTSUP 118# define ENOTSUP EINVAL 119#endif 120#ifndef EOVERFLOW 121# define EOVERFLOW EINVAL 122#endif 123 124#if HAVE_GETTEXT 125#include "libintl.h" 126#endif /* HAVE_GETTEXT */ 127 128#if HAVE_SYS_WAIT_H 129#include <sys/wait.h> /* for WIFEXITED and WEXITSTATUS */ 130#endif /* HAVE_SYS_WAIT_H */ 131 132#ifndef WIFEXITED 133#define WIFEXITED(status) (((status) & 0xff) == 0) 134#endif /* !defined WIFEXITED */ 135#ifndef WEXITSTATUS 136#define WEXITSTATUS(status) (((status) >> 8) & 0xff) 137#endif /* !defined WEXITSTATUS */ 138 139#if HAVE_UNISTD_H 140#include "unistd.h" /* for F_OK, R_OK, and other POSIX goodness */ 141#endif /* HAVE_UNISTD_H */ 142 143#ifndef HAVE_STRFTIME_L 144# if _POSIX_VERSION < 200809 145# define HAVE_STRFTIME_L 0 146# else 147# define HAVE_STRFTIME_L 1 148# endif 149#endif 150 151#ifndef F_OK 152#define F_OK 0 153#endif /* !defined F_OK */ 154#ifndef R_OK 155#define R_OK 4 156#endif /* !defined R_OK */ 157 158/* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX. */ 159#define is_digit(c) ((unsigned)(c) - '0' <= 9) 160 161/* 162** Define HAVE_STDINT_H's default value here, rather than at the 163** start, since __GLIBC__'s value depends on previously-included 164** files. 165** (glibc 2.1 and later have stdint.h, even with pre-C99 compilers.) 166*/ 167#ifndef HAVE_STDINT_H 168#define HAVE_STDINT_H \ 169 (199901 <= __STDC_VERSION__ \ 170 || 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__) \ 171 || __CYGWIN__) 172#endif /* !defined HAVE_STDINT_H */ 173 174#if HAVE_STDINT_H 175#include "stdint.h" 176#endif /* !HAVE_STDINT_H */ 177 178#ifndef HAVE_INTTYPES_H 179# define HAVE_INTTYPES_H HAVE_STDINT_H 180#endif 181#if HAVE_INTTYPES_H 182# include <inttypes.h> 183#endif 184 185/* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX. */ 186#ifdef __LONG_LONG_MAX__ 187# ifndef LLONG_MAX 188# define LLONG_MAX __LONG_LONG_MAX__ 189# endif 190# ifndef LLONG_MIN 191# define LLONG_MIN (-1 - LLONG_MAX) 192# endif 193#endif 194 195#ifndef INT_FAST64_MAX 196# ifdef LLONG_MAX 197typedef long long int_fast64_t; 198# define INT_FAST64_MIN LLONG_MIN 199# define INT_FAST64_MAX LLONG_MAX 200# else 201# if LONG_MAX >> 31 < 0xffffffff 202Please use a compiler that supports a 64-bit integer type (or wider); 203you may need to compile with "-DHAVE_STDINT_H". 204# endif 205typedef long int_fast64_t; 206# define INT_FAST64_MIN LONG_MIN 207# define INT_FAST64_MAX LONG_MAX 208# endif 209#endif 210 211#ifndef SCNdFAST64 212# if INT_FAST64_MAX == LLONG_MAX 213# define SCNdFAST64 "lld" 214# else 215# define SCNdFAST64 "ld" 216# endif 217#endif 218 219#ifndef INT_FAST32_MAX 220# if INT_MAX >> 31 == 0 221typedef long int_fast32_t; 222# define INT_FAST32_MAX LONG_MAX 223# define INT_FAST32_MIN LONG_MIN 224# else 225typedef int int_fast32_t; 226# define INT_FAST32_MAX INT_MAX 227# define INT_FAST32_MIN INT_MIN 228# endif 229#endif 230 231#ifndef INTMAX_MAX 232# ifdef LLONG_MAX 233typedef long long intmax_t; 234# define strtoimax strtoll 235# define INTMAX_MAX LLONG_MAX 236# define INTMAX_MIN LLONG_MIN 237# else 238typedef long intmax_t; 239# define strtoimax strtol 240# define INTMAX_MAX LONG_MAX 241# define INTMAX_MIN LONG_MIN 242# endif 243#endif 244 245#ifndef PRIdMAX 246# if INTMAX_MAX == LLONG_MAX 247# define PRIdMAX "lld" 248# else 249# define PRIdMAX "ld" 250# endif 251#endif 252 253#ifndef UINT_FAST64_MAX 254# if defined ULLONG_MAX || defined __LONG_LONG_MAX__ 255typedef unsigned long long uint_fast64_t; 256# else 257# if ULONG_MAX >> 31 >> 1 < 0xffffffff 258Please use a compiler that supports a 64-bit integer type (or wider); 259you may need to compile with "-DHAVE_STDINT_H". 260# endif 261typedef unsigned long uint_fast64_t; 262# endif 263#endif 264 265#ifndef UINTMAX_MAX 266# if defined ULLONG_MAX || defined __LONG_LONG_MAX__ 267typedef unsigned long long uintmax_t; 268# else 269typedef unsigned long uintmax_t; 270# endif 271#endif 272 273#ifndef PRIuMAX 274# if defined ULLONG_MAX || defined __LONG_LONG_MAX__ 275# define PRIuMAX "llu" 276# else 277# define PRIuMAX "lu" 278# endif 279#endif 280 281#ifndef INT32_MAX 282#define INT32_MAX 0x7fffffff 283#endif /* !defined INT32_MAX */ 284#ifndef INT32_MIN 285#define INT32_MIN (-1 - INT32_MAX) 286#endif /* !defined INT32_MIN */ 287 288#ifndef SIZE_MAX 289#define SIZE_MAX ((size_t) -1) 290#endif 291 292#if 2 < __GNUC__ + (96 <= __GNUC_MINOR__) 293# define ATTRIBUTE_CONST __attribute__ ((const)) 294# define ATTRIBUTE_PURE __attribute__ ((__pure__)) 295# define ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) 296#else 297# define ATTRIBUTE_CONST /* empty */ 298# define ATTRIBUTE_PURE /* empty */ 299# define ATTRIBUTE_FORMAT(spec) /* empty */ 300#endif 301 302#if !defined _Noreturn && __STDC_VERSION__ < 201112 303# if 2 < __GNUC__ + (8 <= __GNUC_MINOR__) 304# define _Noreturn __attribute__ ((__noreturn__)) 305# else 306# define _Noreturn 307# endif 308#endif 309 310#if __STDC_VERSION__ < 199901 && !defined restrict 311# define restrict /* empty */ 312#endif 313 314/* 315** Workarounds for compilers/systems. 316*/ 317 318/* 319** Compile with -Dtime_tz=T to build the tz package with a private 320** time_t type equivalent to T rather than the system-supplied time_t. 321** This debugging feature can test unusual design decisions 322** (e.g., time_t wider than 'long', or unsigned time_t) even on 323** typical platforms. 324*/ 325#ifdef time_tz 326# ifdef LOCALTIME_IMPLEMENTATION 327static time_t sys_time(time_t *x) { return time(x); } 328# endif 329 330typedef time_tz tz_time_t; 331 332# undef ctime 333# define ctime tz_ctime 334# undef ctime_r 335# define ctime_r tz_ctime_r 336# undef difftime 337# define difftime tz_difftime 338# undef gmtime 339# define gmtime tz_gmtime 340# undef gmtime_r 341# define gmtime_r tz_gmtime_r 342# undef localtime 343# define localtime tz_localtime 344# undef localtime_r 345# define localtime_r tz_localtime_r 346# undef localtime_rz 347# define localtime_rz tz_localtime_rz 348# undef mktime 349# define mktime tz_mktime 350# undef mktime_z 351# define mktime_z tz_mktime_z 352# undef offtime 353# define offtime tz_offtime 354# undef posix2time 355# define posix2time tz_posix2time 356# undef posix2time_z 357# define posix2time_z tz_posix2time_z 358# undef time 359# define time tz_time 360# undef time2posix 361# define time2posix tz_time2posix 362# undef time2posix_z 363# define time2posix_z tz_time2posix_z 364# undef time_t 365# define time_t tz_time_t 366# undef timegm 367# define timegm tz_timegm 368# undef timelocal 369# define timelocal tz_timelocal 370# undef timeoff 371# define timeoff tz_timeoff 372# undef tzalloc 373# define tzalloc tz_tzalloc 374# undef tzfree 375# define tzfree tz_tzfree 376# undef tzset 377# define tzset tz_tzset 378# undef tzsetwall 379# define tzsetwall tz_tzsetwall 380 381char *ctime(time_t const *); 382char *ctime_r(time_t const *, char *); 383double difftime(time_t, time_t); 384struct tm *gmtime(time_t const *); 385struct tm *gmtime_r(time_t const *restrict, struct tm *restrict); 386struct tm *localtime(time_t const *); 387struct tm *localtime_r(time_t const *restrict, struct tm *restrict); 388time_t mktime(struct tm *); 389time_t time(time_t *); 390void tzset(void); 391#endif 392 393#if !HAVE_DECL_ASCTIME_R && !defined asctime_r 394extern char *asctime_r(struct tm const *restrict, char *restrict); 395#endif 396 397#if !HAVE_POSIX_DECLS 398# ifdef USG_COMPAT 399# ifndef timezone 400extern long timezone; 401# endif 402# ifndef daylight 403extern int daylight; 404# endif 405# endif 406#endif 407 408#if defined ALTZONE && !defined altzone 409extern long altzone; 410#endif 411 412/* 413** The STD_INSPIRED functions are similar, but most also need 414** declarations if time_tz is defined. 415*/ 416 417#ifdef STD_INSPIRED 418# if !defined tzsetwall || defined time_tz 419void tzsetwall(void); 420# endif 421# if !defined offtime || defined time_tz 422struct tm *offtime(time_t const *, long); 423# endif 424# if !defined timegm || defined time_tz 425time_t timegm(struct tm *); 426# endif 427# if !defined timelocal || defined time_tz 428time_t timelocal(struct tm *); 429# endif 430# if !defined timeoff || defined time_tz 431time_t timeoff(struct tm *, long); 432# endif 433# if !defined time2posix || defined time_tz 434time_t time2posix(time_t); 435# endif 436# if !defined posix2time || defined time_tz 437time_t posix2time(time_t); 438# endif 439#endif 440 441/* Infer TM_ZONE on systems where this information is known, but suppress 442 guessing if NO_TM_ZONE is defined. Similarly for TM_GMTOFF. */ 443#if (defined __GLIBC__ \ 444 || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ \ 445 || (defined __APPLE__ && defined __MACH__)) 446# if !defined TM_GMTOFF && !defined NO_TM_GMTOFF 447# define TM_GMTOFF tm_gmtoff 448# endif 449# if !defined TM_ZONE && !defined NO_TM_ZONE 450# define TM_ZONE tm_zone 451# endif 452#endif 453 454/* 455** Define functions that are ABI compatible with NetBSD but have 456** better prototypes. NetBSD 6.1.4 defines a pointer type timezone_t 457** and labors under the misconception that 'const timezone_t' is a 458** pointer to a constant. This use of 'const' is ineffective, so it 459** is not done here. What we call 'struct state' NetBSD calls 460** 'struct __state', but this is a private name so it doesn't matter. 461*/ 462#if NETBSD_INSPIRED 463typedef struct state *timezone_t; 464struct tm *localtime_rz(timezone_t restrict, time_t const *restrict, 465 struct tm *restrict); 466time_t mktime_z(timezone_t restrict, struct tm *restrict); 467timezone_t tzalloc(char const *); 468void tzfree(timezone_t); 469# ifdef STD_INSPIRED 470# if !defined posix2time_z || defined time_tz 471time_t posix2time_z(timezone_t, time_t) ATTRIBUTE_PURE; 472# endif 473# if !defined time2posix_z || defined time_tz 474time_t time2posix_z(timezone_t, time_t) ATTRIBUTE_PURE; 475# endif 476# endif 477#endif 478 479/* 480** Finally, some convenience items. 481*/ 482 483#if __STDC_VERSION__ < 199901 484# define true 1 485# define false 0 486# define bool int 487#else 488# include <stdbool.h> 489#endif 490 491#ifndef TYPE_BIT 492#define TYPE_BIT(type) (sizeof (type) * CHAR_BIT) 493#endif /* !defined TYPE_BIT */ 494 495#ifndef TYPE_SIGNED 496#define TYPE_SIGNED(type) (((type) -1) < 0) 497#endif /* !defined TYPE_SIGNED */ 498 499#define TWOS_COMPLEMENT(t) ((t) ~ (t) 0 < 0) 500 501/* Max and min values of the integer type T, of which only the bottom 502 B bits are used, and where the highest-order used bit is considered 503 to be a sign bit if T is signed. */ 504#define MAXVAL(t, b) \ 505 ((t) (((t) 1 << ((b) - 1 - TYPE_SIGNED(t))) \ 506 - 1 + ((t) 1 << ((b) - 1 - TYPE_SIGNED(t))))) 507#define MINVAL(t, b) \ 508 ((t) (TYPE_SIGNED(t) ? - TWOS_COMPLEMENT(t) - MAXVAL(t, b) : 0)) 509 510/* The minimum and maximum finite time values. This assumes no padding. */ 511static time_t const time_t_min = MINVAL(time_t, TYPE_BIT(time_t)); 512static time_t const time_t_max = MAXVAL(time_t, TYPE_BIT(time_t)); 513 514#ifndef INT_STRLEN_MAXIMUM 515/* 516** 302 / 1000 is log10(2.0) rounded up. 517** Subtract one for the sign bit if the type is signed; 518** add one for integer division truncation; 519** add one more for a minus sign if the type is signed. 520*/ 521#define INT_STRLEN_MAXIMUM(type) \ 522 ((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + \ 523 1 + TYPE_SIGNED(type)) 524#endif /* !defined INT_STRLEN_MAXIMUM */ 525 526/* 527** INITIALIZE(x) 528*/ 529 530#ifdef lint 531# define INITIALIZE(x) ((x) = 0) 532#else 533# define INITIALIZE(x) 534#endif 535 536#ifndef UNINIT_TRAP 537# define UNINIT_TRAP 0 538#endif 539 540/* 541** For the benefit of GNU folk... 542** '_(MSGID)' uses the current locale's message library string for MSGID. 543** The default is to use gettext if available, and use MSGID otherwise. 544*/ 545 546#ifndef _ 547#if HAVE_GETTEXT 548#define _(msgid) gettext(msgid) 549#else /* !HAVE_GETTEXT */ 550#define _(msgid) msgid 551#endif /* !HAVE_GETTEXT */ 552#endif /* !defined _ */ 553 554#if !defined TZ_DOMAIN && defined HAVE_GETTEXT 555# define TZ_DOMAIN "tz" 556#endif 557 558#if HAVE_INCOMPATIBLE_CTIME_R 559#undef asctime_r 560#undef ctime_r 561char *asctime_r(struct tm const *, char *); 562char *ctime_r(time_t const *, char *); 563#endif /* HAVE_INCOMPATIBLE_CTIME_R */ 564 565#ifndef YEARSPERREPEAT 566#define YEARSPERREPEAT 400 /* years before a Gregorian repeat */ 567#endif /* !defined YEARSPERREPEAT */ 568 569/* 570** The Gregorian year averages 365.2425 days, which is 31556952 seconds. 571*/ 572 573#ifndef AVGSECSPERYEAR 574#define AVGSECSPERYEAR 31556952L 575#endif /* !defined AVGSECSPERYEAR */ 576 577#ifndef SECSPERREPEAT 578#define SECSPERREPEAT ((int_fast64_t) YEARSPERREPEAT * (int_fast64_t) AVGSECSPERYEAR) 579#endif /* !defined SECSPERREPEAT */ 580 581#ifndef SECSPERREPEAT_BITS 582#define SECSPERREPEAT_BITS 34 /* ceil(log2(SECSPERREPEAT)) */ 583#endif /* !defined SECSPERREPEAT_BITS */ 584 585#endif /* !defined PRIVATE_H */ 586