From 6919b25e84760b0a4ced224df58035db6ca65b41 Mon Sep 17 00:00:00 2001 From: Laurence Withers Date: Mon, 16 Oct 2006 00:33:01 +0100 Subject: [PATCH] Fix bugs, finish parser --- src/libiso8601/manip.c | 4 ++++ src/libiso8601/parser.c | 5 +++-- src/libiso8601/print.c | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/libiso8601/manip.c b/src/libiso8601/manip.c index 0f162b2..479e5da 100644 --- a/src/libiso8601/manip.c +++ b/src/libiso8601/manip.c @@ -21,6 +21,10 @@ void iso8601_add_seconds(struct iso8601_date* date, long seconds) qr = ldiv(seconds + date->sec, 86400); date->day += qr.quot; date->sec = qr.rem; + if(date->sec < 0) { + --date->day; + date->sec += 86400; + } } diff --git a/src/libiso8601/parser.c b/src/libiso8601/parser.c index ba668b3..60b61e2 100644 --- a/src/libiso8601/parser.c +++ b/src/libiso8601/parser.c @@ -97,6 +97,7 @@ int iso8601_parse(const char* str, struct iso8601_date* earliest, struct iso8601 if(details) details->extended = 1; break; + case 0: case 'T': switch(dig) { case 4: @@ -625,8 +626,8 @@ done: } if(details) details->tz_sec = tz_sec; - if(earliest) iso8601_add_seconds(earliest, -tz_sec); - if(latest) iso8601_add_seconds(latest, -tz_sec); + if(tz_sec && earliest) iso8601_add_seconds(earliest, -tz_sec); + if(tz_sec && latest) iso8601_add_seconds(latest, -tz_sec); return 0; } diff --git a/src/libiso8601/print.c b/src/libiso8601/print.c index 4a35784..8b5899f 100644 --- a/src/libiso8601/print.c +++ b/src/libiso8601/print.c @@ -28,7 +28,7 @@ void iso8601_print(char* str, int amt, const struct iso8601_date* date, // adjust output for timezone dttz = *date; - iso8601_add_seconds(&dttz, details->tz_sec); + if(details->tz_sec) iso8601_add_seconds(&dttz, details->tz_sec); // determine whether or not to force extended output iso8601_to_cal(&y, &m, &d, &dttz);