X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/82538114a7761232df236f489e2d59f6e91cde8c..9322ba2854211794c27fae9468768b80b767c211:/sbr/datetime.c?ds=sidebyside diff --git a/sbr/datetime.c b/sbr/datetime.c index 4e155855..fb7f7c29 100644 --- a/sbr/datetime.c +++ b/sbr/datetime.c @@ -62,7 +62,10 @@ parse_datetime (const char *datetime, const char *zone, int dst, struct tws *tws) { char utc_indicator; int form_1 = 0; - int items_matched = + int items_matched; + + memset(tws, 0, sizeof *tws); + items_matched = sscanf (datetime, "%4d%2d%2dT%2d%2d%2d%c", &tws->tw_year, &tws->tw_mon, &tws->tw_mday, &tws->tw_hour, &tws->tw_min, &tws->tw_sec, @@ -80,12 +83,16 @@ parse_datetime (const char *datetime, const char *zone, int dst, form_1 = 1; } - if (items_matched >= 6) { + /* items_matched of 3 is for, e.g., 20151230. Assume that means + the entire day. The time fields of the tws struct were + initialized to 0 by the memset() above. */ + if (items_matched >= 6 || items_matched == 3) { int offset = atoi (zone ? zone : "0"); /* struct tws defines tw_mon over [0, 11]. */ --tws->tw_mon; + /* Fill out rest of tws, i.e., its tw_wday and tw_flags. */ set_dotw (tws); /* set_dotw() sets TW_SIMP. Replace that with TW_SEXP so that dasctime() outputs the dotw before the date instead of after. */ @@ -136,9 +143,9 @@ parse_datetime (const char *datetime, const char *zone, int dst, } return OK; - } else { - return NOTOK; } + + return NOTOK; } tzdesc_t @@ -210,7 +217,7 @@ load_timezones (const contentline *clines) { ! strcasecmp ("VTIMEZONE", node->value)) { in_vtimezone = 1; - timezone = mh_xcalloc (1, sizeof (struct tzdesc)); + NEW0(timezone); if (timezones) { tzdesc_t t; @@ -352,10 +359,9 @@ format_datetime (tzdesc_t timezones, const contentline *node) { Form #2: DATE WITH UTC TIME */ if (parse_datetime (node->value, NULL, 0, &tws[0]) == OK) { return strdup (dasctime (&tws[0], 0)); - } else { - advise (NULL, "unable to parse datetime %s", node->value); - return NULL; } + advise (NULL, "unable to parse datetime %s", node->value); + return NULL; } /*