[PATCH] winsup/cygwin/libc/strptime.cc(__strptime) add strptime %s

Brian Inglis Brian.Inglis@SystematicSw.ab.ca
Tue Aug 29 17:57:00 GMT 2017


On 2017-08-24 03:25, Corinna Vinschen wrote:
> On Aug 23 12:51, Brian Inglis wrote:
>> Attached patch to support %s in Cygwin winsup libc strptime.cc __strptime().
>> This also enables support for %s in dateutils package strptime(1).
>> In case the issue comes up, if the user wants to support %s as in date(1) with a
>> preceding @ flag, they just have to include that verbatim before the format as
>> in "@%s".
>> Testing revealed a separate issue with %F format which I will follow up on in a
>> different thread.
>> Similar patch coming for newlib.
> Funny enough, in other places in Cygwin we call this temp variable
> "save_errno" :)
> Alternatively, since you're in C++ code, you can use the save_errno
> class, like this:
>   {
>     save_errno save;
> 
>     [do your thing]
>   }
> The destructor of save_errno will restore errno.
> Since the code as such is fine, it's your choice if you want to stick
> to it or use one of the above.  Just give the word.

Changed to use that.

-- 
Take care. Thanks, Brian Inglis, Calgary, Alberta, Canada

-------------- next part --------------
From 16855e2e241673e5cb98368a696114e38f62a4dc Mon Sep 17 00:00:00 2001
From: Brian Inglis <Brian.Inglis@SystematicSW.ab.ca>
Date: Thu, 24 Aug 2017 13:24:28 -0600
Subject: [PATCH] winsup/cygwin/libc/strptime.cc(__strptime) add %s support to
 strptime

---
 winsup/cygwin/libc/strptime.cc | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/winsup/cygwin/libc/strptime.cc b/winsup/cygwin/libc/strptime.cc
index 62dca6e5e..7c6cc2024 100644
--- a/winsup/cygwin/libc/strptime.cc
+++ b/winsup/cygwin/libc/strptime.cc
@@ -573,6 +573,26 @@ literal:
 			bp = conv_num(bp, &tm->tm_sec, 0, 61, ALT_DIGITS);
 			continue;
 
+		case 's' :	/* The seconds since Unix epoch - GNU extension */
+		    {
+			long long sec;
+			time_t t;
+			char *end;
+			save_errno save;
+
+			LEGAL_ALT(0);
+			sec = strtoll_l ((char *)bp, &end, 10, locale);
+			t = sec;
+			if (end == (char *)bp
+			    || errno != 0
+			    || t != sec
+			    || localtime_r (&t, tm) != tm)
+			    return NULL;
+			bp = (const unsigned char *)end;
+			ymd |= SET_YDAY | SET_WDAY | SET_YMD;
+			break;
+		    }
+
 		case 'U':	/* The week of year, beginning on sunday. */
 		case 'W':	/* The week of year, beginning on monday. */
 			/*
-- 
2.14.1



More information about the Cygwin-patches mailing list