diff options
Diffstat (limited to 'src/timezone/localtime.c')
-rw-r--r-- | src/timezone/localtime.c | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/src/timezone/localtime.c b/src/timezone/localtime.c index 23e022695fa..985ad56da20 100644 --- a/src/timezone/localtime.c +++ b/src/timezone/localtime.c @@ -409,7 +409,7 @@ tzloadbody(char const * name, char *canonname, struct state * sp, bool doextend, struct state *ts = &lsp->u.st; up->buf[nread - 1] = '\0'; - if (tzparse(&up->buf[1], ts, false) == 0 + if (tzparse(&up->buf[1], ts, false) && ts->typecnt == 2) { /* @@ -534,7 +534,7 @@ tzloadbody(char const * name, char *canonname, struct state * sp, bool doextend, * given name is stored there (the buffer must be > TZ_STRLEN_MAX bytes!). */ int -tzload(const char *name, char *canonname, struct state * sp, int doextend) +tzload(const char *name, char *canonname, struct state * sp, bool doextend) { union local_storage ls; @@ -864,13 +864,10 @@ transtime(int year, const struct rule * rulep, /* * Given a POSIX section 8-style TZ string, fill in the rule tables as * appropriate. - * - * Returns 0 on success, -1 on failure. (Note: tzcode has converted this - * to a bool true-on-success convention, but we're holding the line in PG - * for the moment, to avoid external API changes.) + * Returns true on success, false on failure. */ -int -tzparse(const char *name, struct state * sp, int lastditch) +bool +tzparse(const char *name, struct state * sp, bool lastditch) { const char *stdname; const char *dstname = NULL; @@ -908,7 +905,7 @@ tzparse(const char *name, struct state * sp, int lastditch) stdname = name; name = getqzname(name, '>'); if (*name != '>') - return -1; + return false; stdlen = name - stdname; name++; } @@ -918,13 +915,13 @@ tzparse(const char *name, struct state * sp, int lastditch) stdlen = name - stdname; } if (*name == '\0') /* we allow empty STD abbrev, unlike IANA */ - return -1; + return false; name = getoffset(name, &stdoffset); if (name == NULL) - return -1; + return false; charcnt = stdlen + 1; if (sizeof sp->chars < charcnt) - return -1; + return false; load_ok = tzload(TZDEFRULES, NULL, sp, false) == 0; } if (!load_ok) @@ -936,7 +933,7 @@ tzparse(const char *name, struct state * sp, int lastditch) dstname = ++name; name = getqzname(name, '>'); if (*name != '>') - return -1; + return false; dstlen = name - dstname; name++; } @@ -947,15 +944,15 @@ tzparse(const char *name, struct state * sp, int lastditch) dstlen = name - dstname; /* length of DST zone name */ } if (!dstlen) - return -1; + return false; charcnt += dstlen + 1; if (sizeof sp->chars < charcnt) - return -1; + return false; if (*name != '\0' && *name != ',' && *name != ';') { name = getoffset(name, &dstoffset); if (name == NULL) - return -1; + return false; } else dstoffset = stdoffset - SECSPERHOUR; @@ -972,13 +969,13 @@ tzparse(const char *name, struct state * sp, int lastditch) ++name; if ((name = getrule(name, &start)) == NULL) - return -1; + return false; if (*name++ != ',') - return -1; + return false; if ((name = getrule(name, &end)) == NULL) - return -1; + return false; if (*name != '\0') - return -1; + return false; sp->typecnt = 2; /* standard time and DST */ /* @@ -1044,7 +1041,7 @@ tzparse(const char *name, struct state * sp, int lastditch) int j; if (*name != '\0') - return -1; + return false; /* * Initial values of theirstdoffset and theirdstoffset. @@ -1148,7 +1145,7 @@ tzparse(const char *name, struct state * sp, int lastditch) memcpy(cp, dstname, dstlen); *(cp + dstlen) = '\0'; } - return 0; + return true; } static void |