From 3ee59712cd04a6fbaa074b83c92c17bfb5f2e7f1 Mon Sep 17 00:00:00 2001 From: Brian Inglis Date: Thu, 24 Aug 2017 13:12:17 -0600 Subject: [PATCH] newlib/libc/time/strptime.c(strptime_l) add %F %s support for strptime --- newlib/libc/time/strptime.c | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/newlib/libc/time/strptime.c b/newlib/libc/time/strptime.c index c0861eb87..2ec001a1e 100644 --- a/newlib/libc/time/strptime.c +++ b/newlib/libc/time/strptime.c @@ -38,6 +38,9 @@ #include #include #include +#include +#include +#include #include "../locale/setlocale.h" #define _ctloc(x) (_CurrentTimeLocale->x) @@ -230,8 +233,15 @@ strptime_l (const char *buf, const char *format, struct tm *timeptr, buf = s; ymd |= SET_MDAY; break; + case 'F' : /* %Y-%m-%d - GNU extension */ + s = strptime_l (buf, "%Y-%m-%d", timeptr, locale); + if (s == NULL || s == buf) + return NULL; + buf = s; + ymd |= SET_YMD; + break; case 'H' : - case 'k' : + case 'k' : /* hour with leading space - GNU extension */ ret = strtol_l (buf, &s, 10, locale); if (s == buf) return NULL; @@ -239,7 +249,7 @@ strptime_l (const char *buf, const char *format, struct tm *timeptr, buf = s; break; case 'I' : - case 'l' : + case 'l' : /* hour with leading space - GNU extension */ ret = strtol_l (buf, &s, 10, locale); if (s == buf) return NULL; @@ -300,6 +310,26 @@ strptime_l (const char *buf, const char *format, struct tm *timeptr, return NULL; buf = s; break; + case 's' : /* seconds since Unix epoch - GNU extension */ + { + long long sec; + time_t t; + int save_errno; + + save_errno = errno; + errno = 0; + sec = strtoll_l (buf, &s, 10, locale); + t = sec; + if (s == buf + || errno != 0 + || t != sec + || localtime_r (&t, timeptr) != timeptr) + return NULL; + errno = save_errno; + buf = s; + ymd |= SET_YDAY | SET_WDAY | SET_YMD; + break; + } case 'S' : ret = strtol_l (buf, &s, 10, locale); if (s == buf) -- 2.14.1