From: Junio C Hamano Date: Fri, 09 Sep 2011 20:46:49 GMT Subject: Re: [PATCH v3] date.c: Support iso8601 timezone formats Message-ID: <7vipp1tpdy.fsf@alter.siamese.dyndns.org> In-Reply-To: <7vd3f9ve9m.fsf@alter.siamese.dyndns.org> Junio C Hamano writes: > Also, I do not quite understand why the match_tz() logic needs to be that > long. > > Wouldn't something like this patch (on top of yours) easier to follow? > > date.c | 50 +++++++++++++++++++++----------------------------- > 1 files changed, 21 insertions(+), 29 deletions(-) > > diff --git a/date.c b/date.c > index f8722c1..6079b1a 100644 > --- a/date.c > +++ b/date.c > @@ -551,44 +551,36 @@ static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt > > static int match_tz(const char *date, int *offp) > { > + int min; Micronit; this should be "int min = 0", as parsing of "hh" form relies on the if/elseif/else cascade to parse only the hour part and leaving min to the original value. > char *end; > + int hour = strtoul(date + 1, &end, 10); > + int n = end - (date + 1); > > + if (n == 4) { > + /* hhmm */ > + min = hour % 100; > + hour = hour / 100; > + } else if (n != 2) { > + min = 99; /* random crap */ > + } else if (*end == ':') { > + /* hh:mm? */ > + min = strtoul(end + 1, &end, 10); > + if (end - (date + 1) != 5) > + min = 99; /* random crap */ > }