[comp.sources.misc] v19i068: zsh2.00 - The Z shell, Patch02b/6

pfalstad@phoenix.princeton.edu (Paul Falstad) (05/16/91)

Submitted-by: Paul Falstad <pfalstad@phoenix.princeton.edu>
Posting-number: Volume 19, Issue 68
Archive-name: zsh2.00/patch02b
Patch-To: zsh2.00: Volume 18, Issue 84-98

#!/bin/sh
# this is zpatch.02 (part 2 of a multipart archive)
# do not concatenate these parts, unpack them in order with /bin/sh
# file patches continued
#
if test ! -r _shar_seq_.tmp; then
	echo 'Please unpack part 1 first!'
	exit 1
fi
(read Scheck
 if test "$Scheck" != 2; then
	echo Please unpack part "$Scheck" next!
	exit 1
 else
	exit 0
 fi
) < _shar_seq_.tmp || exit 1
echo 'x - continuing file patches'
sed 's/^X//' << 'SHAR_EOF' >> 'patches' &&
X  			else if (on & PMFLAG_u)
X  				{
! 				cc = (Cmdnam) zcalloc(sizeof *cc);
X  				cc->type = SHFUNC;
X  				cc->flags = on;
X  				addhnode(ztrdup(*argv),cc,cmdnamtab,freecmdnam);
***************
*** 1649,1655 ****
X  		}
X  	else while (asg = getasg(*argv++))
X  		{
! 		pm = gethnode(asg->name,paramtab);
X  		if (pm)
X  			{
X  			if (!on && !roff && !asg->value)
--- 1684,1690 ----
X  		}
X  	else while (asg = getasg(*argv++))
X  		{
! 		pm = (Param) gethnode(asg->name,paramtab);
X  		if (pm)
X  			{
X  			if (!on && !roff && !asg->value)
***************
*** 1685,1691 ****
X  				}
X  			createparam(ztrdup(asg->name),
X  				ztrdup((asg->value) ? asg->value : ""),on);
! 			pm = gethnode(asg->name,paramtab);
X  			pm->ct = auxlen;
X  			}
X  		}
--- 1720,1726 ----
X  				}
X  			createparam(ztrdup(asg->name),
X  				ztrdup((asg->value) ? asg->value : ""),on);
! 			pm = (Param) gethnode(asg->name,paramtab);
X  			pm->ct = auxlen;
X  			}
X  		}
***************
*** 1705,1710 ****
--- 1740,1746 ----
X  				{
X  				case 'b': putchar('\b'); break;
X  				case 'c': nnl = 1; break;
+ 				case 'e': putchar('\033'); break;
X  				case 'f': putchar('\f'); break;
X  				case 'n': putchar('\n'); break;
X  				case 'r': putchar('\r'); break;
***************
*** 1799,1805 ****
X  char *name;char **argv;char *ops;int func;
X  {
X  int ret = 0;
! void *dat;
X  
X  	while (*argv)
X  		{
--- 1835,1841 ----
X  char *name;char **argv;char *ops;int func;
X  {
X  int ret = 0;
! vptr dat;
X  
X  	while (*argv)
X  		{
***************
*** 1817,1823 ****
X  char *name;char **argv;char *ops;int func;
X  {
X  int retval = 0;
! void *dat;
X  
X  	while (*argv)
X  		{
--- 1853,1859 ----
X  char *name;char **argv;char *ops;int func;
X  {
X  int retval = 0;
! vptr dat;
X  
X  	while (*argv)
X  		{
***************
*** 1864,1871 ****
X  char *reply,*pmpt;
X  int bsiz,c,gotnl = 0;
X  char *buf,*bptr;
- char cc;
X  
X  	if (*args)
X  		reply = *args++;
X  	else
--- 1900,1907 ----
X  char *reply,*pmpt;
X  int bsiz,c,gotnl = 0;
X  char *buf,*bptr;
X  
+ 	attachtty(mypgrp);
X  	if (*args)
X  		reply = *args++;
X  	else
***************
*** 1974,1980 ****
X  struct bincmd *b;
X  char ops[128],*arg,*pp,*name,**argv,**oargv;
X  int t0,flags,sense,argc = 0,retval,op;
- void *data;
X  Lknode n;
X  
X  	auxdata = NULL;
--- 2010,2015 ----
***************
*** 2006,2015 ****
X  	arg = ugetnode(args);
X  	if (b->optstr)
X  		while (arg &&
! 				((sense = *arg == '-') ||  fset(BINF_PLUSOPTS) && *arg == '+') &&
! 				!atoi(arg))
X  			{
X  			pp = arg;
X  			if (!arg[1])
X  				{
X  				ops['-'] = 1;
--- 2041,2052 ----
X  	arg = ugetnode(args);
X  	if (b->optstr)
X  		while (arg &&
! 				((sense = *arg == '-') || fset(BINF_PLUSOPTS) && *arg == '+') &&
! 				(fset(BINF_PLUSOPTS) || !atoi(arg)))
X  			{
X  			pp = arg;
+ 			if (arg[1] == '-')
+ 				arg++;
X  			if (!arg[1])
X  				{
X  				ops['-'] = 1;
***************
*** 2020,2026 ****
X  				ops['@'] = 1;
X  			while (*++arg)
X  				if (strchr(b->optstr,op = *arg))
! 					ops[*arg] = (sense) ? 1 : -1;
X  				else
X  					break;
X  			if (*arg)
--- 2057,2063 ----
X  				ops['@'] = 1;
X  			while (*++arg)
X  				if (strchr(b->optstr,op = *arg))
! 					ops[*arg] = (sense) ? 1 : 2;
X  				else
X  					break;
X  			if (*arg)
***************
*** 2080,2086 ****
X  	if (*argv++ = arg)
X  		while (*argv++ = ugetnode(args));
X  	argv = oargv;
- 	data = argv;
X  	if (errflag)
X  		return 1;
X  	if (argc < b->minargs || (argc > b->maxargs && b->maxargs != -1))
--- 2117,2122 ----
***************
*** 2090,2096 ****
X  		retval = 1;
X  		}
X  	else
! 		retval = (*(b->handlerfunc))(name,data,ops,b->funcid);
X  	return retval;
X  }
X  
--- 2126,2132 ----
X  		retval = 1;
X  		}
X  	else
! 		retval = (*(b->handlerfunc))(name,argv,ops,b->funcid);
X  	return retval;
X  }
X  
***************
*** 2101,2106 ****
--- 2137,2147 ----
X  
X  	if (!s)
X  		return NULL;
+ 	if (*s == '=')
+ 		{
+ 		zerr("bad assignment",NULL,0);
+ 		return NULL;
+ 		}
X  	asg.name = s;
X  	for (; *s && *s != '='; s++);
X  	if (*s)
***************
*** 2209,2215 ****
X  {
X  struct tms buf;
X  
! 	if (times(&buf))
X  		return 1;
X  	pttime(buf.tms_utime);
X  	putchar(' ');
--- 2250,2256 ----
X  {
X  struct tms buf;
X  
! 	if (times(&buf) == -1)
X  		return 1;
X  	pttime(buf.tms_utime);
X  	putchar(' ');
***************
*** 2242,2248 ****
X  		}
X  	if (optind >= arrlen(args))
X  		return 1;
! 	str = args[optind-1];
X  	if (*str != '+' && *str != '-' || optcind >= strlen(str) ||
X  			!strcmp("--",str))
X  		{
--- 2283,2289 ----
X  		}
X  	if (optind >= arrlen(args))
X  		return 1;
! 	str = args[optind];
X  	if (*str != '+' && *str != '-' || optcind >= strlen(str) ||
X  			!strcmp("--",str))
X  		{
***************
*** 2254,2260 ****
X  	if (!optcind)
X  		optcind = 1;
X  	*opch = str[optcind++];
! 	if (!args[optcind])
X  		{
X  		optind++;
X  		optcind = 0;
--- 2295,2301 ----
X  	if (!optcind)
X  		optcind = 1;
X  	*opch = str[optcind++];
! 	if (!args[optind][optcind])
X  		{
X  		optind++;
X  		optcind = 0;
***************
*** 2276,2282 ****
X  	setsparam(var,ztrdup(opch-(*str == '+')));
X  	if (optstr[1] == ':')
X  		{
! 		if (!args[optind-1])
X  			{
X  			if (quiet)
X  				{
--- 2317,2323 ----
X  	setsparam(var,ztrdup(opch-(*str == '+')));
X  	if (optstr[1] == ':')
X  		{
! 		if (!args[optind])
X  			{
X  			if (quiet)
X  				{
***************
*** 2326,2332 ****
X  					printf("TRAP%s () {}\n",sigs[t0]);
X  				else
X  					{
! 					char *s = gettext((void *) sigfuncs[t0],1);
X  					printf("TRAP%s () {\n\t%s\n}\n",sigs[t0],s);
X  					free(s);
X  					}
--- 2367,2373 ----
X  					printf("TRAP%s () {}\n",sigs[t0]);
X  				else
X  					{
! 					char *s = gettext((vptr) sigfuncs[t0],1);
X  					printf("TRAP%s () {\n\t%s\n}\n",sigs[t0],s);
X  					free(s);
X  					}
*** src/zsh0/zsh2.00/src/cond.c	Tue Apr 23 11:34:17 1991
--- zsh2.00/src/cond.c	Fri May 10 06:25:49 1991
***************
*** 31,37 ****
X  */
X  
X  #include "zsh.h"
- #include "funcs.h"
X  
X  #ifndef F_OK
X  #define F_OK 00
--- 31,36 ----
***************
*** 53,64 ****
X  		}
X  	singsub((char **) &c->left);
X  	untokenize(c->left);
! 	if (c->type != COND_STREQ && c->type != COND_STRNEQ)
! 		if (c->right)
! 			{
! 			singsub((char **) &c->right);
X  			untokenize(c->right);
! 			}
X  	switch (c->type)
X  		{
X  		case COND_STREQ: return matchpat(c->left,c->right);
--- 52,63 ----
X  		}
X  	singsub((char **) &c->left);
X  	untokenize(c->left);
! 	if (c->right)
! 		{
! 		singsub((char **) &c->right);
! 		if (c->type != COND_STREQ && c->type != COND_STRNEQ)
X  			untokenize(c->right);
! 		}
X  	switch (c->type)
X  		{
X  		case COND_STREQ: return matchpat(c->left,c->right);
***************
*** 82,88 ****
X  		case 'w': return(doaccess(c->left,W_OK));
X  		case 'x': return(doaccess(c->left,X_OK));
X  		case 'z': return(!strlen(c->left));
! 		case 'L': return(S_ISLNK(dostat(c->left)));
X  		case 'O': return((st = getstat(c->left)) && st->st_uid == geteuid());
X  		case 'G': return((st = getstat(c->left)) && st->st_gid == getegid());
X  		case 't': return isatty(matheval(c->left));
--- 81,87 ----
X  		case 'w': return(doaccess(c->left,W_OK));
X  		case 'x': return(doaccess(c->left,X_OK));
X  		case 'z': return(!strlen(c->left));
! 		case 'L': return(S_ISLNK(dolstat(c->left)));
X  		case 'O': return((st = getstat(c->left)) && st->st_uid == geteuid());
X  		case 'G': return((st = getstat(c->left)) && st->st_gid == getegid());
X  		case 't': return isatty(matheval(c->left));
***************
*** 126,142 ****
X  	return !access(s,c);
X  }
X  
X  struct stat *getstat(s) /**/
X  char *s;
X  {
- static struct stat st;
- 
X  	if (!strncmp(s,"/dev/fd/",8))
X  		{
X  		if (fstat(atoi(s+8),&st))
X  			return NULL;
X  		}
! 	else if (lstat(s,&st))
X  		return NULL;
X  	return &st;
X  }
--- 125,141 ----
X  	return !access(s,c);
X  }
X  
+ static struct stat st;
+ 
X  struct stat *getstat(s) /**/
X  char *s;
X  {
X  	if (!strncmp(s,"/dev/fd/",8))
X  		{
X  		if (fstat(atoi(s+8),&st))
X  			return NULL;
X  		}
! 	else if (stat(s,&st))
X  		return NULL;
X  	return &st;
X  }
***************
*** 149,154 ****
--- 148,163 ----
X  	if (!(st = getstat(s)))
X  		return 0;
X  	return st->st_mode;
+ }
+ 
+ /* pem@aaii.oz; needed since dostat now uses "stat" */
+ 
+ unsigned short dolstat(s) /**/
+ char *s;
+ {
+ 	if (lstat(s, &st) < 0)
+ 		return 0;
+ 	return st.st_mode;
X  }
X  
X  int optison(s) /**/
*** src/zsh0/zsh2.00/src/cond.pro	Tue Apr 23 00:29:58 1991
--- zsh2.00/src/cond.pro	Tue May  7 22:53:25 1991
***************
*** 2,5 ****
--- 2,6 ----
X  int doaccess DCLPROTO((char *s,int c));
X  struct stat *getstat DCLPROTO((char *s));
X  unsigned short dostat DCLPROTO((char *s));
+ unsigned short dolstat DCLPROTO((char *s));
X  int optison DCLPROTO((char *s));
*** src/zsh0/zsh2.00/src/exec.c	Tue Apr 23 11:53:10 1991
--- zsh2.00/src/exec.c	Fri May 10 06:55:08 1991
***************
*** 31,37 ****
X  */
X  
X  #include "zsh.h"
- #include "funcs.h"
X  #include <sys/errno.h>
X  #include <sys/dir.h>
X  
--- 31,36 ----
***************
*** 78,84 ****
X  void newrunlist(l) /**/
X  List l;
X  {
! 	List a = dupstruct(l); runlist(a);
X  }
X  
X  /* fork and set limits */
--- 77,83 ----
X  void newrunlist(l) /**/
X  List l;
X  {
! 	List a = (List) dupstruct(l); runlist(a);
X  }
X  
X  /* fork and set limits */
***************
*** 167,174 ****
X  						}
X  					else
X  						{
! 						argv[-1] = MYSELF;
! 						execve(MYSELF,argv-1,environ);
X  						}
X  				else
X  					{
--- 166,173 ----
X  						}
X  					else
X  						{
! 						argv[-1] = "sh";
! 						execve("/bin/sh",argv-1,environ);
X  						}
X  				else
X  					{
***************
*** 208,214 ****
X  Cmdnam cn;
X  int tl,ee = 0;
X  
! 	cn = gethnode(peekfirst(args),cmdnamtab);
X  	if (s = zgetenv("STTY"))
X  		zyztem("stty",s);
X  	arg0 = peekfirst(args);
--- 207,213 ----
X  Cmdnam cn;
X  int tl,ee = 0;
X  
! 	cn = (Cmdnam) gethnode(peekfirst(args),cmdnamtab);
X  	if (s = zgetenv("STTY"))
X  		zyztem("stty",s);
X  	arg0 = peekfirst(args);
***************
*** 275,281 ****
X  {
X  char *s,buf[MAXPATHLEN];
X  int tl;
! struct cmdnam *cn = gethnode(arg0,cmdnamtab);
X  char **pp = path;
X  
X  	if (cn && (cn->type == EXCMD_POSTDOT || cn->type == EXCMD_PREDOT))
--- 274,280 ----
X  {
X  char *s,buf[MAXPATHLEN];
X  int tl;
! struct cmdnam *cn = (Cmdnam) gethnode(arg0,cmdnamtab);
X  char **pp = path;
X  
X  	if (cn && (cn->type == EXCMD_POSTDOT || cn->type == EXCMD_PREDOT))
***************
*** 440,446 ****
X  				char *s,*text;
X  
X  				close(pipes[0]);
! 				text = s = gettext((void *) pline->right,0);
X  				addproc(pid,text)->lastfg = 1;
X  				pline->right = NULL;
X  				}
--- 439,445 ----
X  				char *s,*text;
X  
X  				close(pipes[0]);
! 				text = s = gettext((vptr) pline->right,0);
X  				addproc(pid,text)->lastfg = 1;
X  				pline->right = NULL;
X  				}
***************
*** 512,520 ****
X  	for (node = firstnode(l); node; node = next)
X  		{
X  		next = nextnode(node);
! 		if (*(char *) getdata(node))
! 			untokenize(getdata(node));
! 		else
X  			uremnode(l,node);
X  		}
X  }
--- 511,518 ----
X  	for (node = firstnode(l); node; node = next)
X  		{
X  		next = nextnode(node);
! 		untokenize(getdata(node));
! 		if (!*(char *) getdata(node))
X  			uremnode(l,node);
X  		}
X  }
***************
*** 589,595 ****
X  
X  	if (!mfds[fd1])	/* starting a new multio */
X  		{
! 		mfds[fd1] = alloc(sizeof(struct multio));
X  		if (!forked && fd1 != fd2 && fd1 < 10)
X  			save[fd1] = movefd(fd1);
X  		redup(fd2,fd1);
--- 587,593 ----
X  
X  	if (!mfds[fd1])	/* starting a new multio */
X  		{
! 		mfds[fd1] = (struct multio *) alloc(sizeof(struct multio));
X  		if (!forked && fd1 != fd2 && fd1 < 10)
X  			save[fd1] = movefd(fd1);
X  		redup(fd2,fd1);
***************
*** 628,634 ****
X  		{
X  		char **arr,**ptr;
X  
! 		v = ugetnode(l);
X  		singsub(&v->name);
X  		if (errflag)
X  			return;
--- 626,632 ----
X  		{
X  		char **arr,**ptr;
X  
! 		v = (struct varasg *) ugetnode(l);
X  		singsub(&v->name);
X  		if (errflag)
X  			return;
***************
*** 646,652 ****
X  		postfork(vl,1);
X  		if (errflag)
X  			return;
! 		if (v->type == PMFLAG_s)
X  			{
X  			Param pm;
X  			char *val;
--- 644,650 ----
X  		postfork(vl,1);
X  		if (errflag)
X  			return;
! 		if (v->type == PMFLAG_s && (!full(vl) || !nextnode(firstnode(vl))))
X  			{
X  			Param pm;
X  			char *val;
***************
*** 662,671 ****
X  				addenv(v->name,val);
X  			continue;
X  			}
! 		ptr = arr = (char **) zalloc(sizeof(char **)*(countnodes(v->arr)+1));
! 		while (full(v->arr))
X  			{
! 			*ptr = ztrdup(ugetnode(v->arr));
X  			untokenize(*ptr++);
X  			}
X  		*ptr = NULL;
--- 660,669 ----
X  				addenv(v->name,val);
X  			continue;
X  			}
! 		ptr = arr = (char **) zalloc(sizeof(char **)*(countnodes(vl)+1));
! 		while (full(vl))
X  			{
! 			*ptr = ztrdup(ugetnode(vl));
X  			untokenize(*ptr++);
X  			}
X  		*ptr = NULL;
***************
*** 707,713 ****
X  		insnode(args,(Lknode) args,strdup((bkg) ? "bg" : "fg"));
X  		bkg = 0;
X  		}
! 	if (isset(AUTORESUME) && !full(cmd->redir) && full(args) &&
X  			type == SIMPLE && !nextnode(firstnode(args)) &&
X  			findjobnam(peekfirst(args)) != -1)
X  		pushnode(args,strdup("fg"));
--- 705,711 ----
X  		insnode(args,(Lknode) args,strdup((bkg) ? "bg" : "fg"));
X  		bkg = 0;
X  		}
! 	if (isset(AUTORESUME) && !bkg && !full(cmd->redir) && full(args) &&
X  			type == SIMPLE && !nextnode(firstnode(args)) &&
X  			findjobnam(peekfirst(args)) != -1)
X  		pushnode(args,strdup("fg"));
***************
*** 723,729 ****
X  	if (jobbing)	/* get the text associated with this command */
X  		{
X  		char *s;
! 		s = text = gettext((void *) cmd,0);
X  		}
X  	else
X  		text = NULL;
--- 721,727 ----
X  	if (jobbing)	/* get the text associated with this command */
X  		{
X  		char *s;
! 		s = text = gettext((vptr) cmd,0);
X  		}
X  	else
X  		text = NULL;
***************
*** 734,746 ****
X  		return;
X  		}
X  	if (full(args) && !(cmd->flags & CFLAG_COMMAND))
! 		chn = gethnode(peekfirst(args),cmdnamtab);
X  	if (!pathsuppress && !chn && isset(AUTOCD) && full(args) &&
X  			!full(cmd->redir) &&
X  			!nextnode(firstnode(args)) && cancd(peekfirst(args)))
X  		{
X  		pushnode(args,strdup("cd"));
! 		chn = gethnode("cd",cmdnamtab);
X  		}
X  
X  	/* this is nonzero if cmd is a current shell procedure */
--- 732,744 ----
X  		return;
X  		}
X  	if (full(args) && !(cmd->flags & CFLAG_COMMAND))
! 		chn = (Cmdnam) gethnode(peekfirst(args),cmdnamtab);
X  	if (!pathsuppress && !chn && isset(AUTOCD) && full(args) &&
X  			!full(cmd->redir) &&
X  			!nextnode(firstnode(args)) && cancd(peekfirst(args)))
X  		{
X  		pushnode(args,strdup("cd"));
! 		chn = (Cmdnam) gethnode("cd",cmdnamtab);
X  		}
X  
X  	/* this is nonzero if cmd is a current shell procedure */
***************
*** 757,767 ****
--- 755,774 ----
X  	if (bkg || !(iscursh || (cmd->flags & CFLAG_EXEC)) ||
X  			(chn && (chn->type == BUILTIN || chn->type == SHFUNC) && output))
X  		{
+ 		int synch[2];
+ 
+ 		pipe(synch);
X  		pid = (last1 && execok()) ? 0 : phork();
X  		if (pid == -1)
+ 			{
+ 			close(synch[0]);
+ 			close(synch[1]);
X  			return;
+ 			}
X  		if (pid)
X  			{
+ 			close(synch[1]);
+ 			read(synch[0],"foo",1);
X  			if (pid == -1)
X  				zerr("%e",NULL,errno);
X  			else
***************
*** 768,774 ****
--- 775,783 ----
X  				( void ) addproc(pid,text);
X  			return;
X  			}
+ 		close(synch[0]);
X  		entersubsh(bkg);
+ 		close(synch[1]);
X  		forked = 1;
X  		}
X  	if (bkg && isset(BGNICE))	/* stupid */
***************
*** 779,785 ****
X  		addfd(forked,save,mfds,1,output,1);
X  	spawnpipes(cmd->redir);		/* do process substitutions */
X  	while (full(cmd->redir))
! 		if ((fn = ugetnode(cmd->redir))->type == INPIPE)
X  			{
X  			if (fn->fd2 == -1)
X  				execerr();
--- 788,794 ----
X  		addfd(forked,save,mfds,1,output,1);
X  	spawnpipes(cmd->redir);		/* do process substitutions */
X  	while (full(cmd->redir))
! 		if ((fn = (struct redir*) ugetnode(cmd->redir))->type == INPIPE)
X  			{
X  			if (fn->fd2 == -1)
X  				execerr();
***************
*** 821,831 ****
X  				}
X  			else if (fn->type == CLOSE)
X  				{
! 				if (!forked && fn->fd1 < 3)
! 					{
! 					zerr("can't close fd %d without forking",NULL,fn->fd1);
! 					execerr();
! 					}
X  				closemn(mfds,fn->fd1);
X  				close(fn->fd1);
X  				}
--- 830,837 ----
X  				}
X  			else if (fn->type == CLOSE)
X  				{
! 				if (!forked && fn->fd1 < 10)
! 					save[fn->fd1] = movefd(fn->fd1);
X  				closemn(mfds,fn->fd1);
X  				close(fn->fd1);
X  				}
***************
*** 989,996 ****
X  
X  /* convert here document into a here string */
X  
! char *gethere(str) /**/
! char *str;
X  {
X  char pbuf[256];
X  int qt = 0,siz = 0,l,strip = 0;
--- 995,1002 ----
X  
X  /* convert here document into a here string */
X  
! char *gethere(str,typ) /**/
! char *str;int typ;
X  {
X  char pbuf[256];
X  int qt = 0,siz = 0,l,strip = 0;
***************
*** 1000,1008 ****
X  		if (*s == Nularg)
X  			qt = 1;
X  	untokenize(str);
! 	if (*str == '-')
X  		{
- 		str++;
X  		strip = 1;
X  		while (*str == '\t')
X  			str++;
--- 1006,1013 ----
X  		if (*s == Nularg)
X  			qt = 1;
X  	untokenize(str);
! 	if (typ == HEREDOCDASH)
X  		{
X  		strip = 1;
X  		while (*str == '\t')
X  			str++;
***************
*** 1247,1252 ****
--- 1252,1259 ----
X  			}
X  	if (qt && ptr != buf && ptr[-1] == '\n')
X  		ptr[-1] = '\0';
+ 	else
+ 		*ptr = '\0';
X  	if (cnt)
X  		addnode(ret,ztrdup(buf));
X  	free(buf);
***************
*** 1557,1567 ****
X  Lklist l;
X  {
X  Lknode n = firstnode(l);
! struct redir *f;
X  
X  	for (; n; incnode(n))
X  		{
! 		f = getdata(n);
X  		if (f->type == OUTPIPE)
X  			{
X  			char *str = f->name;
--- 1564,1574 ----
X  Lklist l;
X  {
X  Lknode n = firstnode(l);
! Redir f;
X  
X  	for (; n; incnode(n))
X  		{
! 		f = (Redir) getdata(n);
X  		if (f->type == OUTPIPE)
X  			{
X  			char *str = f->name;
***************
*** 1598,1607 ****
X  	permalloc();
X  	while (s = ugetnode(cmd->args))
X  		{
! 		cc = zalloc(sizeof *cc);
X  		cc->type = SHFUNC;
X  		cc->flags = 0;
! 		cc->u.list = dupstruct(cmd->u.list);
X  		addhnode(ztrdup(s),cc,cmdnamtab,freecmdnam);
X  		if (!strncmp(s,"TRAP",4))
X  			{
--- 1605,1614 ----
X  	permalloc();
X  	while (s = ugetnode(cmd->args))
X  		{
! 		cc = (Cmdnam) zalloc(sizeof *cc);
X  		cc->type = SHFUNC;
X  		cc->flags = 0;
! 		cc->u.list = (List) dupstruct(cmd->u.list);
X  		addhnode(ztrdup(s),cc,cmdnamtab,freecmdnam);
X  		if (!strncmp(s,"TRAP",4))
X  			{
***************
*** 1648,1654 ****
X  			}
X  		cn->flags &= ~PMFLAG_u;
X  		permalloc();
! 		cn->u.list = dupstruct(l);
X  		heapalloc();
X  		}
X  	flags = cn->flags;
--- 1655,1661 ----
X  			}
X  		cn->flags &= ~PMFLAG_u;
X  		permalloc();
! 		cn->u.list = (List) dupstruct(l);
X  		heapalloc();
X  		}
X  	flags = cn->flags;
***************
*** 1656,1664 ****
X  	xexitfn = sigfuncs[SIGEXIT];
X  	tab = pparams;
X  	oargv0 = argzero;
X  	if (flags & PMFLAG_t)
X  		opts[XTRACE] = OPT_SET;
! 	pparams = x = zcalloc(((sizeof *x)*(1+countnodes(cmd->args))));
X  	argzero = ztrdup(ugetnode(cmd->args));
X  	while (*x = ugetnode(cmd->args))
X  		*x = ztrdup(*x), x++;
--- 1663,1672 ----
X  	xexitfn = sigfuncs[SIGEXIT];
X  	tab = pparams;
X  	oargv0 = argzero;
+ 	optind = 0;
X  	if (flags & PMFLAG_t)
X  		opts[XTRACE] = OPT_SET;
! 	pparams = x = (char **) zcalloc(((sizeof *x)*(1+countnodes(cmd->args))));
X  	argzero = ztrdup(ugetnode(cmd->args));
X  	while (*x = ugetnode(cmd->args))
X  		*x = ztrdup(*x), x++;
***************
*** 1679,1685 ****
X  	pparams = tab;
X  	if (sigtrapped[SIGEXIT])
X  		dotrap(SIGEXIT);
! 	if (sigfuncs[SIGEXIT])
X  		freestruct(sigfuncs[SIGEXIT]);
X  	sigtrapped[SIGEXIT] = xexittr;
X  	sigfuncs[SIGEXIT] = xexitfn;
--- 1687,1693 ----
X  	pparams = tab;
X  	if (sigtrapped[SIGEXIT])
X  		dotrap(SIGEXIT);
! 	if (sigfuncs[SIGEXIT] && sigfuncs[SIGEXIT] != xexitfn)
X  		freestruct(sigfuncs[SIGEXIT]);
X  	sigtrapped[SIGEXIT] = xexittr;
X  	sigfuncs[SIGEXIT] = xexitfn;
***************
*** 1730,1746 ****
X  int cancd(s)
X  char *s;
X  {
! char *t;
! 
! 	for (t = s; *t; t++)
! 		if (*t == '/')
! 			break;
! 	if (!*t)
X  		{
X  		char sbuf[MAXPATHLEN],**cp;
X  
X  		if (cancd2(s))
X  			return 1;
X  		for (cp = cdpath; *cp; cp++)
X  			{
X  			sprintf(sbuf,"%s/%s",*cp,s);
--- 1738,1751 ----
X  int cancd(s)
X  char *s;
X  {
! 	if (*s != '/')
X  		{
X  		char sbuf[MAXPATHLEN],**cp;
X  
X  		if (cancd2(s))
X  			return 1;
+ 		if (access(s,X_OK) == 0)
+ 			return 0;
X  		for (cp = cdpath; *cp; cp++)
X  			{
X  			sprintf(sbuf,"%s/%s",*cp,s);
***************
*** 1757,1762 ****
X  {
X  struct stat buf;
X  
! 	return !(access(s,X_OK) || lstat(s,&buf) || !S_ISDIR(buf.st_mode));
X  }
X  
--- 1762,1767 ----
X  {
X  struct stat buf;
X  
! 	return !(access(s,X_OK) || stat(s,&buf) || !S_ISDIR(buf.st_mode));
X  }
X  
*** src/zsh0/zsh2.00/src/exec.pro	Tue Apr 23 00:29:58 1991
--- zsh2.00/src/exec.pro	Tue May  7 22:53:25 1991
***************
*** 22,28 ****
X  void fixfds DCLPROTO((int *save));
X  void entersubsh DCLPROTO((int bkg));
X  void closem DCLPROTO((void));
! char *gethere DCLPROTO((char *str));
X  int getherestr DCLPROTO((struct redir *fn));
X  void catproc DCLPROTO((struct multio *mn));
X  void teeproc DCLPROTO((struct multio *mn));
--- 22,28 ----
X  void fixfds DCLPROTO((int *save));
X  void entersubsh DCLPROTO((int bkg));
X  void closem DCLPROTO((void));
! char *gethere DCLPROTO((char *str,int typ));
X  int getherestr DCLPROTO((struct redir *fn));
X  void catproc DCLPROTO((struct multio *mn));
X  void teeproc DCLPROTO((struct multio *mn));
*** src/zsh0/zsh2.00/src/glob.c	Sat Apr 27 00:15:09 1991
--- zsh2.00/src/glob.c	Fri May 10 07:16:44 1991
***************
*** 31,37 ****
X  */
X  
X  #include "zsh.h"
- #include "funcs.h"
X  #include <sys/dir.h>
X  #include <sys/errno.h>
X  
--- 31,36 ----
***************
*** 103,116 ****
X  					func = qualflags;
X  					data = 0;
X  					while (idigit(*s))
! 						data = data*010+(*s-'0');
X  					}
X  				else switch (*s++)
X  					{
! 					case Hat: sense = 1-sense; break;
X  					case '@': func = qualmode; data = S_IFLNK; break;
X  					case '=': func = qualmode; data = S_IFSOCK; break;
X  					case 'p': func = qualmode; data = S_IFIFO; break;
X  					case '/': func = qualmode; data = S_IFDIR; break;
X  					case '.': func = qualmode; data = S_IFREG; break;
X  					case '%': func = qualisdev; break;
--- 102,117 ----
X  					func = qualflags;
X  					data = 0;
X  					while (idigit(*s))
! 						data = data*010+(*s++-'0');
X  					}
X  				else switch (*s++)
X  					{
! 					case Hat: case '^': sense = 1-sense; break;
X  					case '@': func = qualmode; data = S_IFLNK; break;
X  					case '=': func = qualmode; data = S_IFSOCK; break;
+ #ifdef S_IFIFO
X  					case 'p': func = qualmode; data = S_IFIFO; break;
+ #endif
X  					case '/': func = qualmode; data = S_IFDIR; break;
X  					case '.': func = qualmode; data = S_IFREG; break;
X  					case '%': func = qualisdev; break;
***************
*** 246,256 ****
X  		char *t;
X  		int ll = strlen(s);
X  
! 		t = zalloc(ll+2);
X  		strcpy(t,s);
X  		t[ll] = '/';
X  		t[ll+1] = '\0';
- 		free(s);
X  		s = t;
X  		}
X  	*matchptr++ = s;
--- 247,256 ----
X  		char *t;
X  		int ll = strlen(s);
X  
! 		t = ncalloc(ll+2);
X  		strcpy(t,s);
X  		t[ll] = '/';
X  		t[ll+1] = '\0';
X  		s = t;
X  		}
X  	*matchptr++ = s;
***************
*** 491,499 ****
X  char *a;char *b;
X  {
X  Comp c;
! int val;
X  
! 	c = parsereg(b);
X  	if (!c)
X  		{
X  		zerr("bad pattern: %s",b,0);
--- 491,506 ----
X  char *a;char *b;
X  {
X  Comp c;
! int val,len;
! char *b2;
X  
! 	len = strlen(b);
! 	b2 = alloc(len+3);
! 	strcpy(b2+1,b);
! 	b2[0] = Inpar;
! 	b2[len+1] = Outpar;
! 	b2[len+2] = '\0';
! 	c = parsereg(b2);
X  	if (!c)
X  		{
X  		zerr("bad pattern: %s",b,0);
***************
*** 625,631 ****
X  			char *fn;
X  			int dirs = !!q->next;
X  			struct direct *de;
! 			DIR *lock = opendir(pathbuf);
X  			 
X  			if (lock == NULL)
X  				return;
--- 632,638 ----
X  			char *fn;
X  			int dirs = !!q->next;
X  			struct direct *de;
! 			DIR *lock = opendir((*pathbuf) ? pathbuf : ".");
X  			 
X  			if (lock == NULL)
X  				return;
***************
*** 720,725 ****
--- 727,733 ----
X  }
X  
X  static char *pptr;
+ static Comp tail = 0;
X  static int first;
X  
X  int domatch(str,c,fist) /**/
***************
*** 737,743 ****
X  {
X  char *pat = c->str;
X  
! 	if (c->closure)
X  		{
X  		char *saves = pptr;
X  		int savei = first;
--- 745,751 ----
X  {
X  char *pat = c->str;
X  
! 	if (c->closure == 1)
X  		{
X  		char *saves = pptr;
X  		int savei = first;
***************
*** 969,974 ****
--- 977,984 ----
X  Comp c = (Comp) alloc(sizeof *c),c1,c2;
X  char *s = c->str = alloc(MAXPATHLEN*2),*ls = NULL;
X  
+ 	c->next = tail;
+ 
X  	while (*pptr && (mode || *pptr != '/') && *pptr != Bar &&
X  			*pptr != Outpar)
X  		{
***************
*** 995,1014 ****
X  			}
X  		if (*pptr == Inpar)
X  			{
! 			*s++ = '\0';
! 			pptr++;
! 			c->next = (Comp) alloc(sizeof *c);
! 			c->next->left = c1 = parsecompsw();
! 			if (*pptr != Outpar)
X  				{
X  				errflag = 1;
X  				return NULL;
X  				}
- 			pptr++;
X  			if (*pptr == Pound)
X  				{
! 				int dpnd = 1;
! 
X  				pptr++;
X  				if (*pptr == Pound)
X  					{
--- 1005,1028 ----
X  			}
X  		if (*pptr == Inpar)
X  			{
! 			int pars = 1;
! 			char *startp = pptr, *endp;
! 			Comp stail = tail;
! 			int dpnd = 0;
! 
! 			for (pptr = pptr+1; *pptr && pars; pptr++)
! 				if (*pptr == Inpar)
! 					pars++;
! 				else if (*pptr == Outpar)
! 					pars--;
! 			if (pptr[-1] != Outpar)
X  				{
X  				errflag = 1;
X  				return NULL;
X  				}
X  			if (*pptr == Pound)
X  				{
! 				dpnd = 1;
X  				pptr++;
X  				if (*pptr == Pound)
X  					{
***************
*** 1015,1026 ****
X  					pptr++;
X  					dpnd = 2;
X  					}
- 				c->next->closure = dpnd;
X  				}
! 			c2 = parsecomp();
! 			if (!c2)
X  				return NULL;
! 			c->next->next = c2;
X  			return c;
X  			}
X  		if (*pptr == Pound)
--- 1029,1049 ----
X  					pptr++;
X  					dpnd = 2;
X  					}
X  				}
! 			c1 = parsecomp();
! 			if (!c1)
X  				return NULL;
! 			tail = c1;
! 			endp = pptr;
! 			pptr = startp;
! 			pptr++;
! 			*s++ = '\0';
! 			c->next = (Comp) alloc(sizeof *c);
! 			c->next->left = parsecompsw();
! 			c->next->closure = dpnd;
! 			c->next->next = (Comp) alloc(sizeof *c);
! 			pptr = endp;
! 			tail = stail;
X  			return c;
X  			}
X  		if (*pptr == Pound)
***************
*** 1029,1039 ****
X  			pptr++;
X  			if (!ls)
X  				return NULL;
! 			c->next = c1 = (Comp) alloc(sizeof *c);
! 			c1->str = strdup(ls);
! 			c1->closure = 1;
! 			c1->next = parsecomp();
! 			if (!c1->next)
X  				return NULL;
X  			*ls++ = '\0';
X  			return c;
--- 1052,1070 ----
X  			pptr++;
X  			if (!ls)
X  				return NULL;
! 			if (*pptr == Pound) 
! 				{
! 				pptr++;
! 				c->next = c1 = (Comp) alloc(sizeof *c);
! 				c1->str = strdup(ls);
! 				}
! 			else
! 				c1 = c;
! 			c1->next = c2 = (Comp) alloc(sizeof *c);
! 			c2->str = strdup(ls);
! 			c2->closure = 1;
! 			c2->next = parsecomp();
! 			if (!c2->next)
X  				return NULL;
X  			*ls++ = '\0';
X  			return c;
*** src/zsh0/zsh2.00/src/hist.c	Tue Apr 23 00:30:05 1991
--- zsh2.00/src/hist.c	Fri May 10 06:37:00 1991
***************
*** 31,37 ****
X  */
X  
X  #include "zsh.h"
- #include "funcs.h"
X  
X  static int lastc;
X  
--- 31,36 ----
***************
*** 40,49 ****
X  void hwaddc(c) /**/
X  int c;
X  {
! 	if (hlastw && hline && (!errflag || c == HISTSPACE))
X  		{
- 		if (c == EOF || c == HERR)
- 			c = ' ';
X  		*hptr++ = c;
X  		if (hptr-hline >= hlinesz)
X  			{
--- 39,46 ----
X  void hwaddc(c) /**/
X  int c;
X  {
! 	if (hlastw && hline && (!(errflag || lexstop) || c == HISTSPACE))
X  		{
X  		*hptr++ = c;
X  		if (hptr-hline >= hlinesz)
X  			{
***************
*** 61,67 ****
X  		}
X  }
X  
! #define habort() { errflag = 1; return HERR; }
X  
X  /* get a character after performing history substitution */
X  
--- 58,64 ----
X  		}
X  }
X  
! #define habort() { errflag = lexstop = 1; return ' '; }
X  
X  /* get a character after performing history substitution */
X  
***************
*** 73,79 ****
X  
X  tailrec:
X  	c = hgetch();
! 	if (stophist)
X  		{
X  		hwaddc(c);
X  		return c;
--- 70,76 ----
X  
X  tailrec:
X  	c = hgetch();
! 	if (stophist || alstackind)
X  		{
X  		hwaddc(c);
X  		return c;
***************
*** 81,87 ****
X  	if (isfirstch && c == hatchar)
X  		{
X  		isfirstch = 0;
! 		hungets(":s^");
X  		c = bangchar;
X  		goto hatskip;
X  		}
--- 78,85 ----
X  	if (isfirstch && c == hatchar)
X  		{
X  		isfirstch = 0;
! 		hungetch(hatchar);
! 		hungets(":s");
X  		c = bangchar;
X  		goto hatskip;
X  		}
***************
*** 108,361 ****
X  	*hptr = '\0';
X  	if ((c = hgetch()) == '{')
X  		{
! 			bflag = cflag = 1;
X  			c = hgetch();
X  			}
! 		if (c == '\"')
X  			{
! 			stophist = 1;
! 			goto tailrec;
X  			}
! 		if (!cflag && inblank(c) || c == '=' || c == '(' || c == EOF)
X  			{
! 			hungetch(c);
! 			hwaddc(bangchar);
! 			return bangchar;
! 			}
! 		cflag = 0;
! 		ptr = buf;
! 
! 		/* get event number */
! 
! 		if (c == '?')
! 			{
! 			for(;;)
X  				{
X  				c = hgetch();
! 				if (c == '?' || c == '\n' || c == -1)
! 					break;
! 				else
! 					*ptr++ = c;
X  				}
! 			if (c != '\n' && c != -1)
! 				c = hgetch();
! 			*ptr = '\0';
! 			ev = hconsearch(hsubl = ztrdup(buf),&marg);
! 			if (ev == -1)
! 				{
! 				herrflush();
! 				zerr("no such event: %s",buf,0);
! 				habort();
! 				}
X  			}
! 		else
X  			{
! 			int t0;
! 	 
! 			for (;;)
! 				{
! 				if (inblank(c) || c == ':' || c == '^' || c == '$' || c == '*'
! 						|| c == '%' || c == '}' || c == -1)
! 					break;
! 				if (ptr != buf && c == '-')
! 					break;
! 				*ptr++ = c;
! 				if (c == '#' || c == '!')
! 					{
! 					c = hgetch();
! 					break;
! 					}
X  				c = hgetch();
! 				}
! 			*ptr = 0;
! 			if (!*buf)
! 				ev = defev;
! 			else if (t0 = atoi(buf))
! 				ev = (t0 < 0) ? curhist+t0 : t0;
! 			else if (*buf == '!')
! 				ev = curhist-1;
! 			else if (*buf == '#')
! 				ev = curhist;
! 			else if ((ev = hcomsearch(buf)) == -1)
! 				{
! 				zerr("event not found: %s",buf,0);
! 				while (c != '\n' && c != -1)
! 					c = hgetch();
! 				habort();
! 				}
X  			}
X  
! 		/* get the event */
X  
! 		if (!(eline = getevent(defev = ev)))
! 			habort();
X  
! 		/* extract the relevant arguments */
X  
! 		argc = getargc(eline);
! 		if (c == ':')
! 			{
! 			cflag = 1;
! 			c = hgetch();
! 			}
X  		if (c == '*')
X  			{
- 			farg = 1;
- 			larg = argc;
X  			cflag = 0;
X  			}
! 		else
X  			{
! 			hungetch(c);
! 			larg = farg = getargspec(argc,marg);
X  			if (larg == -2)
X  				habort();
! 			if (farg != -1)
! 				cflag = 0;
! 			c = hgetch();
! 			if (c == '*')
! 				{
! 				cflag = 0;
! 				larg = argc;
! 				}
! 			else if (c == '-')
! 				{
! 				cflag = 0;
! 				larg = getargspec(argc,marg);
! 				if (larg == -2)
! 					habort();
! 				if (larg == -1)
! 					larg = argc-1;
! 				}
! 			else
! 				hungetch(c);
X  			}
! 		if (farg == -1)
! 			farg = 0;
! 		if (larg == -1)
! 			larg = argc;
! 		if (!(sline = getargs(eline,farg,larg)))
! 			habort();
X  
! 		/* do the modifiers */
X  
! 		for(;;)
X  			{
! 			c = (cflag) ? ':' : hgetch();
! 			cflag = 0;
! 			if (c == ':')
X  				{
! 				int gbal = 0;
! 			
! 				if ((c = hgetch()) == 'g')
X  					{
! 					gbal = 1;
! 					c = hgetch();
X  					}
! 				switch(c)
! 					{
! 					case 'p':
! 						histdone = 2;
! 						break;
! 					case 'h':
! 						if (!remtpath(&sline))
! 							{
! 							herrflush();
! 							zerr("modifier failed: h",NULL,0);
! 							habort();
! 							}
! 						break;
! 					case 'e':
! 						if (!rembutext(&sline))
! 							{
! 							herrflush();
! 							zerr("modifier failed: e",NULL,0);
! 							habort();
! 							}
! 						break;
! 					case 'r':
! 						if (!remtext(&sline))
! 							{
! 							herrflush();
! 							zerr("modifier failed: r",NULL,0);
! 							habort();
! 							}
! 						break;
! 					case 't':
! 						if (!remlpaths(&sline))
! 							{
! 							herrflush();
! 							zerr("modifier failed: t",NULL,0);
! 							habort();
! 							}
! 						break;
! 					case 's':
X  						{
! 						int del;
! 						char *ptr1,*ptr2;
! 					
! 						del = hgetch();
! 						ptr1 = hdynread(del);
! 						if (!ptr1)
X  							habort();
- 						ptr2 = hdynread2(del);
- 						if (strlen(ptr1))
- 							{
- 							if (hsubl)
- 								free(hsubl);
- 							hsubl = ptr1;
- 							}
- 						if (hsubr)
- 							free(hsubr);
- 						hsubr = ptr2;
X  						}
! 					case '&':
! 						if (hsubl && hsubr)
! 							{
! 							if (subst(&sline,hsubl,hsubr,gbal))
! 								habort();
! 							}
! 						else
! 							{
! 							herrflush();
! 							zerr("no previous substitution with &",NULL,0);
! 							habort();
! 							}
! 						break;
! 					case 'q':
! 						quote(&sline);
! 						break;
! 					case 'x':
! 						quotebreak(&sline);
! 						break;
! 					case 'l':
! 						downcase(&sline);
! 						break;
! 					case 'u':
! 						upcase(&sline);
! 						break;
! 					default:
X  						herrflush();
! 						zerr("illegal modifier: %c",NULL,c);
! 					habort();
X  					break;
! 				}
X  			}
! 		else
X  			{
! 			if (c != '}' || !bflag)
! 				hungetch(c);
! 			if (c != '}' && bflag)
! 				{
! 				zerr("'}' expected",NULL,0);
! 				habort();
! 				}
! 			break;
X  			}
X  		}
! 	
X  	/* stuff the resulting string in the input queue and start over */
X  
X  	if (alstackind != MAXAL)
X  		{
X  		hungets(HISTMARK);
--- 106,363 ----
X  	*hptr = '\0';
X  	if ((c = hgetch()) == '{')
X  		{
! 		bflag = cflag = 1;
! 		c = hgetch();
! 		}
! 	if (c == '\"')
! 		{
! 		stophist = 1;
! 		goto tailrec;
! 		}
! 	if (!cflag && inblank(c) || c == '=' || c == '(' || lexstop)
! 		{
! 		if (lexstop)
! 			lexstop = 0;
! 		else
! 			hungetch(c);
! 		hwaddc(bangchar);
! 		return bangchar;
! 		}
! 	cflag = 0;
! 	ptr = buf;
! 
! 	/* get event number */
! 
! 	if (c == '?')
! 		{
! 		for(;;)
! 			{
X  			c = hgetch();
+ 			if (c == '?' || c == '\n' || lexstop)
+ 				break;
+ 			else
+ 				*ptr++ = c;
X  			}
! 		if (c != '\n' && !lexstop)
! 			c = hgetch();
! 		*ptr = '\0';
! 		ev = hconsearch(hsubl = ztrdup(buf),&marg);
! 		if (ev == -1)
X  			{
! 			herrflush();
! 			zerr("no such event: %s",buf,0);
! 			habort();
X  			}
! 		}
! 	else
! 		{
! 		int t0;
!  
! 		for (;;)
X  			{
! 			if (inblank(c) || c == ':' || c == '^' || c == '$' || c == '*'
! 					|| c == '%' || c == '}' || lexstop)
! 				break;
! 			if (ptr != buf && c == '-')
! 				break;
! 			*ptr++ = c;
! 			if (c == '#' || c == bangchar)
X  				{
X  				c = hgetch();
! 				break;
X  				}
! 			c = hgetch();
X  			}
! 		*ptr = 0;
! 		if (!*buf)
! 			ev = defev;
! 		else if (t0 = atoi(buf))
! 			ev = (t0 < 0) ? curhist+t0 : t0;
! 		else if (*buf == bangchar)
! 			ev = curhist-1;
! 		else if (*buf == '#')
! 			ev = curhist;
! 		else if ((ev = hcomsearch(buf)) == -1)
X  			{
! 			zerr("event not found: %s",buf,0);
! 			while (c != '\n' && !lexstop)
X  				c = hgetch();
! 			habort();
X  			}
+ 		}
X  
! 	/* get the event */
X  
! 	if (!(eline = getevent(defev = ev)))
! 		habort();
X  
! 	/* extract the relevant arguments */
X  
! 	argc = getargc(eline);
! 	if (c == ':')
! 		{
! 		cflag = 1;
! 		c = hgetch();
! 		}
! 	if (c == '*')
! 		{
! 		farg = 1;
! 		larg = argc;
! 		cflag = 0;
! 		}
! 	else
! 		{
! 		hungetch(c);
! 		larg = farg = getargspec(argc,marg);
! 		if (larg == -2)
! 			habort();
! 		if (farg != -1)
! 			cflag = 0;
! 		c = hgetch();
X  		if (c == '*')
X  			{
X  			cflag = 0;
+ 			larg = argc;
X  			}
! 		else if (c == '-')
X  			{
! 			cflag = 0;
! 			larg = getargspec(argc,marg);
X  			if (larg == -2)
X  				habort();
! 			if (larg == -1)
! 				larg = argc-1;
X  			}
! 		else
! 			hungetch(c);
! 		}
! 	if (farg == -1)
! 		farg = 0;
! 	if (larg == -1)
! 		larg = argc;
! 	if (!(sline = getargs(eline,farg,larg)))
! 		habort();
X  
! 	/* do the modifiers */
X  
! 	for(;;)
! 		{
! 		c = (cflag) ? ':' : hgetch();
! 		cflag = 0;
! 		if (c == ':')
X  			{
! 			int gbal = 0;
! 		
! 			if ((c = hgetch()) == 'g')
X  				{
! 				gbal = 1;
! 				c = hgetch();
! 				}
! 			switch(c)
! 				{
! 				case 'p':
! 					histdone = 2;
! 					break;
! 				case 'h':
! 					if (!remtpath(&sline))
! 						{
! 						herrflush();
! 						zerr("modifier failed: h",NULL,0);
! 						habort();
! 						}
! 					break;
! 				case 'e':
! 					if (!rembutext(&sline))
! 						{
! 						herrflush();
! 						zerr("modifier failed: e",NULL,0);
! 						habort();
! 						}
! 					break;
! 				case 'r':
! 					if (!remtext(&sline))
! 						{
! 						herrflush();
! 						zerr("modifier failed: r",NULL,0);
! 						habort();
! 						}
! 					break;
! 				case 't':
! 					if (!remlpaths(&sline))
! 						{
! 						herrflush();
! 						zerr("modifier failed: t",NULL,0);
! 						habort();
! 						}
! 					break;
! 				case 's':
X  					{
! 					int del;
! 					char *ptr1,*ptr2;
! 				
! 					del = hgetch();
! 					ptr1 = hdynread(del);
! 					if (!ptr1)
! 						habort();
! 					ptr2 = hdynread2(del);
! 					if (strlen(ptr1))
! 						{
! 						if (hsubl)
! 							free(hsubl);
! 						hsubl = ptr1;
! 						}
! 					if (hsubr)
! 						free(hsubr);
! 					hsubr = ptr2;
X  					}
! 				case '&':
! 					if (hsubl && hsubr)
X  						{
! 						if (subst(&sline,hsubl,hsubr,gbal))
X  							habort();
X  						}
! 					else
! 						{
X  						herrflush();
! 						zerr("no previous substitution with &",NULL,0);
! 						habort();
! 						}
X  					break;
! 				case 'q':
! 					quote(&sline);
! 					break;
! 				case 'x':
! 					quotebreak(&sline);
! 					break;
! 				case 'l':
! 					downcase(&sline);
! 					break;
! 				case 'u':
! 					upcase(&sline);
! 					break;
! 				default:
! 					herrflush();
! 					zerr("illegal modifier: %c",NULL,c);
! 				habort();
! 				break;
X  			}
! 		}
! 	else
! 		{
! 		if (c != '}' || !bflag)
! 			hungetch(c);
! 		if (c != '}' && bflag)
X  			{
! 			zerr("'}' expected",NULL,0);
! 			habort();
X  			}
+ 		break;
X  		}
! 	}
! 
X  	/* stuff the resulting string in the input queue and start over */
X  
+ 	lexstop = 0;
X  	if (alstackind != MAXAL)
X  		{
X  		hungets(HISTMARK);
***************
*** 385,391 ****
X  			if (!alstackind)
X  				{
X  				zerr("alias stack underflow",NULL,0);
! 				return lastc = HERR;
X  				}
X  			ix = alstack[--alstackind];
X  			if (ix)
--- 387,394 ----
X  			if (!alstackind)
X  				{
X  				zerr("alias stack underflow",NULL,0);
! 				errflag = lexstop = 1;
! 				return lastc = ' ';
X  				}
X  			ix = alstack[--alstackind];
X  			if (ix)
***************
*** 399,410 ****
X  				}
X  			goto start;
X  			}
X  		return lastc;
X  		}
! 	if (strin)
! 		return lastc = EOF;
! 	if (errflag)
! 		return lastc = HERR;
X  	if (interact && isset(SHINSTDIN))
X  		if (!isfirstln)
X  			pmpt = putprompt(prompt2,&plen);
--- 402,416 ----
X  				}
X  			goto start;
X  			}
+ 		if (itok(lastc))
+ 			goto start;
X  		return lastc;
X  		}
! 	if (strin || errflag)
! 		{
! 		lexstop = 1;
! 		return lastc = ' ';
! 		}
X  	if (interact && isset(SHINSTDIN))
X  		if (!isfirstln)
X  			pmpt = putprompt(prompt2,&plen);
***************
*** 424,430 ****
X  	else
X  		line = zleread(pmpt,pmpt2,plen);
X  	if (!line)
! 		return lastc = EOF;
X  	if (interact && isset(SHINSTDIN))
X  		{
X  		char *s = getdata(lastnode(lithistlist));
--- 430,444 ----
X  	else
X  		line = zleread(pmpt,pmpt2,plen);
X  	if (!line)
! 		{
! 		lexstop = 1;
! 		return lastc = ' ';
! 		}
! 	if (errflag)
! 		{
! 		lexstop = errflag = 1;
! 		return lastc = ' ';
! 		}
X  	if (interact && isset(SHINSTDIN))
X  		{
X  		char *s = getdata(lastnode(lithistlist));
***************
*** 513,519 ****
X  void hungetc(c) /**/
X  int c;
X  {
! 	if (c == -1)
X  		return;
X  	if (hlastw)
X  		{
--- 527,533 ----
X  void hungetc(c) /**/
X  int c;
X  {
! 	if (lexstop)
X  		return;
X  	if (hlastw)
X  		{
***************
*** 528,534 ****
X  void hungetch(c) /**/
X  int c;
X  {
! 	if (c == -1)
X  		return;
X  	if (inbufct == inbufsz)
X  		{
--- 542,548 ----
X  void hungetch(c) /**/
X  int c;
X  {
! 	if (lexstop)
X  		return;
X  	if (inbufct == inbufsz)
X  		{
***************
*** 808,814 ****
X  {
X  int t0;
X  Lknode node;
- char *s,*t;
X  
X  	if (curhist-firsthist < 1)
X  		return -1;
--- 822,827 ----
***************
*** 880,886 ****
X  char *str = *junkptr;
X  
X  	for (; *str; str++)
! 		*str = toupper(*str);
X  	return 1;
X  }
X  
--- 893,899 ----
X  char *str = *junkptr;
X  
X  	for (; *str; str++)
! 		*str = tuupper(*str);
X  	return 1;
X  }
X  
***************
*** 890,896 ****
X  char *str = *junkptr;
X  
X  	for (; *str; str++)
! 		*str = tolower(*str);
X  	return 1;
X  }
X  
--- 903,909 ----
X  char *str = *junkptr;
X  
X  	for (; *str; str++)
! 		*str = tulower(*str);
X  	return 1;
X  }
X  
***************
*** 1046,1052 ****
X  char *pp = *(char **) x;
X  
X  	for (; *pp; pp++)
! 		*pp = toupper(*pp);
X  }
X  
X  void downcase(x) /**/
--- 1059,1065 ----
X  char *pp = *(char **) x;
X  
X  	for (; *pp; pp++)
! 		*pp = tuupper(*pp);
X  }
X  
X  void downcase(x) /**/
***************
*** 1055,1061 ****
X  char *pp = *(char **) x;
X  
X  	for (; *pp; pp++)
! 		*pp = tolower(*pp);
X  }
X  
X  int quote(tr) /**/
--- 1068,1074 ----
X  char *pp = *(char **) x;
X  
X  	for (; *pp; pp++)
! 		*pp = tulower(*pp);
X  }
X  
X  int quote(tr) /**/
***************
*** 1140,1146 ****
X  {
X  char *ss,*ttyname DCLPROTO((int)),*bl0;
X  static char buf1[256],buf2[256],*buf;
! int t0;
X  struct tm *tm = NULL;
X  time_t timet;
X  
--- 1153,1159 ----
X  {
X  char *ss,*ttyname DCLPROTO((int)),*bl0;
X  static char buf1[256],buf2[256],*buf;
! int t0,bracepos = 0;
X  struct tm *tm = NULL;
X  time_t timet;
X  
***************
*** 1200,1205 ****
--- 1213,1220 ----
X  				case 'b': tstradd("me");
X  				case 'U': tstradd("us");
X  				case 'u': tstradd("ue");
+ 				case '{': bracepos = bp-buf; break;
+ 				case '}': lensb += (bp-buf)-bracepos; break;
X  				case 't': case '@':
X  					timet = time(NULL);
X  					tm = localtime(&timet);
***************
*** 1281,1287 ****
X  {
X  	if (strin)
X  		hflush();
! 	else while (lastc != '\n' && lastc != HERR)
X  		hgetch();
X  }
X  
--- 1296,1302 ----
X  {
X  	if (strin)
X  		hflush();
! 	else while (lastc != '\n' && !lexstop)
X  		hgetch();
X  }
X  
***************
*** 1294,1300 ****
X  char *buf = zalloc(bsiz),*ptr;
X   
X  	ptr = buf;
! 	while ((c = hgetch()) != stop && c != '\n' && c != EOF && c != HERR)
X  		{
X  		if (c == '\\')
X  			c = hgetch();
--- 1309,1315 ----
X  char *buf = zalloc(bsiz),*ptr;
X   
X  	ptr = buf;
! 	while ((c = hgetch()) != stop && c != '\n' && !lexstop)
X  		{
X  		if (c == '\\')
X  			c = hgetch();
***************
*** 1323,1329 ****
X  char *buf = zalloc(bsiz),*ptr;
X   
X  	ptr = buf;
! 	while ((c = hgetch()) != stop && c != '\n' && c != EOF && c != HERR)
X  		{
X  		if (c == '\n')
X  			{
--- 1338,1344 ----
X  char *buf = zalloc(bsiz),*ptr;
X   
X  	ptr = buf;
! 	while ((c = hgetch()) != stop && c != '\n' && !lexstop)
X  		{
X  		if (c == '\n')
X  			{
***************
*** 1394,1400 ****
X  int arg = pgrp;
X  
X  	if (jobbing)
! #ifdef TCSETPGRP
X  		if (SHTTY != -1 && tcsetpgrp(SHTTY,pgrp) == -1 && !ep)
X  #else
X  		if (SHTTY != -1 && ioctl(SHTTY,TIOCSPGRP,&arg) == -1 && !ep)
--- 1409,1415 ----
X  int arg = pgrp;
X  
X  	if (jobbing)
! #ifndef TIOCSPGRP
X  		if (SHTTY != -1 && tcsetpgrp(SHTTY,pgrp) == -1 && !ep)
X  #else
X  		if (SHTTY != -1 && ioctl(SHTTY,TIOCSPGRP,&arg) == -1 && !ep)
*** src/zsh0/zsh2.00/src/init.c	Tue Apr 23 01:29:26 1991
--- zsh2.00/src/init.c	Fri May 10 06:46:07 1991
***************
*** 32,38 ****
X  
X  #define GLOBALS
X  #include "zsh.h"
- #include "funcs.h"
X  #include <pwd.h>
X  
X  extern int yydebug;
--- 32,37 ----
***************
*** 132,138 ****
X  {
X  int c;
X  
! 	for (c = 0; c != 128; c++)
X  		opts[c] = OPT_INVALID;
X  	for (c = 'a'; c <= 'z'; c++)
X  		opts[c] = opts[c-'a'+'A'] = OPT_UNSET;
--- 131,139 ----
X  {
X  int c;
X  
! 	for (c = 0; c != 32; c++)
! 		opts[c] = OPT_UNSET;
! 	for (c = 32; c != 128; c++)
X  		opts[c] = OPT_INVALID;
X  	for (c = 'a'; c <= 'z'; c++)
X  		opts[c] = opts[c-'a'+'A'] = OPT_UNSET;
***************
*** 185,194 ****
X  				{
X  				int c;
X  
! 				argv++;
X  				c = optlookup(*argv);
X  				if (c == -1)
! 					zerr("no such option: %s",argv[-1],0);
X  				else
X  					opts[c] = action;
X  				break;
--- 186,201 ----
X  				{
X  				int c;
X  
! 				if (!*++*argv)
! 					argv++;
! 				if (!*argv)
! 					{
! 					zerr("string expected after -o",NULL,0);
! 					exit(1);
! 					}
X  				c = optlookup(*argv);
X  				if (c == -1)
! 					zerr("no such option: %s",*argv,0);
X  				else
X  					opts[c] = action;
X  				break;
***************
*** 227,232 ****
--- 234,240 ----
X  	setbuffer(stdout,malloc(BUFSIZ),BUFSIZ);
X  	setbuffer(stderr,malloc(BUFSIZ),BUFSIZ);
X  	subsh = 0;
+ #ifdef JOB_CONTROL
X  	opts[MONITOR] = (interact) ? OPT_SET : OPT_UNSET;
X  	if (jobbing)
X  		{
***************
*** 234,245 ****
--- 242,265 ----
X  		if (SHTTY == -1)
X  			opts[MONITOR] = OPT_UNSET;
X  		else
+ 			{
X  			gettyinfo(&shttyinfo);	/* get tty state */
+ 			savedttyinfo = shttyinfo;
+ 			}
X  		if ((mypgrp = getpgrp(0)) <= 0)
X  			opts[MONITOR] = OPT_UNSET;
X  		}
X  	else
X  		SHTTY = -1;
+ #else
+ 	opts[MONITOR] = OPT_UNSET;
+ 	SHTTY = movefd((isatty(0)) ? dup(0) : open("/dev/tty",O_RDWR));
+ 	if (SHTTY != -1)
+ 		{
+ 		gettyinfo(&shttyinfo);
+ 		savedttyinfo = shttyinfo;
+ 		}
+ #endif
X  }
X  
X  void setupvals() /**/
***************
*** 269,284 ****
X  	paramtab = newhtable(151);
X  	cmdnamtab = newhtable(13);
X  	initxbindtab();
! 	if (interact)
! 		{
! 		prompt = ztrdup("%m%# ");
! 		prompt2 = ztrdup("> ");
! 		prompt3 = ztrdup("?# ");
! 		prompt4 = ztrdup("+ ");
! 		}
X  	ppid = getppid();
X  #ifdef TERMIOS
! 	baud = bauds[cfgetospeed(&shttyinfo.termios)];
X  #else
X  #ifdef TERMIO
X  	baud = bauds[shttyinfo.termio.c_cflag & CBAUD];
--- 289,301 ----
X  	paramtab = newhtable(151);
X  	cmdnamtab = newhtable(13);
X  	initxbindtab();
! 	prompt = ztrdup("%m%# ");
! 	prompt2 = ztrdup("> ");
! 	prompt3 = ztrdup("?# ");
! 	prompt4 = ztrdup("+ ");
X  	ppid = getppid();
X  #ifdef TERMIOS
! 	baud = bauds[shttyinfo.termios.c_cflag & CBAUD];
X  #else
X  #ifdef TERMIO
X  	baud = bauds[shttyinfo.termio.c_cflag & CBAUD];
***************
*** 295,301 ****
X  	columns = 80;
X  	lines = 24;
X  #endif
- 	home = ztrdup("/");
X  	ifs = ztrdup(" \t\n");
X  	if (pwd = getpwuid(getuid()))
X  		{
--- 312,317 ----
***************
*** 311,316 ****
--- 327,333 ----
X  	watchfmt = ztrdup(DEFWATCHFMT);
X  	ttystrname = ztrdup(ttyname(SHTTY));
X  	wordchars = ztrdup(DEFWORDCHARS);
+ 	fceditparam = ztrdup(DEFFCEDIT);
X  	if (ispwd(home))
X  		cwd = ztrdup(home);
X  	else if ((ptr = zgetenv("PWD")) && ispwd(ptr))
***************
*** 334,340 ****
X  	userdirsz = 2;
X  	userdirct = 0;
X  	optarg = ztrdup("");
! 	optind = 1;
X  	path = (char **) zalloc(4*sizeof *path);
X  	path[0] = ztrdup("/bin"); path[1] = ztrdup("/usr/bin");
X  	path[2] = ztrdup("/usr/ucb"); path[3] = NULL;
--- 351,358 ----
X  	userdirsz = 2;
X  	userdirct = 0;
X  	optarg = ztrdup("");
! 	optind = 0;
! 	schedcmds = NULL;
X  	path = (char **) zalloc(4*sizeof *path);
X  	path[0] = ztrdup("/bin"); path[1] = ztrdup("/usr/bin");
X  	path[2] = ztrdup("/usr/ucb"); path[3] = NULL;
***************
*** 341,346 ****
--- 359,365 ----
X  	for (ptr = hostm; *ptr && *ptr != '.'; ptr++);
X  	*ptr = '\0';
X  	inittyptab();
+ 	initlextabs();
X  	setupparams();
X  	setparams();
X  	inittyptab();
***************
*** 363,369 ****
X  	inbuf = zalloc(inbufsz = 256);
X  	inbufptr = inbuf+inbufsz;
X  	inbufct = 0;
! 	/*signal(SIGQUIT,SIG_IGN);*/
X  	for (t0 = 0; t0 != RLIM_NLIMITS; t0++)
X  		getrlimit(t0,limits+t0);
X  	hsubl = hsubr = NULL;
--- 382,388 ----
X  	inbuf = zalloc(inbufsz = 256);
X  	inbufptr = inbuf+inbufsz;
X  	inbufct = 0;
! 	signal(SIGQUIT,SIG_IGN);
X  	for (t0 = 0; t0 != RLIM_NLIMITS; t0++)
X  		getrlimit(t0,limits+t0);
X  	hsubl = hsubr = NULL;
***************
*** 392,398 ****
X  static char *reswds[] = {
X  	"do", "done", "esac", "then", "elif", "else", "fi", "for", "case",
X  	"if", "while", "function", "repeat", "time", "until", "exec", "command",
! 	"select", "coproc", "noglob", "-", NULL
X  	};
X  int t0;
X  
--- 411,417 ----
X  static char *reswds[] = {
X  	"do", "done", "esac", "then", "elif", "else", "fi", "for", "case",
X  	"if", "while", "function", "repeat", "time", "until", "exec", "command",
! 	"select", "coproc", "noglob", "-", "nocorrect", NULL
X  	};
X  int t0;
X  
***************
*** 402,408 ****
X  
X  void runscripts() /**/
X  {
! 	if (interact && opts[NORCS] == OPT_UNSET)
X  		{
X  #ifdef GLOBALZSHRC
X  		source(GLOBALZSHRC);
--- 421,430 ----
X  
X  void runscripts() /**/
X  {
! 	if (opts[NORCS] == OPT_SET)
! 		return;
! 	sourcehome(".zshenv");
! 	if (interact)
X  		{
X  #ifdef GLOBALZSHRC
X  		source(GLOBALZSHRC);
***************
*** 417,423 ****
X  			}
X  		}
X  	if (interact)
! 		readhistfile();
X  	if (opts['c'] == OPT_SET)
X  		{
X  		if (SHIN >= 10)
--- 439,445 ----
X  			}
X  		}
X  	if (interact)
! 		readhistfile(getsparam("HISTFILE"),0);
X  	if (opts['c'] == OPT_SET)
X  		{
X  		if (SHIN >= 10)
***************
*** 441,452 ****
X  	isfirstln = 1;
X  }
X  
! void readhistfile() /**/
X  {
! char *s,buf[1024];
X  FILE *in;
X  
! 	if (!(s = getsparam("HISTFILE")))
X  		return;
X  	if (in = fopen(s,"r"))
X  		{
--- 463,475 ----
X  	isfirstln = 1;
X  }
X  
! void readhistfile(s,err) /**/
! char *s;int err;
X  {
! char buf[1024];
X  FILE *in;
X  
! 	if (!s)
X  		return;
X  	if (in = fopen(s,"r"))
X  		{
***************
*** 454,462 ****
--- 477,489 ----
X  		while (fgets(buf,1024,in))
X  			{
X  			int l = strlen(buf);
+ 			char *pt = buf;
X  
X  			if (l && buf[l-1] == '\n')
X  				buf[l-1] = '\0';
+ 			for (;*pt;pt++)
+ 			    if (*pt == ' ')
+ 				*pt = HISTSPACE;
X  			addnode(histlist,ztrdup(buf));
X  			addnode(lithistlist,ztrdup(buf));
X  			curhist++;
***************
*** 464,479 ****
X  		fclose(in);
X  		lastalloc();
SHAR_EOF
true || echo 'restore of patches failed'
echo 'End of  part 2'
echo 'File patches is continued in part 3'
echo 3 > _shar_seq_.tmp
exit 0
              Paul Falstad  pfalstad@phoenix.princeton.edu
         And on the roads, too, vicious gangs of KEEP LEFT signs!
     If Princeton knew my opinions, they'd have expelled me long ago.

exit 0 # Just in case...
-- 
Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
Sterling Software, IMD           UUCP:     uunet!sparky!kent
Phone:    (402) 291-8300         FAX:      (402) 291-4362
Please send comp.sources.misc-related mail to kent@uunet.uu.net.