summaryrefslogtreecommitdiff
path: root/date.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@osdl.org>2005-09-21 22:50:28 (GMT)
committerJunio C Hamano <junkio@cox.net>2005-09-22 08:53:36 (GMT)
commit01c6ad29bd1b647d4fd1acea54e374c740ec3c10 (patch)
tree4dd367cdbf32a266f5199ecacaa90ce761cfe351 /date.c
parentacfadcfb48e34fdc441e9cffbb385fce9693b363 (diff)
downloadgit-01c6ad29bd1b647d4fd1acea54e374c740ec3c10.zip
git-01c6ad29bd1b647d4fd1acea54e374c740ec3c10.tar.gz
git-01c6ad29bd1b647d4fd1acea54e374c740ec3c10.tar.bz2
[PATCH] Fix strange timezone handling
We generate the ASCII representation of our internal date representation ("seconds since 1970, UTC + timezone information") in two different places. One of them uses the stupid and obvious way to make sure that it gets the sexagecimal representation right for negative timezones even if they might not be exact hours, and the other one depends on the modulus operator always matching the sign of argument. Hey, the clever one works. And C90 even specifies that behaviour. But I had to think about it for a while when I was re-visiting this area, and even if I didn't have to, it's kind of strange to have two different ways to print out the same data format. So use a common helper for this. And select the stupid and straighforward way. Signed-off-by: Linus Torvalds <torvalds@osdl.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'date.c')
-rw-r--r--date.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/date.c b/date.c
index 8d7b2eb..b21cadc 100644
--- a/date.c
+++ b/date.c
@@ -386,12 +386,23 @@ static int match_tz(const 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. */
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));
@@ -435,14 +446,7 @@ int parse_date(const char *date, char *result, int maxlen)
if (!tm_gmt)
then -= offset * 60;
-
- sign = '+';
- if (offset < 0) {
- offset = -offset;
- sign = '-';
- }
-
- return 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);
}