//--------------------------------------------------------------------------// // This file is in the public domain, so clarified as of // // 2009-05-17 by Arthur David Olson. // //--------------------------------------------------------------------------// #include "time_types.h" #include "time_state.h" #include "time_proto.h" //--------------------------------------------------------------------------// static void scrub_abbrs(struct state *sp); /* Initialize *SP to a value appropriate for the TZ setting NAME. Return 0 on success, an errno value on failure. */ int zoneinit(struct state *sp, char const *name) { if (name && ! name[0]) { // User wants it fast rather than right. sp->leapcnt = 0; // so, we're off a little sp->timecnt = 0; sp->typecnt = 0; sp->charcnt = 0; sp->goback = sp->goahead = false; init_ttinfo(&sp->ttis[0], 0, false, 0); strcpy(sp->chars, gmt); sp->defaulttype = 0; return 0; } else { int err = tzload(name, sp, true); if (err != 0 && name && name[0] != '\0' && tzparse(name, sp, false)) { err = 0; } if (err == 0) { scrub_abbrs(sp); } return err; } } static void scrub_abbrs(struct state *sp) { int i; // Replace bogus characters. for (i = 0; i < sp->charcnt; ++i) if (strchr(TZ_ABBR_CHAR_SET, sp->chars[i]) == NULL) sp->chars[i] = TZ_ABBR_ERR_CHAR; // Truncate long abbreviations. for (i = 0; i < sp->typecnt; ++i) { const struct ttinfo * const ttisp = &sp->ttis[i]; char *cp = &sp->chars[ttisp->tt_abbrind]; if (strlen(cp) > TZ_ABBR_MAX_LEN && strcmp(cp, GRANDPARENTED) != 0) { *(cp + TZ_ABBR_MAX_LEN) = '\0'; } } } //--------------------------------------------------------------------------//