1  /* Private header for tzdb code.  */
       2  
       3  #ifndef PRIVATE_H
       4  
       5  #define PRIVATE_H
       6  
       7  /*
       8  ** This file is in the public domain, so clarified as of
       9  ** 1996-06-05 by Arthur David Olson.
      10  */
      11  
      12  /*
      13  ** This header is for use ONLY with the time conversion code.
      14  ** There is no guarantee that it will remain unchanged,
      15  ** or that it will remain at all.
      16  ** Do NOT copy it to any system include directory.
      17  ** Thank you!
      18  */
      19  
      20  /*
      21  ** zdump has been made independent of the rest of the time
      22  ** conversion package to increase confidence in the verification it provides.
      23  ** You can use zdump to help in verifying other implementations.
      24  ** To do this, compile with -DUSE_LTZ=0 and link without the tz library.
      25  */
      26  #ifndef USE_LTZ
      27  # define USE_LTZ 1
      28  #endif
      29  
      30  /* This string was in the Factory zone through version 2016f.  */
      31  #define GRANDPARENTED	"Local time zone must be set--see zic manual page"
      32  
      33  /*
      34  ** Defaults for preprocessor symbols.
      35  ** You can override these in your C compiler options, e.g. '-DHAVE_GETTEXT=1'.
      36  */
      37  
      38  #ifndef HAVE_DECL_ASCTIME_R
      39  #define HAVE_DECL_ASCTIME_R 1
      40  #endif
      41  
      42  #if !defined HAVE_GENERIC && defined __has_extension
      43  # if __has_extension(c_generic_selections)
      44  #  define HAVE_GENERIC 1
      45  # else
      46  #  define HAVE_GENERIC 0
      47  # endif
      48  #endif
      49  /* _Generic is buggy in pre-4.9 GCC.  */
      50  #if !defined HAVE_GENERIC && defined __GNUC__
      51  # define HAVE_GENERIC (4 < __GNUC__ + (9 <= __GNUC_MINOR__))
      52  #endif
      53  #ifndef HAVE_GENERIC
      54  # define HAVE_GENERIC (201112 <= __STDC_VERSION__)
      55  #endif
      56  
      57  #ifndef HAVE_GETTEXT
      58  #define HAVE_GETTEXT		0
      59  #endif /* !defined HAVE_GETTEXT */
      60  
      61  #ifndef HAVE_INCOMPATIBLE_CTIME_R
      62  #define HAVE_INCOMPATIBLE_CTIME_R	0
      63  #endif
      64  
      65  #ifndef HAVE_LINK
      66  #define HAVE_LINK		1
      67  #endif /* !defined HAVE_LINK */
      68  
      69  #ifndef HAVE_POSIX_DECLS
      70  #define HAVE_POSIX_DECLS 1
      71  #endif
      72  
      73  #ifndef HAVE_STDBOOL_H
      74  #define HAVE_STDBOOL_H (199901 <= __STDC_VERSION__)
      75  #endif
      76  
      77  #ifndef HAVE_STRDUP
      78  #define HAVE_STRDUP 1
      79  #endif
      80  
      81  #ifndef HAVE_STRTOLL
      82  #define HAVE_STRTOLL 1
      83  #endif
      84  
      85  #ifndef HAVE_SYMLINK
      86  #define HAVE_SYMLINK		1
      87  #endif /* !defined HAVE_SYMLINK */
      88  
      89  #ifndef HAVE_SYS_STAT_H
      90  #define HAVE_SYS_STAT_H		1
      91  #endif /* !defined HAVE_SYS_STAT_H */
      92  
      93  #ifndef HAVE_SYS_WAIT_H
      94  #define HAVE_SYS_WAIT_H		1
      95  #endif /* !defined HAVE_SYS_WAIT_H */
      96  
      97  #ifndef HAVE_UNISTD_H
      98  #define HAVE_UNISTD_H		1
      99  #endif /* !defined HAVE_UNISTD_H */
     100  
     101  #ifndef HAVE_UTMPX_H
     102  #define HAVE_UTMPX_H		1
     103  #endif /* !defined HAVE_UTMPX_H */
     104  
     105  #ifndef NETBSD_INSPIRED
     106  # define NETBSD_INSPIRED 1
     107  #endif
     108  
     109  #if HAVE_INCOMPATIBLE_CTIME_R
     110  #define asctime_r _incompatible_asctime_r
     111  #define ctime_r _incompatible_ctime_r
     112  #endif /* HAVE_INCOMPATIBLE_CTIME_R */
     113  
     114  /* Enable tm_gmtoff, tm_zone, and environ on GNUish systems.  */
     115  #define _GNU_SOURCE 1
     116  /* Fix asctime_r on Solaris 11.  */
     117  #define _POSIX_PTHREAD_SEMANTICS 1
     118  /* Enable strtoimax on pre-C99 Solaris 11.  */
     119  #define __EXTENSIONS__ 1
     120  
     121  /* To avoid having 'stat' fail unnecessarily with errno == EOVERFLOW,
     122     enable large files on GNUish systems ...  */
     123  #ifndef _FILE_OFFSET_BITS
     124  # define _FILE_OFFSET_BITS 64
     125  #endif
     126  /* ... and on AIX ...  */
     127  #define _LARGE_FILES 1
     128  /* ... and enable large inode numbers on Mac OS X 10.5 and later.  */
     129  #define _DARWIN_USE_64_BIT_INODE 1
     130  
     131  /*
     132  ** Nested includes
     133  */
     134  
     135  /* Avoid clashes with NetBSD by renaming NetBSD's declarations.
     136     If defining the 'timezone' variable, avoid a clash with FreeBSD's
     137     'timezone' function by renaming its declaration.  */
     138  #define localtime_rz sys_localtime_rz
     139  #define mktime_z sys_mktime_z
     140  #define posix2time_z sys_posix2time_z
     141  #define time2posix_z sys_time2posix_z
     142  #if defined USG_COMPAT && USG_COMPAT == 2
     143  # define timezone sys_timezone
     144  #endif
     145  #define timezone_t sys_timezone_t
     146  #define tzalloc sys_tzalloc
     147  #define tzfree sys_tzfree
     148  #include <time.h>
     149  #undef localtime_rz
     150  #undef mktime_z
     151  #undef posix2time_z
     152  #undef time2posix_z
     153  #if defined USG_COMPAT && USG_COMPAT == 2
     154  # undef timezone
     155  #endif
     156  #undef timezone_t
     157  #undef tzalloc
     158  #undef tzfree
     159  
     160  #include <sys/types.h>	/* for time_t */
     161  #include <string.h>
     162  #include <limits.h>	/* for CHAR_BIT et al. */
     163  #include <stdlib.h>
     164  
     165  #include <errno.h>
     166  
     167  #ifndef ENAMETOOLONG
     168  # define ENAMETOOLONG EINVAL
     169  #endif
     170  #ifndef ENOTSUP
     171  # define ENOTSUP EINVAL
     172  #endif
     173  #ifndef EOVERFLOW
     174  # define EOVERFLOW EINVAL
     175  #endif
     176  
     177  #if HAVE_GETTEXT
     178  #include <libintl.h>
     179  #endif /* HAVE_GETTEXT */
     180  
     181  #if HAVE_UNISTD_H
     182  #include <unistd.h>	/* for R_OK, and other POSIX goodness */
     183  #endif /* HAVE_UNISTD_H */
     184  
     185  #ifndef HAVE_STRFTIME_L
     186  # if _POSIX_VERSION < 200809
     187  #  define HAVE_STRFTIME_L 0
     188  # else
     189  #  define HAVE_STRFTIME_L 1
     190  # endif
     191  #endif
     192  
     193  #ifndef USG_COMPAT
     194  # ifndef _XOPEN_VERSION
     195  #  define USG_COMPAT 0
     196  # else
     197  #  define USG_COMPAT 1
     198  # endif
     199  #endif
     200  
     201  #ifndef HAVE_TZNAME
     202  # if _POSIX_VERSION < 198808 && !USG_COMPAT
     203  #  define HAVE_TZNAME 0
     204  # else
     205  #  define HAVE_TZNAME 1
     206  # endif
     207  #endif
     208  
     209  #ifndef ALTZONE
     210  # if defined __sun || defined _M_XENIX
     211  #  define ALTZONE 1
     212  # else
     213  #  define ALTZONE 0
     214  # endif
     215  #endif
     216  
     217  #ifndef R_OK
     218  #define R_OK	4
     219  #endif /* !defined R_OK */
     220  
     221  /* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX. */
     222  #define is_digit(c) ((unsigned)(c) - '0' <= 9)
     223  
     224  /*
     225  ** Define HAVE_STDINT_H's default value here, rather than at the
     226  ** start, since __GLIBC__ and INTMAX_MAX's values depend on
     227  ** previously-included files.  glibc 2.1 and Solaris 10 and later have
     228  ** stdint.h, even with pre-C99 compilers.
     229  */
     230  #ifndef HAVE_STDINT_H
     231  #define HAVE_STDINT_H \
     232     (199901 <= __STDC_VERSION__ \
     233      || 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__)	\
     234      || __CYGWIN__ || INTMAX_MAX)
     235  #endif /* !defined HAVE_STDINT_H */
     236  
     237  #if HAVE_STDINT_H
     238  #include <stdint.h>
     239  #endif /* !HAVE_STDINT_H */
     240  
     241  #ifndef HAVE_INTTYPES_H
     242  # define HAVE_INTTYPES_H HAVE_STDINT_H
     243  #endif
     244  #if HAVE_INTTYPES_H
     245  # include <inttypes.h>
     246  #endif
     247  
     248  /* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX.  */
     249  #ifdef __LONG_LONG_MAX__
     250  # ifndef LLONG_MAX
     251  #  define LLONG_MAX __LONG_LONG_MAX__
     252  # endif
     253  # ifndef LLONG_MIN
     254  #  define LLONG_MIN (-1 - LLONG_MAX)
     255  # endif
     256  #endif
     257  
     258  #ifndef INT_FAST64_MAX
     259  # ifdef LLONG_MAX
     260  typedef long long	int_fast64_t;
     261  #  define INT_FAST64_MIN LLONG_MIN
     262  #  define INT_FAST64_MAX LLONG_MAX
     263  # else
     264  #  if LONG_MAX >> 31 < 0xffffffff
     265  Please use a compiler that supports a 64-bit integer type (or wider);
     266  you may need to compile with "-DHAVE_STDINT_H".
     267  #  endif
     268  typedef long		int_fast64_t;
     269  #  define INT_FAST64_MIN LONG_MIN
     270  #  define INT_FAST64_MAX LONG_MAX
     271  # endif
     272  #endif
     273  
     274  #ifndef PRIdFAST64
     275  # if INT_FAST64_MAX == LLONG_MAX
     276  #  define PRIdFAST64 "lld"
     277  # else
     278  #  define PRIdFAST64 "ld"
     279  # endif
     280  #endif
     281  
     282  #ifndef SCNdFAST64
     283  # define SCNdFAST64 PRIdFAST64
     284  #endif
     285  
     286  #ifndef INT_FAST32_MAX
     287  # if INT_MAX >> 31 == 0
     288  typedef long int_fast32_t;
     289  #  define INT_FAST32_MAX LONG_MAX
     290  #  define INT_FAST32_MIN LONG_MIN
     291  # else
     292  typedef int int_fast32_t;
     293  #  define INT_FAST32_MAX INT_MAX
     294  #  define INT_FAST32_MIN INT_MIN
     295  # endif
     296  #endif
     297  
     298  #ifndef INTMAX_MAX
     299  # ifdef LLONG_MAX
     300  typedef long long intmax_t;
     301  #  if HAVE_STRTOLL
     302  #   define strtoimax strtoll
     303  #  endif
     304  #  define INTMAX_MAX LLONG_MAX
     305  #  define INTMAX_MIN LLONG_MIN
     306  # else
     307  typedef long intmax_t;
     308  #  define INTMAX_MAX LONG_MAX
     309  #  define INTMAX_MIN LONG_MIN
     310  # endif
     311  # ifndef strtoimax
     312  #  define strtoimax strtol
     313  # endif
     314  #endif
     315  
     316  #ifndef PRIdMAX
     317  # if INTMAX_MAX == LLONG_MAX
     318  #  define PRIdMAX "lld"
     319  # else
     320  #  define PRIdMAX "ld"
     321  # endif
     322  #endif
     323  
     324  #ifndef UINT_FAST64_MAX
     325  # if defined ULLONG_MAX || defined __LONG_LONG_MAX__
     326  typedef unsigned long long uint_fast64_t;
     327  # else
     328  #  if ULONG_MAX >> 31 >> 1 < 0xffffffff
     329  Please use a compiler that supports a 64-bit integer type (or wider);
     330  you may need to compile with "-DHAVE_STDINT_H".
     331  #  endif
     332  typedef unsigned long	uint_fast64_t;
     333  # endif
     334  #endif
     335  
     336  #ifndef UINTMAX_MAX
     337  # if defined ULLONG_MAX || defined __LONG_LONG_MAX__
     338  typedef unsigned long long uintmax_t;
     339  # else
     340  typedef unsigned long uintmax_t;
     341  # endif
     342  #endif
     343  
     344  #ifndef PRIuMAX
     345  # if defined ULLONG_MAX || defined __LONG_LONG_MAX__
     346  #  define PRIuMAX "llu"
     347  # else
     348  #  define PRIuMAX "lu"
     349  # endif
     350  #endif
     351  
     352  #ifndef INT32_MAX
     353  #define INT32_MAX 0x7fffffff
     354  #endif /* !defined INT32_MAX */
     355  #ifndef INT32_MIN
     356  #define INT32_MIN (-1 - INT32_MAX)
     357  #endif /* !defined INT32_MIN */
     358  
     359  #ifndef SIZE_MAX
     360  #define SIZE_MAX ((size_t) -1)
     361  #endif
     362  
     363  #if 3 <= __GNUC__
     364  # define ATTRIBUTE_CONST __attribute__ ((const))
     365  # define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
     366  # define ATTRIBUTE_PURE __attribute__ ((__pure__))
     367  # define ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
     368  #else
     369  # define ATTRIBUTE_CONST /* empty */
     370  # define ATTRIBUTE_MALLOC /* empty */
     371  # define ATTRIBUTE_PURE /* empty */
     372  # define ATTRIBUTE_FORMAT(spec) /* empty */
     373  #endif
     374  
     375  #if !defined _Noreturn && __STDC_VERSION__ < 201112
     376  # if 2 < __GNUC__ + (8 <= __GNUC_MINOR__)
     377  #  define _Noreturn __attribute__ ((__noreturn__))
     378  # else
     379  #  define _Noreturn
     380  # endif
     381  #endif
     382  
     383  #if __STDC_VERSION__ < 199901 && !defined restrict
     384  # define restrict /* empty */
     385  #endif
     386  
     387  /*
     388  ** Workarounds for compilers/systems.
     389  */
     390  
     391  #ifndef EPOCH_LOCAL
     392  # define EPOCH_LOCAL 0
     393  #endif
     394  #ifndef EPOCH_OFFSET
     395  # define EPOCH_OFFSET 0
     396  #endif
     397  #ifndef RESERVE_STD_EXT_IDS
     398  # define RESERVE_STD_EXT_IDS 0
     399  #endif
     400  
     401  /* If standard C identifiers with external linkage (e.g., localtime)
     402     are reserved and are not already being renamed anyway, rename them
     403     as if compiling with '-Dtime_tz=time_t'.  */
     404  #if !defined time_tz && RESERVE_STD_EXT_IDS && USE_LTZ
     405  # define time_tz time_t
     406  #endif
     407  
     408  /*
     409  ** Compile with -Dtime_tz=T to build the tz package with a private
     410  ** time_t type equivalent to T rather than the system-supplied time_t.
     411  ** This debugging feature can test unusual design decisions
     412  ** (e.g., time_t wider than 'long', or unsigned time_t) even on
     413  ** typical platforms.
     414  */
     415  #if defined time_tz || EPOCH_LOCAL || EPOCH_OFFSET != 0
     416  # define TZ_TIME_T 1
     417  #else
     418  # define TZ_TIME_T 0
     419  #endif
     420  
     421  #if TZ_TIME_T
     422  # ifdef LOCALTIME_IMPLEMENTATION
     423  static time_t sys_time(time_t *x) { return time(x); }
     424  # endif
     425  
     426  typedef time_tz tz_time_t;
     427  
     428  # undef  asctime
     429  # define asctime tz_asctime
     430  # undef  asctime_r
     431  # define asctime_r tz_asctime_r
     432  # undef  ctime
     433  # define ctime tz_ctime
     434  # undef  ctime_r
     435  # define ctime_r tz_ctime_r
     436  # undef  difftime
     437  # define difftime tz_difftime
     438  # undef  gmtime
     439  # define gmtime tz_gmtime
     440  # undef  gmtime_r
     441  # define gmtime_r tz_gmtime_r
     442  # undef  localtime
     443  # define localtime tz_localtime
     444  # undef  localtime_r
     445  # define localtime_r tz_localtime_r
     446  # undef  localtime_rz
     447  # define localtime_rz tz_localtime_rz
     448  # undef  mktime
     449  # define mktime tz_mktime
     450  # undef  mktime_z
     451  # define mktime_z tz_mktime_z
     452  # undef  offtime
     453  # define offtime tz_offtime
     454  # undef  posix2time
     455  # define posix2time tz_posix2time
     456  # undef  posix2time_z
     457  # define posix2time_z tz_posix2time_z
     458  # undef  strftime
     459  # define strftime tz_strftime
     460  # undef  time
     461  # define time tz_time
     462  # undef  time2posix
     463  # define time2posix tz_time2posix
     464  # undef  time2posix_z
     465  # define time2posix_z tz_time2posix_z
     466  # undef  time_t
     467  # define time_t tz_time_t
     468  # undef  timegm
     469  # define timegm tz_timegm
     470  # undef  timelocal
     471  # define timelocal tz_timelocal
     472  # undef  timeoff
     473  # define timeoff tz_timeoff
     474  # undef  tzalloc
     475  # define tzalloc tz_tzalloc
     476  # undef  tzfree
     477  # define tzfree tz_tzfree
     478  # undef  tzset
     479  # define tzset tz_tzset
     480  # undef  tzsetwall
     481  # define tzsetwall tz_tzsetwall
     482  # if HAVE_STRFTIME_L
     483  #  undef  strftime_l
     484  #  define strftime_l tz_strftime_l
     485  # endif
     486  # if HAVE_TZNAME
     487  #  undef  tzname
     488  #  define tzname tz_tzname
     489  # endif
     490  # if USG_COMPAT
     491  #  undef  daylight
     492  #  define daylight tz_daylight
     493  #  undef  timezone
     494  #  define timezone tz_timezone
     495  # endif
     496  # if ALTZONE
     497  #  undef  altzone
     498  #  define altzone tz_altzone
     499  # endif
     500  
     501  char *asctime(struct tm const *);
     502  char *asctime_r(struct tm const *restrict, char *restrict);
     503  char *ctime(time_t const *);
     504  char *ctime_r(time_t const *, char *);
     505  double difftime(time_t, time_t) ATTRIBUTE_CONST;
     506  size_t strftime(char *restrict, size_t, char const *restrict,
     507  		struct tm const *restrict);
     508  # if HAVE_STRFTIME_L
     509  size_t strftime_l(char *restrict, size_t, char const *restrict,
     510  		  struct tm const *restrict, locale_t);
     511  # endif
     512  struct tm *gmtime(time_t const *);
     513  struct tm *gmtime_r(time_t const *restrict, struct tm *restrict);
     514  struct tm *localtime(time_t const *);
     515  struct tm *localtime_r(time_t const *restrict, struct tm *restrict);
     516  time_t mktime(struct tm *);
     517  time_t time(time_t *);
     518  void tzset(void);
     519  #endif
     520  
     521  #if !HAVE_DECL_ASCTIME_R && !defined asctime_r
     522  extern char *asctime_r(struct tm const *restrict, char *restrict);
     523  #endif
     524  
     525  #ifndef HAVE_DECL_ENVIRON
     526  # if defined environ || defined __USE_GNU
     527  #  define HAVE_DECL_ENVIRON 1
     528  # else
     529  #  define HAVE_DECL_ENVIRON 0
     530  # endif
     531  #endif
     532  
     533  #if !HAVE_DECL_ENVIRON
     534  extern char **environ;
     535  #endif
     536  
     537  #if 2 <= HAVE_TZNAME + (TZ_TIME_T || !HAVE_POSIX_DECLS)
     538  extern char *tzname[];
     539  #endif
     540  #if 2 <= USG_COMPAT + (TZ_TIME_T || !HAVE_POSIX_DECLS)
     541  extern long timezone;
     542  extern int daylight;
     543  #endif
     544  #if 2 <= ALTZONE + (TZ_TIME_T || !HAVE_POSIX_DECLS)
     545  extern long altzone;
     546  #endif
     547  
     548  /*
     549  ** The STD_INSPIRED functions are similar, but most also need
     550  ** declarations if time_tz is defined.
     551  */
     552  
     553  #ifdef STD_INSPIRED
     554  # if TZ_TIME_T || !defined tzsetwall
     555  void tzsetwall(void);
     556  # endif
     557  # if TZ_TIME_T || !defined offtime
     558  struct tm *offtime(time_t const *, long);
     559  # endif
     560  # if TZ_TIME_T || !defined timegm
     561  time_t timegm(struct tm *);
     562  # endif
     563  # if TZ_TIME_T || !defined timelocal
     564  time_t timelocal(struct tm *);
     565  # endif
     566  # if TZ_TIME_T || !defined timeoff
     567  time_t timeoff(struct tm *, long);
     568  # endif
     569  # if TZ_TIME_T || !defined time2posix
     570  time_t time2posix(time_t);
     571  # endif
     572  # if TZ_TIME_T || !defined posix2time
     573  time_t posix2time(time_t);
     574  # endif
     575  #endif
     576  
     577  /* Infer TM_ZONE on systems where this information is known, but suppress
     578     guessing if NO_TM_ZONE is defined.  Similarly for TM_GMTOFF.  */
     579  #if (defined __GLIBC__ \
     580       || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ \
     581       || (defined __APPLE__ && defined __MACH__))
     582  # if !defined TM_GMTOFF && !defined NO_TM_GMTOFF
     583  #  define TM_GMTOFF tm_gmtoff
     584  # endif
     585  # if !defined TM_ZONE && !defined NO_TM_ZONE
     586  #  define TM_ZONE tm_zone
     587  # endif
     588  #endif
     589  
     590  /*
     591  ** Define functions that are ABI compatible with NetBSD but have
     592  ** better prototypes.  NetBSD 6.1.4 defines a pointer type timezone_t
     593  ** and labors under the misconception that 'const timezone_t' is a
     594  ** pointer to a constant.  This use of 'const' is ineffective, so it
     595  ** is not done here.  What we call 'struct state' NetBSD calls
     596  ** 'struct __state', but this is a private name so it doesn't matter.
     597  */
     598  #if NETBSD_INSPIRED
     599  typedef struct state *timezone_t;
     600  struct tm *localtime_rz(timezone_t restrict, time_t const *restrict,
     601  			struct tm *restrict);
     602  time_t mktime_z(timezone_t restrict, struct tm *restrict);
     603  timezone_t tzalloc(char const *);
     604  void tzfree(timezone_t);
     605  # ifdef STD_INSPIRED
     606  #  if TZ_TIME_T || !defined posix2time_z
     607  time_t posix2time_z(timezone_t, time_t) ATTRIBUTE_PURE;
     608  #  endif
     609  #  if TZ_TIME_T || !defined time2posix_z
     610  time_t time2posix_z(timezone_t, time_t) ATTRIBUTE_PURE;
     611  #  endif
     612  # endif
     613  #endif
     614  
     615  /*
     616  ** Finally, some convenience items.
     617  */
     618  
     619  #if HAVE_STDBOOL_H
     620  # include <stdbool.h>
     621  #else
     622  # define true 1
     623  # define false 0
     624  # define bool int
     625  #endif
     626  
     627  #define TYPE_BIT(type)	(sizeof (type) * CHAR_BIT)
     628  #define TYPE_SIGNED(type) (((type) -1) < 0)
     629  #define TWOS_COMPLEMENT(t) ((t) ~ (t) 0 < 0)
     630  
     631  /* Max and min values of the integer type T, of which only the bottom
     632     B bits are used, and where the highest-order used bit is considered
     633     to be a sign bit if T is signed.  */
     634  #define MAXVAL(t, b)						\
     635    ((t) (((t) 1 << ((b) - 1 - TYPE_SIGNED(t)))			\
     636  	- 1 + ((t) 1 << ((b) - 1 - TYPE_SIGNED(t)))))
     637  #define MINVAL(t, b)						\
     638    ((t) (TYPE_SIGNED(t) ? - TWOS_COMPLEMENT(t) - MAXVAL(t, b) : 0))
     639  
     640  /* The extreme time values, assuming no padding.  */
     641  #define TIME_T_MIN_NO_PADDING MINVAL(time_t, TYPE_BIT(time_t))
     642  #define TIME_T_MAX_NO_PADDING MAXVAL(time_t, TYPE_BIT(time_t))
     643  
     644  /* The extreme time values.  These are macros, not constants, so that
     645     any portability problem occur only when compiling .c files that use
     646     the macros, which is safer for applications that need only zdump and zic.
     647     This implementation assumes no padding if time_t is signed and
     648     either the compiler lacks support for _Generic or time_t is not one
     649     of the standard signed integer types.  */
     650  #if HAVE_GENERIC
     651  # define TIME_T_MIN \
     652      _Generic((time_t) 0, \
     653  	     signed char: SCHAR_MIN, short: SHRT_MIN, \
     654  	     int: INT_MIN, long: LONG_MIN, long long: LLONG_MIN, \
     655  	     default: TIME_T_MIN_NO_PADDING)
     656  # define TIME_T_MAX \
     657      (TYPE_SIGNED(time_t) \
     658       ? _Generic((time_t) 0, \
     659  		signed char: SCHAR_MAX, short: SHRT_MAX, \
     660  		int: INT_MAX, long: LONG_MAX, long long: LLONG_MAX, \
     661  		default: TIME_T_MAX_NO_PADDING)			    \
     662       : (time_t) -1)
     663  #else
     664  # define TIME_T_MIN TIME_T_MIN_NO_PADDING
     665  # define TIME_T_MAX TIME_T_MAX_NO_PADDING
     666  #endif
     667  
     668  /*
     669  ** 302 / 1000 is log10(2.0) rounded up.
     670  ** Subtract one for the sign bit if the type is signed;
     671  ** add one for integer division truncation;
     672  ** add one more for a minus sign if the type is signed.
     673  */
     674  #define INT_STRLEN_MAXIMUM(type) \
     675  	((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + \
     676  	1 + TYPE_SIGNED(type))
     677  
     678  /*
     679  ** INITIALIZE(x)
     680  */
     681  
     682  #ifdef GCC_LINT
     683  # define INITIALIZE(x)	((x) = 0)
     684  #else
     685  # define INITIALIZE(x)
     686  #endif
     687  
     688  #ifndef UNINIT_TRAP
     689  # define UNINIT_TRAP 0
     690  #endif
     691  
     692  /*
     693  ** For the benefit of GNU folk...
     694  ** '_(MSGID)' uses the current locale's message library string for MSGID.
     695  ** The default is to use gettext if available, and use MSGID otherwise.
     696  */
     697  
     698  #if HAVE_GETTEXT
     699  #define _(msgid) gettext(msgid)
     700  #else /* !HAVE_GETTEXT */
     701  #define _(msgid) msgid
     702  #endif /* !HAVE_GETTEXT */
     703  
     704  #if !defined TZ_DOMAIN && defined HAVE_GETTEXT
     705  # define TZ_DOMAIN "tz"
     706  #endif
     707  
     708  #if HAVE_INCOMPATIBLE_CTIME_R
     709  #undef asctime_r
     710  #undef ctime_r
     711  char *asctime_r(struct tm const *, char *);
     712  char *ctime_r(time_t const *, char *);
     713  #endif /* HAVE_INCOMPATIBLE_CTIME_R */
     714  
     715  /* Handy macros that are independent of tzfile implementation.  */
     716  
     717  #define YEARSPERREPEAT		400	/* years before a Gregorian repeat */
     718  
     719  #define SECSPERMIN	60
     720  #define MINSPERHOUR	60
     721  #define HOURSPERDAY	24
     722  #define DAYSPERWEEK	7
     723  #define DAYSPERNYEAR	365
     724  #define DAYSPERLYEAR	366
     725  #define SECSPERHOUR	(SECSPERMIN * MINSPERHOUR)
     726  #define SECSPERDAY	((int_fast32_t) SECSPERHOUR * HOURSPERDAY)
     727  #define MONSPERYEAR	12
     728  
     729  #define TM_SUNDAY	0
     730  #define TM_MONDAY	1
     731  #define TM_TUESDAY	2
     732  #define TM_WEDNESDAY	3
     733  #define TM_THURSDAY	4
     734  #define TM_FRIDAY	5
     735  #define TM_SATURDAY	6
     736  
     737  #define TM_JANUARY	0
     738  #define TM_FEBRUARY	1
     739  #define TM_MARCH	2
     740  #define TM_APRIL	3
     741  #define TM_MAY		4
     742  #define TM_JUNE		5
     743  #define TM_JULY		6
     744  #define TM_AUGUST	7
     745  #define TM_SEPTEMBER	8
     746  #define TM_OCTOBER	9
     747  #define TM_NOVEMBER	10
     748  #define TM_DECEMBER	11
     749  
     750  #define TM_YEAR_BASE	1900
     751  
     752  #define EPOCH_YEAR	1970
     753  #define EPOCH_WDAY	TM_THURSDAY
     754  
     755  #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
     756  
     757  /*
     758  ** Since everything in isleap is modulo 400 (or a factor of 400), we know that
     759  **	isleap(y) == isleap(y % 400)
     760  ** and so
     761  **	isleap(a + b) == isleap((a + b) % 400)
     762  ** or
     763  **	isleap(a + b) == isleap(a % 400 + b % 400)
     764  ** This is true even if % means modulo rather than Fortran remainder
     765  ** (which is allowed by C89 but not by C99 or later).
     766  ** We use this to avoid addition overflow problems.
     767  */
     768  
     769  #define isleap_sum(a, b)	isleap((a) % 400 + (b) % 400)
     770  
     771  
     772  /*
     773  ** The Gregorian year averages 365.2425 days, which is 31556952 seconds.
     774  */
     775  
     776  #define AVGSECSPERYEAR		31556952L
     777  #define SECSPERREPEAT \
     778    ((int_fast64_t) YEARSPERREPEAT * (int_fast64_t) AVGSECSPERYEAR)
     779  #define SECSPERREPEAT_BITS	34	/* ceil(log2(SECSPERREPEAT)) */
     780  
     781  #endif /* !defined PRIVATE_H */