-/* Generated by re2c 0.9.8.dev on Tue Jun 21 19:40:50 2005 */
+/* Generated by re2c 0.9.8.dev on Tue Jun 28 19:53:13 2005 */
#line 1 "parse_date.re"
/*
+----------------------------------------------------------------------+
/* The timezone table. */
static timelib_tz_lookup_table const timelib_timezone_lookup[] = {
- { "gmt", 0, HOUR ( 0), "GMT" }, /* Greenwich Mean */
- { "ut", 0, HOUR ( 0), "UTC" }, /* Universal (Coordinated) */
- { "utc", 0, HOUR ( 0), "UTC" },
- { "wet", 0, HOUR ( 0), "Europe/London" }, /* Western European */
- { "bst", 1, HOUR ( 0), "Europe/London" }, /* British Summer */
- { "wat", 0, HOUR ( 1), "Africa/Dakar" }, /* West Africa */
- { "at", 0, HOUR ( 2), "Atlantic/Azores" }, /* Azores */
+ { "a", 0, HOUR (- 1), NULL },
+ { "adt", 1, HOUR ( 4), "America/Halifax" }, /* Atlantic Daylight */
+ { "ahst", 0, HOUR ( 10), "America/Anchorage" }, /* Alaska-Hawaii Standard */
+ { "akdt", 0, HOUR ( 10), "America/Anchorage" }, /* Alaska Daylight */
+ { "akst", 0, HOUR ( 10), "America/Anchorage" }, /* Alaska Standard */
+ { "ast", 0, HOUR ( 4), "America/Halifax" }, /* Atlantic Standard */
+ { "at", 0, HOUR ( 2), "Atlantic/Azores" }, /* Azores */
+ { "b", 0, HOUR (- 2), NULL },
+ { "bst", 1, HOUR ( 0), "Europe/London" }, /* British Summer */
+ { "bt", 0, -HOUR ( 3), "Asia/Baghdad" }, /* Baghdad, USSR Zone 2 */
+ { "c", 0, HOUR (- 3), NULL },
+ { "cadt", 1, -HOUR (9.5), "Australia/Adelaide" }, /* Central Australian Daylight */
+ { "cast", 0, -HOUR (9.5), "Australia/Adelaide" }, /* Central Australian Standard */
+ { "cat", 0, HOUR ( 10), "America/Anchorage" }, /* Central Alaska */
+ { "cct", 0, -HOUR ( 8), "Asia/Shanghai" }, /* China Coast, USSR Zone 7 */
+ { "cdt", 1, HOUR ( 6), "America/Chicago" }, /* Central Daylight */
+ { "cest", 1, -HOUR ( 1), "Europe/Berlin" }, /* Central European Summer */
+ { "cet", 0, -HOUR ( 1), "Europe/Berlin" }, /* Central European */
+ { "cst", 0, HOUR ( 6), "America/Chicago" }, /* Central Standard */
+ { "d", 0, HOUR (- 4), NULL },
+ { "e", 0, HOUR (- 5), NULL },
+ { "eadt", 1, -HOUR ( 10), "Australia/Sydney" }, /* Eastern Australian Daylight */
+ { "east", 0, -HOUR ( 10), "Australia/Sydney" }, /* Eastern Australian Standard */
+ { "edt", 1, HOUR ( 5), "America/New_York" }, /* Eastern Daylight */
+ { "eet", 0, -HOUR ( 2), "Europe/Bucharest" }, /* Eastern Europe, USSR Zone 1 */
+ { "est", 0, HOUR ( 5), "America/New_York" }, /* Eastern Standard */
+ { "f", 0, HOUR (- 6), NULL },
+ { "fst", 1, -HOUR ( 1), "Europe/Paris" }, /* French Summer */
+ { "fwt", 0, -HOUR ( 1), "Europe/Paris" }, /* French Winter */
+ { "g", 0, HOUR (- 7), NULL },
+ { "gmt", 0, HOUR ( 0), "GMT" }, /* Greenwich Mean */
+ { "gst", 0, -HOUR ( 10), "Pacific/Guam" }, /* Guam Standard, USSR Zone 9 */
+ { "h", 0, HOUR (- 8), NULL },
+ { "hdt", 1, HOUR ( 10), "Pacific/Honolulu" }, /* Hawaii Daylight */
+ { "hst", 0, HOUR ( 10), "Pacific/Honolulu" }, /* Hawaii Standard */
+ { "i", 0, HOUR (- 9), NULL },
+ { "idle", 0, -HOUR ( 12), "NZ" }, /* International Date Line East */
+ { "idlw", 0, HOUR ( 12), NULL }, /* International Date Line West */
+ { "ist", 0, -HOUR (5.5), "Asia/Calcutta" }, /* Indian Standard */
+ { "it", 0, -HOUR (3.5), "Asia/Tehran" }, /* Iran */
+ { "jst", 0, -HOUR ( 9), "Asia/Tokyo" }, /* Japan Standard, USSR Zone 8 */
+ { "jt", 0, -HOUR (7.5), NULL }, /* Java (3pm in Cronusland!) */
+ { "k", 0, HOUR (-10), NULL },
+ { "l", 0, HOUR (-11), NULL },
+ { "m", 0, HOUR (-12), NULL },
+ { "mdt", 1, HOUR ( 7), "America/Phoenix" }, /* Mountain Daylight */
+ { "mest", 1, -HOUR ( 1), "MET" }, /* Middle European Summer */
+ { "mesz", 1, -HOUR ( 1), "MET" }, /* Middle European Summer */
+ { "met", 0, -HOUR ( 1), "MET" }, /* Middle European */
+ { "mewt", 0, -HOUR ( 1), "MET" }, /* Middle European Winter */
+ { "mst", 0, HOUR ( 7), "America/Phoenix" }, /* Mountain Standard */
+ { "n", 0, HOUR ( 1), NULL },
+ { "ndt", 1, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Daylight */
+ { "nft", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland */
+ { "nst", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Standard */
+ { "nt", 0, HOUR ( 11), NULL }, /* Nome */
+ { "nzdt", 1, -HOUR ( 12), "NZ" }, /* New Zealand Daylight */
+ { "nzst", 0, -HOUR ( 12), "NZ" }, /* New Zealand Standard */
+ { "nzt", 0, -HOUR ( 12), "NZ" }, /* New Zealand */
+ { "o", 0, HOUR ( 2), NULL },
+ { "p", 0, HOUR ( 3), NULL },
+ { "pdt", 1, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Daylight */
+ { "pst", 0, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Standard */
+ { "q", 0, HOUR ( 4), NULL },
+ { "r", 0, HOUR ( 5), NULL },
+ { "s", 0, HOUR ( 6), NULL },
+ { "slst", 1, -HOUR ( 1), "Europe/Oslo" }, /* Skien Local Summer Time */
+ { "slt", 0, -HOUR ( 1), "Europe/Oslo" }, /* Skien Local Time */
+ { "sst", 1, -HOUR ( 1), "Europe/Stockholm" }, /* Swedish Summer */
+ { "swt", 0, -HOUR ( 1), "Europe/Stockholm" }, /* Swedish Winter */
+ { "t", 0, HOUR ( 7), NULL },
+ { "u", 0, HOUR ( 8), NULL },
+ { "ut", 0, HOUR ( 0), "UTC" }, /* Universal (Coordinated) */
+ { "utc", 0, HOUR ( 0), "UTC" },
+ { "v", 0, HOUR ( 9), NULL },
+ { "w", 0, HOUR ( 10), NULL },
+ { "wadt", 1, -HOUR ( 7), "Australia/Perth" }, /* West Australian Daylight */
+ { "wast", 0, -HOUR ( 7), "Australia/Perth" }, /* West Australian Standard */
+ { "wat", 0, HOUR ( 1), "Africa/Dakar" }, /* West Africa */
+ { "wet", 0, HOUR ( 0), "Europe/London" }, /* Western European */
+ { "x", 0, HOUR ( 11), NULL },
+ { "y", 0, HOUR ( 12), NULL },
+ { "ydt", 1, HOUR ( 9), "America/Anchorage" }, /* Yukon Daylight */
+ { "yst", 0, HOUR ( 9), "America/Anchorage" }, /* Yukon Standard */
+ { "z", 0, HOUR ( 0), NULL },
+ { "zp4", 0, -HOUR ( 4), NULL }, /* USSR Zone 3 */
+ { "zp5", 0, -HOUR ( 5), NULL }, /* USSR Zone 4 */
+ { "zp6", 0, -HOUR ( 6), NULL }, /* USSR Zone 5 */
#if 0
/* For completeness. BST is also British Summer, and GST is
* also Guam Standard. */
{ "bst", 0, HOUR ( 3), NULL }, /* Brazil Standard */
{ "gst", 0, HOUR ( 3), NULL }, /* Greenland Standard */
-#endif
- { "nft", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland */
- { "nst", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Standard */
- { "ndt", 1, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Daylight */
- { "ast", 0, HOUR ( 4), "America/Halifax" }, /* Atlantic Standard */
- { "adt", 1, HOUR ( 4), "America/Halifax" }, /* Atlantic Daylight */
- { "est", 0, HOUR ( 5), "America/New_York" }, /* Eastern Standard */
- { "edt", 1, HOUR ( 5), "America/New_York" }, /* Eastern Daylight */
- { "cst", 0, HOUR ( 6), "America/Chicago" }, /* Central Standard */
- { "cdt", 1, HOUR ( 6), "America/Chicago" }, /* Central Daylight */
- { "mst", 0, HOUR ( 7), "America/Phoenix" }, /* Mountain Standard */
- { "mdt", 1, HOUR ( 7), "America/Phoenix" }, /* Mountain Daylight */
- { "pst", 0, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Standard */
- { "pdt", 1, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Daylight */
- { "yst", 0, HOUR ( 9), "America/Anchorage" }, /* Yukon Standard */
- { "ydt", 1, HOUR ( 9), "America/Anchorage" }, /* Yukon Daylight */
- { "hst", 0, HOUR (10), "Pacific/Honolulu" }, /* Hawaii Standard */
- { "hdt", 1, HOUR (10), "Pacific/Honolulu" }, /* Hawaii Daylight */
- { "cat", 0, HOUR (10), "America/Anchorage" }, /* Central Alaska */
- { "akst", 0, HOUR (10), "America/Anchorage" }, /* Alaska Standard */
- { "akdt", 0, HOUR (10), "America/Anchorage" }, /* Alaska Daylight */
- { "ahst", 0, HOUR (10), "America/Anchorage" }, /* Alaska-Hawaii Standard */
- { "nt", 0, HOUR (11), NULL }, /* Nome */
- { "idlw", 0, HOUR (12), NULL }, /* International Date Line West */
- { "cet", 0, -HOUR (1), "Europe/Berlin" }, /* Central European */
- { "cest", 1, -HOUR (1), "Europe/Berlin" }, /* Central European Summer */
- { "slt", 0, -HOUR (1), "Europe/Oslo" }, /* Skien Local Time */
- { "slst", 1, -HOUR (1), "Europe/Oslo" }, /* Skien Local Summer Time */
- { "met", 0, -HOUR (1), "MET" }, /* Middle European */
- { "mewt", 0, -HOUR (1), "MET" }, /* Middle European Winter */
- { "mest", 1, -HOUR (1), "MET" }, /* Middle European Summer */
- { "mesz", 1, -HOUR (1), "MET" }, /* Middle European Summer */
- { "swt", 0, -HOUR (1), "Europe/Stockholm" }, /* Swedish Winter */
- { "sst", 1, -HOUR (1), "Europe/Stockholm" }, /* Swedish Summer */
- { "fwt", 0, -HOUR (1), "Europe/Paris" }, /* French Winter */
- { "fst", 1, -HOUR (1), "Europe/Paris" }, /* French Summer */
- { "eet", 0, -HOUR (2), "Europe/Bucharest" }, /* Eastern Europe, USSR Zone 1 */
- { "bt", 0, -HOUR (3), "Asia/Baghdad" }, /* Baghdad, USSR Zone 2 */
- { "it", 0, -HOUR (3.5), "Asia/Tehran" },/* Iran */
- { "zp4", 0, -HOUR (4), NULL }, /* USSR Zone 3 */
- { "zp5", 0, -HOUR (5), NULL }, /* USSR Zone 4 */
- { "ist", 0, -HOUR (5.5), "Asia/Calcutta" },/* Indian Standard */
- { "zp6", 0, -HOUR (6), NULL }, /* USSR Zone 5 */
-#if 0
+
/* For completeness. NST is also Newfoundland Standard, and SST is
* also Swedish Summer. */
{ "nst", 0, -HOUR (6.5), NULL },/* North Sumatra */
{ "sst", 0, -HOUR (7), NULL }, /* South Sumatra, USSR Zone 6 */
#endif
- { "wast", 0, -HOUR (7), "Australia/Perth" }, /* West Australian Standard */
- { "wadt", 1, -HOUR (7), "Australia/Perth" }, /* West Australian Daylight */
- { "jt", 0, -HOUR (7.5), NULL },/* Java (3pm in Cronusland!) */
- { "cct", 0, -HOUR (8), "Asia/Shanghai" }, /* China Coast, USSR Zone 7 */
- { "jst", 0, -HOUR (9), "Asia/Tokyo" }, /* Japan Standard, USSR Zone 8 */
- { "cast", 0, -HOUR (9.5), "Australia/Adelaide" },/* Central Australian Standard */
- { "cadt", 1, -HOUR (9.5), "Australia/Adelaide" },/* Central Australian Daylight */
- { "east", 0, -HOUR (10), "Australia/Sydney" }, /* Eastern Australian Standard */
- { "eadt", 1, -HOUR (10), "Australia/Sydney" }, /* Eastern Australian Daylight */
- { "gst", 0, -HOUR (10), "Pacific/Guam" }, /* Guam Standard, USSR Zone 9 */
- { "nzt", 0, -HOUR (12), "NZ" }, /* New Zealand */
- { "nzst", 0, -HOUR (12), "NZ" }, /* New Zealand Standard */
- { "nzdt", 1, -HOUR (12), "NZ" }, /* New Zealand Daylight */
- { "idle", 0, -HOUR (12), "NZ" }, /* International Date Line East */
-
- { "a", 0, HOUR (- 1), NULL },
- { "b", 0, HOUR (- 2), NULL },
- { "c", 0, HOUR (- 3), NULL },
- { "d", 0, HOUR (- 4), NULL },
- { "e", 0, HOUR (- 5), NULL },
- { "f", 0, HOUR (- 6), NULL },
- { "g", 0, HOUR (- 7), NULL },
- { "h", 0, HOUR (- 8), NULL },
- { "i", 0, HOUR (- 9), NULL },
- { "k", 0, HOUR (-10), NULL },
- { "l", 0, HOUR (-11), NULL },
- { "m", 0, HOUR (-12), NULL },
- { "n", 0, HOUR ( 1), NULL },
- { "o", 0, HOUR ( 2), NULL },
- { "p", 0, HOUR ( 3), NULL },
- { "q", 0, HOUR ( 4), NULL },
- { "r", 0, HOUR ( 5), NULL },
- { "s", 0, HOUR ( 6), NULL },
- { "t", 0, HOUR ( 7), NULL },
- { "u", 0, HOUR ( 8), NULL },
- { "v", 0, HOUR ( 9), NULL },
- { "w", 0, HOUR ( 10), NULL },
- { "x", 0, HOUR ( 11), NULL },
- { "y", 0, HOUR ( 12), NULL },
- { "z", 0, HOUR ( 0), NULL },
- { NULL, 0, 0, NULL }
};
static timelib_relunit const timelib_relunit_lookup[] = {
}
}
+static timelib_tz_lookup_table* zone_search(char *word, int left, int right)
+{
+ int mid, cmp;
+
+ if (left > right) {
+ return NULL; /* not found */
+ }
+
+ mid = (left + right) / 2;
+
+ cmp = strcasecmp(word, timelib_timezone_lookup[mid].name);
+ if (cmp < 0) {
+ return zone_search(word, left, mid - 1);
+ } else if (cmp > 0) {
+ return zone_search(word, mid + 1, right);
+ } else { /* (cmp == 0) */
+ return (timelib_tz_lookup_table*)&timelib_timezone_lookup[mid];
+ }
+}
+
static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, char **tz_name)
{
char *word;
char *begin = *ptr, *end;
long value = 0;
- const timelib_tz_lookup_table *tp;
+ timelib_tz_lookup_table *tp;
while (**ptr != '\0') {
++*ptr;
memcpy(word, begin, end - begin);
*tz_name = NULL;
- for (tp = timelib_timezone_lookup; tp->name; tp++) {
- if (strcasecmp(word, tp->name) == 0) {
- value = tp->value;
- *dst = tp->type;
+ if ((tp = zone_search(word, 0, sizeof(timelib_timezone_lookup)/sizeof(*timelib_timezone_lookup)-1))) {
+ value = tp->value;
+ *dst = tp->type;
/*
- if (tp->full_tz_name) {
- *tz_name = tp->full_tz_name;
- }
-*/
- break;
+ if (tp->full_tz_name) {
+ *tz_name = tp->full_tz_name;
}
+*/
}
*tz_abbr = word;
std:
s->tok = cursor;
s->len = 0;
-#line 855 "parse_date.re"
+#line 869 "parse_date.re"
{
0, 0, 0, 0, 0, 0, 0, 0,
};
-#line 794 "<stdout>"
+#line 808 "<stdout>"
{
YYCTYPE yych;
unsigned int yyaccept;
yy3:
YYDEBUG(3, *YYCURSOR);
-#line 1293 "parse_date.re"
+#line 1307 "parse_date.re"
{
TIMELIB_INIT;
s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time);
TIMELIB_DEINIT;
return TIMELIB_TIMEZONE;
}
-#line 872 "<stdout>"
+#line 886 "<stdout>"
yy4:
YYDEBUG(4, *YYCURSOR);
yych = *++YYCURSOR;
yy7:
YYDEBUG(7, *YYCURSOR);
-#line 1353 "parse_date.re"
+#line 1367 "parse_date.re"
{
/* printf("unexpected character: #%d, %c\n", *s->tok, *s->tok); */
goto std;
}
-#line 938 "<stdout>"
+#line 952 "<stdout>"
yy8:
YYDEBUG(8, *YYCURSOR);
yyaccept = 0;
yy44:
YYDEBUG(44, *YYCURSOR);
-#line 1342 "parse_date.re"
+#line 1356 "parse_date.re"
{
goto std;
}
-#line 1598 "<stdout>"
+#line 1612 "<stdout>"
yy45:
YYDEBUG(45, *YYCURSOR);
++YYCURSOR;
yy46:
YYDEBUG(46, *YYCURSOR);
-#line 1347 "parse_date.re"
+#line 1361 "parse_date.re"
{
s->pos = cursor; s->line++;
goto std;
}
-#line 1607 "<stdout>"
+#line 1621 "<stdout>"
yy47:
YYDEBUG(47, *YYCURSOR);
yych = *++YYCURSOR;
yy81:
YYDEBUG(81, *YYCURSOR);
-#line 1326 "parse_date.re"
+#line 1340 "parse_date.re"
{
timelib_ull i;
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 1904 "<stdout>"
+#line 1918 "<stdout>"
yy82:
YYDEBUG(82, *YYCURSOR);
++YYCURSOR;
yy148:
YYDEBUG(148, *YYCURSOR);
-#line 1288 "parse_date.re"
+#line 1302 "parse_date.re"
{
goto std;
}
-#line 2397 "<stdout>"
+#line 2411 "<stdout>"
yy149:
YYDEBUG(149, *YYCURSOR);
yych = *++YYCURSOR;
yy155:
YYDEBUG(155, *YYCURSOR);
-#line 1272 "parse_date.re"
+#line 1286 "parse_date.re"
{
const timelib_relunit* relunit;
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 2440 "<stdout>"
+#line 2454 "<stdout>"
yy156:
YYDEBUG(156, *YYCURSOR);
yyaccept = 1;
yy188:
YYDEBUG(188, *YYCURSOR);
-#line 1256 "parse_date.re"
+#line 1270 "parse_date.re"
{
timelib_sll i;
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 2771 "<stdout>"
+#line 2785 "<stdout>"
yy189:
YYDEBUG(189, *YYCURSOR);
++YYCURSOR;
yy391:
YYDEBUG(391, *YYCURSOR);
-#line 1086 "parse_date.re"
+#line 1100 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_DATE();
TIMELIB_DEINIT;
return TIMELIB_DATE_NO_DAY;
}
-#line 4545 "<stdout>"
+#line 4559 "<stdout>"
yy392:
YYDEBUG(392, *YYCURSOR);
yych = *++YYCURSOR;
yy397:
YYDEBUG(397, *YYCURSOR);
-#line 1110 "parse_date.re"
+#line 1124 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_DATE();
TIMELIB_DEINIT;
return TIMELIB_DATE_TEXT;
}
-#line 4595 "<stdout>"
+#line 4609 "<stdout>"
yy398:
YYDEBUG(398, *YYCURSOR);
yych = *++YYCURSOR;
yy409:
YYDEBUG(409, *YYCURSOR);
-#line 1301 "parse_date.re"
+#line 1315 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_DATE();
TIMELIB_DEINIT;
return TIMELIB_SHORTDATE_WITH_TIME;
}
-#line 4684 "<stdout>"
+#line 4698 "<stdout>"
yy410:
YYDEBUG(410, *YYCURSOR);
yyaccept = 7;
yy450:
YYDEBUG(450, *YYCURSOR);
-#line 1202 "parse_date.re"
+#line 1216 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_DATE();
TIMELIB_DEINIT;
return TIMELIB_PG_TEXT;
}
-#line 4939 "<stdout>"
+#line 4953 "<stdout>"
yy451:
YYDEBUG(451, *YYCURSOR);
yych = *++YYCURSOR;
yy558:
YYDEBUG(558, *YYCURSOR);
-#line 1242 "parse_date.re"
+#line 1256 "parse_date.re"
{
TIMELIB_INIT;
s->time->relative.y = 0 - s->time->relative.y;
TIMELIB_DEINIT;
return TIMELIB_AGO;
}
-#line 6183 "<stdout>"
+#line 6197 "<stdout>"
yy559:
YYDEBUG(559, *YYCURSOR);
yyaccept = 1;
yy668:
YYDEBUG(668, *YYCURSOR);
-#line 942 "parse_date.re"
+#line 956 "parse_date.re"
{
DEBUG_OUTPUT("timeshort24 | timelong24 | iso8601long");
TIMELIB_INIT;
TIMELIB_DEINIT;
return TIMELIB_TIME24_WITH_ZONE;
}
-#line 7625 "<stdout>"
+#line 7639 "<stdout>"
yy669:
YYDEBUG(669, *YYCURSOR);
yyaccept = 10;
yy683:
YYDEBUG(683, *YYCURSOR);
-#line 927 "parse_date.re"
+#line 941 "parse_date.re"
{
DEBUG_OUTPUT("timeshort12 | timelong12");
TIMELIB_INIT;
TIMELIB_DEINIT;
return TIMELIB_TIME12;
}
-#line 7736 "<stdout>"
+#line 7750 "<stdout>"
yy684:
YYDEBUG(684, *YYCURSOR);
yych = *++YYCURSOR;
yy696:
YYDEBUG(696, *YYCURSOR);
-#line 1062 "parse_date.re"
+#line 1076 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_DATE();
TIMELIB_DEINIT;
return TIMELIB_DATE_FULL;
}
-#line 7831 "<stdout>"
+#line 7845 "<stdout>"
yy697:
YYDEBUG(697, *YYCURSOR);
yych = *++YYCURSOR;
yy755:
YYDEBUG(755, *YYCURSOR);
-#line 1074 "parse_date.re"
+#line 1088 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_DATE();
TIMELIB_DEINIT;
return TIMELIB_DATE_FULL_POINTED;
}
-#line 8091 "<stdout>"
+#line 8105 "<stdout>"
yy756:
YYDEBUG(756, *YYCURSOR);
yych = *++YYCURSOR;
yy800:
YYDEBUG(800, *YYCURSOR);
-#line 1050 "parse_date.re"
+#line 1064 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_DATE();
TIMELIB_DEINIT;
return TIMELIB_ISO_DATE;
}
-#line 8384 "<stdout>"
+#line 8398 "<stdout>"
yy801:
YYDEBUG(801, *YYCURSOR);
yych = *++YYCURSOR;
yy804:
YYDEBUG(804, *YYCURSOR);
-#line 1025 "parse_date.re"
+#line 1039 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_DATE();
TIMELIB_DEINIT;
return TIMELIB_AMERICAN;
}
-#line 8411 "<stdout>"
+#line 8425 "<stdout>"
yy805:
YYDEBUG(805, *YYCURSOR);
yyaccept = 11;
yy837:
YYDEBUG(837, *YYCURSOR);
-#line 1226 "parse_date.re"
+#line 1240 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_TIME();
TIMELIB_DEINIT;
return TIMELIB_CLF;
}
-#line 8582 "<stdout>"
+#line 8596 "<stdout>"
yy838:
YYDEBUG(838, *YYCURSOR);
yyaccept = 12;
yy877:
YYDEBUG(877, *YYCURSOR);
-#line 1214 "parse_date.re"
+#line 1228 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_DATE();
TIMELIB_DEINIT;
return TIMELIB_PG_TEXT;
}
-#line 8824 "<stdout>"
+#line 8838 "<stdout>"
yy878:
YYDEBUG(878, *YYCURSOR);
yych = *++YYCURSOR;
yy897:
YYDEBUG(897, *YYCURSOR);
-#line 1098 "parse_date.re"
+#line 1112 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_DATE();
TIMELIB_DEINIT;
return TIMELIB_DATE_NO_DAY;
}
-#line 9037 "<stdout>"
+#line 9051 "<stdout>"
yy898:
YYDEBUG(898, *YYCURSOR);
yych = *++YYCURSOR;
yy917:
YYDEBUG(917, *YYCURSOR);
-#line 1183 "parse_date.re"
+#line 1197 "parse_date.re"
{
timelib_sll w, d;
TIMELIB_DEINIT;
return TIMELIB_ISO_WEEK;
}
-#line 9169 "<stdout>"
+#line 9183 "<stdout>"
yy918:
YYDEBUG(918, *YYCURSOR);
++YYCURSOR;
yy919:
YYDEBUG(919, *YYCURSOR);
-#line 1164 "parse_date.re"
+#line 1178 "parse_date.re"
{
timelib_sll w, d;
TIMELIB_DEINIT;
return TIMELIB_ISO_WEEK;
}
-#line 9191 "<stdout>"
+#line 9205 "<stdout>"
yy920:
YYDEBUG(920, *YYCURSOR);
yych = *++YYCURSOR;
yy923:
YYDEBUG(923, *YYCURSOR);
-#line 1152 "parse_date.re"
+#line 1166 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_DATE();
TIMELIB_DEINIT;
return TIMELIB_PG_YEARDAY;
}
-#line 9227 "<stdout>"
+#line 9241 "<stdout>"
yy924:
YYDEBUG(924, *YYCURSOR);
yych = *++YYCURSOR;
yy930:
YYDEBUG(930, *YYCURSOR);
-#line 1122 "parse_date.re"
+#line 1136 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_DATE();
TIMELIB_DEINIT;
return TIMELIB_DATE_NOCOLON;
}
-#line 9299 "<stdout>"
+#line 9313 "<stdout>"
yy931:
YYDEBUG(931, *YYCURSOR);
yych = *++YYCURSOR;
yy941:
YYDEBUG(941, *YYCURSOR);
-#line 1133 "parse_date.re"
+#line 1147 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_TIME();
TIMELIB_DEINIT;
return TIMELIB_XMLRPC_SOAP;
}
-#line 9363 "<stdout>"
+#line 9377 "<stdout>"
yy942:
YYDEBUG(942, *YYCURSOR);
yych = *++YYCURSOR;
yy1035:
YYDEBUG(1035, *YYCURSOR);
-#line 1039 "parse_date.re"
+#line 1053 "parse_date.re"
{
TIMELIB_INIT;
TIMELIB_HAVE_DATE();
TIMELIB_DEINIT;
return TIMELIB_ISO_DATE;
}
-#line 9866 "<stdout>"
+#line 9880 "<stdout>"
yy1036:
YYDEBUG(1036, *YYCURSOR);
yych = *++YYCURSOR;
yy1116:
YYDEBUG(1116, *YYCURSOR);
-#line 964 "parse_date.re"
+#line 978 "parse_date.re"
{
DEBUG_OUTPUT("gnunocolon");
TIMELIB_INIT;
TIMELIB_DEINIT;
return TIMELIB_GNU_NOCOLON;
}
-#line 10504 "<stdout>"
+#line 10518 "<stdout>"
yy1117:
YYDEBUG(1117, *YYCURSOR);
yych = *++YYCURSOR;
yy1124:
YYDEBUG(1124, *YYCURSOR);
-#line 1009 "parse_date.re"
+#line 1023 "parse_date.re"
{
DEBUG_OUTPUT("iso8601nocolon");
TIMELIB_INIT;
TIMELIB_DEINIT;
return TIMELIB_ISO_NOCOLON;
}
-#line 10576 "<stdout>"
+#line 10590 "<stdout>"
yy1125:
YYDEBUG(1125, *YYCURSOR);
yyaccept = 19;
yy1140:
YYDEBUG(1140, *YYCURSOR);
-#line 903 "parse_date.re"
+#line 917 "parse_date.re"
{
timelib_ull i;
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 10743 "<stdout>"
+#line 10757 "<stdout>"
yy1141:
YYDEBUG(1141, *YYCURSOR);
yych = *++YYCURSOR;
yy1149:
YYDEBUG(1149, *YYCURSOR);
-#line 891 "parse_date.re"
+#line 905 "parse_date.re"
{
DEBUG_OUTPUT("tomorrow");
TIMELIB_INIT;
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 10784 "<stdout>"
+#line 10798 "<stdout>"
yy1150:
YYDEBUG(1150, *YYCURSOR);
yych = *++YYCURSOR;
yy1152:
YYDEBUG(1152, *YYCURSOR);
-#line 881 "parse_date.re"
+#line 895 "parse_date.re"
{
DEBUG_OUTPUT("today");
TIMELIB_INIT;
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 10804 "<stdout>"
+#line 10818 "<stdout>"
yy1153:
YYDEBUG(1153, *YYCURSOR);
yych = *++YYCURSOR;
yy1155:
YYDEBUG(1155, *YYCURSOR);
-#line 872 "parse_date.re"
+#line 886 "parse_date.re"
{
DEBUG_OUTPUT("now");
TIMELIB_INIT;
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 10829 "<stdout>"
+#line 10843 "<stdout>"
yy1156:
YYDEBUG(1156, *YYCURSOR);
yych = *++YYCURSOR;
yy1164:
YYDEBUG(1164, *YYCURSOR);
-#line 860 "parse_date.re"
+#line 874 "parse_date.re"
{
DEBUG_OUTPUT("yesterday");
TIMELIB_INIT;
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 10869 "<stdout>"
+#line 10883 "<stdout>"
}
}
-#line 1357 "parse_date.re"
+#line 1371 "parse_date.re"
}
/* The timezone table. */
static timelib_tz_lookup_table const timelib_timezone_lookup[] = {
- { "gmt", 0, HOUR ( 0), "GMT" }, /* Greenwich Mean */
- { "ut", 0, HOUR ( 0), "UTC" }, /* Universal (Coordinated) */
- { "utc", 0, HOUR ( 0), "UTC" },
- { "wet", 0, HOUR ( 0), "Europe/London" }, /* Western European */
- { "bst", 1, HOUR ( 0), "Europe/London" }, /* British Summer */
- { "wat", 0, HOUR ( 1), "Africa/Dakar" }, /* West Africa */
- { "at", 0, HOUR ( 2), "Atlantic/Azores" }, /* Azores */
+ { "a", 0, HOUR (- 1), NULL },
+ { "adt", 1, HOUR ( 4), "America/Halifax" }, /* Atlantic Daylight */
+ { "ahst", 0, HOUR ( 10), "America/Anchorage" }, /* Alaska-Hawaii Standard */
+ { "akdt", 0, HOUR ( 10), "America/Anchorage" }, /* Alaska Daylight */
+ { "akst", 0, HOUR ( 10), "America/Anchorage" }, /* Alaska Standard */
+ { "ast", 0, HOUR ( 4), "America/Halifax" }, /* Atlantic Standard */
+ { "at", 0, HOUR ( 2), "Atlantic/Azores" }, /* Azores */
+ { "b", 0, HOUR (- 2), NULL },
+ { "bst", 1, HOUR ( 0), "Europe/London" }, /* British Summer */
+ { "bt", 0, -HOUR ( 3), "Asia/Baghdad" }, /* Baghdad, USSR Zone 2 */
+ { "c", 0, HOUR (- 3), NULL },
+ { "cadt", 1, -HOUR (9.5), "Australia/Adelaide" }, /* Central Australian Daylight */
+ { "cast", 0, -HOUR (9.5), "Australia/Adelaide" }, /* Central Australian Standard */
+ { "cat", 0, HOUR ( 10), "America/Anchorage" }, /* Central Alaska */
+ { "cct", 0, -HOUR ( 8), "Asia/Shanghai" }, /* China Coast, USSR Zone 7 */
+ { "cdt", 1, HOUR ( 6), "America/Chicago" }, /* Central Daylight */
+ { "cest", 1, -HOUR ( 1), "Europe/Berlin" }, /* Central European Summer */
+ { "cet", 0, -HOUR ( 1), "Europe/Berlin" }, /* Central European */
+ { "cst", 0, HOUR ( 6), "America/Chicago" }, /* Central Standard */
+ { "d", 0, HOUR (- 4), NULL },
+ { "e", 0, HOUR (- 5), NULL },
+ { "eadt", 1, -HOUR ( 10), "Australia/Sydney" }, /* Eastern Australian Daylight */
+ { "east", 0, -HOUR ( 10), "Australia/Sydney" }, /* Eastern Australian Standard */
+ { "edt", 1, HOUR ( 5), "America/New_York" }, /* Eastern Daylight */
+ { "eet", 0, -HOUR ( 2), "Europe/Bucharest" }, /* Eastern Europe, USSR Zone 1 */
+ { "est", 0, HOUR ( 5), "America/New_York" }, /* Eastern Standard */
+ { "f", 0, HOUR (- 6), NULL },
+ { "fst", 1, -HOUR ( 1), "Europe/Paris" }, /* French Summer */
+ { "fwt", 0, -HOUR ( 1), "Europe/Paris" }, /* French Winter */
+ { "g", 0, HOUR (- 7), NULL },
+ { "gmt", 0, HOUR ( 0), "GMT" }, /* Greenwich Mean */
+ { "gst", 0, -HOUR ( 10), "Pacific/Guam" }, /* Guam Standard, USSR Zone 9 */
+ { "h", 0, HOUR (- 8), NULL },
+ { "hdt", 1, HOUR ( 10), "Pacific/Honolulu" }, /* Hawaii Daylight */
+ { "hst", 0, HOUR ( 10), "Pacific/Honolulu" }, /* Hawaii Standard */
+ { "i", 0, HOUR (- 9), NULL },
+ { "idle", 0, -HOUR ( 12), "NZ" }, /* International Date Line East */
+ { "idlw", 0, HOUR ( 12), NULL }, /* International Date Line West */
+ { "ist", 0, -HOUR (5.5), "Asia/Calcutta" }, /* Indian Standard */
+ { "it", 0, -HOUR (3.5), "Asia/Tehran" }, /* Iran */
+ { "jst", 0, -HOUR ( 9), "Asia/Tokyo" }, /* Japan Standard, USSR Zone 8 */
+ { "jt", 0, -HOUR (7.5), NULL }, /* Java (3pm in Cronusland!) */
+ { "k", 0, HOUR (-10), NULL },
+ { "l", 0, HOUR (-11), NULL },
+ { "m", 0, HOUR (-12), NULL },
+ { "mdt", 1, HOUR ( 7), "America/Phoenix" }, /* Mountain Daylight */
+ { "mest", 1, -HOUR ( 1), "MET" }, /* Middle European Summer */
+ { "mesz", 1, -HOUR ( 1), "MET" }, /* Middle European Summer */
+ { "met", 0, -HOUR ( 1), "MET" }, /* Middle European */
+ { "mewt", 0, -HOUR ( 1), "MET" }, /* Middle European Winter */
+ { "mst", 0, HOUR ( 7), "America/Phoenix" }, /* Mountain Standard */
+ { "n", 0, HOUR ( 1), NULL },
+ { "ndt", 1, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Daylight */
+ { "nft", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland */
+ { "nst", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Standard */
+ { "nt", 0, HOUR ( 11), NULL }, /* Nome */
+ { "nzdt", 1, -HOUR ( 12), "NZ" }, /* New Zealand Daylight */
+ { "nzst", 0, -HOUR ( 12), "NZ" }, /* New Zealand Standard */
+ { "nzt", 0, -HOUR ( 12), "NZ" }, /* New Zealand */
+ { "o", 0, HOUR ( 2), NULL },
+ { "p", 0, HOUR ( 3), NULL },
+ { "pdt", 1, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Daylight */
+ { "pst", 0, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Standard */
+ { "q", 0, HOUR ( 4), NULL },
+ { "r", 0, HOUR ( 5), NULL },
+ { "s", 0, HOUR ( 6), NULL },
+ { "slst", 1, -HOUR ( 1), "Europe/Oslo" }, /* Skien Local Summer Time */
+ { "slt", 0, -HOUR ( 1), "Europe/Oslo" }, /* Skien Local Time */
+ { "sst", 1, -HOUR ( 1), "Europe/Stockholm" }, /* Swedish Summer */
+ { "swt", 0, -HOUR ( 1), "Europe/Stockholm" }, /* Swedish Winter */
+ { "t", 0, HOUR ( 7), NULL },
+ { "u", 0, HOUR ( 8), NULL },
+ { "ut", 0, HOUR ( 0), "UTC" }, /* Universal (Coordinated) */
+ { "utc", 0, HOUR ( 0), "UTC" },
+ { "v", 0, HOUR ( 9), NULL },
+ { "w", 0, HOUR ( 10), NULL },
+ { "wadt", 1, -HOUR ( 7), "Australia/Perth" }, /* West Australian Daylight */
+ { "wast", 0, -HOUR ( 7), "Australia/Perth" }, /* West Australian Standard */
+ { "wat", 0, HOUR ( 1), "Africa/Dakar" }, /* West Africa */
+ { "wet", 0, HOUR ( 0), "Europe/London" }, /* Western European */
+ { "x", 0, HOUR ( 11), NULL },
+ { "y", 0, HOUR ( 12), NULL },
+ { "ydt", 1, HOUR ( 9), "America/Anchorage" }, /* Yukon Daylight */
+ { "yst", 0, HOUR ( 9), "America/Anchorage" }, /* Yukon Standard */
+ { "z", 0, HOUR ( 0), NULL },
+ { "zp4", 0, -HOUR ( 4), NULL }, /* USSR Zone 3 */
+ { "zp5", 0, -HOUR ( 5), NULL }, /* USSR Zone 4 */
+ { "zp6", 0, -HOUR ( 6), NULL }, /* USSR Zone 5 */
#if 0
/* For completeness. BST is also British Summer, and GST is
* also Guam Standard. */
{ "bst", 0, HOUR ( 3), NULL }, /* Brazil Standard */
{ "gst", 0, HOUR ( 3), NULL }, /* Greenland Standard */
-#endif
- { "nft", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland */
- { "nst", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Standard */
- { "ndt", 1, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Daylight */
- { "ast", 0, HOUR ( 4), "America/Halifax" }, /* Atlantic Standard */
- { "adt", 1, HOUR ( 4), "America/Halifax" }, /* Atlantic Daylight */
- { "est", 0, HOUR ( 5), "America/New_York" }, /* Eastern Standard */
- { "edt", 1, HOUR ( 5), "America/New_York" }, /* Eastern Daylight */
- { "cst", 0, HOUR ( 6), "America/Chicago" }, /* Central Standard */
- { "cdt", 1, HOUR ( 6), "America/Chicago" }, /* Central Daylight */
- { "mst", 0, HOUR ( 7), "America/Phoenix" }, /* Mountain Standard */
- { "mdt", 1, HOUR ( 7), "America/Phoenix" }, /* Mountain Daylight */
- { "pst", 0, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Standard */
- { "pdt", 1, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Daylight */
- { "yst", 0, HOUR ( 9), "America/Anchorage" }, /* Yukon Standard */
- { "ydt", 1, HOUR ( 9), "America/Anchorage" }, /* Yukon Daylight */
- { "hst", 0, HOUR (10), "Pacific/Honolulu" }, /* Hawaii Standard */
- { "hdt", 1, HOUR (10), "Pacific/Honolulu" }, /* Hawaii Daylight */
- { "cat", 0, HOUR (10), "America/Anchorage" }, /* Central Alaska */
- { "akst", 0, HOUR (10), "America/Anchorage" }, /* Alaska Standard */
- { "akdt", 0, HOUR (10), "America/Anchorage" }, /* Alaska Daylight */
- { "ahst", 0, HOUR (10), "America/Anchorage" }, /* Alaska-Hawaii Standard */
- { "nt", 0, HOUR (11), NULL }, /* Nome */
- { "idlw", 0, HOUR (12), NULL }, /* International Date Line West */
- { "cet", 0, -HOUR (1), "Europe/Berlin" }, /* Central European */
- { "cest", 1, -HOUR (1), "Europe/Berlin" }, /* Central European Summer */
- { "slt", 0, -HOUR (1), "Europe/Oslo" }, /* Skien Local Time */
- { "slst", 1, -HOUR (1), "Europe/Oslo" }, /* Skien Local Summer Time */
- { "met", 0, -HOUR (1), "MET" }, /* Middle European */
- { "mewt", 0, -HOUR (1), "MET" }, /* Middle European Winter */
- { "mest", 1, -HOUR (1), "MET" }, /* Middle European Summer */
- { "mesz", 1, -HOUR (1), "MET" }, /* Middle European Summer */
- { "swt", 0, -HOUR (1), "Europe/Stockholm" }, /* Swedish Winter */
- { "sst", 1, -HOUR (1), "Europe/Stockholm" }, /* Swedish Summer */
- { "fwt", 0, -HOUR (1), "Europe/Paris" }, /* French Winter */
- { "fst", 1, -HOUR (1), "Europe/Paris" }, /* French Summer */
- { "eet", 0, -HOUR (2), "Europe/Bucharest" }, /* Eastern Europe, USSR Zone 1 */
- { "bt", 0, -HOUR (3), "Asia/Baghdad" }, /* Baghdad, USSR Zone 2 */
- { "it", 0, -HOUR (3.5), "Asia/Tehran" },/* Iran */
- { "zp4", 0, -HOUR (4), NULL }, /* USSR Zone 3 */
- { "zp5", 0, -HOUR (5), NULL }, /* USSR Zone 4 */
- { "ist", 0, -HOUR (5.5), "Asia/Calcutta" },/* Indian Standard */
- { "zp6", 0, -HOUR (6), NULL }, /* USSR Zone 5 */
-#if 0
+
/* For completeness. NST is also Newfoundland Standard, and SST is
* also Swedish Summer. */
{ "nst", 0, -HOUR (6.5), NULL },/* North Sumatra */
{ "sst", 0, -HOUR (7), NULL }, /* South Sumatra, USSR Zone 6 */
#endif
- { "wast", 0, -HOUR (7), "Australia/Perth" }, /* West Australian Standard */
- { "wadt", 1, -HOUR (7), "Australia/Perth" }, /* West Australian Daylight */
- { "jt", 0, -HOUR (7.5), NULL },/* Java (3pm in Cronusland!) */
- { "cct", 0, -HOUR (8), "Asia/Shanghai" }, /* China Coast, USSR Zone 7 */
- { "jst", 0, -HOUR (9), "Asia/Tokyo" }, /* Japan Standard, USSR Zone 8 */
- { "cast", 0, -HOUR (9.5), "Australia/Adelaide" },/* Central Australian Standard */
- { "cadt", 1, -HOUR (9.5), "Australia/Adelaide" },/* Central Australian Daylight */
- { "east", 0, -HOUR (10), "Australia/Sydney" }, /* Eastern Australian Standard */
- { "eadt", 1, -HOUR (10), "Australia/Sydney" }, /* Eastern Australian Daylight */
- { "gst", 0, -HOUR (10), "Pacific/Guam" }, /* Guam Standard, USSR Zone 9 */
- { "nzt", 0, -HOUR (12), "NZ" }, /* New Zealand */
- { "nzst", 0, -HOUR (12), "NZ" }, /* New Zealand Standard */
- { "nzdt", 1, -HOUR (12), "NZ" }, /* New Zealand Daylight */
- { "idle", 0, -HOUR (12), "NZ" }, /* International Date Line East */
-
- { "a", 0, HOUR (- 1), NULL },
- { "b", 0, HOUR (- 2), NULL },
- { "c", 0, HOUR (- 3), NULL },
- { "d", 0, HOUR (- 4), NULL },
- { "e", 0, HOUR (- 5), NULL },
- { "f", 0, HOUR (- 6), NULL },
- { "g", 0, HOUR (- 7), NULL },
- { "h", 0, HOUR (- 8), NULL },
- { "i", 0, HOUR (- 9), NULL },
- { "k", 0, HOUR (-10), NULL },
- { "l", 0, HOUR (-11), NULL },
- { "m", 0, HOUR (-12), NULL },
- { "n", 0, HOUR ( 1), NULL },
- { "o", 0, HOUR ( 2), NULL },
- { "p", 0, HOUR ( 3), NULL },
- { "q", 0, HOUR ( 4), NULL },
- { "r", 0, HOUR ( 5), NULL },
- { "s", 0, HOUR ( 6), NULL },
- { "t", 0, HOUR ( 7), NULL },
- { "u", 0, HOUR ( 8), NULL },
- { "v", 0, HOUR ( 9), NULL },
- { "w", 0, HOUR ( 10), NULL },
- { "x", 0, HOUR ( 11), NULL },
- { "y", 0, HOUR ( 12), NULL },
- { "z", 0, HOUR ( 0), NULL },
- { NULL, 0, 0, NULL }
};
static timelib_relunit const timelib_relunit_lookup[] = {
}
}
+static timelib_tz_lookup_table* zone_search(char *word, int left, int right)
+{
+ int mid, cmp;
+
+ if (left > right) {
+ return NULL; /* not found */
+ }
+
+ mid = (left + right) / 2;
+
+ cmp = strcasecmp(word, timelib_timezone_lookup[mid].name);
+ if (cmp < 0) {
+ return zone_search(word, left, mid - 1);
+ } else if (cmp > 0) {
+ return zone_search(word, mid + 1, right);
+ } else { /* (cmp == 0) */
+ return (timelib_tz_lookup_table*)&timelib_timezone_lookup[mid];
+ }
+}
+
static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, char **tz_name)
{
char *word;
char *begin = *ptr, *end;
long value = 0;
- const timelib_tz_lookup_table *tp;
+ timelib_tz_lookup_table *tp;
while (**ptr != '\0') {
++*ptr;
memcpy(word, begin, end - begin);
*tz_name = NULL;
- for (tp = timelib_timezone_lookup; tp->name; tp++) {
- if (strcasecmp(word, tp->name) == 0) {
- value = tp->value;
- *dst = tp->type;
+ if ((tp = zone_search(word, 0, sizeof(timelib_timezone_lookup)/sizeof(*timelib_timezone_lookup)-1))) {
+ value = tp->value;
+ *dst = tp->type;
/*
- if (tp->full_tz_name) {
- *tz_name = tp->full_tz_name;
- }
-*/
- break;
+ if (tp->full_tz_name) {
+ *tz_name = tp->full_tz_name;
}
+*/
}
*tz_abbr = word;
}
}
+static int tz_search(char *timezone, int left, int right)
+{
+ int mid, cmp;
+
+ if (left > right) {
+ return -1; /* not found */
+ }
+
+ mid = (left + right) / 2;
+
+ cmp = strcmp(timezone, timezonedb_idx[mid].id);
+ if (cmp < 0) {
+ return tz_search(timezone, left, mid - 1);
+ } else if (cmp > 0) {
+ return tz_search(timezone, mid + 1, right);
+ } else { /* (cmp == 0) */
+ return timezonedb_idx[mid].pos;
+ }
+}
+
+
static int seek_to_tz_position(char **tzf, char *timezone)
{
- int found;
- tzdb_idx *ptr;
-
- /* Reset Index Position */
- ptr = timezonedb_idx;
-
- /* Start scanning the index file for the timezone */
- found = 0;
- do {
- if (strcmp(timezone, ptr->id) == 0) {
- found = 1;
- (*tzf) = &php_timezone_db_index[ptr->pos + 20];
- break;
- }
- ptr++;
- } while (ptr->id != NULL);
- if (!found) {
+ int pos = tz_search(timezone, 0, sizeof(timezonedb_idx)/sizeof(*timezonedb_idx)-1);
+
+ if (pos == -1) {
return 0;
}
+
+ (*tzf) = &php_timezone_db_index[pos + 20];
return 1;
}
/* The timezone table. */
static timelib_tz_lookup_table const timelib_timezone_lookup[] = {
- { "gmt", 0, HOUR ( 0), "GMT" }, /* Greenwich Mean */
- { "ut", 0, HOUR ( 0), "UTC" }, /* Universal (Coordinated) */
- { "utc", 0, HOUR ( 0), "UTC" },
- { "wet", 0, HOUR ( 0), "Europe/London" }, /* Western European */
- { "bst", 1, HOUR ( 0), "Europe/London" }, /* British Summer */
- { "wat", 0, HOUR ( 1), "Africa/Dakar" }, /* West Africa */
- { "at", 0, HOUR ( 2), "Atlantic/Azores" }, /* Azores */
+ { "a", 0, HOUR (- 1), NULL },
+ { "adt", 1, HOUR ( 4), "America/Halifax" }, /* Atlantic Daylight */
+ { "ahst", 0, HOUR ( 10), "America/Anchorage" }, /* Alaska-Hawaii Standard */
+ { "akdt", 0, HOUR ( 10), "America/Anchorage" }, /* Alaska Daylight */
+ { "akst", 0, HOUR ( 10), "America/Anchorage" }, /* Alaska Standard */
+ { "ast", 0, HOUR ( 4), "America/Halifax" }, /* Atlantic Standard */
+ { "at", 0, HOUR ( 2), "Atlantic/Azores" }, /* Azores */
+ { "b", 0, HOUR (- 2), NULL },
+ { "bst", 1, HOUR ( 0), "Europe/London" }, /* British Summer */
+ { "bt", 0, -HOUR ( 3), "Asia/Baghdad" }, /* Baghdad, USSR Zone 2 */
+ { "c", 0, HOUR (- 3), NULL },
+ { "cadt", 1, -HOUR (9.5), "Australia/Adelaide" }, /* Central Australian Daylight */
+ { "cast", 0, -HOUR (9.5), "Australia/Adelaide" }, /* Central Australian Standard */
+ { "cat", 0, HOUR ( 10), "America/Anchorage" }, /* Central Alaska */
+ { "cct", 0, -HOUR ( 8), "Asia/Shanghai" }, /* China Coast, USSR Zone 7 */
+ { "cdt", 1, HOUR ( 6), "America/Chicago" }, /* Central Daylight */
+ { "cest", 1, -HOUR ( 1), "Europe/Berlin" }, /* Central European Summer */
+ { "cet", 0, -HOUR ( 1), "Europe/Berlin" }, /* Central European */
+ { "cst", 0, HOUR ( 6), "America/Chicago" }, /* Central Standard */
+ { "d", 0, HOUR (- 4), NULL },
+ { "e", 0, HOUR (- 5), NULL },
+ { "eadt", 1, -HOUR ( 10), "Australia/Sydney" }, /* Eastern Australian Daylight */
+ { "east", 0, -HOUR ( 10), "Australia/Sydney" }, /* Eastern Australian Standard */
+ { "edt", 1, HOUR ( 5), "America/New_York" }, /* Eastern Daylight */
+ { "eet", 0, -HOUR ( 2), "Europe/Bucharest" }, /* Eastern Europe, USSR Zone 1 */
+ { "est", 0, HOUR ( 5), "America/New_York" }, /* Eastern Standard */
+ { "f", 0, HOUR (- 6), NULL },
+ { "fst", 1, -HOUR ( 1), "Europe/Paris" }, /* French Summer */
+ { "fwt", 0, -HOUR ( 1), "Europe/Paris" }, /* French Winter */
+ { "g", 0, HOUR (- 7), NULL },
+ { "gmt", 0, HOUR ( 0), "GMT" }, /* Greenwich Mean */
+ { "gst", 0, -HOUR ( 10), "Pacific/Guam" }, /* Guam Standard, USSR Zone 9 */
+ { "h", 0, HOUR (- 8), NULL },
+ { "hdt", 1, HOUR ( 10), "Pacific/Honolulu" }, /* Hawaii Daylight */
+ { "hst", 0, HOUR ( 10), "Pacific/Honolulu" }, /* Hawaii Standard */
+ { "i", 0, HOUR (- 9), NULL },
+ { "idle", 0, -HOUR ( 12), "NZ" }, /* International Date Line East */
+ { "idlw", 0, HOUR ( 12), NULL }, /* International Date Line West */
+ { "ist", 0, -HOUR (5.5), "Asia/Calcutta" }, /* Indian Standard */
+ { "it", 0, -HOUR (3.5), "Asia/Tehran" }, /* Iran */
+ { "jst", 0, -HOUR ( 9), "Asia/Tokyo" }, /* Japan Standard, USSR Zone 8 */
+ { "jt", 0, -HOUR (7.5), NULL }, /* Java (3pm in Cronusland!) */
+ { "k", 0, HOUR (-10), NULL },
+ { "l", 0, HOUR (-11), NULL },
+ { "m", 0, HOUR (-12), NULL },
+ { "mdt", 1, HOUR ( 7), "America/Phoenix" }, /* Mountain Daylight */
+ { "mest", 1, -HOUR ( 1), "MET" }, /* Middle European Summer */
+ { "mesz", 1, -HOUR ( 1), "MET" }, /* Middle European Summer */
+ { "met", 0, -HOUR ( 1), "MET" }, /* Middle European */
+ { "mewt", 0, -HOUR ( 1), "MET" }, /* Middle European Winter */
+ { "mst", 0, HOUR ( 7), "America/Phoenix" }, /* Mountain Standard */
+ { "n", 0, HOUR ( 1), NULL },
+ { "ndt", 1, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Daylight */
+ { "nft", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland */
+ { "nst", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Standard */
+ { "nt", 0, HOUR ( 11), NULL }, /* Nome */
+ { "nzdt", 1, -HOUR ( 12), "NZ" }, /* New Zealand Daylight */
+ { "nzst", 0, -HOUR ( 12), "NZ" }, /* New Zealand Standard */
+ { "nzt", 0, -HOUR ( 12), "NZ" }, /* New Zealand */
+ { "o", 0, HOUR ( 2), NULL },
+ { "p", 0, HOUR ( 3), NULL },
+ { "pdt", 1, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Daylight */
+ { "pst", 0, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Standard */
+ { "q", 0, HOUR ( 4), NULL },
+ { "r", 0, HOUR ( 5), NULL },
+ { "s", 0, HOUR ( 6), NULL },
+ { "slst", 1, -HOUR ( 1), "Europe/Oslo" }, /* Skien Local Summer Time */
+ { "slt", 0, -HOUR ( 1), "Europe/Oslo" }, /* Skien Local Time */
+ { "sst", 1, -HOUR ( 1), "Europe/Stockholm" }, /* Swedish Summer */
+ { "swt", 0, -HOUR ( 1), "Europe/Stockholm" }, /* Swedish Winter */
+ { "t", 0, HOUR ( 7), NULL },
+ { "u", 0, HOUR ( 8), NULL },
+ { "ut", 0, HOUR ( 0), "UTC" }, /* Universal (Coordinated) */
+ { "utc", 0, HOUR ( 0), "UTC" },
+ { "v", 0, HOUR ( 9), NULL },
+ { "w", 0, HOUR ( 10), NULL },
+ { "wadt", 1, -HOUR ( 7), "Australia/Perth" }, /* West Australian Daylight */
+ { "wast", 0, -HOUR ( 7), "Australia/Perth" }, /* West Australian Standard */
+ { "wat", 0, HOUR ( 1), "Africa/Dakar" }, /* West Africa */
+ { "wet", 0, HOUR ( 0), "Europe/London" }, /* Western European */
+ { "x", 0, HOUR ( 11), NULL },
+ { "y", 0, HOUR ( 12), NULL },
+ { "ydt", 1, HOUR ( 9), "America/Anchorage" }, /* Yukon Daylight */
+ { "yst", 0, HOUR ( 9), "America/Anchorage" }, /* Yukon Standard */
+ { "z", 0, HOUR ( 0), NULL },
+ { "zp4", 0, -HOUR ( 4), NULL }, /* USSR Zone 3 */
+ { "zp5", 0, -HOUR ( 5), NULL }, /* USSR Zone 4 */
+ { "zp6", 0, -HOUR ( 6), NULL }, /* USSR Zone 5 */
#if 0
/* For completeness. BST is also British Summer, and GST is
* also Guam Standard. */
{ "bst", 0, HOUR ( 3), NULL }, /* Brazil Standard */
{ "gst", 0, HOUR ( 3), NULL }, /* Greenland Standard */
-#endif
- { "nft", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland */
- { "nst", 0, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Standard */
- { "ndt", 1, HOUR (3.5), "America/St_Johns" }, /* Newfoundland Daylight */
- { "ast", 0, HOUR ( 4), "America/Halifax" }, /* Atlantic Standard */
- { "adt", 1, HOUR ( 4), "America/Halifax" }, /* Atlantic Daylight */
- { "est", 0, HOUR ( 5), "America/New_York" }, /* Eastern Standard */
- { "edt", 1, HOUR ( 5), "America/New_York" }, /* Eastern Daylight */
- { "cst", 0, HOUR ( 6), "America/Chicago" }, /* Central Standard */
- { "cdt", 1, HOUR ( 6), "America/Chicago" }, /* Central Daylight */
- { "mst", 0, HOUR ( 7), "America/Phoenix" }, /* Mountain Standard */
- { "mdt", 1, HOUR ( 7), "America/Phoenix" }, /* Mountain Daylight */
- { "pst", 0, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Standard */
- { "pdt", 1, HOUR ( 8), "America/Los_Angeles" }, /* Pacific Daylight */
- { "yst", 0, HOUR ( 9), "America/Anchorage" }, /* Yukon Standard */
- { "ydt", 1, HOUR ( 9), "America/Anchorage" }, /* Yukon Daylight */
- { "hst", 0, HOUR (10), "Pacific/Honolulu" }, /* Hawaii Standard */
- { "hdt", 1, HOUR (10), "Pacific/Honolulu" }, /* Hawaii Daylight */
- { "cat", 0, HOUR (10), "America/Anchorage" }, /* Central Alaska */
- { "akst", 0, HOUR (10), "America/Anchorage" }, /* Alaska Standard */
- { "akdt", 0, HOUR (10), "America/Anchorage" }, /* Alaska Daylight */
- { "ahst", 0, HOUR (10), "America/Anchorage" }, /* Alaska-Hawaii Standard */
- { "nt", 0, HOUR (11), NULL }, /* Nome */
- { "idlw", 0, HOUR (12), NULL }, /* International Date Line West */
- { "cet", 0, -HOUR (1), "Europe/Berlin" }, /* Central European */
- { "cest", 1, -HOUR (1), "Europe/Berlin" }, /* Central European Summer */
- { "slt", 0, -HOUR (1), "Europe/Oslo" }, /* Skien Local Time */
- { "slst", 1, -HOUR (1), "Europe/Oslo" }, /* Skien Local Summer Time */
- { "met", 0, -HOUR (1), "MET" }, /* Middle European */
- { "mewt", 0, -HOUR (1), "MET" }, /* Middle European Winter */
- { "mest", 1, -HOUR (1), "MET" }, /* Middle European Summer */
- { "mesz", 1, -HOUR (1), "MET" }, /* Middle European Summer */
- { "swt", 0, -HOUR (1), "Europe/Stockholm" }, /* Swedish Winter */
- { "sst", 1, -HOUR (1), "Europe/Stockholm" }, /* Swedish Summer */
- { "fwt", 0, -HOUR (1), "Europe/Paris" }, /* French Winter */
- { "fst", 1, -HOUR (1), "Europe/Paris" }, /* French Summer */
- { "eet", 0, -HOUR (2), "Europe/Bucharest" }, /* Eastern Europe, USSR Zone 1 */
- { "bt", 0, -HOUR (3), "Asia/Baghdad" }, /* Baghdad, USSR Zone 2 */
- { "it", 0, -HOUR (3.5), "Asia/Tehran" },/* Iran */
- { "zp4", 0, -HOUR (4), NULL }, /* USSR Zone 3 */
- { "zp5", 0, -HOUR (5), NULL }, /* USSR Zone 4 */
- { "ist", 0, -HOUR (5.5), "Asia/Calcutta" },/* Indian Standard */
- { "zp6", 0, -HOUR (6), NULL }, /* USSR Zone 5 */
-#if 0
+
/* For completeness. NST is also Newfoundland Standard, and SST is
* also Swedish Summer. */
{ "nst", 0, -HOUR (6.5), NULL },/* North Sumatra */
{ "sst", 0, -HOUR (7), NULL }, /* South Sumatra, USSR Zone 6 */
#endif
- { "wast", 0, -HOUR (7), "Australia/Perth" }, /* West Australian Standard */
- { "wadt", 1, -HOUR (7), "Australia/Perth" }, /* West Australian Daylight */
- { "jt", 0, -HOUR (7.5), NULL },/* Java (3pm in Cronusland!) */
- { "cct", 0, -HOUR (8), "Asia/Shanghai" }, /* China Coast, USSR Zone 7 */
- { "jst", 0, -HOUR (9), "Asia/Tokyo" }, /* Japan Standard, USSR Zone 8 */
- { "cast", 0, -HOUR (9.5), "Australia/Adelaide" },/* Central Australian Standard */
- { "cadt", 1, -HOUR (9.5), "Australia/Adelaide" },/* Central Australian Daylight */
- { "east", 0, -HOUR (10), "Australia/Sydney" }, /* Eastern Australian Standard */
- { "eadt", 1, -HOUR (10), "Australia/Sydney" }, /* Eastern Australian Daylight */
- { "gst", 0, -HOUR (10), "Pacific/Guam" }, /* Guam Standard, USSR Zone 9 */
- { "nzt", 0, -HOUR (12), "NZ" }, /* New Zealand */
- { "nzst", 0, -HOUR (12), "NZ" }, /* New Zealand Standard */
- { "nzdt", 1, -HOUR (12), "NZ" }, /* New Zealand Daylight */
- { "idle", 0, -HOUR (12), "NZ" }, /* International Date Line East */
-
- { "a", 0, HOUR (- 1), NULL },
- { "b", 0, HOUR (- 2), NULL },
- { "c", 0, HOUR (- 3), NULL },
- { "d", 0, HOUR (- 4), NULL },
- { "e", 0, HOUR (- 5), NULL },
- { "f", 0, HOUR (- 6), NULL },
- { "g", 0, HOUR (- 7), NULL },
- { "h", 0, HOUR (- 8), NULL },
- { "i", 0, HOUR (- 9), NULL },
- { "k", 0, HOUR (-10), NULL },
- { "l", 0, HOUR (-11), NULL },
- { "m", 0, HOUR (-12), NULL },
- { "n", 0, HOUR ( 1), NULL },
- { "o", 0, HOUR ( 2), NULL },
- { "p", 0, HOUR ( 3), NULL },
- { "q", 0, HOUR ( 4), NULL },
- { "r", 0, HOUR ( 5), NULL },
- { "s", 0, HOUR ( 6), NULL },
- { "t", 0, HOUR ( 7), NULL },
- { "u", 0, HOUR ( 8), NULL },
- { "v", 0, HOUR ( 9), NULL },
- { "w", 0, HOUR ( 10), NULL },
- { "x", 0, HOUR ( 11), NULL },
- { "y", 0, HOUR ( 12), NULL },
- { "z", 0, HOUR ( 0), NULL },
- { NULL, 0, 0, NULL }
};
static timelib_relunit const timelib_relunit_lookup[] = {
}
}
+static timelib_tz_lookup_table* zone_search(char *word, int left, int right)
+{
+ int mid, cmp;
+
+ if (left > right) {
+ return NULL; /* not found */
+ }
+
+ mid = (left + right) / 2;
+
+ cmp = strcasecmp(word, timelib_timezone_lookup[mid].name);
+ if (cmp < 0) {
+ return zone_search(word, left, mid - 1);
+ } else if (cmp > 0) {
+ return zone_search(word, mid + 1, right);
+ } else { /* (cmp == 0) */
+ return (timelib_tz_lookup_table*)&timelib_timezone_lookup[mid];
+ }
+}
+
static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, char **tz_name)
{
char *word;
char *begin = *ptr, *end;
long value = 0;
- const timelib_tz_lookup_table *tp;
+ timelib_tz_lookup_table *tp;
while (**ptr != '\0') {
++*ptr;
memcpy(word, begin, end - begin);
*tz_name = NULL;
- for (tp = timelib_timezone_lookup; tp->name; tp++) {
- if (strcasecmp(word, tp->name) == 0) {
- value = tp->value;
- *dst = tp->type;
+ if ((tp = zone_search(word, 0, sizeof(timelib_timezone_lookup)/sizeof(*timelib_timezone_lookup)-1))) {
+ value = tp->value;
+ *dst = tp->type;
/*
- if (tp->full_tz_name) {
- *tz_name = tp->full_tz_name;
- }
-*/
- break;
+ if (tp->full_tz_name) {
+ *tz_name = tp->full_tz_name;
}
+*/
}
*tz_abbr = word;
-typedef struct { char *id; unsigned int pos; } tzdb_idx; tzdb_idx timezonedb_idx[533+1] = {
+typedef struct { char *id; unsigned int pos; } tzdb_idx; tzdb_idx timezonedb_idx[533] = {
{ "Africa/Abidjan" , 0x000000 },
{ "Africa/Accra" , 0x000049 },
{ "Africa/Addis_Ababa" , 0x0000E5 },
{ "WET" , 0x0379DF },
{ "W-SU" , 0x037C86 },
{ "Zulu" , 0x037FB5 },
-{ NULL, 0 }
};
/* This is a generated file, do not modify */
unsigned char php_timezone_db_index[229357] = {