X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=date.c;h=b21cadc4d6811d7b333c90a072d56c077ff21ae7;hb=edde7a8b5324d88f07fcb8204da313c19b4988fa;hp=8ec6d0b86c5988ac0fb40bab0eeb1af2ad39da8d;hpb=9cb480f2ad653d834fe5e4ba7a8a25f74ad1d89b;p=git.git diff --git a/date.c b/date.c index 8ec6d0b8..b21cadc4 100644 --- a/date.c +++ b/date.c @@ -224,7 +224,7 @@ static int is_date(int year, int month, int day, struct tm *tm) return 0; } -static int match_multi_number(unsigned long num, char c, char *date, char *end, struct tm *tm) +static int match_multi_number(unsigned long num, char c, const char *date, char *end, struct tm *tm) { long num2, num3; @@ -270,7 +270,7 @@ static int match_multi_number(unsigned long num, char c, char *date, char *end, /* * We've seen a digit. Time? Year? Date? */ -static int match_digit(char *date, struct tm *tm, int *offset, int *tm_gmt) +static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt) { int n; char *end; @@ -361,7 +361,7 @@ static int match_digit(char *date, struct tm *tm, int *offset, int *tm_gmt) return n; } -static int match_tz(char *date, int *offp) +static int match_tz(const char *date, int *offp) { char *end; int offset = strtoul(date+1, &end, 10); @@ -386,12 +386,23 @@ static int match_tz(char *date, int *offp) return end - date; } +static int date_string(unsigned long date, int offset, char *buf, int len) +{ + int sign = '+'; + + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return snprintf(buf, len, "%lu %c%02d%02d", date, sign, offset / 60, offset % 60); +} + /* Gr. strptime is crap for this; it doesn't have a way to require RFC2822 (i.e. English) day/month names, and it doesn't work correctly with %z. */ -void parse_date(char *date, char *result, int maxlen) +int parse_date(const char *date, char *result, int maxlen) { struct tm tm; - int offset, sign, tm_gmt; + int offset, tm_gmt; time_t then; memset(&tm, 0, sizeof(tm)); @@ -431,18 +442,11 @@ void parse_date(char *date, char *result, int maxlen) offset = (then - mktime(&tm)) / 60; if (then == -1) - return; + return -1; if (!tm_gmt) then -= offset * 60; - - sign = '+'; - if (offset < 0) { - offset = -offset; - sign = '-'; - } - - snprintf(result, maxlen, "%lu %c%02d%02d", then, sign, offset/60, offset % 60); + return date_string(then, offset, result, maxlen); } void datestamp(char *buf, int bufsize) @@ -455,5 +459,5 @@ void datestamp(char *buf, int bufsize) offset = my_mktime(localtime(&now)) - now; offset /= 60; - snprintf(buf, bufsize, "%lu %+05d", now, offset/60*100 + offset%60); + date_string(now, offset, buf, bufsize); }