X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=date.c;h=b46f2ce344d53585901820b39dffc8cb4c631364;hb=b0391890d25d9e7ca8f7df2199292df68ead8093;hp=7371bc136a650ccfcee5e87eafb3e738a227d8bd;hpb=f80cd783c6f346388bbb0a6a15672be99a71f7ed;p=git.git diff --git a/date.c b/date.c index 7371bc13..b46f2ce3 100644 --- a/date.c +++ b/date.c @@ -4,12 +4,11 @@ * Copyright (C) Linus Torvalds, 2005 */ -#include -#include -#include #include #include +#include "cache.h" + static time_t my_mktime(struct tm *tm) { static const int mdays[] = { @@ -51,9 +50,9 @@ const char *show_date(unsigned long time, int tz) int minutes; minutes = tz < 0 ? -tz : tz; - minutes = (tz / 100)*60 + (tz % 100); + minutes = (minutes / 100)*60 + (minutes % 100); minutes = tz < 0 ? -minutes : minutes; - t = time - minutes * 60; + t = time + minutes * 60; tm = gmtime(&t); if (!tm) return NULL; @@ -225,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; @@ -271,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) +static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt) { int n; char *end; @@ -284,8 +283,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; + } } /* @@ -360,7 +361,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,10 +388,10 @@ static int match_tz(char *date, int *offp) /* 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) +void parse_date(const char *date, char *result, int maxlen) { struct tm tm; - int offset, sign; + int offset, sign, tm_gmt; time_t then; memset(&tm, 0, sizeof(tm)); @@ -399,6 +400,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; @@ -411,7 +413,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,7 +433,8 @@ void parse_date(char *date, char *result, int maxlen) if (then == -1) return; - then -= offset * 60; + if (!tm_gmt) + then -= offset * 60; sign = '+'; if (offset < 0) {