Loading...
--- Libc/Libc-583/stdtime/FreeBSD/strptime.c.patch
+++ Libc/Libc-498.1.7/stdtime/FreeBSD/strptime.c.patch
@@ -1,6 +1,6 @@
---- strptime.c.orig 2009-03-04 16:49:20.000000000 -0800
-+++ strptime.c 2009-05-13 16:39:36.000000000 -0700
-@@ -61,41 +61,56 @@ static char sccsid[] __unused = "@(#)str
+--- strptime.c.orig 2008-04-24 01:10:36.000000000 -0700
++++ strptime.c 2008-04-24 02:01:31.000000000 -0700
+@@ -61,10 +61,13 @@ static char sccsid[] __unused = "@(#)str
#endif /* not lint */
__FBSDID("$FreeBSD: src/lib/libc/stdtime/strptime.c,v 1.35 2003/11/17 04:19:15 nectar Exp $");
@@ -14,9 +14,7 @@
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
-+#include <stdint.h>
-+#include <limits.h>
- #include "un-namespace.h"
+@@ -72,30 +75,41 @@ __FBSDID("$FreeBSD: src/lib/libc/stdtime
#include "libc_private.h"
#include "timelocal.h"
@@ -28,15 +26,16 @@
+enum {CONVERT_NONE, CONVERT_GMT, CONVERT_ZONE};
+
-+#define _strptime(b,f,t,c,l) _strptime0(b,f,t,c,l,-1,0,-1)
-+
static char *
-_strptime(const char *buf, const char *fmt, struct tm *tm, int *GMTp)
-+_strptime0(const char *buf, const char *fmt, struct tm *tm, int *convp, locale_t loc, int year, int yday, int wday)
++_strptime(const char *buf, const char *fmt, struct tm *tm, int *convp, locale_t loc)
{
char c;
const char *ptr;
int i,
++ year = -1,
++ yday = 0,
++ wday = -1,
len;
int Ealternative, Oalternative;
- struct lc_time_T *tptr = __get_current_time_locale();
@@ -64,7 +63,7 @@
buf++;
else if (c != *buf++)
return 0;
-@@ -114,18 +129,18 @@ label:
+@@ -114,18 +128,18 @@ label:
break;
case '+':
@@ -86,7 +85,7 @@
i *= 10;
i += *buf - '0';
len--;
-@@ -133,17 +148,21 @@ label:
+@@ -133,17 +147,21 @@ label:
if (i < 19)
return 0;
@@ -110,7 +109,7 @@
if (buf == 0)
return 0;
break;
-@@ -161,47 +180,55 @@ label:
+@@ -161,47 +179,55 @@ label:
goto label;
case 'F':
@@ -174,7 +173,7 @@
i *= 10;
i += *buf - '0';
len--;
-@@ -209,19 +236,19 @@ label:
+@@ -209,19 +235,19 @@ label:
if (i < 1 || i > 366)
return 0;
@@ -198,7 +197,7 @@
i *= 10;
i += *buf - '0';
len--;
-@@ -237,8 +264,8 @@ label:
+@@ -237,8 +263,8 @@ label:
tm->tm_sec = i;
}
@@ -209,7 +208,7 @@
ptr++;
break;
-@@ -254,11 +281,11 @@ label:
+@@ -254,11 +280,11 @@ label:
* XXX The %l specifier may gobble one too many
* digits if used incorrectly.
*/
@@ -223,7 +222,7 @@
i *= 10;
i += *buf - '0';
len--;
-@@ -271,8 +298,8 @@ label:
+@@ -271,8 +297,8 @@ label:
tm->tm_hour = i;
@@ -234,7 +233,7 @@
ptr++;
break;
-@@ -282,7 +309,7 @@ label:
+@@ -282,7 +308,7 @@ label:
* specifiers.
*/
len = strlen(tptr->am);
@@ -243,7 +242,7 @@
if (tm->tm_hour > 12)
return 0;
if (tm->tm_hour == 12)
-@@ -292,7 +319,7 @@ label:
+@@ -292,7 +318,7 @@ label:
}
len = strlen(tptr->pm);
@@ -252,7 +251,7 @@
if (tm->tm_hour > 12)
return 0;
if (tm->tm_hour != 12)
-@@ -307,34 +334,28 @@ label:
+@@ -307,34 +333,28 @@ label:
case 'a':
for (i = 0; i < asizeof(tptr->weekday); i++) {
len = strlen(tptr->weekday[i]);
@@ -296,7 +295,7 @@
i *= 10;
i += *buf - '0';
len--;
-@@ -342,23 +363,46 @@ label:
+@@ -342,23 +362,46 @@ label:
if (i > 53)
return 0;
@@ -353,7 +352,7 @@
ptr++;
break;
-@@ -372,11 +416,18 @@ label:
+@@ -372,11 +415,18 @@ label:
* XXX The %e specifier may gobble one too many
* digits if used incorrectly.
*/
@@ -375,7 +374,7 @@
i *= 10;
i += *buf - '0';
len--;
-@@ -386,8 +437,8 @@ label:
+@@ -386,8 +436,8 @@ label:
tm->tm_mday = i;
@@ -386,7 +385,7 @@
ptr++;
break;
-@@ -398,19 +449,19 @@ label:
+@@ -398,19 +448,19 @@ label:
if (Oalternative) {
if (c == 'B') {
len = strlen(tptr->alt_month[i]);
@@ -412,7 +411,7 @@
break;
}
}
-@@ -422,11 +473,11 @@ label:
+@@ -422,11 +472,11 @@ label:
break;
case 'm':
@@ -426,7 +425,7 @@
i *= 10;
i += *buf - '0';
len--;
-@@ -436,8 +487,8 @@ label:
+@@ -436,8 +486,8 @@ label:
tm->tm_mon = i - 1;
@@ -437,7 +436,7 @@
ptr++;
break;
-@@ -450,7 +501,7 @@ label:
+@@ -450,7 +500,7 @@ label:
sverrno = errno;
errno = 0;
@@ -446,7 +445,7 @@
if (errno == ERANGE || (long)(t = n) != n) {
errno = sverrno;
return 0;
-@@ -458,24 +509,82 @@ label:
+@@ -458,24 +508,37 @@ label:
errno = sverrno;
buf = cp;
gmtime_r(&t, tm);
@@ -467,55 +466,10 @@
+#if __DARWIN_UNIX03
+ if (c == 'Y') {
-+ int savei = 0;
-+ const char *savebuf = buf;
-+ int64_t i64 = 0;
-+ int overflow = 0;
-+
-+ for (len = 0; *buf != 0 && isdigit_l((unsigned char)*buf, loc); buf++) {
-+ i64 *= 10;
-+ i64 += *buf - '0';
-+ if (++len <= 4) {
-+ savei = i64;
-+ savebuf = buf + 1;
-+ }
-+ if (i64 > INT_MAX) {
-+ overflow++;
-+ break;
-+ }
++ for (i = 0; *buf != 0 && isdigit_l((unsigned char)*buf, loc); buf++) {
++ i *= 10;
++ i += *buf - '0';
+ }
-+ /*
-+ * Conformance requires %Y to be more then 4
-+ * digits. However, there are several cases
-+ * where %Y is immediately followed by other
-+ * digits values. So we do the conformance
-+ * case first (as many digits as possible),
-+ * and if we fail, we backup and try just 4
-+ * digits for %Y.
-+ */
-+ if (len > 4 && !overflow) {
-+ struct tm savetm = *tm;
-+ int saveconv = *convp;
-+ const char *saveptr = ptr;
-+ char *ret;
-+
-+ if (i64 < 1900)
-+ return 0;
-+
-+ tm->tm_year = i64 - 1900;
-+
-+ if (*buf != 0 && isspace_l((unsigned char)*buf, loc))
-+ while (*ptr != 0 && !isspace_l((unsigned char)*ptr, loc) && *ptr != '%')
-+ ptr++;
-+ ret = _strptime0(buf, ptr, tm, convp, loc, tm->tm_year, yday, wday);
-+ if (ret) return ret;
-+ /* Failed, so try 4-digit year */
-+ *tm = savetm;
-+ *convp = saveconv;
-+ ptr = saveptr;
-+ }
-+ buf = savebuf;
-+ i = savei;
+ } else {
+ len = 2;
+#else /* !__DARWIN_UNIX03 */
@@ -533,7 +487,7 @@
if (c == 'Y')
i -= 1900;
if (c == 'y' && i < 69)
-@@ -483,35 +592,58 @@ label:
+@@ -483,35 +546,58 @@ label:
if (i < 0)
return 0;
@@ -574,7 +528,7 @@
+ *convp = CONVERT_GMT;
+ buf += len;
+ break;
-+ }
+ }
+ tzset();
+ tzlen = strlen(tzname[0]);
+ if (len == tzlen && strncmp(buf, tzname[0], tzlen) == 0) {
@@ -587,7 +541,7 @@
+ tm->tm_isdst = 1;
+ buf += len;
+ break;
- }
++ }
+ return 0;
+ }
+
@@ -611,7 +565,7 @@
}
break;
}
-@@ -524,14 +656,39 @@ char *
+@@ -524,14 +610,39 @@ char *
strptime(const char * __restrict buf, const char * __restrict fmt,
struct tm * __restrict tm)
{