From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gatech.edu (gatech.edu [130.207.244.244]) by werple.mira.net.au (8.6.12/8.6.9) with SMTP id VAA03890 for ; Mon, 24 Jul 1995 21:19:23 +1000 Received: from math (math.skiles.gatech.edu) by gatech.edu with SMTP id AA09110 (5.65c/Gatech-10.0-IDA for ); Mon, 24 Jul 1995 07:19:48 -0400 Received: by math (5.x/SMI-SVR4) id AA05291; Mon, 24 Jul 1995 07:16:10 -0400 Resent-Date: Mon, 24 Jul 1995 13:14:34 +0100 (MET DST) Old-Return-Path: From: hzoli@cs.elte.hu (Zoltan Hidvegi) Message-Id: <9507241114.AA07460@turan.elte.hu> Subject: Further special parameter changes To: zsh-workers@math.gatech.edu (zsh-workers) Date: Mon, 24 Jul 1995 13:14:34 +0100 (MET DST) X-Mailer: ELM [version 2.4 PL21] Content-Type: text Resent-Message-Id: <"-R3Cb.0.bI1.v3u4m"@math> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/269 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu The patch below further reduces the number of special parameters. It makes TTY, FCEDIT, HOST, MAIL, TIMEFMT, TMPPREFIX, WATCHFMT and signals non-special. If zsh is invoked as sh/ksh, it removes the ARGC, status, prompt, PROMPT2, PROMPT3, PROMPT4 and argv parameters. These parameters are not sh/ksh compatible and all of them has an equivalent compatible pair. Without this patch sh scripts doing something like foo ; status=$? ; if [ $status = ... will fail because $status is a special parameter (I had such a script and this idiom is quite common in sh scripts). The patch depends on my previous patch which removed LOGNAME from the special parameter list (art. 268). Or you can apply it to my release as well which already contains the LOGNAME patch. Bye, Zoltan *** 1.8 1995/07/06 12:28:04 --- Src/globals.h 1995/07/07 23:09:17 *************** *** 91,98 **** EXTERN int userdirsz, userdirct; - EXTERN char *mailfile; - EXTERN char *yytext; /* error/break flag */ --- 91,96 ---- *************** *** 324,339 **** EXTERN char *rprompt; /* $RPROMPT */ EXTERN char *sprompt; - EXTERN char *timefmt; /* $TIMEFMT */ - EXTERN char *watchfmt; /* $WATCHFMT */ EXTERN char *wordchars; - EXTERN char *fceditparam; - EXTERN char *tmpprefix; /* $TMPPREFIX */ EXTERN char *rstring, *Rstring; EXTERN char *postedit; EXTERN char *hostnam; /* from gethostname */ - EXTERN char *hostvar; /* $HOST */ EXTERN char *home; /* $HOME */ EXTERN char **pparams; /* $argv */ --- 322,332 ---- *************** *** 541,552 **** EXTERN int noaliases; #ifdef GLOBALS - /* signal names */ - char **sigptr = sigs; /* tokens */ char *ztokens = "#$^*()$=|{}[]`<>?~`,'\"\\"; #else ! extern char *ztokens, **sigptr; #endif /* $histchars */ --- 534,543 ---- EXTERN int noaliases; #ifdef GLOBALS /* tokens */ char *ztokens = "#$^*()$=|{}[]`<>?~`,'\"\\"; #else ! extern char *ztokens; #endif /* $histchars */ *** 1.4 1995/07/04 14:23:18 --- Src/params.h 1995/07/07 23:09:17 *************** *** 51,57 **** #define IPDEF1(A,B,C,D) {NULL,A,NULL,IFN(C),IFN(B),10,\ PM_INTEGER|PM_SPECIAL|D,NULL,NULL,NULL,NULL,0} IPDEF1("#", poundgetfn, IFN(nullsetfn), PM_READONLY), - IPDEF1("ARGC", poundgetfn, IFN(nullsetfn), PM_READONLY), IPDEF1("ERRNO", errnogetfn, IFN(nullsetfn), PM_READONLY), IPDEF1("GID", gidgetfn, gidsetfn, 0), IPDEF1("EGID", egidgetfn, egidsetfn, 0), --- 51,56 ---- *************** *** 82,88 **** IPDEF4("!", &lastpid), IPDEF4("$", &mypid), IPDEF4("?", &lastval), - IPDEF4("status", &lastval), IPDEF4("LINENO", &lineno), IPDEF4("PPID", &ppid), --- 81,86 ---- *************** *** 106,127 **** #define IPDEF6(A,B) {NULL,A,NULL,IFN(nullsetfn),IFN(strvargetfn),0,\ PM_SCALAR|PM_READONLY|PM_SPECIAL,(void *)B,NULL,NULL,NULL,0} IPDEF6("PWD", &pwd), - IPDEF6("TTY", &ttystrname), #define IPDEF7(A,B) {NULL,A,NULL,IFN(strvarsetfn),IFN(strvargetfn),0,\ PM_SCALAR|PM_SPECIAL,(void *)B,NULL,NULL,NULL,0} - IPDEF7("FCEDIT", &fceditparam), - IPDEF7("HOST", &hostvar), IPDEF7("OLDPWD", &oldpwd), IPDEF7("OPTARG", &zoptarg), - IPDEF7("MAIL", &mailfile), IPDEF7("NULLCMD", &nullcmd), IPDEF7("POSTEDIT", &postedit), - IPDEF7("prompt", &prompt), - IPDEF7("PROMPT", &prompt), - IPDEF7("PROMPT2", &prompt2), - IPDEF7("PROMPT3", &prompt3), - IPDEF7("PROMPT4", &prompt4), IPDEF7("READNULLCMD", &readnullcmd), IPDEF7("RPROMPT", &rprompt), IPDEF7("PS1", &prompt), --- 104,116 ---- *************** *** 130,138 **** IPDEF7("PS4", &prompt4), IPDEF7("RPS1", &rprompt), IPDEF7("SPROMPT", &sprompt), - IPDEF7("TIMEFMT", &timefmt), - IPDEF7("TMPPREFIX", &tmpprefix), - IPDEF7("WATCHFMT", &watchfmt), IPDEF7("0", &argzero), #define IPDEF8(A,B,C) {NULL,A,NULL,IFN(colonarrsetfn),IFN(colonarrgetfn),0,\ --- 119,124 ---- *************** *** 157,169 **** IPDEF9("manpath", 0, &manpath, "MANPATH"), IPDEF9("watch", 0, &watch, "WATCH"), IPDEF9("psvar", 0, &psvar, "PSVAR"), - IPDEF9("signals", PM_READONLY, &sigptr, NULL), - IPDEF9("argv", 0, &pparams, NULL), IPDEF9("*", 0, &pparams, NULL), IPDEF9("@", 0, &pparams, NULL), {NULL, "path", NULL, IFN(pathsetfn), IFN(pathgetfn), 0, PM_ARRAY | PM_SPECIAL | PM_UNIQUE, NULL, NULL, "PATH", NULL, 0}, {NULL,} }; --- 143,166 ---- IPDEF9("manpath", 0, &manpath, "MANPATH"), IPDEF9("watch", 0, &watch, "WATCH"), IPDEF9("psvar", 0, &psvar, "PSVAR"), IPDEF9("*", 0, &pparams, NULL), IPDEF9("@", 0, &pparams, NULL), {NULL, "path", NULL, IFN(pathsetfn), IFN(pathgetfn), 0, PM_ARRAY | PM_SPECIAL | PM_UNIQUE, NULL, NULL, "PATH", NULL, 0}, + + {NULL,}, + + /* The following parameters are not avaible in sh/ksh compatibility * + * mode. All of these has sh compatible equivalents. */ + IPDEF1("ARGC", poundgetfn, IFN(nullsetfn), PM_READONLY), + IPDEF4("status", &lastval), + IPDEF7("prompt", &prompt), + IPDEF7("PROMPT", &prompt), + IPDEF7("PROMPT2", &prompt2), + IPDEF7("PROMPT3", &prompt3), + IPDEF7("PROMPT4", &prompt4), + IPDEF9("argv", 0, &pparams, NULL), {NULL,} }; *** 1.12 1995/07/04 18:21:23 --- Src/params.c 1995/07/23 00:43:13 *************** *** 44,50 **** { struct iparam *ip; Param pm; ! char **old_environ, **envp, **envp2; char buf[50], *str, *iname; int num_env; --- 44,50 ---- { struct iparam *ip; Param pm; ! char **old_environ, **envp, **envp2, **sigptr, **t; char buf[50], *str, *iname; int num_env; *************** *** 63,72 **** /* Add the special parameter to the hash table */ for (ip = special_param; ip->nam; ip++) paramtab->addnode(paramtab, ztrdup(ip->nam), ip); ! ! argvparam = (Param) paramtab->getnode(paramtab, "argv"); ! setsparam("LOGNAME", ztrdup((str = getlogin()) && *str ? str : cached_username)); noerrs = 1; /* Copy the environment variables we are inheriting to dynamic * --- 63,83 ---- /* Add the special parameter to the hash table */ for (ip = special_param; ip->nam; ip++) paramtab->addnode(paramtab, ztrdup(ip->nam), ip); ! if (strcmp(zsh_name, "sh") && strcmp(zsh_name, "ksh")) ! while ((++ip)->nam) ! paramtab->addnode(paramtab, ztrdup(ip->nam), ip); ! ! argvparam = (Param) paramtab->getnode(paramtab, "*"); ! ! /* Add standard non-special parameters which have to be * ! * initialized before we copy the environment variables since * ! * zsh mustn't override their values in the environment. */ setsparam("LOGNAME", ztrdup((str = getlogin()) && *str ? str : cached_username)); + setsparam("FCEDIT", ztrdup(DEFAULT_FCEDIT)); + setsparam("HOST", ztrdup(hostnam)); + setsparam("TIMEFMT", ztrdup(DEFAULT_TIMEFMT)); + setsparam("WATCHFMT", ztrdup(DEFAULT_WATCHFMT)); + setsparam("TMPPREFIX", ztrdup(DEFAULT_TMPPREFIX)); noerrs = 1; /* Copy the environment variables we are inheriting to dynamic * *************** *** 123,131 **** --- 134,145 ---- setsparam("HOSTTYPE", ztrdup(HOSTTYPE)); setsparam("MACHTYPE", ztrdup(MACHTYPE)); setsparam("OSTYPE", ztrdup(OSTYPE)); + setsparam("TTY", ztrdup(ttystrname)); setsparam("VENDOR", ztrdup(VENDOR)); setsparam("ZSH_NAME", ztrdup(zsh_name)); setsparam("ZSH_VERSION", ztrdup(ZSH_VERSION)); + setaparam("signals", sigptr = zalloc((SIGCOUNT+4) * sizeof(char *))); + for (t = sigs; (*sigptr++ = ztrdup(*t++)); ); noerrs = 0; } *** 1.10 1995/07/07 18:32:30 --- Src/init.c 1995/07/23 00:18:56 *************** *** 513,523 **** if (!(ttystrname = ztrdup(ttyname(SHTTY)))) ttystrname = ztrdup(""); ifs = ztrdup(" \t\n"); - timefmt = ztrdup(DEFAULT_TIMEFMT); - watchfmt = ztrdup(DEFAULT_WATCHFMT); wordchars = ztrdup(DEFAULT_WORDCHARS); - fceditparam = ztrdup(DEFAULT_FCEDIT); - tmpprefix = ztrdup(DEFAULT_TMPPREFIX); postedit = ztrdup(""); underscore = ztrdup(""); --- 513,519 ---- *************** *** 533,539 **** hostnam = (char *) zalloc(256); gethostname(hostnam, 256); - hostvar = ztrdup(hostnam); compctlsetup(); namdirs = (Nameddirs) zcalloc(sizeof(*namdirs) * 2); --- 529,534 ---- *** 1.1 1995/06/23 07:48:00 --- Src/watch.c 1995/07/23 00:26:00 *************** *** 377,388 **** dowatch(void) { char **s = watch; ! char *fmt = (watchfmt) ? watchfmt : DEFAULT_WATCHFMT; FILE *in; int utabsz = 0, utabmax = wtabsz + 4, uct, wct; STRUCT_UTMP *utab, *uptr, *wptr; struct stat st; holdintr(); if (!fmt) fmt = "%n has %a %l from %m."; --- 377,390 ---- dowatch(void) { char **s = watch; ! char *fmt = getsparam("WATCHFMT"); FILE *in; int utabsz = 0, utabmax = wtabsz + 4, uct, wct; STRUCT_UTMP *utab, *uptr, *wptr; struct stat st; + if (!fmt) + fmt = DEFAULT_WATCHFMT; holdintr(); if (!fmt) fmt = "%n has %a %l from %m."; *** 1.1 1995/06/18 06:44:03 --- Src/jobs.c 1995/07/23 00:22:45 *************** *** 696,702 **** if (percent > 100) percent = 100; /* just to make it look right */ ! for (s = (timefmt ? timefmt : DEFAULT_TIMEFMT); *s; s++) if (*s == '%') switch (*++s) { case 'E': --- 696,704 ---- if (percent > 100) percent = 100; /* just to make it look right */ ! if (!(s = getsparam("TIMEFMT"))) ! s = DEFAULT_TIMEFMT; ! for (; *s; s++) if (*s == '%') switch (*++s) { case 'E': *** 1.25 1995/07/17 20:57:39 --- Src/builtin.c 1995/07/23 00:31:06 *************** *** 2703,2715 **** ((out = fdopen(tempfd, "w")) == NULL)) { zwarnnam("fc", "can't open temp file: %e", NULL, errno); } else { ! if (!fclist(out, 0, ops['r'], 0, 0, first, last, asgf, com)) ! if (fcedit(auxdata ? auxdata : ! (fceditparam ? fceditparam : DEFAULT_FCEDIT), fil)) if (stuff(fil)) zwarnnam("fc", "%e: %s", s, errno); else retval = 0; } unlink(fil); } --- 2703,2717 ---- ((out = fdopen(tempfd, "w")) == NULL)) { zwarnnam("fc", "can't open temp file: %e", NULL, errno); } else { ! if (!fclist(out, 0, ops['r'], 0, 0, first, last, asgf, com)) { ! char *editor = auxdata ? auxdata : getsparam("FCEDIT"); ! ! if (fcedit(editor ? editor : DEFAULT_FCEDIT, fil)) if (stuff(fil)) zwarnnam("fc", "%e: %s", s, errno); else retval = 0; + } } unlink(fil); } *** 1.12 1995/07/14 14:24:06 --- Src/exec.c 1995/07/23 00:27:07 *************** *** 2055,2060 **** --- 2055,2062 ---- char * gettemp(void) { + char *tmpprefix = getsparam("TMPPREFIX"); + return ((char *) mktemp(dyncat((tmpprefix ? tmpprefix : DEFAULT_TMPPREFIX), "XXXXXX"))); } *** 1.13 1995/07/14 14:18:35 --- Src/utils.c 1995/07/23 00:03:39 *************** *** 589,597 **** return; diff = (int)difftime(time(NULL), lastmailcheck); if (diff > mailcheck) { if (mailpath && *mailpath && **mailpath) checkmailpath(mailpath); ! else if (mailfile && *mailfile) { char *x[2]; x[0] = mailfile; --- 589,599 ---- return; diff = (int)difftime(time(NULL), lastmailcheck); if (diff > mailcheck) { + char *mailfile; + if (mailpath && *mailpath && **mailpath) checkmailpath(mailpath); ! else if ((mailfile = getsparam("MAIL")) && *mailfile) { char *x[2]; x[0] = mailfile; *** 1.8 1995/07/11 15:09:08 --- Doc/zshparam.1 1995/07/22 23:58:07 *************** *** 127,133 **** The number of positional parameters in decimal. .TP .B ARGC ! Same as \fB#\fP. .TP .B $ The process id of this shell. --- 127,133 ---- The number of positional parameters in decimal. .TP .B ARGC ! Same as \fB#\fP. It has no special meaning in sh/ksh compatibility mode. .TP .B $ The process id of this shell. *************** *** 140,155 **** An array containing the positional parameters. .TP .B argv ! Same as \fB*\fP. .TP .B @ ! Same as \fBargv[@]\fP. .TP .B ? The exit value returned by the last command. .TP .B status ! Same as \fB?\fP. .TP .B _ The last argument of the previous command. --- 140,155 ---- An array containing the positional parameters. .TP .B argv ! Same as \fB*\fP. It has no special meaning in sh/ksh compatibility mode. .TP .B @ ! Same as \fBargv[@]\fP but it can be used in sh/ksh compatibility mode. .TP .B ? The exit value returned by the last command. .TP .B status ! Same as \fB?\fP. It has no special meaning in sh/ksh compatibility mode. .TP .B _ The last argument of the previous command. *************** *** 393,400 **** .TP .B MAIL If this parameter is set and \fBmailpath\fP is not set, ! the shell looks for mail in the specified file. By default it is set to ! the user's system mailbox. .TP .B MAILCHECK The interval in seconds between checks for new mail. --- 393,399 ---- .TP .B MAIL If this parameter is set and \fBmailpath\fP is not set, ! the shell looks for mail in the specified file. .TP .B MAILCHECK The interval in seconds between checks for new mail. *************** *** 432,438 **** This string is output whenever the line editor exits. It usually contains termcap strings to reset the terminal. .TP ! .B PROMPT The primary prompt string, printed before a command is read; the default is "%m%# ". If the escape sequence takes an optional integer, it should appear between the '%' and the next character of the --- 431,437 ---- This string is output whenever the line editor exits. It usually contains termcap strings to reset the terminal. .TP ! .B PS1 The primary prompt string, printed before a command is read; the default is "%m%# ". If the escape sequence takes an optional integer, it should appear between the '%' and the next character of the *************** *** 621,649 **** .PP .PD 0 .TP ! .B PROMPT2 The secondary prompt, printed when the shell needs more information to complete a command. ! Recognizes the same escape sequences as \fB$PROMPT\fP. The default is "> ". .TP ! .B PROMPT3 Selection prompt used within a \fBselect\fP loop. ! Recognizes the same escape sequences as \fB$PROMPT\fP. The default is "?# ". .TP ! .B PROMPT4 The execution trace prompt. Default is "+ ". .TP ! .B PS1 .TP ! .B PS2 .TP ! .B PS3 .TP ! .B PS4 ! Same as \fBPROMPT\fP, \fBPROMPT2\fP, \fBPROMPT3\fP, and \fBPROMPT4\fP, ! respectively. .TP .B psvar (PSVAR) An array (colon-separated list) whose first nine values can be used in --- 620,649 ---- .PP .PD 0 .TP ! .B PS2 The secondary prompt, printed when the shell needs more information to complete a command. ! Recognizes the same escape sequences as \fB$PS1\fP. The default is "> ". .TP ! .B PS3 Selection prompt used within a \fBselect\fP loop. ! Recognizes the same escape sequences as \fB$PS1\fP. The default is "?# ". .TP ! .B PS4 The execution trace prompt. Default is "+ ". .TP ! .B PROMPT .TP ! .B PROMPT2 .TP ! .B PROMPT3 .TP ! .B PROMPT4 ! Same as \fBPS1\fP, \fBPS2\fP, \fBPS3\fP, and \fBPS4\fP, ! respectively. These parameters do not have any special ! meaning in sh/ksh compatibility mode. .TP .B psvar (PSVAR) An array (colon-separated list) whose first nine values can be used in *************** *** 651,657 **** vice versa. .TP .B prompt ! Same as \fBPROMPT\fP. .TP .B READNULLCMD The command name to assume if a single input redirection --- 651,657 ---- vice versa. .TP .B prompt ! Same as \fBPS1\fP. It has no special meaning in sh/ksh compatibility mode. .TP .B READNULLCMD The command name to assume if a single input redirection