]> granicus.if.org Git - php/commitdiff
- Implemented binary search for timezone abbreviations and timezone identifier
authorDerick Rethans <derick@php.net>
Tue, 28 Jun 2005 17:56:47 +0000 (17:56 +0000)
committerDerick Rethans <derick@php.net>
Tue, 28 Jun 2005 17:56:47 +0000 (17:56 +0000)
  lookups. (Based on a patch by Nuno Lopes)

ext/date/lib/parse_date.c
ext/date/lib/parse_date.re
ext/date/lib/parse_tz.c
ext/date/lib/resource/parse_date.re
ext/date/lib/timezonedb.h

index 36848e90a5131f8717344ea0a1c987905acb15b8..dc250ed84a40cae9e10b6dc7c8479da7b80d956b 100644 (file)
@@ -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 "<stdout>"
+#line 808 "<stdout>"
 {
        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 "<stdout>"
+#line 886 "<stdout>"
 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 "<stdout>"
+#line 952 "<stdout>"
 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 "<stdout>"
+#line 1612 "<stdout>"
 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 "<stdout>"
+#line 1621 "<stdout>"
 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 "<stdout>"
+#line 1918 "<stdout>"
 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 "<stdout>"
+#line 2411 "<stdout>"
 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 "<stdout>"
+#line 2454 "<stdout>"
 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 "<stdout>"
+#line 2785 "<stdout>"
 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 "<stdout>"
+#line 4559 "<stdout>"
 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 "<stdout>"
+#line 4609 "<stdout>"
 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 "<stdout>"
+#line 4698 "<stdout>"
 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 "<stdout>"
+#line 4953 "<stdout>"
 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 "<stdout>"
+#line 6197 "<stdout>"
 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 "<stdout>"
+#line 7639 "<stdout>"
 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 "<stdout>"
+#line 7750 "<stdout>"
 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 "<stdout>"
+#line 7845 "<stdout>"
 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 "<stdout>"
+#line 8105 "<stdout>"
 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 "<stdout>"
+#line 8398 "<stdout>"
 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 "<stdout>"
+#line 8425 "<stdout>"
 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 "<stdout>"
+#line 8596 "<stdout>"
 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 "<stdout>"
+#line 8838 "<stdout>"
 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 "<stdout>"
+#line 9051 "<stdout>"
 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 "<stdout>"
+#line 9183 "<stdout>"
 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 "<stdout>"
+#line 9205 "<stdout>"
 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 "<stdout>"
+#line 9241 "<stdout>"
 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 "<stdout>"
+#line 9313 "<stdout>"
 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 "<stdout>"
+#line 9377 "<stdout>"
 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 "<stdout>"
+#line 9880 "<stdout>"
 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 "<stdout>"
+#line 10518 "<stdout>"
 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 "<stdout>"
+#line 10590 "<stdout>"
 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 "<stdout>"
+#line 10757 "<stdout>"
 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 "<stdout>"
+#line 10798 "<stdout>"
 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 "<stdout>"
+#line 10818 "<stdout>"
 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 "<stdout>"
+#line 10843 "<stdout>"
 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 "<stdout>"
+#line 10883 "<stdout>"
 }
 }
-#line 1357 "parse_date.re"
+#line 1371 "parse_date.re"
 
 }
 
index 6f193d533fc7565c82a09589c36db56192ae5727..e98f405fd86a07b50b65dd7d7a1142e4209add9b 100644 (file)
@@ -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;
index 60aac4435d979e2b9c73d75e1a836c0188d409e0..69bf19639327ff857c96b8bb88edda047e3e8ea3 100644 (file)
@@ -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;
 }
 
index 6f193d533fc7565c82a09589c36db56192ae5727..e98f405fd86a07b50b65dd7d7a1142e4209add9b 100644 (file)
@@ -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;
index b7512eff2c5628f3b3d583dcec22ebfc11d5daa0..5e0235e24011030362f7d64c411f55544f1dab7e 100644 (file)
@@ -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] = {