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