implement %y and %C specifiers in strptime
authorTimo Teräs <timo.teras@iki.fi>
Wed, 14 May 2014 07:53:56 +0000 (10:53 +0300)
committerRich Felker <dalias@aerifal.cx>
Fri, 6 Jun 2014 21:41:12 +0000 (17:41 -0400)
src/time/strptime.c

index 4d9eea41c2d3e860867a043685c815a8d7e23413..f41f55f24cf4bcf8a100178440a15e8efdfc14ad 100644 (file)
@@ -11,6 +11,7 @@ char *strptime(const char *restrict s, const char *restrict f, struct tm *restri
        int i, w, neg, adj, min, range, *dest, dummy;
        const char *ex;
        size_t len;
+       int want_century = 0, century = 0;
        while (*f) {
                if (*f != '%') {
                        if (isspace(*f)) for (; *s && isspace(*s); s++);
@@ -40,9 +41,9 @@ char *strptime(const char *restrict s, const char *restrict f, struct tm *restri
                        if (!s) return 0;
                        break;
                case 'C':
-                       /* FIXME */
-                       dest = &dummy;
+                       dest = &century;
                        if (w<0) w=2;
+                       want_century |= 2;
                        goto numeric_digits;
                case 'd': case 'e':
                        dest = &tm->tm_mday;
@@ -135,14 +136,15 @@ char *strptime(const char *restrict s, const char *restrict f, struct tm *restri
                        if (!s) return 0;
                        break;
                case 'y':
-                       /* FIXME */
-                       dest = &dummy;
+                       dest = &tm->tm_year;
                        w = 2;
+                       want_century |= 1;
                        goto numeric_digits;
                case 'Y':
                        dest = &tm->tm_year;
                        if (w<0) w=4;
                        adj = 1900;
+                       want_century = 0;
                        goto numeric_digits;
                case '%':
                        if (*s++ != '%') return 0;
@@ -187,5 +189,9 @@ char *strptime(const char *restrict s, const char *restrict f, struct tm *restri
                        ;
                }
        }
+       if (want_century) {
+               if (want_century & 2) tm->tm_year += century * 100 - 1900;
+               else if (tm->tm_year <= 68) tm->tm_year += 100;
+       }
        return (char *)s;
 }