1 /*-------------------------------------------------------------------------
2  *
3  * pgtz.h
4  *	  Timezone Library Integration Functions
5  *
6  * Note: this file contains only definitions that are private to the
7  * timezone library.  Public definitions are in pgtime.h.
8  *
9  * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
10  *
11  * IDENTIFICATION
12  *	  src/timezone/pgtz.h
13  *
14  *-------------------------------------------------------------------------
15  */
16 #ifndef _PGTZ_H
17 #define _PGTZ_H
18 
19 #include "pgtime.h"
20 #include "tzfile.h"
21 
22 
23 #define SMALLEST(a, b)	(((a) < (b)) ? (a) : (b))
24 #define BIGGEST(a, b)	(((a) > (b)) ? (a) : (b))
25 
26 struct ttinfo
27 {								/* time type information */
28 	int32		tt_utoff;		/* UT offset in seconds */
29 	bool		tt_isdst;		/* used to set tm_isdst */
30 	int			tt_desigidx;	/* abbreviation list index */
31 	bool		tt_ttisstd;		/* transition is std time */
32 	bool		tt_ttisut;		/* transition is UT */
33 };
34 
35 struct lsinfo
36 {								/* leap second information */
37 	pg_time_t	ls_trans;		/* transition time */
38 	int64		ls_corr;		/* correction to apply */
39 };
40 
41 struct state
42 {
43 	int			leapcnt;
44 	int			timecnt;
45 	int			typecnt;
46 	int			charcnt;
47 	bool		goback;
48 	bool		goahead;
49 	pg_time_t	ats[TZ_MAX_TIMES];
50 	unsigned char types[TZ_MAX_TIMES];
51 	struct ttinfo ttis[TZ_MAX_TYPES];
52 	char		chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + 1, 4 /* sizeof gmt */ ),
53 							  (2 * (TZ_STRLEN_MAX + 1)))];
54 	struct lsinfo lsis[TZ_MAX_LEAPS];
55 
56 	/*
57 	 * The time type to use for early times or if no transitions. It is always
58 	 * zero for recent tzdb releases. It might be nonzero for data from tzdb
59 	 * 2018e or earlier.
60 	 */
61 	int			defaulttype;
62 };
63 
64 
65 struct pg_tz
66 {
67 	/* TZname contains the canonically-cased name of the timezone */
68 	char		TZname[TZ_STRLEN_MAX + 1];
69 	struct state state;
70 };
71 
72 
73 /* in pgtz.c */
74 extern int	pg_open_tzfile(const char *name, char *canonname);
75 
76 /* in localtime.c */
77 extern int	tzload(const char *name, char *canonname, struct state *sp,
78 				   bool doextend);
79 extern bool tzparse(const char *name, struct state *sp, bool lastditch);
80 
81 #endif							/* _PGTZ_H */
82