X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=date.c;h=63f5a0919768112c0d3301e7afaa59edcce7da36;hb=9e48b389990c0201487e58f3bac32734a59a7e89;hp=1f366a67f8b0d282088a26d900a3031fdc3e6012;hpb=e99d59ff0bff349ef205cef1076e0354c8130680;p=git.git diff --git a/date.c b/date.c index 1f366a67..63f5a091 100644 --- a/date.c +++ b/date.c @@ -4,10 +4,6 @@ * Copyright (C) Linus Torvalds, 2005 */ -#include -#include -#include -#include #include #include "cache.h" @@ -227,7 +223,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; @@ -273,7 +269,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) +static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt) { int n; char *end; @@ -286,8 +282,10 @@ static int match_digit(char *date, struct tm *tm, int *offset) */ if (num > 946684800) { time_t time = num; - if (gmtime_r(&time, tm)) + if (gmtime_r(&time, tm)) { + *tm_gmt = 1; return end - date; + } } /* @@ -362,7 +360,7 @@ static int match_digit(char *date, struct tm *tm, int *offset) 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); @@ -387,12 +385,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; + int offset, tm_gmt; time_t then; memset(&tm, 0, sizeof(tm)); @@ -401,6 +410,7 @@ void parse_date(char *date, char *result, int maxlen) tm.tm_mday = -1; tm.tm_isdst = -1; offset = -1; + tm_gmt = 0; for (;;) { int match = 0; @@ -413,7 +423,7 @@ void parse_date(char *date, char *result, int maxlen) if (isalpha(c)) match = match_alpha(date, &tm, &offset); else if (isdigit(c)) - match = match_digit(date, &tm, &offset); + match = match_digit(date, &tm, &offset, &tm_gmt); else if ((c == '-' || c == '+') && isdigit(date[1])) match = match_tz(date, &offset); @@ -431,17 +441,11 @@ void parse_date(char *date, char *result, int maxlen) offset = (then - mktime(&tm)) / 60; if (then == -1) - return; - - then -= offset * 60; - - sign = '+'; - if (offset < 0) { - offset = -offset; - sign = '-'; - } + return -1; - snprintf(result, maxlen, "%lu %c%02d%02d", then, sign, offset/60, offset % 60); + if (!tm_gmt) + then -= offset * 60; + return date_string(then, offset, result, maxlen); } void datestamp(char *buf, int bufsize) @@ -454,5 +458,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); }