* zic.c (addtype): Avoid the need to call strcmp each time through the loop checking for duplicate zone types. The strcmp is unnecessary if we already have checked for duplicate abbreviations and so can just look at the strings’ offsets. So, look for those duplicates first. --- zic.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/zic.c b/zic.c index 2cd8cc7..3e27a48 100644 --- a/zic.c +++ b/zic.c @@ -2876,16 +2876,28 @@ addtype(zic_t gmtoff, char const *abbr, bool isdst, bool ttisstd, bool ttisgmt) { register int i, j; - /* - ** See if there's already an entry for this zone type. - ** If so, just return its index. - */ - for (i = 0; i < typecnt; ++i) { + if (! (-1L - 2147483647L <= gmtoff && gmtoff <= 2147483647L)) { + error(_("UT offset out of range")); + exit(EXIT_FAILURE); + } + + for (j = 0; j < charcnt; ++j) + if (strcmp(&chars[j], abbr) == 0) + break; + if (j == charcnt) + newabbr(abbr); + else { + /* + ** See if there's already an entry for this zone type. + ** If so, just return its index. + */ + for (i = 0; i < typecnt; i++) { if (gmtoff == gmtoffs[i] && isdst == isdsts[i] && - strcmp(abbr, &chars[abbrinds[i]]) == 0 && + j == abbrinds[i] && ttisstd == ttisstds[i] && ttisgmt == ttisgmts[i]) return i; + } } /* ** There isn't one; add a new one, unless there are already too @@ -2895,22 +2907,12 @@ addtype(zic_t gmtoff, char const *abbr, bool isdst, bool ttisstd, bool ttisgmt) error(_("too many local time types")); exit(EXIT_FAILURE); } - if (! (-1L - 2147483647L <= gmtoff && gmtoff <= 2147483647L)) { - error(_("UT offset out of range")); - exit(EXIT_FAILURE); - } + i = typecnt++; gmtoffs[i] = gmtoff; isdsts[i] = isdst; ttisstds[i] = ttisstd; ttisgmts[i] = ttisgmt; - - for (j = 0; j < charcnt; ++j) - if (strcmp(&chars[j], abbr) == 0) - break; - if (j == charcnt) - newabbr(abbr); abbrinds[i] = j; - ++typecnt; return i; } -- 2.21.0