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:
parent
e92a54d99c
commit
393d340e4f
40
date.c
40
date.c
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user