Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Builtin strftime and TZ assignments

On Feb 21,  4:39pm, Bart Schaefer wrote:
} On Feb 21, 11:16pm, Peter Stephenson wrote:
} }
} } That wouldn't work because a level is only assigned if you "typeset" or
} } equivalent --- a normal assignment creates a global parameter.  But I'd
} } expect it to work with locallevel instead of locallevel+1.

It does in fact work with locallevel.

} } I don't understand the difference if createparam() isn't there.  It
} } should always be called by any function that needs to create a parameter.
} If you just call setsparam("TZ", ...), it will eventually go through
} createparam() and the right thing happens with locallevel

Apparently I was confused about that too -- it's the use of the TZ=UTC
prefix which creates and removes again the parameter, not the use of
the parameter scope in bin_strftime().

} Also I now suspect my patch breaks strftime -s, I didn't test that.

Which it does not.  Except for one special case:  "strftime -s TZ ..."
doesn't change the value of TZ.

Here's a revised patch.  Question:  How does one know when to metafy() the
value passed to setsparam()?  It doesn't appear that getsparam() performs
an unmetafy(), so I presume I can pass directly back to setsparam().

diff --git a/Src/Modules/datetime.c b/Src/Modules/datetime.c
index 00ebd2b..63a04dc 100644
--- a/Src/Modules/datetime.c
+++ b/Src/Modules/datetime.c
@@ -94,7 +94,7 @@ reverse_strftime(char *nam, char **argv, char *scalar, int quiet)
 static int
-bin_strftime(char *nam, char **argv, Options ops, UNUSED(int func))
+output_strftime(char *nam, char **argv, Options ops, UNUSED(int func))
     int bufsize, x;
     char *endptr = NULL, *scalar = NULL, *buffer;
@@ -145,6 +145,25 @@ bin_strftime(char *nam, char **argv, Options ops, UNUSED(int func))
     return 0;
+static int
+bin_strftime(char *nam, char **argv, Options ops, int func)
+    int result = 1;
+    char *tz = getsparam("TZ");
+    startparamscope();
+    if (tz && *tz) {
+	Param pm = createparam("TZ", PM_LOCAL|PM_SCALAR|PM_EXPORTED);
+	if (pm)
+	    pm->level = locallevel; /* because createparam() doesn't */
+	setsparam("TZ", ztrdup(tz));
+    }
+    result = output_strftime(nam, argv, ops, func);
+    endparamscope();
+    return result;
 static zlong
 getcurrentsecs(UNUSED(Param pm))

Messages sorted by: Reverse Date, Date, Thread, Author