projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Plug leak in Daniel's read-tree.
[git.git]
/
date.c
diff --git
a/date.c
b/date.c
index
1f366a6
..
b46f2ce
100644
(file)
--- a/
date.c
+++ b/
date.c
@@
-4,9
+4,6
@@
* Copyright (C) Linus Torvalds, 2005
*/
* Copyright (C) Linus Torvalds, 2005
*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
#include <ctype.h>
#include <time.h>
#include <ctype.h>
#include <time.h>
@@
-227,7
+224,7
@@
static int is_date(int year, int month, int day, struct tm *tm)
return 0;
}
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, c
onst c
har *date, char *end, struct tm *tm)
{
long num2, num3;
{
long num2, num3;
@@
-273,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?
*/
/*
* We've seen a digit. Time? Year? Date?
*/
-static int match_digit(c
har *date, struct tm *tm, int *offse
t)
+static int match_digit(c
onst char *date, struct tm *tm, int *offset, int *tm_gm
t)
{
int n;
char *end;
{
int n;
char *end;
@@
-286,8
+283,10
@@
static int match_digit(char *date, struct tm *tm, int *offset)
*/
if (num > 946684800) {
time_t time = num;
*/
if (num > 946684800) {
time_t time = num;
- if (gmtime_r(&time, tm))
+ if (gmtime_r(&time, tm)) {
+ *tm_gmt = 1;
return end - date;
return end - date;
+ }
}
/*
}
/*
@@
-362,7
+361,7
@@
static int match_digit(char *date, struct tm *tm, int *offset)
return n;
}
return n;
}
-static int match_tz(char *date, int *offp)
+static int match_tz(c
onst c
har *date, int *offp)
{
char *end;
int offset = strtoul(date+1, &end, 10);
{
char *end;
int offset = strtoul(date+1, &end, 10);
@@
-389,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. */
/* 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(c
onst c
har *date, char *result, int maxlen)
{
struct tm tm;
{
struct tm tm;
- int offset, sign;
+ int offset, sign
, tm_gmt
;
time_t then;
memset(&tm, 0, sizeof(tm));
time_t then;
memset(&tm, 0, sizeof(tm));
@@
-401,6
+400,7
@@
void parse_date(char *date, char *result, int maxlen)
tm.tm_mday = -1;
tm.tm_isdst = -1;
offset = -1;
tm.tm_mday = -1;
tm.tm_isdst = -1;
offset = -1;
+ tm_gmt = 0;
for (;;) {
int match = 0;
for (;;) {
int match = 0;
@@
-413,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))
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);
else if ((c == '-' || c == '+') && isdigit(date[1]))
match = match_tz(date, &offset);
@@
-433,7
+433,8
@@
void parse_date(char *date, char *result, int maxlen)
if (then == -1)
return;
if (then == -1)
return;
- then -= offset * 60;
+ if (!tm_gmt)
+ then -= offset * 60;
sign = '+';
if (offset < 0) {
sign = '+';
if (offset < 0) {