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);
|
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 {
|
static const struct special {
|
||||||
const char *name;
|
const char *name;
|
||||||
void (*fn)(struct tm *, int *);
|
void (*fn)(struct tm *, int *);
|
||||||
@ -606,6 +632,8 @@ static const struct special {
|
|||||||
{ "noon", date_noon },
|
{ "noon", date_noon },
|
||||||
{ "midnight", date_midnight },
|
{ "midnight", date_midnight },
|
||||||
{ "tea", date_tea },
|
{ "tea", date_tea },
|
||||||
|
{ "PM", date_pm },
|
||||||
|
{ "AM", date_am },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -717,6 +745,18 @@ static const char *approxidate_digit(const char *date, struct tm *tm, int *num)
|
|||||||
char *end;
|
char *end;
|
||||||
unsigned long number = strtoul(date, &end, 10);
|
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;
|
*num = number;
|
||||||
return end;
|
return end;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user