]> git.eshelyaron.com Git - emacs.git/commitdiff
Port angle-bracket TZ settings to MS-Windows
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 2 Jun 2016 04:00:58 +0000 (21:00 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 2 Jun 2016 04:09:17 +0000 (21:09 -0700)
* doc/lispref/os.texi (Time Zone Rules): Document MS-Windows
lack of support for numeric time zone abbreviations.
* src/w32.c (sys_putenv): Convert angle-bracket TZ syntax
to MS-compatible syntax if possible, and to "ZZZ" otherwise.
Problem reported by Kazuhiro Ito (Bug#23600).

doc/lispref/os.texi
src/w32.c

index becb691581b3283a64bd06d3ce7dc38668e36664..38dde26d03a19607c4b47cc3f4fbce3b3ff912c9 100644 (file)
@@ -1327,7 +1327,8 @@ If it is @code{t}, the conversion uses Universal Time.  If it is
 a string, the conversion uses the time zone rule equivalent to setting
 @env{TZ} to that string.  If it is an integer @var{offset}, the
 conversion uses a fixed time zone with the given offset and a numeric
-abbreviation.  If it is a list (@var{offset} @var{abbr}), where
+abbreviation on POSIX-compatible platforms and an unspecified abbreviation
+on MS-Windows.  If it is a list (@var{offset} @var{abbr}), where
 @var{offset} is an integer number of seconds east of Universal Time
 and @var{abbr} is a string, the conversion uses a fixed time zone with
 the given offset and abbreviation.
index 442ce79b23cd7ae564dbfd4f546ab521bbe2f3ca..71a38b91946d94ca8f94fb4cf165d21059d90360 100644 (file)
--- a/src/w32.c
+++ b/src/w32.c
@@ -2505,6 +2505,35 @@ sys_putenv (char *str)
       return unsetenv (str);
     }
 
+  if (strncmp (str, "TZ=<", 4) == 0)
+    {
+      /* MS-Windows does not support POSIX.1-2001 angle-bracket TZ
+        abbreviation syntax.  Convert to POSIX.1-1988 syntax if possible,
+        and to the undocumented placeholder "ZZZ" otherwise.  */
+      bool supported_abbr = true;
+      for (char *p = str + 4; *p; p++)
+       {
+         if (('0' <= *p && *p <= '9') || *p == '-' || *p == '+')
+           supported_abbr = false;
+         else if (*p == '>')
+           {
+             ptrdiff_t abbrlen;
+             if (supported_abbr)
+               {
+                 abbrlen = p - (str + 4);
+                 memmove (str + 3, str + 4, abbrlen);
+               }
+             else
+               {
+                 abbrlen = 3;
+                 memset (str + 3, 'Z', abbrlen);
+               }
+             memmove (str + 3 + abbrlen, p + 1, strlen (p));
+             break;
+           }
+       }
+    }
+
   return _putenv (str);
 }