From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eplet.mira.net.au (eplet.mira.net.au [203.9.190.17]) by melb.werple.net.au (8.7.5/8.7.3/2) with ESMTP id GAA11997 for ; Wed, 17 Jul 1996 06:02:23 +1000 (EST) Received: from euclid.skiles.gatech.edu (list@euclid.skiles.gatech.edu [130.207.146.50]) by eplet.mira.net.au (8.7.5/8.7.3) with ESMTP id FAA09755 for ; Wed, 17 Jul 1996 05:59:57 +1000 (EST) Received: (from list@localhost) by euclid.skiles.gatech.edu (8.7.3/8.7.3) id PAA06535; Tue, 16 Jul 1996 15:44:08 -0400 (EDT) Resent-Date: Tue, 16 Jul 1996 15:44:08 -0400 (EDT) From: Zefram Message-Id: <28053.199607161943@stone.dcs.warwick.ac.uk> Subject: Bugfix in $0 saving To: zsh-workers@math.gatech.edu (Z Shell workers mailing list) Date: Tue, 16 Jul 1996 20:43:08 +0100 (BST) X-Patch: 109 X-Loop: zefram@dcs.warwick.ac.uk X-Stardate: [-31]7819.10 X-US-Congress: Moronic fuckers MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Resent-Message-ID: <"cGit_1.0.1c1.84_wn"@euclid> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/1669 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu -----BEGIN PGP SIGNED MESSAGE----- There is a problem with the conditional saving of $0 around functions and sourcing, which was introduced a few betas ago. Try the following: emulate zsh ek () { emulate ksh } ek echo $0 There's a problem going in the other direction too. The cause of this behaviour is that emulation is checked before and after the function is executed, without regard for the fact that it might have changed in the meantime. There is also, in my opinion, a philosophical bug in the code. It checks the emulation mode directly, but (a) it's not currently possible to directly query the current setting, and (b) more importantly, aspects of behaviour such as this should be settable independently -- ksh/sh/POSIX etc. emulation should not be an all-or-nothing choice. Before the "emulation" variable was added, compatibility behaviour was always added by the use of separate options, and I think that was a Good Thing. (Maybe those EMULATE_*SH constants make it too easy, eh?) The patch below fixes both of these problems. It adds an option, FUNCTION_ARGZERO, which is set by default unless we are emulating ksh or sh, and $0 is changed depending on this option. Then $0 is restored iff it was changed. I made this patch using my working copy of zsh that has my option patch from article 1275 applied. If you're not using that patch, then the context for a couple of the hunks will be wrong, so you'll need to apply them by hand. You'll also need to use "OPT_CSH|OPT_ZSH" instead of "OPT_NONBOURNE" in the globals.h hunk. On a completely different issue, why aren't the info files included in the distribution any more? Not everyone has makeinfo. -zefram Index: Doc/zshoptions.man =================================================================== RCS file: /home/zefram/usr/cvsroot/zsh/Doc/zshoptions.man,v retrieving revision 1.10 diff -c -r1.10 zshoptions.man *** zshoptions.man 1996/07/16 14:26:42 1.10 --- zshoptions.man 1996/07/16 16:06:04 *************** *** 194,199 **** --- 194,203 ---- output flow control via start/stop characters (usually assigned to ^S/^Q) is disabled in the shell's editor. .TP + \fBFUNCTION_ARGZERO\fP + When executing a shell function or sourcing a script, set $0 + temporarily to the name of the function/script. + .TP \fBGLOB\fP (+\fBF\fP, ksh: +\fBf\fP) Perform filename generation. .TP Index: Src/builtin.c =================================================================== RCS file: /home/zefram/usr/cvsroot/zsh/Src/builtin.c,v retrieving revision 1.22 diff -c -r1.22 builtin.c *** builtin.c 1996/07/16 14:26:48 1.22 --- builtin.c 1996/07/16 15:50:19 *************** *** 4599,4605 **** int bin_dot(char *name, char **argv, char *ops, int func) { ! char **old, *old0; int ret, diddot = 0, dotdot = 0; char buf[PATH_MAX]; char *s, **t, *enam, *arg0; --- 4599,4605 ---- int bin_dot(char *name, char **argv, char *ops, int func) { ! char **old, *old0 = NULL; int ret, diddot = 0, dotdot = 0; char buf[PATH_MAX]; char *s, **t, *enam, *arg0; *************** *** 4608,4614 **** if (!*argv) return 0; old = pparams; - old0 = argzero; /* get arguments for the script */ if (argv[1]) { PERMALLOC { --- 4608,4613 ---- *************** *** 4616,4623 **** } LASTALLOC; } enam = arg0 = ztrdup(*argv); ! if (emulation != EMULATE_KSH && emulation != EMULATE_SH) argzero = arg0; s = unmeta(enam); errno = ENOENT; ret = 1; --- 4615,4624 ---- } LASTALLOC; } enam = arg0 = ztrdup(*argv); ! if (isset(FUNCTIONARGZERO)) { ! old0 = argzero; argzero = arg0; + } s = unmeta(enam); errno = ENOENT; ret = 1; *************** *** 4667,4673 **** if (ret) zwarnnam(name, "%e: %s", enam, errno); zsfree(arg0); ! if (emulation != EMULATE_KSH && emulation != EMULATE_SH) argzero = old0; return ret ? ret : lastval; } --- 4668,4674 ---- if (ret) zwarnnam(name, "%e: %s", enam, errno); zsfree(arg0); ! if (old0) argzero = old0; return ret ? ret : lastval; } Index: Src/exec.c =================================================================== RCS file: /home/zefram/usr/cvsroot/zsh/Src/exec.c,v retrieving revision 1.22 diff -c -r1.22 exec.c *** exec.c 1996/07/16 14:40:42 1.22 --- exec.c 1996/07/16 15:50:26 *************** *** 2416,2422 **** * was executed. */ { Param pm; ! char **tab, **x, *oargv0; int xexittr, oldzoptind, oldlastval; LinkList olist; char *s, *ou; --- 2416,2422 ---- * was executed. */ { Param pm; ! char **tab, **x, *oargv0 = NULL; int xexittr, oldzoptind, oldlastval; LinkList olist; char *s, *ou; *************** *** 2431,2437 **** sigtrapped[SIGEXIT] = 0; sigfuncs[SIGEXIT] = NULL; tab = pparams; - oargv0 = argzero; oldzoptind = zoptind; zoptind = 1; --- 2431,2436 ---- *************** *** 2448,2462 **** node = doshargs->first; pparams = x = (char **) zcalloc(((sizeof *x) * (1 + countlinknodes(doshargs)))); ! if (emulation != EMULATE_KSH && emulation != EMULATE_SH) argzero = ztrdup((char *) node->dat); node = node->next; for (; node; node = node->next, x++) *x = ztrdup((char *) node->dat); } else { pparams = (char **) zcalloc(sizeof *pparams); ! if (emulation != EMULATE_KSH && emulation != EMULATE_SH) argzero = ztrdup(argzero); } PERMALLOC { olist = locallist; /* save the old locallist since shell functions may be nested */ --- 2447,2465 ---- node = doshargs->first; pparams = x = (char **) zcalloc(((sizeof *x) * (1 + countlinknodes(doshargs)))); ! if (isset(FUNCTIONARGZERO)) { ! oargv0 = argzero; argzero = ztrdup((char *) node->dat); + } node = node->next; for (; node; node = node->next, x++) *x = ztrdup((char *) node->dat); } else { pparams = (char **) zcalloc(sizeof *pparams); ! if (isset(FUNCTIONARGZERO)) { ! oargv0 = argzero; argzero = ztrdup(argzero); + } } PERMALLOC { olist = locallist; /* save the old locallist since shell functions may be nested */ *************** *** 2481,2487 **** locallist = olist; /* restore the old list of local variables */ breaks = retflag = 0; freearray(pparams); ! if (emulation != EMULATE_KSH && emulation != EMULATE_SH) { zsfree(argzero); argzero = oargv0; } --- 2484,2490 ---- locallist = olist; /* restore the old list of local variables */ breaks = retflag = 0; freearray(pparams); ! if (oargv0) { zsfree(argzero); argzero = oargv0; } Index: Src/globals.h =================================================================== RCS file: /home/zefram/usr/cvsroot/zsh/Src/globals.h,v retrieving revision 1.10 diff -c -r1.10 globals.h *** globals.h 1996/07/16 14:26:52 1.10 --- globals.h 1996/07/16 15:52:45 *************** *** 697,702 **** --- 697,703 ---- {"extendedglob", 0, 0, 0}, {"extendedhistory", 0, 0, OPT_EMULATE|OPT_CSH}, {"flowcontrol", 0, 0, OPT_ALL}, + {"functionargzero", 0, 0, OPT_EMULATE|OPT_NONBOURNE}, {"glob", x'F', x'f', OPT_ALL}, {"globassign", 0, 0, OPT_EMULATE|OPT_CSH}, {"globcomplete", 0, 0, 0}, Index: Src/zsh.h =================================================================== RCS file: /home/zefram/usr/cvsroot/zsh/Src/zsh.h,v retrieving revision 1.13 diff -c -r1.13 zsh.h *** zsh.h 1996/07/16 14:27:08 1.13 --- zsh.h 1996/07/16 15:50:01 *************** *** 1079,1084 **** --- 1079,1085 ---- EXTENDEDGLOB, EXTENDEDHISTORY, FLOWCONTROL, + FUNCTIONARGZERO, GLOBOPT, GLOBASSIGN, GLOBCOMPLETE, -----BEGIN PGP SIGNATURE----- Version: 2.6.2 iQCVAwUBMevEbXD/+HJTpU/hAQGGagQAheGD479f2GWHgBQpwCZAWwJAJrOj2dmK +oUNCU9F6JBhw1wi2uWpaYRKf8u4R6Hxfs4c2IcoQFAC4QA9uJH8E4v8zVCVTtPk VgMp4Pf03Uy2UQP4CATj2bdhrBten0gK/yIplTVIBYD3DO3RzgN0WantZv881ZZt 71WefyfvnVk= =W3Jz -----END PGP SIGNATURE-----