cvs: php-src /ext/date/lib parse_date.c parse_tz.c timezonedb.h /ext/date/lib/resource parse_date.re
| From: | Derick Rethans | Date: | Tue, 28 Jun 2005 17:56:48 +0000 |
| Subject: | cvs: php-src /ext/date/lib parse_date.c parse_tz.c timezonedb.h /ext/date/lib/resource parse_date.re | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-32550@lists.php.net to get a copy of this message | ||
derick Tue Jun 28 13:56:48 2005 EDT
Modified files:
/php-src/ext/date/lib parse_date.c parse_tz.c timezonedb.h
/php-src/ext/date/lib/resource parse_date.re
Log:
- Implemented binary search for timezone abbreviations and timezone identifier
lookups. (Based on a patch by Nuno Lopes)
http://cvs.php.net/diff.php/php-src/ext/date/lib/parse_date.c?r1=1.14&r2=1.15&ty=u Index: php-src/ext/date/lib/parse_date.c diff -u php-src/ext/date/lib/parse_date.c:1.14 php-src/ext/date/lib/parse_date.c:1.15 --- php-src/ext/date/lib/parse_date.c:1.14 Tue Jun 21 13:43:27 2005 +++ php-src/ext/date/lib/parse_date.c Tue Jun 28 13:56:46 2005 @@ -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" /* +----------------------------------------------------------------------+ @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: parse_date.c,v 1.14 2005/06/21 17:43:27 derick Exp $ */ +/* $Id: parse_date.c,v 1.15 2005/06/28 17:56:46 derick Exp $ */ #include <timelib_config.h> @@ -165,108 +165,105 @@ /* 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 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 @@ 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 @@ std: s->tok = cursor; s->len = 0; -#line 855 "parse_date.re" +#line 869 "parse_date.re" { @@ -790,7 +804,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, }; -#line 794 "<stdout>" +#line 808 "<stdout>" { YYCTYPE yych; unsigned int yyaccept; @@ -868,14 +882,14 @@ 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; @@ -944,12 +958,12 @@ 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; @@ -1684,11 +1698,11 @@ 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; @@ -1696,12 +1710,12 @@ 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; @@ -2054,7 +2068,7 @@ yy81: YYDEBUG(81, *YYCURSOR); -#line 1326 "parse_date.re" +#line 1340 "parse_date.re" { timelib_ull i; @@ -2069,7 +2083,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 1904 "<stdout>" +#line 1918 "<stdout>" yy82: YYDEBUG(82, *YYCURSOR); ++YYCURSOR; @@ -2692,11 +2706,11 @@ 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; @@ -2738,7 +2752,7 @@ yy155: YYDEBUG(155, *YYCURSOR); -#line 1272 "parse_date.re" +#line 1286 "parse_date.re" { const timelib_relunit* relunit; @@ -2753,7 +2767,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 2440 "<stdout>" +#line 2454 "<stdout>" yy156: YYDEBUG(156, *YYCURSOR); yyaccept = 1; @@ -3137,7 +3151,7 @@ yy188: YYDEBUG(188, *YYCURSOR); -#line 1256 "parse_date.re" +#line 1270 "parse_date.re" { timelib_sll i; @@ -3152,7 +3166,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 2771 "<stdout>" +#line 2785 "<stdout>" yy189: YYDEBUG(189, *YYCURSOR); ++YYCURSOR; @@ -5325,7 +5339,7 @@ yy391: YYDEBUG(391, *YYCURSOR); -#line 1086 "parse_date.re" +#line 1100 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -5336,7 +5350,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 4545 "<stdout>" +#line 4559 "<stdout>" yy392: YYDEBUG(392, *YYCURSOR); yych = *++YYCURSOR; @@ -5387,7 +5401,7 @@ yy397: YYDEBUG(397, *YYCURSOR); -#line 1110 "parse_date.re" +#line 1124 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -5398,7 +5412,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 4595 "<stdout>" +#line 4609 "<stdout>" yy398: YYDEBUG(398, *YYCURSOR); yych = *++YYCURSOR; @@ -5487,7 +5501,7 @@ yy409: YYDEBUG(409, *YYCURSOR); -#line 1301 "parse_date.re" +#line 1315 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -5511,7 +5525,7 @@ TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 4684 "<stdout>" +#line 4698 "<stdout>" yy410: YYDEBUG(410, *YYCURSOR); yyaccept = 7; @@ -5837,7 +5851,7 @@ yy450: YYDEBUG(450, *YYCURSOR); -#line 1202 "parse_date.re" +#line 1216 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -5848,7 +5862,7 @@ TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 4939 "<stdout>" +#line 4953 "<stdout>" yy451: YYDEBUG(451, *YYCURSOR); yych = *++YYCURSOR; @@ -7295,7 +7309,7 @@ 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 @@ TIMELIB_DEINIT; return TIMELIB_AGO; } -#line 6183 "<stdout>" +#line 6197 "<stdout>" yy559: YYDEBUG(559, *YYCURSOR); yyaccept = 1; @@ -8953,7 +8967,7 @@ 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 @@ TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 7625 "<stdout>" +#line 7639 "<stdout>" yy669: YYDEBUG(669, *YYCURSOR); yyaccept = 10; @@ -9101,7 +9115,7 @@ yy683: YYDEBUG(683, *YYCURSOR); -#line 927 "parse_date.re" +#line 941 "parse_date.re" { DEBUG_OUTPUT("timeshort12 | timelong12"); TIMELIB_INIT; @@ -9115,7 +9129,7 @@ TIMELIB_DEINIT; return TIMELIB_TIME12; } -#line 7736 "<stdout>" +#line 7750 "<stdout>" yy684: YYDEBUG(684, *YYCURSOR); yych = *++YYCURSOR; @@ -9225,7 +9239,7 @@ yy696: YYDEBUG(696, *YYCURSOR); -#line 1062 "parse_date.re" +#line 1076 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -9236,7 +9250,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_FULL; } -#line 7831 "<stdout>" +#line 7845 "<stdout>" yy697: YYDEBUG(697, *YYCURSOR); yych = *++YYCURSOR; @@ -9603,7 +9617,7 @@ yy755: YYDEBUG(755, *YYCURSOR); -#line 1074 "parse_date.re" +#line 1088 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -9614,7 +9628,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 8091 "<stdout>" +#line 8105 "<stdout>" yy756: YYDEBUG(756, *YYCURSOR); yych = *++YYCURSOR; @@ -9986,7 +10000,7 @@ yy800: YYDEBUG(800, *YYCURSOR); -#line 1050 "parse_date.re" +#line 1064 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -9997,7 +10011,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 8384 "<stdout>" +#line 8398 "<stdout>" yy801: YYDEBUG(801, *YYCURSOR); yych = *++YYCURSOR; @@ -10019,7 +10033,7 @@ yy804: YYDEBUG(804, *YYCURSOR); -#line 1025 "parse_date.re" +#line 1039 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -10032,7 +10046,7 @@ TIMELIB_DEINIT; return TIMELIB_AMERICAN; } -#line 8411 "<stdout>" +#line 8425 "<stdout>" yy805: YYDEBUG(805, *YYCURSOR); yyaccept = 11; @@ -10254,7 +10268,7 @@ yy837: YYDEBUG(837, *YYCURSOR); -#line 1226 "parse_date.re" +#line 1240 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_TIME(); @@ -10269,7 +10283,7 @@ TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 8582 "<stdout>" +#line 8596 "<stdout>" yy838: YYDEBUG(838, *YYCURSOR); yyaccept = 12; @@ -10581,7 +10595,7 @@ yy877: YYDEBUG(877, *YYCURSOR); -#line 1214 "parse_date.re" +#line 1228 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -10592,7 +10606,7 @@ TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 8824 "<stdout>" +#line 8838 "<stdout>" yy878: YYDEBUG(878, *YYCURSOR); yych = *++YYCURSOR; @@ -10838,7 +10852,7 @@ yy897: YYDEBUG(897, *YYCURSOR); -#line 1098 "parse_date.re" +#line 1112 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -10849,7 +10863,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 9037 "<stdout>" +#line 9051 "<stdout>" yy898: YYDEBUG(898, *YYCURSOR); yych = *++YYCURSOR; @@ -11003,7 +11017,7 @@ yy917: YYDEBUG(917, *YYCURSOR); -#line 1183 "parse_date.re" +#line 1197 "parse_date.re" { timelib_sll w, d; @@ -11021,7 +11035,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 9169 "<stdout>" +#line 9183 "<stdout>" yy918: YYDEBUG(918, *YYCURSOR); ++YYCURSOR; @@ -11029,7 +11043,7 @@ yy919: YYDEBUG(919, *YYCURSOR); -#line 1164 "parse_date.re" +#line 1178 "parse_date.re" { timelib_sll w, d; @@ -11047,7 +11061,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 9191 "<stdout>" +#line 9205 "<stdout>" yy920: YYDEBUG(920, *YYCURSOR); yych = *++YYCURSOR; @@ -11080,7 +11094,7 @@ yy923: YYDEBUG(923, *YYCURSOR); -#line 1152 "parse_date.re" +#line 1166 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -11091,7 +11105,7 @@ TIMELIB_DEINIT; return TIMELIB_PG_YEARDAY; } -#line 9227 "<stdout>" +#line 9241 "<stdout>" yy924: YYDEBUG(924, *YYCURSOR); yych = *++YYCURSOR; @@ -11167,7 +11181,7 @@ yy930: YYDEBUG(930, *YYCURSOR); -#line 1122 "parse_date.re" +#line 1136 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -11177,7 +11191,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 9299 "<stdout>" +#line 9313 "<stdout>" yy931: YYDEBUG(931, *YYCURSOR); yych = *++YYCURSOR; @@ -11245,7 +11259,7 @@ yy941: YYDEBUG(941, *YYCURSOR); -#line 1133 "parse_date.re" +#line 1147 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_TIME(); @@ -11263,7 +11277,7 @@ TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 9363 "<stdout>" +#line 9377 "<stdout>" yy942: YYDEBUG(942, *YYCURSOR); yych = *++YYCURSOR; @@ -11944,7 +11958,7 @@ yy1035: YYDEBUG(1035, *YYCURSOR); -#line 1039 "parse_date.re" +#line 1053 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -11954,7 +11968,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 9866 "<stdout>" +#line 9880 "<stdout>" yy1036: YYDEBUG(1036, *YYCURSOR); yych = *++YYCURSOR; @@ -12737,7 +12751,7 @@ yy1116: YYDEBUG(1116, *YYCURSOR); -#line 964 "parse_date.re" +#line 978 "parse_date.re" { DEBUG_OUTPUT("gnunocolon"); TIMELIB_INIT; @@ -12758,7 +12772,7 @@ TIMELIB_DEINIT; return TIMELIB_GNU_NOCOLON; } -#line 10504 "<stdout>" +#line 10518 "<stdout>" yy1117: YYDEBUG(1117, *YYCURSOR); yych = *++YYCURSOR; @@ -12831,7 +12845,7 @@ yy1124: YYDEBUG(1124, *YYCURSOR); -#line 1009 "parse_date.re" +#line 1023 "parse_date.re" { DEBUG_OUTPUT("iso8601nocolon"); TIMELIB_INIT; @@ -12846,7 +12860,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_NOCOLON; } -#line 10576 "<stdout>" +#line 10590 "<stdout>" yy1125: YYDEBUG(1125, *YYCURSOR); yyaccept = 19; @@ -13024,7 +13038,7 @@ yy1140: YYDEBUG(1140, *YYCURSOR); -#line 903 "parse_date.re" +#line 917 "parse_date.re" { timelib_ull i; @@ -13047,7 +13061,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10743 "<stdout>" +#line 10757 "<stdout>" yy1141: YYDEBUG(1141, *YYCURSOR); yych = *++YYCURSOR; @@ -13095,7 +13109,7 @@ yy1149: YYDEBUG(1149, *YYCURSOR); -#line 891 "parse_date.re" +#line 905 "parse_date.re" { DEBUG_OUTPUT("tomorrow"); TIMELIB_INIT; @@ -13106,7 +13120,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10784 "<stdout>" +#line 10798 "<stdout>" yy1150: YYDEBUG(1150, *YYCURSOR); yych = *++YYCURSOR; @@ -13123,7 +13137,7 @@ yy1152: YYDEBUG(1152, *YYCURSOR); -#line 881 "parse_date.re" +#line 895 "parse_date.re" { DEBUG_OUTPUT("today"); TIMELIB_INIT; @@ -13132,7 +13146,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10804 "<stdout>" +#line 10818 "<stdout>" yy1153: YYDEBUG(1153, *YYCURSOR); yych = *++YYCURSOR; @@ -13155,7 +13169,7 @@ yy1155: YYDEBUG(1155, *YYCURSOR); -#line 872 "parse_date.re" +#line 886 "parse_date.re" { DEBUG_OUTPUT("now"); TIMELIB_INIT; @@ -13163,7 +13177,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10829 "<stdout>" +#line 10843 "<stdout>" yy1156: YYDEBUG(1156, *YYCURSOR); yych = *++YYCURSOR; @@ -13210,7 +13224,7 @@ yy1164: YYDEBUG(1164, *YYCURSOR); -#line 860 "parse_date.re" +#line 874 "parse_date.re" { DEBUG_OUTPUT("yesterday"); TIMELIB_INIT; @@ -13221,10 +13235,10 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10869 "<stdout>" +#line 10883 "<stdout>" } } -#line 1357 "parse_date.re" +#line 1371 "parse_date.re" } http://cvs.php.net/diff.php/php-src/ext/date/lib/parse_tz.c?r1=1.13&r2=1.14&ty=u Index: php-src/ext/date/lib/parse_tz.c diff -u php-src/ext/date/lib/parse_tz.c:1.13 php-src/ext/date/lib/parse_tz.c:1.14 --- php-src/ext/date/lib/parse_tz.c:1.13 Mon Jun 20 07:07:53 2005 +++ php-src/ext/date/lib/parse_tz.c Tue Jun 28 13:56:46 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: parse_tz.c,v 1.13 2005/06/20 11:07:53 derick Exp $ */ +/* $Id: parse_tz.c,v 1.14 2005/06/28 17:56:46 derick Exp $ */ #include <timelib_config.h> @@ -185,27 +185,36 @@ } } -static int seek_to_tz_position(char **tzf, char *timezone) +static int tz_search(char *timezone, int left, int right) { - int found; - tzdb_idx *ptr; + int mid, cmp; - /* Reset Index Position */ - ptr = timezonedb_idx; + 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; + } +} - /* 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) { + +static int seek_to_tz_position(char **tzf, char *timezone) +{ + 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; } http://cvs.php.net/diff.php/php-src/ext/date/lib/timezonedb.h?r1=1.1&r2=1.2&ty=u Index: php-src/ext/date/lib/timezonedb.h diff -u php-src/ext/date/lib/timezonedb.h:1.1 php-src/ext/date/lib/timezonedb.h:1.2 --- php-src/ext/date/lib/timezonedb.h:1.1 Tue Jun 14 17:32:27 2005 +++ php-src/ext/date/lib/timezonedb.h Tue Jun 28 13:56:46 2005 @@ -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 @@ { "WET" , 0x0379DF }, { "W-SU" , 0x037C86 }, { "Zulu" , 0x037FB5 }, -{ NULL, 0 } }; /* This is a generated file, do not modify */ unsigned char php_timezone_db_index[229357] = { http://cvs.php.net/diff.php/php-src/ext/date/lib/resource/parse_date.re?r1=1.13&r2=1.14&ty=u Index: php-src/ext/date/lib/resource/parse_date.re diff -u php-src/ext/date/lib/resource/parse_date.re:1.13 php-src/ext/date/lib/resource/parse_date.re:1.14 --- php-src/ext/date/lib/resource/parse_date.re:1.13 Tue Jun 21 13:43:28 2005 +++ php-src/ext/date/lib/resource/parse_date.re Tue Jun 28 13:56:47 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: parse_date.re,v 1.13 2005/06/21 17:43:28 derick Exp $ */ +/* $Id: parse_date.re,v 1.14 2005/06/28 17:56:47 derick Exp $ */ #include <timelib_config.h> @@ -163,108 +163,105 @@ /* 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 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 @@ 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;
http://cvs.php.net/diff.php/php-src/ext/date/lib/parse_date.c?r1=1.14&r2=1.15&ty=u Index: php-src/ext/date/lib/parse_date.c diff -u php-src/ext/date/lib/parse_date.c:1.14 php-src/ext/date/lib/parse_date.c:1.15 --- php-src/ext/date/lib/parse_date.c:1.14 Tue Jun 21 13:43:27 2005 +++ php-src/ext/date/lib/parse_date.c Tue Jun 28 13:56:46 2005 @@ -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" /* +----------------------------------------------------------------------+ @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: parse_date.c,v 1.14 2005/06/21 17:43:27 derick Exp $ */ +/* $Id: parse_date.c,v 1.15 2005/06/28 17:56:46 derick Exp $ */ #include <timelib_config.h> @@ -165,108 +165,105 @@ /* 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 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 @@ 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 @@ std: s->tok = cursor; s->len = 0; -#line 855 "parse_date.re" +#line 869 "parse_date.re" { @@ -790,7 +804,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, }; -#line 794 "<stdout>" +#line 808 "<stdout>" { YYCTYPE yych; unsigned int yyaccept; @@ -868,14 +882,14 @@ 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; @@ -944,12 +958,12 @@ 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; @@ -1684,11 +1698,11 @@ 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; @@ -1696,12 +1710,12 @@ 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; @@ -2054,7 +2068,7 @@ yy81: YYDEBUG(81, *YYCURSOR); -#line 1326 "parse_date.re" +#line 1340 "parse_date.re" { timelib_ull i; @@ -2069,7 +2083,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 1904 "<stdout>" +#line 1918 "<stdout>" yy82: YYDEBUG(82, *YYCURSOR); ++YYCURSOR; @@ -2692,11 +2706,11 @@ 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; @@ -2738,7 +2752,7 @@ yy155: YYDEBUG(155, *YYCURSOR); -#line 1272 "parse_date.re" +#line 1286 "parse_date.re" { const timelib_relunit* relunit; @@ -2753,7 +2767,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 2440 "<stdout>" +#line 2454 "<stdout>" yy156: YYDEBUG(156, *YYCURSOR); yyaccept = 1; @@ -3137,7 +3151,7 @@ yy188: YYDEBUG(188, *YYCURSOR); -#line 1256 "parse_date.re" +#line 1270 "parse_date.re" { timelib_sll i; @@ -3152,7 +3166,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 2771 "<stdout>" +#line 2785 "<stdout>" yy189: YYDEBUG(189, *YYCURSOR); ++YYCURSOR; @@ -5325,7 +5339,7 @@ yy391: YYDEBUG(391, *YYCURSOR); -#line 1086 "parse_date.re" +#line 1100 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -5336,7 +5350,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 4545 "<stdout>" +#line 4559 "<stdout>" yy392: YYDEBUG(392, *YYCURSOR); yych = *++YYCURSOR; @@ -5387,7 +5401,7 @@ yy397: YYDEBUG(397, *YYCURSOR); -#line 1110 "parse_date.re" +#line 1124 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -5398,7 +5412,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 4595 "<stdout>" +#line 4609 "<stdout>" yy398: YYDEBUG(398, *YYCURSOR); yych = *++YYCURSOR; @@ -5487,7 +5501,7 @@ yy409: YYDEBUG(409, *YYCURSOR); -#line 1301 "parse_date.re" +#line 1315 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -5511,7 +5525,7 @@ TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 4684 "<stdout>" +#line 4698 "<stdout>" yy410: YYDEBUG(410, *YYCURSOR); yyaccept = 7; @@ -5837,7 +5851,7 @@ yy450: YYDEBUG(450, *YYCURSOR); -#line 1202 "parse_date.re" +#line 1216 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -5848,7 +5862,7 @@ TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 4939 "<stdout>" +#line 4953 "<stdout>" yy451: YYDEBUG(451, *YYCURSOR); yych = *++YYCURSOR; @@ -7295,7 +7309,7 @@ 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 @@ TIMELIB_DEINIT; return TIMELIB_AGO; } -#line 6183 "<stdout>" +#line 6197 "<stdout>" yy559: YYDEBUG(559, *YYCURSOR); yyaccept = 1; @@ -8953,7 +8967,7 @@ 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 @@ TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 7625 "<stdout>" +#line 7639 "<stdout>" yy669: YYDEBUG(669, *YYCURSOR); yyaccept = 10; @@ -9101,7 +9115,7 @@ yy683: YYDEBUG(683, *YYCURSOR); -#line 927 "parse_date.re" +#line 941 "parse_date.re" { DEBUG_OUTPUT("timeshort12 | timelong12"); TIMELIB_INIT; @@ -9115,7 +9129,7 @@ TIMELIB_DEINIT; return TIMELIB_TIME12; } -#line 7736 "<stdout>" +#line 7750 "<stdout>" yy684: YYDEBUG(684, *YYCURSOR); yych = *++YYCURSOR; @@ -9225,7 +9239,7 @@ yy696: YYDEBUG(696, *YYCURSOR); -#line 1062 "parse_date.re" +#line 1076 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -9236,7 +9250,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_FULL; } -#line 7831 "<stdout>" +#line 7845 "<stdout>" yy697: YYDEBUG(697, *YYCURSOR); yych = *++YYCURSOR; @@ -9603,7 +9617,7 @@ yy755: YYDEBUG(755, *YYCURSOR); -#line 1074 "parse_date.re" +#line 1088 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -9614,7 +9628,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 8091 "<stdout>" +#line 8105 "<stdout>" yy756: YYDEBUG(756, *YYCURSOR); yych = *++YYCURSOR; @@ -9986,7 +10000,7 @@ yy800: YYDEBUG(800, *YYCURSOR); -#line 1050 "parse_date.re" +#line 1064 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -9997,7 +10011,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 8384 "<stdout>" +#line 8398 "<stdout>" yy801: YYDEBUG(801, *YYCURSOR); yych = *++YYCURSOR; @@ -10019,7 +10033,7 @@ yy804: YYDEBUG(804, *YYCURSOR); -#line 1025 "parse_date.re" +#line 1039 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -10032,7 +10046,7 @@ TIMELIB_DEINIT; return TIMELIB_AMERICAN; } -#line 8411 "<stdout>" +#line 8425 "<stdout>" yy805: YYDEBUG(805, *YYCURSOR); yyaccept = 11; @@ -10254,7 +10268,7 @@ yy837: YYDEBUG(837, *YYCURSOR); -#line 1226 "parse_date.re" +#line 1240 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_TIME(); @@ -10269,7 +10283,7 @@ TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 8582 "<stdout>" +#line 8596 "<stdout>" yy838: YYDEBUG(838, *YYCURSOR); yyaccept = 12; @@ -10581,7 +10595,7 @@ yy877: YYDEBUG(877, *YYCURSOR); -#line 1214 "parse_date.re" +#line 1228 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -10592,7 +10606,7 @@ TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 8824 "<stdout>" +#line 8838 "<stdout>" yy878: YYDEBUG(878, *YYCURSOR); yych = *++YYCURSOR; @@ -10838,7 +10852,7 @@ yy897: YYDEBUG(897, *YYCURSOR); -#line 1098 "parse_date.re" +#line 1112 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -10849,7 +10863,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 9037 "<stdout>" +#line 9051 "<stdout>" yy898: YYDEBUG(898, *YYCURSOR); yych = *++YYCURSOR; @@ -11003,7 +11017,7 @@ yy917: YYDEBUG(917, *YYCURSOR); -#line 1183 "parse_date.re" +#line 1197 "parse_date.re" { timelib_sll w, d; @@ -11021,7 +11035,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 9169 "<stdout>" +#line 9183 "<stdout>" yy918: YYDEBUG(918, *YYCURSOR); ++YYCURSOR; @@ -11029,7 +11043,7 @@ yy919: YYDEBUG(919, *YYCURSOR); -#line 1164 "parse_date.re" +#line 1178 "parse_date.re" { timelib_sll w, d; @@ -11047,7 +11061,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 9191 "<stdout>" +#line 9205 "<stdout>" yy920: YYDEBUG(920, *YYCURSOR); yych = *++YYCURSOR; @@ -11080,7 +11094,7 @@ yy923: YYDEBUG(923, *YYCURSOR); -#line 1152 "parse_date.re" +#line 1166 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -11091,7 +11105,7 @@ TIMELIB_DEINIT; return TIMELIB_PG_YEARDAY; } -#line 9227 "<stdout>" +#line 9241 "<stdout>" yy924: YYDEBUG(924, *YYCURSOR); yych = *++YYCURSOR; @@ -11167,7 +11181,7 @@ yy930: YYDEBUG(930, *YYCURSOR); -#line 1122 "parse_date.re" +#line 1136 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -11177,7 +11191,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 9299 "<stdout>" +#line 9313 "<stdout>" yy931: YYDEBUG(931, *YYCURSOR); yych = *++YYCURSOR; @@ -11245,7 +11259,7 @@ yy941: YYDEBUG(941, *YYCURSOR); -#line 1133 "parse_date.re" +#line 1147 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_TIME(); @@ -11263,7 +11277,7 @@ TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 9363 "<stdout>" +#line 9377 "<stdout>" yy942: YYDEBUG(942, *YYCURSOR); yych = *++YYCURSOR; @@ -11944,7 +11958,7 @@ yy1035: YYDEBUG(1035, *YYCURSOR); -#line 1039 "parse_date.re" +#line 1053 "parse_date.re" { TIMELIB_INIT; TIMELIB_HAVE_DATE(); @@ -11954,7 +11968,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 9866 "<stdout>" +#line 9880 "<stdout>" yy1036: YYDEBUG(1036, *YYCURSOR); yych = *++YYCURSOR; @@ -12737,7 +12751,7 @@ yy1116: YYDEBUG(1116, *YYCURSOR); -#line 964 "parse_date.re" +#line 978 "parse_date.re" { DEBUG_OUTPUT("gnunocolon"); TIMELIB_INIT; @@ -12758,7 +12772,7 @@ TIMELIB_DEINIT; return TIMELIB_GNU_NOCOLON; } -#line 10504 "<stdout>" +#line 10518 "<stdout>" yy1117: YYDEBUG(1117, *YYCURSOR); yych = *++YYCURSOR; @@ -12831,7 +12845,7 @@ yy1124: YYDEBUG(1124, *YYCURSOR); -#line 1009 "parse_date.re" +#line 1023 "parse_date.re" { DEBUG_OUTPUT("iso8601nocolon"); TIMELIB_INIT; @@ -12846,7 +12860,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_NOCOLON; } -#line 10576 "<stdout>" +#line 10590 "<stdout>" yy1125: YYDEBUG(1125, *YYCURSOR); yyaccept = 19; @@ -13024,7 +13038,7 @@ yy1140: YYDEBUG(1140, *YYCURSOR); -#line 903 "parse_date.re" +#line 917 "parse_date.re" { timelib_ull i; @@ -13047,7 +13061,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10743 "<stdout>" +#line 10757 "<stdout>" yy1141: YYDEBUG(1141, *YYCURSOR); yych = *++YYCURSOR; @@ -13095,7 +13109,7 @@ yy1149: YYDEBUG(1149, *YYCURSOR); -#line 891 "parse_date.re" +#line 905 "parse_date.re" { DEBUG_OUTPUT("tomorrow"); TIMELIB_INIT; @@ -13106,7 +13120,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10784 "<stdout>" +#line 10798 "<stdout>" yy1150: YYDEBUG(1150, *YYCURSOR); yych = *++YYCURSOR; @@ -13123,7 +13137,7 @@ yy1152: YYDEBUG(1152, *YYCURSOR); -#line 881 "parse_date.re" +#line 895 "parse_date.re" { DEBUG_OUTPUT("today"); TIMELIB_INIT; @@ -13132,7 +13146,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10804 "<stdout>" +#line 10818 "<stdout>" yy1153: YYDEBUG(1153, *YYCURSOR); yych = *++YYCURSOR; @@ -13155,7 +13169,7 @@ yy1155: YYDEBUG(1155, *YYCURSOR); -#line 872 "parse_date.re" +#line 886 "parse_date.re" { DEBUG_OUTPUT("now"); TIMELIB_INIT; @@ -13163,7 +13177,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10829 "<stdout>" +#line 10843 "<stdout>" yy1156: YYDEBUG(1156, *YYCURSOR); yych = *++YYCURSOR; @@ -13210,7 +13224,7 @@ yy1164: YYDEBUG(1164, *YYCURSOR); -#line 860 "parse_date.re" +#line 874 "parse_date.re" { DEBUG_OUTPUT("yesterday"); TIMELIB_INIT; @@ -13221,10 +13235,10 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10869 "<stdout>" +#line 10883 "<stdout>" } } -#line 1357 "parse_date.re" +#line 1371 "parse_date.re" } http://cvs.php.net/diff.php/php-src/ext/date/lib/parse_tz.c?r1=1.13&r2=1.14&ty=u Index: php-src/ext/date/lib/parse_tz.c diff -u php-src/ext/date/lib/parse_tz.c:1.13 php-src/ext/date/lib/parse_tz.c:1.14 --- php-src/ext/date/lib/parse_tz.c:1.13 Mon Jun 20 07:07:53 2005 +++ php-src/ext/date/lib/parse_tz.c Tue Jun 28 13:56:46 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: parse_tz.c,v 1.13 2005/06/20 11:07:53 derick Exp $ */ +/* $Id: parse_tz.c,v 1.14 2005/06/28 17:56:46 derick Exp $ */ #include <timelib_config.h> @@ -185,27 +185,36 @@ } } -static int seek_to_tz_position(char **tzf, char *timezone) +static int tz_search(char *timezone, int left, int right) { - int found; - tzdb_idx *ptr; + int mid, cmp; - /* Reset Index Position */ - ptr = timezonedb_idx; + 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; + } +} - /* 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) { + +static int seek_to_tz_position(char **tzf, char *timezone) +{ + 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; } http://cvs.php.net/diff.php/php-src/ext/date/lib/timezonedb.h?r1=1.1&r2=1.2&ty=u Index: php-src/ext/date/lib/timezonedb.h diff -u php-src/ext/date/lib/timezonedb.h:1.1 php-src/ext/date/lib/timezonedb.h:1.2 --- php-src/ext/date/lib/timezonedb.h:1.1 Tue Jun 14 17:32:27 2005 +++ php-src/ext/date/lib/timezonedb.h Tue Jun 28 13:56:46 2005 @@ -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 @@ { "WET" , 0x0379DF }, { "W-SU" , 0x037C86 }, { "Zulu" , 0x037FB5 }, -{ NULL, 0 } }; /* This is a generated file, do not modify */ unsigned char php_timezone_db_index[229357] = { http://cvs.php.net/diff.php/php-src/ext/date/lib/resource/parse_date.re?r1=1.13&r2=1.14&ty=u Index: php-src/ext/date/lib/resource/parse_date.re diff -u php-src/ext/date/lib/resource/parse_date.re:1.13 php-src/ext/date/lib/resource/parse_date.re:1.14 --- php-src/ext/date/lib/resource/parse_date.re:1.13 Tue Jun 21 13:43:28 2005 +++ php-src/ext/date/lib/resource/parse_date.re Tue Jun 28 13:56:47 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: parse_date.re,v 1.13 2005/06/21 17:43:28 derick Exp $ */ +/* $Id: parse_date.re,v 1.14 2005/06/28 17:56:47 derick Exp $ */ #include <timelib_config.h> @@ -163,108 +163,105 @@ /* 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 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 @@ 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;