On 2017-07-23 22:07, Brian Inglis wrote:
> On 2017-07-23 20:09, Lavrentiev, Anton (NIH/NLM/NCBI) [C] wrote:
>>> But that's just scanning a decimal integer to time_t.
>> It's not a question of whether I can or can't convert a string into an 
>> integer, rather it's a question about portability of code that uses %s for
>> both functions and expects it to work unchanged in the Cygwin environment.
>> Also, strptime() was designed to be a reversal to strftime() (from the
>> man-pages: the strptime() function is the converse function to strftime(3))
>> so both are supposed to "understand" the same basic set of formats. Because
>> of Cygwin's strptime() missing "%s", the following also does not work even
>> from command line:
>> $ date +"%s" | strptime "%s"
> Attached diff for proposed strptime %s and %F support.
> Let me know if you would prefer a different approach before I submit a git 
> format-patch.

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.

-- 
Take care. Thanks, Brian Inglis, Calgary, Alberta, Canada
From 11f950597e7f66132a2ce6c8120f7199ba02316f Mon Sep 17 00:00:00 2001
From: Brian Inglis <brian.ing...@systematicsw.ab.ca>
Date: Tue, 22 Aug 2017 15:10:27 -0600
Subject: [PATCH] winsup/cygwin/libc/strptime.cc(__strptime) add strptime %s

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

diff --git a/winsup/cygwin/libc/strptime.cc b/winsup/cygwin/libc/strptime.cc
index 62dca6e5e..a7fef4985 100644
--- a/winsup/cygwin/libc/strptime.cc
+++ b/winsup/cygwin/libc/strptime.cc
@@ -573,6 +573,29 @@ 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;
+                       int errno_save;
+                       char *end;
+
+                       LEGAL_ALT(0);
+                       errno_save = errno;
+                       errno = 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;
+                       errno = errno_save;
+                       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.0

Reply via email to