vcs-svn: cap number of bytes read from sliding view
[gitweb.git] / date.c
diff --git a/date.c b/date.c
index 610ecf75075aee90eabf65d198f7a28ba629a970..00f9eb5d0b9730107a8e08e92eb04d4cc9233595 100644 (file)
--- a/date.c
+++ b/date.c
@@ -229,6 +229,7 @@ static const struct {
 
        { "GMT",    0, 0, },    /* Greenwich Mean */
        { "UTC",    0, 0, },    /* Universal (Coordinated) */
+       { "Z",      0, 0, },    /* Zulu, alias for UTC */
 
        { "WET",    0, 0, },    /* Western European */
        { "BST",    0, 1, },    /* British Summer */
@@ -305,7 +306,7 @@ static int match_alpha(const char *date, struct tm *tm, int *offset)
 
        for (i = 0; i < ARRAY_SIZE(timezone_names); i++) {
                int match = match_string(date, timezone_names[i].name);
-               if (match >= 3) {
+               if (match >= 3 || match == strlen(timezone_names[i].name)) {
                        int off = timezone_names[i].offset;
 
                        /* This is bogus, but we like summer */
@@ -585,7 +586,7 @@ static int date_string(unsigned long date, int offset, char *buf, int len)
 
 /* 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_toffset(const char *date, unsigned long *timestamp, int *offset)
+int parse_date_basic(const char *date, unsigned long *timestamp, int *offset)
 {
        struct tm tm;
        int tm_gmt;
@@ -634,24 +635,23 @@ int parse_date_toffset(const char *date, unsigned long *timestamp, int *offset)
        /* mktime uses local timezone */
        *timestamp = tm_to_time_t(&tm);
        if (*offset == -1)
-               *offset = (*timestamp - mktime(&tm)) / 60;
+               *offset = ((time_t)*timestamp - mktime(&tm)) / 60;
 
        if (*timestamp == -1)
                return -1;
 
        if (!tm_gmt)
                *timestamp -= *offset * 60;
-       return 1; /* success */
+       return 0; /* success */
 }
 
 int parse_date(const char *date, char *result, int maxlen)
 {
        unsigned long timestamp;
        int offset;
-       if (parse_date_toffset(date, &timestamp, &offset) > 0)
-               return date_string(timestamp, offset, result, maxlen);
-       else
+       if (parse_date_basic(date, &timestamp, &offset))
                return -1;
+       return date_string(timestamp, offset, result, maxlen);
 }
 
 enum date_mode parse_date_format(const char *format)
@@ -1003,9 +1003,8 @@ unsigned long approxidate_relative(const char *date, const struct timeval *tv)
        int offset;
        int errors = 0;
 
-       if (parse_date_toffset(date, &timestamp, &offset) > 0)
+       if (!parse_date_basic(date, &timestamp, &offset))
                return timestamp;
-
        return approxidate_str(date, tv, &errors);
 }
 
@@ -1018,7 +1017,7 @@ unsigned long approxidate_careful(const char *date, int *error_ret)
        if (!error_ret)
                error_ret = &dummy;
 
-       if (parse_date_toffset(date, &timestamp, &offset) > 0) {
+       if (!parse_date_basic(date, &timestamp, &offset)) {
                *error_ret = 0;
                return timestamp;
        }