fix printf precision specifier for hex floats on non-ld80 archs
[musl] / src / time / strptime.c
index da9e1f4..c54a0d8 100644 (file)
@@ -11,7 +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;
+       int want_century = 0, century = 0, relyear = 0;
        while (*f) {
                if (*f != '%') {
                        if (isspace(*f)) for (; *s && isspace(*s); s++);
@@ -94,6 +94,7 @@ char *strptime(const char *restrict s, const char *restrict f, struct tm *restri
                        len = strlen(ex);
                        if (!strncasecmp(s, ex, len)) {
                                tm->tm_hour %= 12;
+                               s += len;
                                break;
                        }
                        ex = nl_langinfo(PM_STR);
@@ -101,6 +102,7 @@ char *strptime(const char *restrict s, const char *restrict f, struct tm *restri
                        if (!strncasecmp(s, ex, len)) {
                                tm->tm_hour %= 12;
                                tm->tm_hour += 12;
+                               s += len;
                                break;
                        }
                        return 0;
@@ -142,7 +144,7 @@ char *strptime(const char *restrict s, const char *restrict f, struct tm *restri
                        if (!s) return 0;
                        break;
                case 'y':
-                       dest = &tm->tm_year;
+                       dest = &relyear;
                        w = 2;
                        want_century |= 1;
                        goto numeric_digits;
@@ -196,6 +198,7 @@ char *strptime(const char *restrict s, const char *restrict f, struct tm *restri
                }
        }
        if (want_century) {
+               tm->tm_year = relyear;
                if (want_century & 2) tm->tm_year += century * 100 - 1900;
                else if (tm->tm_year <= 68) tm->tm_year += 100;
        }