Fix approxidate() to understand more extended numbers

You can now say "5:35 PM yesterday", and approxidate() gets the right answer.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Linus Torvalds 2006-09-28 12:14:27 -07:00 committed by Junio C Hamano
parent e92a54d99c
commit 393d340e4f

40
date.c
View File

@ -598,6 +598,32 @@ static void date_tea(struct tm *tm, int *num)
date_time(tm, 17);
}
static void date_pm(struct tm *tm, int *num)
{
int hour = *num;
*num = 0;
if (hour > 0 && hour < 12) {
tm->tm_hour = hour;
tm->tm_min = 0;
tm->tm_sec = 0;
}
if (tm->tm_hour > 0 && tm->tm_hour < 12)
tm->tm_hour += 12;
}
static void date_am(struct tm *tm, int *num)
{
int hour = *num;
*num = 0;
if (hour > 0 && hour < 12) {
tm->tm_hour = hour;
tm->tm_min = 0;
tm->tm_sec = 0;
}
}
static const struct special {
const char *name;
void (*fn)(struct tm *, int *);
@ -606,6 +632,8 @@ static const struct special {
{ "noon", date_noon },
{ "midnight", date_midnight },
{ "tea", date_tea },
{ "PM", date_pm },
{ "AM", date_am },
{ NULL }
};
@ -717,6 +745,18 @@ static const char *approxidate_digit(const char *date, struct tm *tm, int *num)
char *end;
unsigned long number = strtoul(date, &end, 10);
switch (*end) {
case ':':
case '.':
case '/':
case '-':
if (isdigit(end[1])) {
int match = match_multi_number(number, *end, date, end, tm);
if (match)
return date + match;
}
}
*num = number;
return end;
}