summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdtime/strptime.c
diff options
context:
space:
mode:
authorsheldonh <sheldonh@FreeBSD.org>1999-11-10 14:40:59 +0000
committersheldonh <sheldonh@FreeBSD.org>1999-11-10 14:40:59 +0000
commit6f243c5ca7afe3130205a974027f0fd0b8149958 (patch)
treefcdb6296c732d2c2215556388cf16e64a485972c /lib/libc/stdtime/strptime.c
parent278d74a6af04e58079d4e40d5c3421fbb9a87c06 (diff)
downloadFreeBSD-src-6f243c5ca7afe3130205a974027f0fd0b8149958.zip
FreeBSD-src-6f243c5ca7afe3130205a974027f0fd0b8149958.tar.gz
Decremement by 1 the value taken for %j before assigning it to tm_yday,
which is zero-based. Correct the range checking for the value taken for %S. Add %w for the day of the week (0-6). Accept (but do nothing with) %U and %W. The comment for this change was taken from NetBSD. These changes were made after several failed attempts to contact the author of our strptime.c . PR: 10131 Submitted by: tadf@kt.rim.or.jp (Tadayoshi Funaba)
Diffstat (limited to 'lib/libc/stdtime/strptime.c')
-rw-r--r--lib/libc/stdtime/strptime.c56
1 files changed, 50 insertions, 6 deletions
diff --git a/lib/libc/stdtime/strptime.c b/lib/libc/stdtime/strptime.c
index 7f2de92..f9a3855 100644
--- a/lib/libc/stdtime/strptime.c
+++ b/lib/libc/stdtime/strptime.c
@@ -171,10 +171,10 @@ _strptime(const char *buf, const char *fmt, struct tm *tm)
i *= 10;
i += *buf - '0';
}
- if (i > 365)
+ if (i < 1 || i > 366)
return 0;
- tm->tm_yday = i;
+ tm->tm_yday = i - 1;
break;
case 'M':
@@ -189,13 +189,16 @@ _strptime(const char *buf, const char *fmt, struct tm *tm)
i *= 10;
i += *buf - '0';
}
- if (i > 59)
- return 0;
- if (c == 'M')
+ if (c == 'M') {
+ if (i > 59)
+ return 0;
tm->tm_min = i;
- else
+ } else {
+ if (i > 60)
+ return 0;
tm->tm_sec = i;
+ }
if (*buf != 0 && isspace((unsigned char)*buf))
while (*ptr != 0 && !isspace((unsigned char)*ptr))
@@ -271,6 +274,47 @@ _strptime(const char *buf, const char *fmt, struct tm *tm)
buf += len;
break;
+ case 'U':
+ case 'W':
+ /*
+ * XXX This is bogus, as we can not assume any valid
+ * information present in the tm structure at this
+ * point to calculate a real value, so just check the
+ * range for now.
+ */
+ if (!isdigit((unsigned char)*buf))
+ return 0;
+
+ for (i = 0; *buf != 0 && isdigit((unsigned char)*buf); buf++) {
+ i *= 10;
+ i += *buf - '0';
+ }
+ if (i > 53)
+ return 0;
+
+ if (*buf != 0 && isspace((unsigned char)*buf))
+ while (*ptr != 0 && !isspace((unsigned char)*ptr))
+ ptr++;
+ break;
+
+ case 'w':
+ if (!isdigit((unsigned char)*buf))
+ return 0;
+
+ for (i = 0; *buf != 0 && isdigit((unsigned char)*buf); buf++) {
+ i *= 10;
+ i += *buf - '0';
+ }
+ if (i > 6)
+ return 0;
+
+ tm->tm_wday = i;
+
+ if (*buf != 0 && isspace((unsigned char)*buf))
+ while (*ptr != 0 && !isspace((unsigned char)*ptr))
+ ptr++;
+ break;
+
case 'd':
case 'e':
if (!isdigit((unsigned char)*buf))
OpenPOWER on IntegriCloud