1/** @file
2    Definitions private to the Implementation of <time.h>.
3
4    Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
5    This program and the accompanying materials are licensed and made available under
6    the terms and conditions of the BSD License that accompanies this distribution.
7    The full text of the license may be found at
8    http://opensource.org/licenses/bsd-license.php.
9
10    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13  Portions derived from the NIH time zone package files,
14  which contain the following notice:
15
16    This file is in the public domain, so clarified as of
17    1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov).
18**/
19#ifndef _TIMEVAL_H
20#define _TIMEVAL_H
21
22extern struct state * lclptr;
23extern struct state * gmtptr;
24extern char         * tzname[2];
25extern const char     gmt[4];
26extern const char     wildabbr[9];
27extern const int      year_lengths[2];
28extern const int      mon_lengths[2][MONSPERYEAR];
29extern long int       timezone;
30extern int            daylight;
31
32#define EFI_UNSPECIFIED_TIMEZONE  0x07FF
33
34/*
35** The DST rules to use if TZ has no rules and we can't load TZDEFRULES.
36** We default to US rules as of 1999-08-17.
37** POSIX 1003.1 section 8.1.1 says that the default DST rules are
38** implementation dependent; for historical reasons, US rules are a
39** common default.
40*/
41#ifndef TZDEFRULESTRING
42#define TZDEFRULESTRING ",M4.1.0,M10.5.0"
43#endif
44
45// Facilities for external time-zone definition files do not currently exist
46#define NO_ZONEINFO_FILES
47
48#define EPOCH_DAY     5
49#define DAY_TO_uSEC   86400000000
50
51/* Rule type values for the r_type member of a rule structure */
52#define JULIAN_DAY            0   /* Jn - Julian day */
53#define DAY_OF_YEAR           1   /* n - day of year */
54#define MONTH_NTH_DAY_OF_WEEK 2   /* Mm.n.d - month, week, day of week */
55
56#ifdef TZNAME_MAX
57  #define MY_TZNAME_MAX TZNAME_MAX
58#endif /* defined TZNAME_MAX */
59
60#ifndef TZNAME_MAX
61  #define MY_TZNAME_MAX 255
62#endif /* !defined TZNAME_MAX */
63
64/* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX.  */
65#define is_digit(c) ((unsigned)(c) - '0' <= 9)
66
67#define LEAPS_THRU_END_OF(y)  ((y) / 4 - (y) / 100 + (y) / 400)
68
69#define BIGGEST(a, b) (((a) > (b)) ? (a) : (b))
70
71#ifndef INITIALIZE
72#define INITIALIZE(x) ((x) = 0)
73#endif /* !defined INITIALIZE */
74
75struct ttinfo {       /* time type information */
76  LONG32    tt_gmtoff;  /* UTC offset in seconds */
77  int   tt_isdst; /* used to set tm_isdst */
78  int   tt_abbrind; /* abbreviation list index */
79  int   tt_ttisstd; /* TRUE if transition is std time */
80  int   tt_ttisgmt; /* TRUE if transition is UTC */
81};
82
83struct lsinfo {       /* leap second information */
84  time_t    ls_trans; /* transition time */
85  LONG32    ls_corr;  /* correction to apply */
86};
87
88struct state {
89  int           leapcnt;
90  int           timecnt;
91  int           typecnt;
92  int           charcnt;
93  time_t        ats[TZ_MAX_TIMES];
94  unsigned char types[TZ_MAX_TIMES];
95  struct ttinfo ttis[TZ_MAX_TYPES];
96  char          chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + 1, sizeof gmt), (2 * (MY_TZNAME_MAX + 1)))];
97  struct lsinfo lsis[TZ_MAX_LEAPS];
98};
99
100struct rule {
101  int     r_type;   /* type of rule--see below */
102  int     r_day;    /* day number of rule */
103  int     r_week;   /* week number of rule */
104  int     r_mon;    /* month number of rule */
105  LONG32    r_time;   /* transition time of rule */
106};
107
108#define JULIAN_DAY    0 /* Jn - Julian day */
109#define DAY_OF_YEAR   1 /* n - day of year */
110#define MONTH_NTH_DAY_OF_WEEK 2 /* Mm.n.d - month, week, day of week */
111
112__BEGIN_DECLS
113extern void gmtload(struct state * const sp);
114extern void tzset(void);
115__END_DECLS
116
117#endif  /* _TIMEVAL_H */
118