public inbox for newlib@sourceware.org
 help / color / mirror / Atom feed
From: <earlephilhower@yahoo.com>
To: <newlib@sourceware.org>
Subject: [PATCH] Add support for TZ names with <> in tzset
Date: Sat, 14 Nov 2020 15:03:52 -0800	[thread overview]
Message-ID: <080401d6bada$6c52f060$44f8d120$@yahoo.com> (raw)
In-Reply-To: <080401d6bada$6c52f060$44f8d120$.ref@yahoo.com>

Howdy all,

Attached is a patch which extends the tzset() function to support a format
for "unnamed" TZ environment timezones which use "<+/-nn>" as the timezone
name instead of an alphabetic name.  These are supported in glibc and are
present in several major TZ databases that we use on the ESP8266 Arduino
core.  For example, 

> #define TZ_Africa_Casablanca	  "<+01>-1"

The existing tzset sscanf format string breaks at the first "+", assuming
it's the
beginning of the offset.  This patch special-cases names beginning with "<"
to
circumvent the issue.

Signed-off-by: Earle F. Philhower, III   <earlephilhower@yahoo.com>

---
 newlib/libc/time/tzset_r.c | 46 ++++++++++++++++++++++++++++++--------
 1 file changed, 37 insertions(+), 9 deletions(-)

diff --git a/newlib/libc/time/tzset_r.c b/newlib/libc/time/tzset_r.c
index 9e0cf834b..5b8b692ee 100644
--- a/newlib/libc/time/tzset_r.c
+++ b/newlib/libc/time/tzset_r.c
@@ -45,8 +45,19 @@ _tzset_unlocked_r (struct _reent *reent_ptr)
   if (*tzenv == ':')
     ++tzenv;

-  if (sscanf (tzenv, "%10[^0-9,+-]%n", __tzname_std, &n) <= 0)
-    return;
+  if (tzenv[0] == '<')
+    {
+      /* This is of the form "<[+-]nn>" so needs a different parsing */
+      if (sscanf (tzenv, "%9[^>]>%n", __tzname_std, &n) <= 0)
+        return;
+      /* Include the final > */
+      strcat (__tzname_std, ">");
+    }
+  else
+    {
+      if (sscanf (tzenv, "%10[^0-9,+-]%n", __tzname_std, &n) <= 0)
+        return;
+    }

   tzenv += n;

@@ -69,15 +80,32 @@ _tzset_unlocked_r (struct _reent *reent_ptr)
   _tzname[0] = __tzname_std;
   tzenv += n;

-  if (sscanf (tzenv, "%10[^0-9,+-]%n", __tzname_dst, &n) <= 0)
-    { /* No dst */
-      _tzname[1] = _tzname[0];
-      _timezone = tz->__tzrule[0].offset;
-      _daylight = 0;
-      return;
+  if (tzenv[0] == '<')
+    {
+      /* This is of the form "<[+-]nn>" so needs a different parsing */
+      if (sscanf (tzenv, "%9[^>]>%n", __tzname_dst, &n) <= 0)
+        { /* No dst */
+          _tzname[1] = _tzname[0];
+          _timezone = tz->__tzrule[0].offset;
+          _daylight = 0;
+          return;
+        }
+      /* Include the final > */
+      strcat (__tzname_dst, ">");
+      _tzname[1] = __tzname_dst;
     }
   else
-    _tzname[1] = __tzname_dst;
+    {
+      if (sscanf (tzenv, "%10[^0-9,+-]%n", __tzname_dst, &n) <= 0)
+        { /* No dst */
+          _tzname[1] = _tzname[0];
+          _timezone = tz->__tzrule[0].offset;
+          _daylight = 0;
+          return;
+        }
+      else
+        _tzname[1] = __tzname_dst;
+    }

   tzenv += n;

--
2.17.1



       reply	other threads:[~2020-11-14 23:04 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <080401d6bada$6c52f060$44f8d120$.ref@yahoo.com>
2020-11-14 23:03 ` earlephilhower [this message]
2020-11-16 15:13   ` Corinna Vinschen
2020-11-16 22:30     ` Brian Inglis
     [not found]       ` <DM2P110MB01699F833CC488133A5AE9E99AE20@DM2P110MB0169.NAMP110.PROD.OUTLOOK.COM>
2020-11-17  1:43         ` Fw: " C Howland
2020-11-17  4:59           ` Brian Inglis
2020-12-12 17:56             ` Earle F. Philhower, III
2020-12-12 18:59               ` Brian Inglis
2020-12-14  9:30               ` Corinna Vinschen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='080401d6bada$6c52f060$44f8d120$@yahoo.com' \
    --to=earlephilhower@yahoo.com \
    --cc=newlib@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).