date handling: handle "AM"/"PM" on time
authorLinus Torvalds <torvalds@ppc970.osdl.org>
Sun, 1 May 2005 19:34:56 +0000 (12:34 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Sun, 1 May 2005 19:34:56 +0000 (12:34 -0700)
And be a bitmore careful about matching: if we don't recognize a word
or a number, we skip the whole thing, rather than trying the next character
in that word/number.

Finally: since ctime() adds the final '\n', don't add another one in test-date.

date.c
test-date.c

diff --git a/date.c b/date.c
index 5ee4984..aa4fb3e 100644 (file)
--- a/date.c
+++ b/date.c
@@ -114,6 +114,15 @@ static int match_string(const char *date, const char *str)
        return i;
 }
 
+static int skip_alpha(const char *date)
+{
+       int i = 0;
+       do {
+               i++;
+       } while (isalpha(date[i]));
+       return i;
+}
+
 /*
 * Parse month, weekday, or timezone name
 */
@@ -153,8 +162,14 @@ static int match_alpha(const char *date, struct tm *tm, int *offset)
                }
        }
 
+       if (match_string(date, "PM") == 2) {
+               if (tm->tm_hour > 0 && tm->tm_hour < 12)
+                       tm->tm_hour += 12;
+               return 2;
+       }
+
        /* BAD CRAP */
-       return 0;
+       return skip_alpha(date);
 }
 
 static int is_date(int year, int month, int day, struct tm *tm)
@@ -332,14 +347,13 @@ static int match_tz(char *date, int *offp)
         * a valid minute. We might want to check that the minutes
         * are divisible by 30 or something too.
         */
-       if (min >= 60 || n < 3)
-               return 0;
+       if (min < 60 && n > 2) {
+               offset = hour*60+min;
+               if (*date == '-')
+                       offset = -offset;
 
-       offset = hour*60+min;
-       if (*date == '-')
-               offset = -offset;
-
-       *offp = offset;
+               *offp = offset;
+       }
        return end - date;
 }
 
index 8ec41c3..6fe3e28 100644 (file)
@@ -14,7 +14,7 @@ int main(int argc, char **argv)
                memcpy(result, "bad", 4);
                parse_date(argv[i], result, sizeof(result));
                t = strtoul(result, NULL, 0);
-               printf("%s -> %s -> %s\n", argv[i], result, ctime(&t));
+               printf("%s -> %s -> %s", argv[i], result, ctime(&t));
        }
        return 0;
 }