Fix two rc fn-saving bugs mentioned on 9fans. Also, please rm /sys/src/cmd/rc/fmtquote.c update /sys/src/cmd/rc/fmtquote.c Thanks. Reference: /n/sources/patch/applied/rcfn Date: Wed Jul 2 01:06:00 CES 2008 Signed-off-by: rsc@swtch.com --- /sys/src/cmd/rc/exec.c Wed Jul 2 01:05:36 2008 +++ /sys/src/cmd/rc/exec.c Wed Jul 2 02:10:03 2008 @@ -751,9 +751,11 @@ } deglob(runq->argv->words->word); runq->local = newvar(strdup(runq->argv->words->word), runq->local); - runq->local->val = copywords(runq->argv->next->words, (word *)0); - runq->local->changed = 1; poplist(); + globlist(); + runq->local->val = runq->argv->words; + runq->local->changed = 1; + runq->argv->words = 0; poplist(); } @@ -790,6 +792,7 @@ word *a; int end; end = runq->code[runq->pc].i; + globlist(); for(a = runq->argv->words;a;a = a->next){ v = gvlook(a->word); if(v->fn) --- /sys/src/cmd/rc/io.c Wed Jul 2 01:05:37 2008 +++ /sys/src/cmd/rc/io.c Wed Jul 2 01:05:37 2008 @@ -91,7 +91,7 @@ pwrd(io *f, char *s) { char *t; - for(t = s;*t;t++) if(!wordchr(*t)) break; + for(t = s;*t;t++) if(*t >= 0 && needsrcquote(*t)) break; if(t==s || *t) pquo(f, s); else pstr(f, s); --- /sys/src/cmd/rc/plan9.c Wed Jul 2 01:05:39 2008 +++ /sys/src/cmd/rc/plan9.c Wed Jul 2 01:05:38 2008 @@ -275,7 +275,7 @@ else{ if(v->fn){ fd = openfd(f); - pfmt(fd, "fn %s %s\n", v->name, v->fn[v->pc-1].s); + pfmt(fd, "fn %q %s\n", v->name, v->fn[v->pc-1].s); closeio(fd); } close(f); --- /sys/src/cmd/rc/simple.c Wed Jul 2 01:05:40 2008 +++ /sys/src/cmd/rc/simple.c Wed Jul 2 01:05:39 2008 @@ -466,7 +466,7 @@ found = 0; v = gvlook(a->word); if(v->fn) - pfmt(out, "fn %s %s\n", v->name, v->fn[v->pc-1].s); + pfmt(out, "fn %q %s\n", v->name, v->fn[v->pc-1].s); else{ for(bp = Builtin;bp->name;bp++) if(strcmp(a->word, bp->name)==0){ --- /sys/src/cmd/rc/win32.c Wed Jul 2 01:05:41 2008 +++ /sys/src/cmd/rc/win32.c Wed Jul 2 01:05:41 2008 @@ -211,7 +211,7 @@ else{ if(v->fn){ fd = openfd(f); - pfmt(fd, "fn %s %s\n", v->name, v->fn[v->pc-1].s); + pfmt(fd, "fn %q %s\n", v->name, v->fn[v->pc-1].s); closeio(fd); } close(f);