PostgreSQL Source Code git master
Loading...
Searching...
No Matches
pgtz.h File Reference
#include "pgtime.h"
#include "tzfile.h"
Include dependency graph for pgtz.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ttinfo
 
struct  lsinfo
 
struct  state
 
struct  pg_tz
 

Macros

#define SMALLEST(a, b)   (((a) < (b)) ? (a) : (b))
 
#define BIGGEST(a, b)   (((a) > (b)) ? (a) : (b))
 

Functions

int pg_open_tzfile (const char *name, char *canonname)
 
int tzload (const char *name, char *canonname, struct state *sp, bool doextend)
 
bool tzparse (const char *name, struct state *sp, bool lastditch)
 

Macro Definition Documentation

◆ BIGGEST

#define BIGGEST (   a,
  b 
)    (((a) > (b)) ? (a) : (b))

Definition at line 24 of file pgtz.h.

◆ SMALLEST

#define SMALLEST (   a,
  b 
)    (((a) < (b)) ? (a) : (b))

Definition at line 23 of file pgtz.h.

Function Documentation

◆ pg_open_tzfile()

int pg_open_tzfile ( const char name,
char canonname 
)
extern

Definition at line 65 of file findtimezone.c.

66{
67 char fullname[MAXPGPATH];
68
69 if (canonname)
71
72 strlcpy(fullname, pg_TZDIR(), sizeof(fullname));
73 if (strlen(fullname) + 1 + strlen(name) >= MAXPGPATH)
74 return -1; /* not gonna fit */
75 strcat(fullname, "/");
77
78 return open(fullname, O_RDONLY | PG_BINARY, 0);
79}
#define PG_BINARY
Definition c.h:1374
static const char * pg_TZDIR(void)
#define MAXPGPATH
#define TZ_STRLEN_MAX
Definition pgtime.h:54
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition strlcpy.c:45
static int fb(int x)
const char * name

References fb(), MAXPGPATH, name, PG_BINARY, pg_TZDIR(), pg_TZDIR(), result, scan_directory_ci(), strlcpy(), and TZ_STRLEN_MAX.

Referenced by tzloadbody().

◆ tzload()

int tzload ( const char name,
char canonname,
struct state sp,
bool  doextend 
)
extern

Definition at line 589 of file localtime.c.

590{
591 union local_storage *lsp = malloc(sizeof *lsp);
592
593 if (!lsp)
594 return errno;
595 else
596 {
598
599 free(lsp);
600 return err;
601 }
602}
void err(int eval, const char *fmt,...)
Definition err.c:43
static int tzloadbody(char const *name, char *canonname, struct state *sp, bool doextend, union local_storage *lsp)
Definition localtime.c:212
#define free(a)
#define malloc(a)

References err(), fb(), free, malloc, name, and tzloadbody().

Referenced by gmtload(), pg_load_tz(), pg_tzenumerate_next(), and pg_tzset().

◆ tzparse()

bool tzparse ( const char name,
struct state sp,
bool  lastditch 
)
extern

Definition at line 939 of file localtime.c.

940{
941 const char *stdname;
942 const char *dstname = NULL;
943 size_t stdlen;
944 size_t dstlen;
945 size_t charcnt;
948 char *cp;
949 bool load_ok;
950
951 stdname = name;
952 if (lastditch)
953 {
954 /* Unlike IANA, don't assume name is exactly "GMT" */
955 stdlen = strlen(name); /* length of standard zone name */
956 name += stdlen;
957 stdoffset = 0;
958 }
959 else
960 {
961 if (*name == '<')
962 {
963 name++;
964 stdname = name;
965 name = getqzname(name, '>');
966 if (*name != '>')
967 return false;
968 stdlen = name - stdname;
969 name++;
970 }
971 else
972 {
973 name = getzname(name);
974 stdlen = name - stdname;
975 }
976 if (*name == '\0') /* we allow empty STD abbrev, unlike IANA */
977 return false;
979 if (name == NULL)
980 return false;
981 }
982 charcnt = stdlen + 1;
983 if (sizeof sp->chars < charcnt)
984 return false;
985
986 /*
987 * The IANA code always tries to tzload(TZDEFRULES) here. We do not want
988 * to do that; it would be bad news in the lastditch case, where we can't
989 * assume pg_open_tzfile() is sane yet. Moreover, if we did load it and
990 * it contains leap-second-dependent info, that would cause problems too.
991 * Finally, IANA has deprecated the TZDEFRULES feature, so it presumably
992 * will die at some point. Desupporting it now seems like good
993 * future-proofing.
994 */
995 load_ok = false;
996 sp->goback = sp->goahead = false; /* simulate failed tzload() */
997 sp->leapcnt = 0; /* intentionally assume no leap seconds */
998
999 if (*name != '\0')
1000 {
1001 if (*name == '<')
1002 {
1003 dstname = ++name;
1004 name = getqzname(name, '>');
1005 if (*name != '>')
1006 return false;
1007 dstlen = name - dstname;
1008 name++;
1009 }
1010 else
1011 {
1012 dstname = name;
1013 name = getzname(name);
1014 dstlen = name - dstname; /* length of DST abbr. */
1015 }
1016 if (!dstlen)
1017 return false;
1018 charcnt += dstlen + 1;
1019 if (sizeof sp->chars < charcnt)
1020 return false;
1021 if (*name != '\0' && *name != ',' && *name != ';')
1022 {
1024 if (name == NULL)
1025 return false;
1026 }
1027 else
1029 if (*name == '\0' && !load_ok)
1031 if (*name == ',' || *name == ';')
1032 {
1033 struct rule start;
1034 struct rule end;
1035 int year;
1036 int yearlim;
1037 int timecnt;
1040 int yearbeg;
1041
1042 ++name;
1043 if ((name = getrule(name, &start)) == NULL)
1044 return false;
1045 if (*name++ != ',')
1046 return false;
1047 if ((name = getrule(name, &end)) == NULL)
1048 return false;
1049 if (*name != '\0')
1050 return false;
1051 sp->typecnt = 2; /* standard time and DST */
1052
1053 /*
1054 * Two transitions per year, from EPOCH_YEAR forward.
1055 */
1056 init_ttinfo(&sp->ttis[0], -stdoffset, false, 0);
1057 init_ttinfo(&sp->ttis[1], -dstoffset, true, stdlen + 1);
1058 sp->defaulttype = 0;
1059 timecnt = 0;
1060 janfirst = 0;
1062
1063 do
1064 {
1067
1068 yearbeg--;
1070 {
1072 break;
1073 }
1074 } while (EPOCH_YEAR - YEARSPERREPEAT / 2 < yearbeg);
1075
1077 for (year = yearbeg; year < yearlim; year++)
1078 {
1080 starttime = transtime(year, &start, stdoffset),
1081 endtime = transtime(year, &end, dstoffset);
1083 yearsecs = (year_lengths[isleap(year)]
1084 * SECSPERDAY);
1085 bool reversed = endtime < starttime;
1086
1087 if (reversed)
1088 {
1089 int_fast32_t swap = starttime;
1090
1091 starttime = endtime;
1092 endtime = swap;
1093 }
1094 if (reversed
1095 || (starttime < endtime
1096 && (endtime - starttime
1097 < (yearsecs
1098 + (stdoffset - dstoffset)))))
1099 {
1100 if (TZ_MAX_TIMES - 2 < timecnt)
1101 break;
1102 sp->ats[timecnt] = janfirst;
1104 (&sp->ats[timecnt],
1105 janoffset + starttime))
1106 sp->types[timecnt++] = !reversed;
1107 sp->ats[timecnt] = janfirst;
1109 (&sp->ats[timecnt],
1110 janoffset + endtime))
1111 {
1112 sp->types[timecnt++] = reversed;
1113 yearlim = year + YEARSPERREPEAT + 1;
1114 }
1115 }
1118 break;
1119 janoffset = 0;
1120 }
1121 sp->timecnt = timecnt;
1122 if (!timecnt)
1123 {
1124 sp->ttis[0] = sp->ttis[1];
1125 sp->typecnt = 1; /* Perpetual DST. */
1126 }
1127 else if (YEARSPERREPEAT < year - yearbeg)
1128 sp->goback = sp->goahead = true;
1129 }
1130 else
1131 {
1135 bool isdst;
1136 int i;
1137 int j;
1138
1139 if (*name != '\0')
1140 return false;
1141
1142 /*
1143 * Initial values of theirstdoffset and theirdstoffset.
1144 */
1145 theirstdoffset = 0;
1146 for (i = 0; i < sp->timecnt; ++i)
1147 {
1148 j = sp->types[i];
1149 if (!sp->ttis[j].tt_isdst)
1150 {
1152 -sp->ttis[j].tt_utoff;
1153 break;
1154 }
1155 }
1156 theirdstoffset = 0;
1157 for (i = 0; i < sp->timecnt; ++i)
1158 {
1159 j = sp->types[i];
1160 if (sp->ttis[j].tt_isdst)
1161 {
1163 -sp->ttis[j].tt_utoff;
1164 break;
1165 }
1166 }
1167
1168 /*
1169 * Initially we're assumed to be in standard time.
1170 */
1171 isdst = false;
1173
1174 /*
1175 * Now juggle transition times and types tracking offsets as you
1176 * do.
1177 */
1178 for (i = 0; i < sp->timecnt; ++i)
1179 {
1180 j = sp->types[i];
1181 sp->types[i] = sp->ttis[j].tt_isdst;
1182 if (sp->ttis[j].tt_ttisut)
1183 {
1184 /* No adjustment to transition time */
1185 }
1186 else
1187 {
1188 /*
1189 * If daylight saving time is in effect, and the
1190 * transition time was not specified as standard time, add
1191 * the daylight saving time offset to the transition time;
1192 * otherwise, add the standard time offset to the
1193 * transition time.
1194 */
1195 /*
1196 * Transitions from DST to DDST will effectively disappear
1197 * since POSIX provides for only one DST offset.
1198 */
1199 if (isdst && !sp->ttis[j].tt_ttisstd)
1200 {
1201 sp->ats[i] += dstoffset -
1203 }
1204 else
1205 {
1206 sp->ats[i] += stdoffset -
1208 }
1209 }
1210 theiroffset = -sp->ttis[j].tt_utoff;
1211 if (sp->ttis[j].tt_isdst)
1213 else
1215 }
1216
1217 /*
1218 * Finally, fill in ttis.
1219 */
1220 init_ttinfo(&sp->ttis[0], -stdoffset, false, 0);
1221 init_ttinfo(&sp->ttis[1], -dstoffset, true, stdlen + 1);
1222 sp->typecnt = 2;
1223 sp->defaulttype = 0;
1224 }
1225 }
1226 else
1227 {
1228 dstlen = 0;
1229 sp->typecnt = 1; /* only standard time */
1230 sp->timecnt = 0;
1231 init_ttinfo(&sp->ttis[0], -stdoffset, false, 0);
1232 sp->defaulttype = 0;
1233 }
1234 sp->charcnt = charcnt;
1235 cp = sp->chars;
1237 cp += stdlen;
1238 *cp++ = '\0';
1239 if (dstlen != 0)
1240 {
1242 *(cp + dstlen) = '\0';
1243 }
1244 return true;
1245}
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
return str start
#define isleap(y)
Definition datetime.h:273
int j
Definition isn.c:78
int i
Definition isn.c:77
static const char * getqzname(const char *strp, const int delim)
Definition localtime.c:666
static bool increment_overflow_time(pg_time_t *tp, int_fast32_t j)
Definition localtime.c:1560
static void init_ttinfo(struct ttinfo *s, int_fast32_t utoff, bool isdst, int desigidx)
Definition localtime.c:108
#define TZDEFRULESTRING
Definition localtime.c:61
static int_fast32_t transtime(const int year, const struct rule *const rulep, const int_fast32_t offset)
Definition localtime.c:842
static const char * getzname(const char *strp)
Definition localtime.c:645
static const int year_lengths[2]
Definition localtime.c:634
static const char * getrule(const char *strp, struct rule *const rulep)
Definition localtime.c:781
static const char * getoffset(const char *strp, int_fast32_t *const offsetp)
Definition localtime.c:754
int64 pg_time_t
Definition pgtime.h:23
#define SECSPERDAY
Definition private.h:100
#define SECSPERHOUR
Definition private.h:99
#define EPOCH_YEAR
Definition private.h:126
#define YEARSPERREPEAT
Definition private.h:91
#define TZ_MAX_TIMES
Definition tzfile.h:100
static ptrdiff_t timecnt
Definition zic.c:201
static int charcnt
Definition zic.c:182

References charcnt, EPOCH_YEAR, fb(), getoffset(), getqzname(), getrule(), getzname(), i, increment_overflow_time(), init_ttinfo(), isleap, j, memcpy(), name, SECSPERDAY, SECSPERHOUR, start, timecnt, transtime(), TZ_MAX_TIMES, TZDEFRULESTRING, year_lengths, and YEARSPERREPEAT.

Referenced by gmtload(), pg_load_tz(), pg_tzset(), and tzloadbody().