projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Work around missing hard links on FAT formatted media
[git.git]
/
date.c
diff --git
a/date.c
b/date.c
index
1f366a6
..
63f5a09
100644
(file)
--- a/
date.c
+++ b/
date.c
@@
-4,10
+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 "cache.h"
#include <time.h>
#include "cache.h"
@@
-227,7
+223,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
+269,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
+282,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
+360,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);
@@
-387,12
+385,23
@@
static int match_tz(char *date, int *offp)
return end - date;
}
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. */
/* 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;
{
struct tm tm;
- int offset,
sign
;
+ int offset,
tm_gmt
;
time_t then;
memset(&tm, 0, sizeof(tm));
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.tm_mday = -1;
tm.tm_isdst = -1;
offset = -1;
+ tm_gmt = 0;
for (;;) {
int match = 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))
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);
@@
-431,17
+441,11
@@
void parse_date(char *date, char *result, int maxlen)
offset = (then - mktime(&tm)) / 60;
if (then == -1)
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)
}
void datestamp(char *buf, int bufsize)
@@
-454,5
+458,5
@@
void datestamp(char *buf, int bufsize)
offset = my_mktime(localtime(&now)) - now;
offset /= 60;
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
);
}
}