date.c: split up dst information in the timezone table
authorLinus Torvalds <torvalds@ppc970.osdl.org>
Sat, 30 Apr 2005 21:53:12 +0000 (14:53 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Sat, 30 Apr 2005 21:53:12 +0000 (14:53 -0700)
This still doesn't actually really _use_ it properly, nor make any
distinction between different DST rules, but at least we could (if
we wanted to) fake it a bit better.

Right now the code actually still says "it's always summer". I'm
from Finland, I don't like winter.

date.c

diff --git a/date.c b/date.c
index 15f2819..0022bf2 100644 (file)
--- a/date.c
+++ b/date.c
@@ -47,51 +47,52 @@ static const char *weekday_names[] = {
 static const struct {
        const char *name;
        int offset;
 static const struct {
        const char *name;
        int offset;
+       int dst;
 } timezone_names[] = {
 } timezone_names[] = {
-       { "IDLW", -12 },        /* International Date Line West */
-       { "NT",   -11 },        /* Nome */
-       { "CAT",  -10 },        /* Central Alaska */
-       { "HST",  -10 },        /* Hawaii Standard */
-       { "HDT",   -9 },        /* Hawaii Daylight */
-       { "YDT",   -8 },        /* Yukon Daylight */
-       { "YST",   -9 },        /* Yukon Standard */
-       { "PST",   -8 },        /* Pacific Standard */
-       { "PDT",   -7 },        /* Pacific Daylight */
-       { "MST",   -7 },        /* Mountain Standard */
-       { "MDT",   -6 },        /* Mountain Daylight */
-       { "CST",   -6 },        /* Central Standard */
-       { "CDT",   -5 },        /* Central Daylight */
-       { "EST",   -5 },        /* Eastern Standard */
-       { "EDT",   -4 },        /* Eastern Daylight */
-       { "AST",   -3 },        /* Atlantic Standard */
-       { "ADT",   -2 },        /* Atlantic Daylight */
-       { "WAT",   -1 },        /* West Africa */
-
-       { "GMT",    0 },        /* Greenwich Mean */
-       { "UTC",    0 },        /* Universal (Coordinated) */
-
-       { "WET",    0 },        /* Western European */
-       { "BST",    0 },        /* British Summer */
-       { "CET",   +1 },        /* Central European */
-       { "MET",   +1 },        /* Middle European */
-       { "MEWT",  +1 },        /* Middle European Winter */
-       { "MEST",  +2 },        /* Middle European Summer */
-       { "CEST",  +2 },        /* Central European Summer */
-       { "MESZ",  +1 },        /* Middle European Summer */
-       { "FWT",   +1 },        /* French Winter */
-       { "FST",   +2 },        /* French Summer */
-       { "EET",   +2 },        /* Eastern Europe, USSR Zone 1 */
-       { "WAST",  +7 },        /* West Australian Standard */
-       { "WADT",  +8 },        /* West Australian Daylight */
-       { "CCT",   +8 },        /* China Coast, USSR Zone 7 */
-       { "JST",   +9 },        /* Japan Standard, USSR Zone 8 */
-       { "EAST", +10 },        /* Eastern Australian Standard */
-       { "EADT", +11 },        /* Eastern Australian Daylight */
-       { "GST",  +10 },        /* Guam Standard, USSR Zone 9 */
-       { "NZT",  +11 },        /* New Zealand */
-       { "NZST", +11 },        /* New Zealand Standard */
-       { "NZDT", +12 },        /* New Zealand Daylight */
-       { "IDLE", +12 },        /* International Date Line East */
+       { "IDLW", -12, 0, },    /* International Date Line West */
+       { "NT",   -11, 0, },    /* Nome */
+       { "CAT",  -10, 0, },    /* Central Alaska */
+       { "HST",  -10, 0, },    /* Hawaii Standard */
+       { "HDT",  -10, 1, },    /* Hawaii Daylight */
+       { "YST",   -9, 0, },    /* Yukon Standard */
+       { "YDT",   -9, 1, },    /* Yukon Daylight */
+       { "PST",   -8, 0, },    /* Pacific Standard */
+       { "PDT",   -8, 1, },    /* Pacific Daylight */
+       { "MST",   -7, 0, },    /* Mountain Standard */
+       { "MDT",   -7, 1, },    /* Mountain Daylight */
+       { "CST",   -6, 0, },    /* Central Standard */
+       { "CDT",   -6, 1, },    /* Central Daylight */
+       { "EST",   -5, 0, },    /* Eastern Standard */
+       { "EDT",   -5, 1, },    /* Eastern Daylight */
+       { "AST",   -3, 0, },    /* Atlantic Standard */
+       { "ADT",   -3, 1, },    /* Atlantic Daylight */
+       { "WAT",   -1, 0, },    /* West Africa */
+
+       { "GMT",    0, 0, },    /* Greenwich Mean */
+       { "UTC",    0, 0, },    /* Universal (Coordinated) */
+
+       { "WET",    0, 0, },    /* Western European */
+       { "BST",    0, 1, },    /* British Summer */
+       { "CET",   +1, 0, },    /* Central European */
+       { "MET",   +1, 0, },    /* Middle European */
+       { "MEWT",  +1, 0, },    /* Middle European Winter */
+       { "MEST",  +1, 1, },    /* Middle European Summer */
+       { "CEST",  +1, 1, },    /* Central European Summer */
+       { "MESZ",  +1, 1, },    /* Middle European Summer */
+       { "FWT",   +1, 0, },    /* French Winter */
+       { "FST",   +1, 1, },    /* French Summer */
+       { "EET",   +2, 0, },    /* Eastern Europe, USSR Zone 1 */
+       { "WAST",  +7, 0, },    /* West Australian Standard */
+       { "WADT",  +7, 1, },    /* West Australian Daylight */
+       { "CCT",   +8, 0, },    /* China Coast, USSR Zone 7 */
+       { "JST",   +9, 0, },    /* Japan Standard, USSR Zone 8 */
+       { "EAST", +10, 0, },    /* Eastern Australian Standard */
+       { "EADT", +10, 1, },    /* Eastern Australian Daylight */
+       { "GST",  +10, 0, },    /* Guam Standard, USSR Zone 9 */
+       { "NZT",  +11, 0, },    /* New Zealand */
+       { "NZST", +11, 0, },    /* New Zealand Standard */
+       { "NZDT", +11, 1, },    /* New Zealand Daylight */
+       { "IDLE", +12, 0, },    /* International Date Line East */
 };
 
 #define NR_TZ (sizeof(timezone_names) / sizeof(timezone_names[0]))
 };
 
 #define NR_TZ (sizeof(timezone_names) / sizeof(timezone_names[0]))
@@ -138,7 +139,12 @@ static int match_alpha(const char *date, struct tm *tm, int *offset)
        for (i = 0; i < NR_TZ; i++) {
                int match = match_string(date, timezone_names[i].name);
                if (match >= 3) {
        for (i = 0; i < NR_TZ; i++) {
                int match = match_string(date, timezone_names[i].name);
                if (match >= 3) {
-                       *offset = 60*timezone_names[i].offset;
+                       int off = timezone_names[i].offset;
+
+                       /* This is bogus, but we like summer */
+                       off += timezone_names[i].dst;
+
+                       *offset = 60*off;
                        return match;
                }
        }
                        return match;
                }
        }