Skip to content

Commit

Permalink
Merge branch 'lt/time-reject-fractional-seconds'
Browse files Browse the repository at this point in the history
* lt/time-reject-fractional-seconds:
  date/time: do not get confused by fractional seconds
  • Loading branch information
Shawn O. Pearce committed Oct 9, 2008
2 parents a3c76f2 + 9f2b6d2 commit 78a935d
Showing 1 changed file with 20 additions and 6 deletions.
26 changes: 20 additions & 6 deletions date.c
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,15 @@ static int match_multi_number(unsigned long num, char c, const char *date, char
return end - date;
}

/* Have we filled in any part of the time/date yet? */
static inline int nodate(struct tm *tm)
{
return tm->tm_year < 0 &&
tm->tm_mon < 0 &&
tm->tm_mday < 0 &&
!(tm->tm_hour | tm->tm_min | tm->tm_sec);
}

/*
* We've seen a digit. Time? Year? Date?
*/
Expand All @@ -418,7 +427,7 @@ static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt
* more than 8 digits. This is because we don't want to rule out
* numbers like 20070606 as a YYYYMMDD date.
*/
if (num >= 100000000) {
if (num >= 100000000 && nodate(tm)) {
time_t time = num;
if (gmtime_r(&time, tm)) {
*tm_gmt = 1;
Expand Down Expand Up @@ -462,6 +471,13 @@ static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt
return n;
}

/*
* Ignore lots of numerals. We took care of 4-digit years above.
* Days or months must be one or two digits.
*/
if (n > 2)
return n;

/*
* NOTE! We will give precedence to day-of-month over month or
* year numbers in the 1-12 range. So 05 is always "mday 5",
Expand All @@ -488,10 +504,6 @@ static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt

if (num > 0 && num < 32) {
tm->tm_mday = num;
} else if (num > 1900) {
tm->tm_year = num - 1900;
} else if (num > 70) {
tm->tm_year = num;
} else if (num > 0 && num < 13) {
tm->tm_mon = num-1;
}
Expand Down Expand Up @@ -823,7 +835,9 @@ static const char *approxidate_digit(const char *date, struct tm *tm, int *num)
}
}

*num = number;
/* Accept zero-padding only for small numbers ("Dec 02", never "Dec 0002") */
if (date[0] != '0' || end - date <= 2)
*num = number;
return end;
}

Expand Down

0 comments on commit 78a935d

Please sign in to comment.