| 963 | */ |
| 964 | |
| 965 | static int tzparse(const char * name, struct state * const sp, const int lastditch) { |
| 966 | const char * stdname; |
| 967 | const char * dstname; |
| 968 | size_t stdlen; |
| 969 | size_t dstlen; |
| 970 | int_fast32_t stdoffset; |
| 971 | int_fast32_t dstoffset; |
| 972 | char * cp; |
| 973 | int load_result; |
| 974 | static struct ttinfo zttinfo; |
| 975 | |
| 976 | INITIALIZE(dstname); |
| 977 | stdname = name; |
| 978 | if (lastditch) { |
| 979 | stdlen = strlen(name); /* length of standard zone name */ |
| 980 | name += stdlen; |
| 981 | if (stdlen >= sizeof sp->chars) |
| 982 | stdlen = (sizeof sp->chars) - 1; |
| 983 | stdoffset = 0; |
| 984 | } else { |
| 985 | if (*name == '<') { |
| 986 | name++; |
| 987 | stdname = name; |
| 988 | name = getqzname(name, '>'); |
| 989 | if (*name != '>') |
| 990 | return (-1); |
| 991 | stdlen = name - stdname; |
| 992 | name++; |
| 993 | } else { |
| 994 | name = getzname(name); |
| 995 | stdlen = name - stdname; |
| 996 | } |
| 997 | if (*name == '\0') |
| 998 | return -1; |
| 999 | name = getoffset(name, &stdoffset); |
| 1000 | if (name == NULL) |
| 1001 | return -1; |
| 1002 | } |
| 1003 | load_result = tzload(TZDEFRULES, sp, FALSE); |
| 1004 | if (load_result != 0) |
| 1005 | sp->leapcnt = 0; /* so, we're off a little */ |
| 1006 | if (*name != '\0') { |
| 1007 | if (*name == '<') { |
| 1008 | dstname = ++name; |
| 1009 | name = getqzname(name, '>'); |
| 1010 | if (*name != '>') |
| 1011 | return -1; |
| 1012 | dstlen = name - dstname; |
| 1013 | name++; |
| 1014 | } else { |
| 1015 | dstname = name; |
| 1016 | name = getzname(name); |
| 1017 | dstlen = name - dstname; /* length of DST zone name */ |
| 1018 | } |
| 1019 | if (*name != '\0' && *name != ',' && *name != ';') { |
| 1020 | name = getoffset(name, &dstoffset); |
| 1021 | if (name == NULL) |
| 1022 | return -1; |