#include <h/fmt_scan.h>
#include "h/tws.h"
#include "h/utils.h"
+#include "unquote.h"
/*
* This doesn't try to support all of the myriad date-time formats
* struct tws.
*/
static int
-parse_datetime (const char *datetime, const char *zone, int dst,
+parse_datetime (const char *datetime, const char *zone, bool dst,
struct tws *tws) {
char utc_indicator;
- int form_1 = 0;
+ bool form_1;
int items_matched;
- memset(tws, 0, sizeof *tws);
+ ZERO(tws);
items_matched =
sscanf (datetime, "%4d%2d%2dT%2d%2d%2d%c",
&tws->tw_year, &tws->tw_mon, &tws->tw_mday,
&utc_indicator);
tws->tw_flags = TW_NULL;
+ form_1 = false;
if (items_matched == 7) {
/* The 'Z' must be capital according to RFC 5545 Sec. 3.3.5. */
if (utc_indicator != 'Z') {
- inform("%s has invalid timezone indicator of 0x%x",
+ inform("%s has invalid timezone-indicator byte: %#x",
datetime, utc_indicator);
return NOTOK;
}
} else if (zone == NULL) {
- form_1 = 1;
+ form_1 = true;
}
/* 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;
- the only flag in tw_flags used is TW_DST
*/
tws->tw_yday = tws->tw_clock = 0;
- tws->tw_zone = 60 * (offset / 100) + offset % 100;
+ if (zone) {
+ int offset = atoi(zone);
+ tws->tw_zone = 60 * (offset / 100) + offset % 100;
+ } else
+ tws->tw_zone = 0;
if (dst) {
tws->tw_zone -= 60; /* per dlocaltime() */
tws->tw_flags |= TW_DST;
tzdesc_t
load_timezones (const contentline *clines) {
tzdesc_t timezones = NULL, timezone = NULL;
- int in_vtimezone, in_standard, in_daylight;
+ bool in_vtimezone, in_standard, in_daylight;
tzparams *params = NULL;
const contentline *node;
/* Interpret each VTIMEZONE section. */
- in_vtimezone = in_standard = in_daylight = 0;
+ in_vtimezone = in_standard = in_daylight = false;
for (node = clines; node; node = node->next) {
/* node->name will be NULL if the line was "deleted". */
if (! node->name) { continue; }
(in_daylight && ! strcasecmp ("DAYLIGHT", node->value)))) {
struct tws tws;
- if (in_standard) { in_standard = 0; }
- else if (in_daylight) { in_daylight = 0; }
+ if (in_standard) { in_standard = false; }
+ else if (in_daylight) { in_daylight = false; }
if (parse_datetime (params->dtstart, params->offsetfrom,
- in_daylight ? 1 : 0,
+ in_daylight,
&tws) == OK) {
if (tws.tw_year >= 1970) {
/* dmktime() falls apart for, e.g., the year 1601. */
} else {
inform("failed to parse start time %s for %s",
params->dtstart,
- in_standard ? "standard" : "daylight");
+ in_daylight ? "daylight" : "standard");
return NULL;
}
params = NULL;
} else if (in_vtimezone) {
if (! strcasecmp ("END", node->name) &&
! strcasecmp ("VTIMEZONE", node->value)) {
- in_vtimezone = 0;
+ in_vtimezone = false;
} else if (! strcasecmp ("BEGIN", node->name) &&
! strcasecmp ("STANDARD", node->value)) {
- in_standard = 1;
+ in_standard = true;
params = &timezone->standard_params;
} else if (! strcasecmp ("BEGIN", node->name) &&
! strcasecmp ("DAYLIGHT", node->value)) {
- in_daylight = 1;
+ in_daylight = true;
params = &timezone->daylight_params;
} else if (! strcasecmp ("TZID", node->name)) {
/* See comment below in format_datetime() about removing any enclosing quotes from a
if (! strcasecmp ("BEGIN", node->name) &&
! strcasecmp ("VTIMEZONE", node->value)) {
- in_vtimezone = 1;
+ in_vtimezone = true;
NEW0(timezone);
if (timezones) {
tzdesc_t t;
if (! dt_timezone) {
/* Form #1: DATE WITH LOCAL TIME, i.e., no time zone, or
Form #2: DATE WITH UTC TIME */
- if (parse_datetime (node->value, NULL, 0, &tws[0]) == OK) {
+ if (parse_datetime (node->value, NULL, false, &tws[0]) == OK) {
return strdup (dasctime (&tws[0], 0));
}
inform("unable to parse datetime %s", node->value);
}
if (parse_datetime (node->value, tz->standard_params.offsetto,
- 0, &tws[0]) == OK) {
+ false, &tws[0]) == OK) {
dt[0] = tws[0].tw_clock;
} else {
inform("unable to parse datetime %s", node->value);
dst = 0;
} else {
if (parse_datetime (node->value,
- tz->daylight_params.offsetto, 1,
+ tz->daylight_params.offsetto, true,
&tws[1]) == OK) {
dt[1] = tws[1].tw_clock;
} else {
return NULL;
}
- dst = dt[1] > transition[0] ? 0 : 1;
+ dst = dt[1] <= transition[0];
}
}