From 28e76fe7f488ad79451d25f1cd6b0e50223bd18f Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Tue, 28 Jun 2005 17:56:47 +0000 Subject: [PATCH] - Implemented binary search for timezone abbreviations and timezone identifier lookups. (Based on a patch by Nuno Lopes) --- ext/date/lib/parse_date.c | 366 +++++++++++++++------------- ext/date/lib/parse_date.re | 218 +++++++++-------- ext/date/lib/parse_tz.c | 43 ++-- ext/date/lib/resource/parse_date.re | 218 +++++++++-------- ext/date/lib/timezonedb.h | 3 +- 5 files changed, 449 insertions(+), 399 deletions(-) diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c index 36848e90a5..dc250ed84a 100644 --- a/ext/date/lib/parse_date.c +++ b/ext/date/lib/parse_date.c @@ -1,4 +1,4 @@ -/* 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" /* +----------------------------------------------------------------------+ @@ -165,108 +165,105 @@ typedef struct _timelib_relunit { /* 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[] = { @@ -655,12 +652,32 @@ static void timelib_set_relative(char **ptr, timelib_sll amount, Scanner *s) } } +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; @@ -670,17 +687,14 @@ static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, char **tz_ 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; @@ -751,7 +765,7 @@ static int scan(Scanner *s) std: s->tok = cursor; s->len = 0; -#line 855 "parse_date.re" +#line 869 "parse_date.re" { @@ -790,7 +804,7 @@ std: 0, 0, 0, 0, 0, 0, 0, 0, }; -#line 794 "" +#line 808 "" { YYCTYPE yych; unsigned int yyaccept; @@ -868,14 +882,14 @@ yy2: 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 "" +#line 886 "" yy4: YYDEBUG(4, *YYCURSOR); yych = *++YYCURSOR; @@ -944,12 +958,12 @@ yy6: 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 "" +#line 952 "" yy8: YYDEBUG(8, *YYCURSOR); yyaccept = 0; @@ -1684,11 +1698,11 @@ yy43: yy44: YYDEBUG(44, *YYCURSOR); -#line 1342 "parse_date.re" +#line 1356 "parse_date.re" { goto std; } -#line 1598 "" +#line 1612 "" yy45: YYDEBUG(45, *YYCURSOR); ++YYCURSOR; @@ -1696,12 +1710,12 @@ yy45: yy46: YYDEBUG(46, *YYCURSOR); -#line 1347 "parse_date.re" +#line 1361 "parse_date.re" { s->pos = cursor; s->line++; goto std; } -#line 1607 "" +#line 1621 "" yy47: YYDEBUG(47, *YYCURSOR); yych = *++YYCURSOR; @@ -2054,7 +2068,7 @@ yy80: yy81: YYDEBUG(81, *YYCURSOR); -#line 1326 "parse_date.re" +#line 1340 "parse_date.re" { timelib_ull i; @@ -2069,7 +2083,7 @@ yy81: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 1904 "" +#line 1918 "" yy82: YYDEBUG(82, *YYCURSOR); ++YYCURSOR; @@ -2692,11 +2706,11 @@ yy147: yy148: YYDEBUG(148, *YYCURSOR); -#line 1288 "parse_date.re" +#line 1302 "parse_date.re" { goto std; } -#line 2397 "" +#line 2411 "" yy149: YYDEBUG(149, *YYCURSOR); yych = *++YYCURSOR; @@ -2738,7 +2752,7 @@ yy154: yy155: YYDEBUG(155, *YYCURSOR); -#line 1272 "parse_date.re" +#line 1286 "parse_date.re" { const timelib_relunit* relunit; @@ -2753,7 +2767,7 @@ yy155: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 2440 "" +#line 2454 "" yy156: YYDEBUG(156, *YYCURSOR); yyaccept = 1; @@ -3137,7 +3151,7 @@ yy187: yy188: YYDEBUG(188, *YYCURSOR); -#line 1256 "parse_date.re" +#line 1270 "parse_date.re" { timelib_sll i; @@ -3152,7 +3166,7 @@ yy188: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 2771 "" +#line 2785 "" yy189: YYDEBUG(189, *YYCURSOR); ++YYCURSOR; @@ -5325,7 +5339,7 @@ yy390: yy391: YYDEBUG(391, *YYCURSOR); -#line 1086 "parse_date.re" +#line 1100 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -5336,7 +5350,7 @@ yy391: TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 4545 "" +#line 4559 "" yy392: YYDEBUG(392, *YYCURSOR); yych = *++YYCURSOR; @@ -5387,7 +5401,7 @@ yy396: yy397: YYDEBUG(397, *YYCURSOR); -#line 1110 "parse_date.re" +#line 1124 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -5398,7 +5412,7 @@ yy397: TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 4595 "" +#line 4609 "" yy398: YYDEBUG(398, *YYCURSOR); yych = *++YYCURSOR; @@ -5487,7 +5501,7 @@ yy408: yy409: YYDEBUG(409, *YYCURSOR); -#line 1301 "parse_date.re" +#line 1315 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -5511,7 +5525,7 @@ yy409: TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 4684 "" +#line 4698 "" yy410: YYDEBUG(410, *YYCURSOR); yyaccept = 7; @@ -5837,7 +5851,7 @@ yy449: yy450: YYDEBUG(450, *YYCURSOR); -#line 1202 "parse_date.re" +#line 1216 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -5848,7 +5862,7 @@ yy450: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 4939 "" +#line 4953 "" yy451: YYDEBUG(451, *YYCURSOR); yych = *++YYCURSOR; @@ -7295,7 +7309,7 @@ yy557: 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; @@ -7308,7 +7322,7 @@ yy558: TIMELIB_DEINIT; return TIMELIB_AGO; } -#line 6183 "" +#line 6197 "" yy559: YYDEBUG(559, *YYCURSOR); yyaccept = 1; @@ -8953,7 +8967,7 @@ yy667: yy668: YYDEBUG(668, *YYCURSOR); -#line 942 "parse_date.re" +#line 956 "parse_date.re" { DEBUG_OUTPUT("timeshort24 | timelong24 | iso8601long"); TIMELIB_INIT; @@ -8974,7 +8988,7 @@ yy668: TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 7625 "" +#line 7639 "" yy669: YYDEBUG(669, *YYCURSOR); yyaccept = 10; @@ -9101,7 +9115,7 @@ yy682: yy683: YYDEBUG(683, *YYCURSOR); -#line 927 "parse_date.re" +#line 941 "parse_date.re" { DEBUG_OUTPUT("timeshort12 | timelong12"); TIMELIB_INIT; @@ -9115,7 +9129,7 @@ yy683: TIMELIB_DEINIT; return TIMELIB_TIME12; } -#line 7736 "" +#line 7750 "" yy684: YYDEBUG(684, *YYCURSOR); yych = *++YYCURSOR; @@ -9225,7 +9239,7 @@ yy695: yy696: YYDEBUG(696, *YYCURSOR); -#line 1062 "parse_date.re" +#line 1076 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -9236,7 +9250,7 @@ yy696: TIMELIB_DEINIT; return TIMELIB_DATE_FULL; } -#line 7831 "" +#line 7845 "" yy697: YYDEBUG(697, *YYCURSOR); yych = *++YYCURSOR; @@ -9603,7 +9617,7 @@ yy754: yy755: YYDEBUG(755, *YYCURSOR); -#line 1074 "parse_date.re" +#line 1088 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -9614,7 +9628,7 @@ yy755: TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 8091 "" +#line 8105 "" yy756: YYDEBUG(756, *YYCURSOR); yych = *++YYCURSOR; @@ -9986,7 +10000,7 @@ yy799: yy800: YYDEBUG(800, *YYCURSOR); -#line 1050 "parse_date.re" +#line 1064 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -9997,7 +10011,7 @@ yy800: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 8384 "" +#line 8398 "" yy801: YYDEBUG(801, *YYCURSOR); yych = *++YYCURSOR; @@ -10019,7 +10033,7 @@ yy803: yy804: YYDEBUG(804, *YYCURSOR); -#line 1025 "parse_date.re" +#line 1039 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -10032,7 +10046,7 @@ yy804: TIMELIB_DEINIT; return TIMELIB_AMERICAN; } -#line 8411 "" +#line 8425 "" yy805: YYDEBUG(805, *YYCURSOR); yyaccept = 11; @@ -10254,7 +10268,7 @@ yy836: yy837: YYDEBUG(837, *YYCURSOR); -#line 1226 "parse_date.re" +#line 1240 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_TIME(); @@ -10269,7 +10283,7 @@ yy837: TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 8582 "" +#line 8596 "" yy838: YYDEBUG(838, *YYCURSOR); yyaccept = 12; @@ -10581,7 +10595,7 @@ yy876: yy877: YYDEBUG(877, *YYCURSOR); -#line 1214 "parse_date.re" +#line 1228 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -10592,7 +10606,7 @@ yy877: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 8824 "" +#line 8838 "" yy878: YYDEBUG(878, *YYCURSOR); yych = *++YYCURSOR; @@ -10838,7 +10852,7 @@ yy896: yy897: YYDEBUG(897, *YYCURSOR); -#line 1098 "parse_date.re" +#line 1112 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -10849,7 +10863,7 @@ yy897: TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 9037 "" +#line 9051 "" yy898: YYDEBUG(898, *YYCURSOR); yych = *++YYCURSOR; @@ -11003,7 +11017,7 @@ yy916: yy917: YYDEBUG(917, *YYCURSOR); -#line 1183 "parse_date.re" +#line 1197 "parse_date.re" { timelib_sll w, d; @@ -11021,7 +11035,7 @@ yy917: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 9169 "" +#line 9183 "" yy918: YYDEBUG(918, *YYCURSOR); ++YYCURSOR; @@ -11029,7 +11043,7 @@ yy918: yy919: YYDEBUG(919, *YYCURSOR); -#line 1164 "parse_date.re" +#line 1178 "parse_date.re" { timelib_sll w, d; @@ -11047,7 +11061,7 @@ yy919: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 9191 "" +#line 9205 "" yy920: YYDEBUG(920, *YYCURSOR); yych = *++YYCURSOR; @@ -11080,7 +11094,7 @@ yy922: yy923: YYDEBUG(923, *YYCURSOR); -#line 1152 "parse_date.re" +#line 1166 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -11091,7 +11105,7 @@ yy923: TIMELIB_DEINIT; return TIMELIB_PG_YEARDAY; } -#line 9227 "" +#line 9241 "" yy924: YYDEBUG(924, *YYCURSOR); yych = *++YYCURSOR; @@ -11167,7 +11181,7 @@ yy929: yy930: YYDEBUG(930, *YYCURSOR); -#line 1122 "parse_date.re" +#line 1136 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -11177,7 +11191,7 @@ yy930: TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 9299 "" +#line 9313 "" yy931: YYDEBUG(931, *YYCURSOR); yych = *++YYCURSOR; @@ -11245,7 +11259,7 @@ yy940: yy941: YYDEBUG(941, *YYCURSOR); -#line 1133 "parse_date.re" +#line 1147 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_TIME(); @@ -11263,7 +11277,7 @@ yy941: TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 9363 "" +#line 9377 "" yy942: YYDEBUG(942, *YYCURSOR); yych = *++YYCURSOR; @@ -11944,7 +11958,7 @@ yy1034: yy1035: YYDEBUG(1035, *YYCURSOR); -#line 1039 "parse_date.re" +#line 1053 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -11954,7 +11968,7 @@ yy1035: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 9866 "" +#line 9880 "" yy1036: YYDEBUG(1036, *YYCURSOR); yych = *++YYCURSOR; @@ -12737,7 +12751,7 @@ yy1115: yy1116: YYDEBUG(1116, *YYCURSOR); -#line 964 "parse_date.re" +#line 978 "parse_date.re" { DEBUG_OUTPUT("gnunocolon"); TIMELIB_INIT; @@ -12758,7 +12772,7 @@ yy1116: TIMELIB_DEINIT; return TIMELIB_GNU_NOCOLON; } -#line 10504 "" +#line 10518 "" yy1117: YYDEBUG(1117, *YYCURSOR); yych = *++YYCURSOR; @@ -12831,7 +12845,7 @@ yy1123: yy1124: YYDEBUG(1124, *YYCURSOR); -#line 1009 "parse_date.re" +#line 1023 "parse_date.re" { DEBUG_OUTPUT("iso8601nocolon"); TIMELIB_INIT; @@ -12846,7 +12860,7 @@ yy1124: TIMELIB_DEINIT; return TIMELIB_ISO_NOCOLON; } -#line 10576 "" +#line 10590 "" yy1125: YYDEBUG(1125, *YYCURSOR); yyaccept = 19; @@ -13024,7 +13038,7 @@ yy1139: yy1140: YYDEBUG(1140, *YYCURSOR); -#line 903 "parse_date.re" +#line 917 "parse_date.re" { timelib_ull i; @@ -13047,7 +13061,7 @@ yy1140: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10743 "" +#line 10757 "" yy1141: YYDEBUG(1141, *YYCURSOR); yych = *++YYCURSOR; @@ -13095,7 +13109,7 @@ yy1148: yy1149: YYDEBUG(1149, *YYCURSOR); -#line 891 "parse_date.re" +#line 905 "parse_date.re" { DEBUG_OUTPUT("tomorrow"); TIMELIB_INIT; @@ -13106,7 +13120,7 @@ yy1149: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10784 "" +#line 10798 "" yy1150: YYDEBUG(1150, *YYCURSOR); yych = *++YYCURSOR; @@ -13123,7 +13137,7 @@ yy1151: yy1152: YYDEBUG(1152, *YYCURSOR); -#line 881 "parse_date.re" +#line 895 "parse_date.re" { DEBUG_OUTPUT("today"); TIMELIB_INIT; @@ -13132,7 +13146,7 @@ yy1152: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10804 "" +#line 10818 "" yy1153: YYDEBUG(1153, *YYCURSOR); yych = *++YYCURSOR; @@ -13155,7 +13169,7 @@ yy1154: yy1155: YYDEBUG(1155, *YYCURSOR); -#line 872 "parse_date.re" +#line 886 "parse_date.re" { DEBUG_OUTPUT("now"); TIMELIB_INIT; @@ -13163,7 +13177,7 @@ yy1155: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10829 "" +#line 10843 "" yy1156: YYDEBUG(1156, *YYCURSOR); yych = *++YYCURSOR; @@ -13210,7 +13224,7 @@ yy1163: yy1164: YYDEBUG(1164, *YYCURSOR); -#line 860 "parse_date.re" +#line 874 "parse_date.re" { DEBUG_OUTPUT("yesterday"); TIMELIB_INIT; @@ -13221,10 +13235,10 @@ yy1164: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10869 "" +#line 10883 "" } } -#line 1357 "parse_date.re" +#line 1371 "parse_date.re" } diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re index 6f193d533f..e98f405fd8 100644 --- a/ext/date/lib/parse_date.re +++ b/ext/date/lib/parse_date.re @@ -163,108 +163,105 @@ typedef struct _timelib_relunit { /* 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[] = { @@ -653,12 +650,32 @@ static void timelib_set_relative(char **ptr, timelib_sll amount, Scanner *s) } } +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; @@ -668,17 +685,14 @@ static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, char **tz_ 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; diff --git a/ext/date/lib/parse_tz.c b/ext/date/lib/parse_tz.c index 60aac4435d..69bf196393 100644 --- a/ext/date/lib/parse_tz.c +++ b/ext/date/lib/parse_tz.c @@ -185,27 +185,36 @@ void timelib_dump_tzinfo(timelib_tzinfo *tz) } } +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; } diff --git a/ext/date/lib/resource/parse_date.re b/ext/date/lib/resource/parse_date.re index 6f193d533f..e98f405fd8 100644 --- a/ext/date/lib/resource/parse_date.re +++ b/ext/date/lib/resource/parse_date.re @@ -163,108 +163,105 @@ typedef struct _timelib_relunit { /* 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[] = { @@ -653,12 +650,32 @@ static void timelib_set_relative(char **ptr, timelib_sll amount, Scanner *s) } } +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; @@ -668,17 +685,14 @@ static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, char **tz_ 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; diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index b7512eff2c..5e0235e240 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -1,4 +1,4 @@ -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 }, @@ -532,7 +532,6 @@ typedef struct { char *id; unsigned int pos; } tzdb_idx; tzdb_idx timezonedb_idx { "WET" , 0x0379DF }, { "W-SU" , 0x037C86 }, { "Zulu" , 0x037FB5 }, -{ NULL, 0 } }; /* This is a generated file, do not modify */ unsigned char php_timezone_db_index[229357] = { -- 2.50.1