xref: /csrg-svn/old/sh/name.c (revision 60176)
114478Ssam #ifndef lint
2*60176Sbostic static char sccsid[] = "@(#)name.c	4.5 05/21/93";
314478Ssam #endif
46699Smckusick 
5*60176Sbostic #include <unistd.h>
6*60176Sbostic 
76699Smckusick #
86699Smckusick /*
96699Smckusick  * UNIX shell
106699Smckusick  *
116699Smckusick  * S. R. Bourne
126699Smckusick  * Bell Telephone Laboratories
136699Smckusick  *
146699Smckusick  */
156699Smckusick 
166699Smckusick #include	"defs.h"
176699Smckusick 
186699Smckusick PROC BOOL	chkid();
196699Smckusick 
206699Smckusick 
216699Smckusick NAMNOD	ps2nod	= {	NIL,		NIL,		ps2name},
226699Smckusick 	fngnod	= {	NIL,		NIL,		fngname},
236699Smckusick 	pathnod = {	NIL,		NIL,		pathname},
246699Smckusick 	ifsnod	= {	NIL,		NIL,		ifsname},
256699Smckusick 	ps1nod	= {	&pathnod,	&ps2nod,	ps1name},
266699Smckusick 	homenod = {	&fngnod,	&ifsnod,	homename},
276699Smckusick 	mailnod = {	&homenod,	&ps1nod,	mailname};
286699Smckusick 
296699Smckusick NAMPTR		namep = &mailnod;
306699Smckusick 
316699Smckusick 
326699Smckusick /* ========	variable and string handling	======== */
336699Smckusick 
syslook(w,syswds)346699Smckusick syslook(w,syswds)
356699Smckusick 	STRING		w;
366699Smckusick 	SYSTAB		syswds;
376699Smckusick {
386699Smckusick 	REG CHAR	first;
396699Smckusick 	REG STRING	s;
406699Smckusick 	REG SYSPTR	syscan;
416699Smckusick 
426699Smckusick 	syscan=syswds; first = *w;
436699Smckusick 
446699Smckusick 	WHILE s=syscan->sysnam
456699Smckusick 	DO  IF first == *s
466699Smckusick 		ANDF eq(w,s)
476699Smckusick 	    THEN return(syscan->sysval);
486699Smckusick 	    FI
496699Smckusick 	    syscan++;
506699Smckusick 	OD
516699Smckusick 	return(0);
526699Smckusick }
536699Smckusick 
setlist(arg,xp)546699Smckusick setlist(arg,xp)
556699Smckusick 	REG ARGPTR	arg;
566699Smckusick 	INT		xp;
576699Smckusick {
586699Smckusick 	WHILE arg
596699Smckusick 	DO REG STRING	s=mactrim(arg->argval);
606699Smckusick 	   setname(s, xp);
616699Smckusick 	   arg=arg->argnxt;
626699Smckusick 	   IF flags&execpr
636699Smckusick 	   THEN prs(s);
646699Smckusick 		IF arg THEN blank(); ELSE newline(); FI
656699Smckusick 	   FI
666699Smckusick 	OD
676699Smckusick }
686699Smckusick 
setname(argi,xp)696699Smckusick VOID	setname(argi, xp)
706699Smckusick 	STRING		argi;
716699Smckusick 	INT		xp;
726699Smckusick {
736699Smckusick 	REG STRING	argscan=argi;
746699Smckusick 	REG NAMPTR	n;
756699Smckusick 
766699Smckusick 	IF letter(*argscan)
776699Smckusick 	THEN	WHILE alphanum(*argscan) DO argscan++ OD
786699Smckusick 		IF *argscan=='='
796699Smckusick 		THEN	*argscan = 0;
806699Smckusick 			n=lookup(argi);
816699Smckusick 			*argscan++ = '=';
826699Smckusick 			attrib(n, xp);
836699Smckusick 			IF xp&N_ENVNAM
8425357Sbloom 			THEN
8525357Sbloom 				/*
8625357Sbloom 				 * Importing IFS can be very dangerous
8725357Sbloom 				 */
8825357Sbloom 				IF !bcmp(argi, "IFS=", sizeof("IFS=") - 1)
8925357Sbloom 				THEN
9025357Sbloom 					int uid;
9125357Sbloom 					IF (uid = getuid())!=geteuid() ORF !uid
9225357Sbloom 					THEN
9325357Sbloom 						return;
9425357Sbloom 					FI
9525357Sbloom 				FI
9625357Sbloom 				n->namenv = n->namval = argscan;
976699Smckusick 			ELSE	assign(n, argscan);
986699Smckusick 			FI
996699Smckusick 			return;
1006699Smckusick 		FI
1016699Smckusick 	FI
1026699Smckusick 	failed(argi,notid);
1036699Smckusick }
1046699Smckusick 
replace(a,v)1056699Smckusick replace(a, v)
1066699Smckusick 	REG STRING	*a;
1076699Smckusick 	STRING		v;
1086699Smckusick {
1096699Smckusick 	free(*a); *a=make(v);
1106699Smckusick }
1116699Smckusick 
dfault(n,v)1126699Smckusick dfault(n,v)
1136699Smckusick 	NAMPTR		n;
1146699Smckusick 	STRING		v;
1156699Smckusick {
1166699Smckusick 	IF n->namval==0
1176699Smckusick 	THEN	assign(n,v)
1186699Smckusick 	FI
1196699Smckusick }
1206699Smckusick 
assign(n,v)1216699Smckusick assign(n,v)
1226699Smckusick 	NAMPTR		n;
1236699Smckusick 	STRING		v;
1246699Smckusick {
1256699Smckusick 	IF n->namflg&N_RDONLY
1266699Smckusick 	THEN	failed(n->namid,wtfailed);
1276699Smckusick 	ELSE	replace(&n->namval,v);
1286699Smckusick 	FI
1296699Smckusick }
1306699Smckusick 
readvar(names)1316699Smckusick INT	readvar(names)
1326699Smckusick 	STRING		*names;
1336699Smckusick {
1346699Smckusick 	FILEBLK		fb;
1356699Smckusick 	REG FILE	f = &fb;
1366699Smckusick 	REG CHAR	c;
1376699Smckusick 	REG INT		rc=0;
1386699Smckusick 	NAMPTR		n=lookup(*names++); /* done now to avoid storage mess */
1396699Smckusick 	STKPTR		rel=relstak();
1406699Smckusick 
1416699Smckusick 	push(f); initf(dup(0));
1426699Smckusick 	IF lseek(0,0L,1)==-1
1436699Smckusick 	THEN	f->fsiz=1;
1446699Smckusick 	FI
1456699Smckusick 
1466699Smckusick 	LOOP	c=nextc(0);
1476699Smckusick 		IF (*names ANDF any(c, ifsnod.namval)) ORF eolchar(c)
1486699Smckusick 		THEN	zerostak();
1496699Smckusick 			assign(n,absstak(rel)); setstak(rel);
1506699Smckusick 			IF *names
1516699Smckusick 			THEN	n=lookup(*names++);
1526699Smckusick 			ELSE	n=0;
1536699Smckusick 			FI
1546699Smckusick 			IF eolchar(c)
1556699Smckusick 			THEN	break;
1566699Smckusick 			FI
1576699Smckusick 		ELSE	pushstak(c);
1586699Smckusick 		FI
1596699Smckusick 	POOL
1606699Smckusick 	WHILE n
1616699Smckusick 	DO assign(n, nullstr);
1626699Smckusick 	   IF *names THEN n=lookup(*names++); ELSE n=0; FI
1636699Smckusick 	OD
1646699Smckusick 
1656699Smckusick 	IF eof THEN rc=1 FI
1666699Smckusick 	lseek(0, (long)(f->fnxt-f->fend), 1);
1676699Smckusick 	pop();
1686699Smckusick 	return(rc);
1696699Smckusick }
1706699Smckusick 
assnum(p,i)1716699Smckusick assnum(p, i)
1726699Smckusick 	STRING		*p;
1736699Smckusick 	INT		i;
1746699Smckusick {
1756699Smckusick 	itos(i); replace(p,numbuf);
1766699Smckusick }
1776699Smckusick 
make(v)1786699Smckusick STRING	make(v)
1796699Smckusick 	STRING		v;
1806699Smckusick {
1816699Smckusick 	REG STRING	p;
1826699Smckusick 
1836699Smckusick 	IF v
1846699Smckusick 	THEN	movstr(v,p=alloc(length(v)));
1856699Smckusick 		return(p);
1866699Smckusick 	ELSE	return(0);
1876699Smckusick 	FI
1886699Smckusick }
1896699Smckusick 
1906699Smckusick 
lookup(nam)1916699Smckusick NAMPTR		lookup(nam)
1926699Smckusick 	REG STRING	nam;
1936699Smckusick {
1946699Smckusick 	REG NAMPTR	nscan=namep;
1956699Smckusick 	REG NAMPTR	*prev;
1966699Smckusick 	INT		LR;
1976699Smckusick 
1986699Smckusick 	IF !chkid(nam)
1996699Smckusick 	THEN	failed(nam,notid);
2006699Smckusick 	FI
2016699Smckusick 	WHILE nscan
2026699Smckusick 	DO	IF (LR=cf(nam,nscan->namid))==0
2036699Smckusick 		THEN	return(nscan);
2046699Smckusick 		ELIF LR<0
2056699Smckusick 		THEN	prev = &(nscan->namlft);
2066699Smckusick 		ELSE	prev = &(nscan->namrgt);
2076699Smckusick 		FI
2086699Smckusick 		nscan = *prev;
2096699Smckusick 	OD
2106699Smckusick 
2116699Smckusick 	/* add name node */
2126699Smckusick 	nscan=alloc(sizeof *nscan);
2136699Smckusick 	nscan->namlft=nscan->namrgt=NIL;
2146699Smckusick 	nscan->namid=make(nam);
2156699Smckusick 	nscan->namval=0; nscan->namflg=N_DEFAULT; nscan->namenv=0;
2166699Smckusick 	return(*prev = nscan);
2176699Smckusick }
2186699Smckusick 
chkid(nam)2196699Smckusick LOCAL BOOL	chkid(nam)
2206699Smckusick 	STRING		nam;
2216699Smckusick {
2226699Smckusick 	REG CHAR *	cp=nam;
2236699Smckusick 
2246699Smckusick 	IF !letter(*cp)
2256699Smckusick 	THEN	return(FALSE);
2266699Smckusick 	ELSE	WHILE *++cp
2276699Smckusick 		DO IF !alphanum(*cp)
2286699Smckusick 		   THEN	return(FALSE);
2296699Smckusick 		   FI
2306699Smckusick 		OD
2316699Smckusick 	FI
2326699Smckusick 	return(TRUE);
2336699Smckusick }
2346699Smckusick 
2356699Smckusick LOCAL VOID (*namfn)();
2366699Smckusick namscan(fn)
2376699Smckusick 	VOID		(*fn)();
2386699Smckusick {
2396699Smckusick 	namfn=fn;
2406699Smckusick 	namwalk(namep);
2416699Smckusick }
2426699Smckusick 
namwalk(np)2436699Smckusick LOCAL VOID	namwalk(np)
2446699Smckusick 	REG NAMPTR	np;
2456699Smckusick {
2466699Smckusick 	IF np
2476699Smckusick 	THEN	namwalk(np->namlft);
2486699Smckusick 		(*namfn)(np);
2496699Smckusick 		namwalk(np->namrgt);
2506699Smckusick 	FI
2516699Smckusick }
2526699Smckusick 
printnam(n)2536699Smckusick VOID	printnam(n)
2546699Smckusick 	NAMPTR		n;
2556699Smckusick {
2566699Smckusick 	REG STRING	s;
2576699Smckusick 
2586699Smckusick 	sigchk();
2596699Smckusick 	IF s=n->namval
2606699Smckusick 	THEN	prs(n->namid);
2616699Smckusick 		prc('='); prs(s);
2626699Smckusick 		newline();
2636699Smckusick 	FI
2646699Smckusick }
2656699Smckusick 
staknam(n)2666699Smckusick LOCAL STRING	staknam(n)
2676699Smckusick 	REG NAMPTR	n;
2686699Smckusick {
2696699Smckusick 	REG STRING	p;
2706699Smckusick 
2716699Smckusick 	p=movstr(n->namid,staktop);
2726699Smckusick 	p=movstr("=",p);
2736699Smckusick 	p=movstr(n->namval,p);
2746699Smckusick 	return(getstak(p+1-ADR(stakbot)));
2756699Smckusick }
2766699Smckusick 
exname(n)2776699Smckusick VOID	exname(n)
2786699Smckusick 	REG NAMPTR	n;
2796699Smckusick {
2806699Smckusick 	IF n->namflg&N_EXPORT
2816699Smckusick 	THEN	free(n->namenv);
2826699Smckusick 		n->namenv = make(n->namval);
2836699Smckusick 	ELSE	free(n->namval);
2846699Smckusick 		n->namval = make(n->namenv);
2856699Smckusick 	FI
2866699Smckusick }
2876699Smckusick 
printflg(n)2886699Smckusick VOID	printflg(n)
2896699Smckusick 	REG NAMPTR		n;
2906699Smckusick {
2916699Smckusick 	IF n->namflg&N_EXPORT
2926699Smckusick 	THEN	prs(export); blank();
2936699Smckusick 	FI
2946699Smckusick 	IF n->namflg&N_RDONLY
2956699Smckusick 	THEN	prs(readonly); blank();
2966699Smckusick 	FI
2976699Smckusick 	IF n->namflg&(N_EXPORT|N_RDONLY)
2986699Smckusick 	THEN	prs(n->namid); newline();
2996699Smckusick 	FI
3006699Smckusick }
3016699Smckusick 
setupenv()30218427Smckusick VOID	setupenv()
3036699Smckusick {
3046699Smckusick 	REG STRING	*e=environ;
3056699Smckusick 
3066699Smckusick 	WHILE *e
3076699Smckusick 	DO setname(*e++, N_ENVNAM) OD
3086699Smckusick }
3096699Smckusick 
3106699Smckusick LOCAL INT	namec;
3116699Smckusick 
countnam(n)3126699Smckusick VOID	countnam(n)
3136699Smckusick 	NAMPTR		n;
3146699Smckusick {
3156699Smckusick 	namec++;
3166699Smckusick }
3176699Smckusick 
3186699Smckusick LOCAL STRING 	*argnam;
3196699Smckusick 
pushnam(n)3206699Smckusick VOID	pushnam(n)
3216699Smckusick 	NAMPTR		n;
3226699Smckusick {
3236699Smckusick 	IF n->namval
3246699Smckusick 	THEN	*argnam++ = staknam(n);
3256699Smckusick 	FI
3266699Smckusick }
3276699Smckusick 
setenv()3286699Smckusick STRING	*setenv()
3296699Smckusick {
3306699Smckusick 	REG STRING	*er;
3316699Smckusick 
3326699Smckusick 	namec=0;
3336699Smckusick 	namscan(countnam);
3346699Smckusick 	argnam = er = getstak(namec*BYTESPERWORD+BYTESPERWORD);
3356699Smckusick 	namscan(pushnam);
3366699Smckusick 	*argnam++ = 0;
3376699Smckusick 	return(er);
3386699Smckusick }
339