From: Peter Stephenson <p.stephenson@samsung.com>
To: Zsh hackers list <zsh-workers@zsh.org>
Subject: Re: PATCH: functions with redirections
Date: Tue, 30 Sep 2014 12:52:49 +0100 [thread overview]
Message-ID: <20140930125249.0235af2a@pwslap01u.europe.root.pri> (raw)
In-Reply-To: <20140930094813.22965438@pwslap01u.europe.root.pri>
On Tue, 30 Sep 2014 09:48:13 +0100
Peter Stephenson <p.stephenson@samsung.com> wrote:
> On Mon, 29 Sep 2014 18:02:57 -0700
> Bart Schaefer <schaefer@brasslantern.com> wrote:
> > On Sep 29, 1:53pm, Bart Schaefer wrote:
> > }
> > } foo() { echo foo; } >&3
> > } foo 3>&2
> >
> > Tried this now; happily it works the same as bash.
>
> It works by appending the list from the function definition to the list
> from the command line, so the effect is "3>&2 >&3" as you expect.
> Should probably add a test for it --- it's slightly different code from
> the normal case.
There's one here.
> $functions[foo] output will need a special case. I'll look at it.
This is straightforward, except the code is messily duplicated in two
places and both have an unmetafy() I'm extremely dubious about ---
surely as the string is internal to a parameter value it should still be
metafied? If something's not unmetafying it that's a bug elsewhere.
I'm also a bit dubious about the way output for functions with the EF_RUN
flag is handled --- the original code rather than the additions. I
think this is to do with ksh-style autoloads.
diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c
index 0385a70..55157a9 100644
--- a/Src/Modules/parameter.c
+++ b/Src/Modules/parameter.c
@@ -392,20 +392,36 @@ getfunction(UNUSED(HashTable ht), const char *name, int dis)
((shf->node.flags & PM_TAGGED) ? "t" : "")));
} else {
char *t = getpermtext(shf->funcdef, NULL, 1), *n, *h;
+ char *start;
+
+ if (shf->redir)
+ start = "{\n\t";
+ else
+ start = "\t";
if (shf->funcdef->flags & EF_RUN) {
n = nicedupstring(name);
- h = (char *) zhalloc(strlen(t) + strlen(n) + 9);
- h[0] = '\t';
- strcpy(h + 1, t);
+ h = (char *) zhalloc(strlen(start) + strlen(t) + strlen(n) + 8);
+ strcpy(h, start);
+ strcat(h, t);
strcat(h, "\n\t");
strcat(h, n);
strcat(h, " \"$@\"");
} else
- h = dyncat("\t", t);
+ h = dyncat(start, t);
zsfree(t);
+ /*
+ * TBD: Is this unmetafy correct? Surely as this
+ * is a parameter value it stays metafied?
+ */
unmetafy(h, NULL);
+ if (shf->redir) {
+ t = getpermtext(shf->redir, NULL, 1);
+ h = zhtricat(h, "\n}", t);
+ zsfree(t);
+ }
+
pm->u.str = h;
}
} else {
@@ -456,21 +472,38 @@ scanfunctions(UNUSED(HashTable ht), ScanFunc func, int flags, int dis)
((shf->node.flags & PM_TAGGED) ? "Ut" : "U") :
((shf->node.flags & PM_TAGGED) ? "t" : "")));
} else {
- char *t = getpermtext(((Shfunc) hn)->funcdef, NULL, 1);
- char *n;
+ Shfunc shf = (Shfunc)hn;
+ char *t = getpermtext(shf->funcdef, NULL, 1);
+ char *n, *start;
- if (((Shfunc) hn)->funcdef->flags & EF_RUN) {
+ if (shf->redir)
+ start = "{\n\t";
+ else
+ start = "\t";
+
+ if (shf->funcdef->flags & EF_RUN) {
n = nicedupstring(hn->nam);
- pm.u.str = (char *) zhalloc(strlen(t) + strlen(n) + 9);
- pm.u.str[0] = '\t';
- strcpy(pm.u.str + 1, t);
+ pm.u.str = (char *) zhalloc(
+ strlen(start) + strlen(t) + strlen(n) + 8);
+ strcpy(pm.u.str, start);
+ strcat(pm.u.str, t);
strcat(pm.u.str, "\n\t");
strcat(pm.u.str, n);
strcat(pm.u.str, " \"$@\"");
} else
- pm.u.str = dyncat("\t", t);
+ pm.u.str = dyncat(start, t);
+ /*
+ * TBD: Is this unmetafy correct? Surely as this
+ * is a parameter value it stays metafied?
+ */
unmetafy(pm.u.str, NULL);
zsfree(t);
+
+ if (shf->redir) {
+ t = getpermtext(shf->redir, NULL, 1);
+ pm.u.str = zhtricat(pm.u.str, "\n}", t);
+ zsfree(t);
+ }
}
}
func(&pm.node, flags);
diff --git a/Test/A04redirect.ztst b/Test/A04redirect.ztst
index 6c38a31..a39ce46 100644
--- a/Test/A04redirect.ztst
+++ b/Test/A04redirect.ztst
@@ -507,3 +507,27 @@
>Ich heisse 2func
>Running 3func
>Ich heisse 3func
+
+ redirfn2() { print The latest output; } >&3
+ redirfn2 3>output4
+ print No output yet
+ cat output4
+0:Redirections in both function definition and command line
+>No output yet
+>The latest output
+
+# This relies on the fact that the test harness always loads
+# the zsh/parameter module.
+ print $functions[redirfn]
+0:Output from $functions[] for definition with redirection
+>{
+> local var
+> read var
+> print I want to tell you about $var
+> print Also, this might be an error >&2
+>} < input2 > output2 2>&1
+
+ noredirfn() { print This rather boring function has no redirection.; }
+ print $functions[noredirfn]
+0:Output from $functions[] for definition with no redirection
+> print This rather boring function has no redirection.
pws
prev parent reply other threads:[~2014-09-30 11:53 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-29 19:52 Peter Stephenson
2014-09-29 20:27 ` Peter Stephenson
2014-09-29 20:53 ` Bart Schaefer
2014-09-29 21:37 ` Bart Schaefer
2014-09-30 4:51 ` Mikael Magnusson
2014-10-01 19:17 ` Peter Stephenson
2014-10-02 4:07 ` Bart Schaefer
2014-10-02 8:35 ` Peter Stephenson
2014-10-02 14:55 ` Peter Stephenson
2014-10-02 15:54 ` Bart Schaefer
2014-10-02 15:56 ` Bart Schaefer
2014-10-02 16:03 ` Peter Stephenson
2014-09-30 1:02 ` Bart Schaefer
2014-09-30 8:48 ` Peter Stephenson
2014-09-30 11:52 ` Peter Stephenson [this message]
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=20140930125249.0235af2a@pwslap01u.europe.root.pri \
--to=p.stephenson@samsung.com \
--cc=zsh-workers@zsh.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.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
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 NNTP newsgroup(s).