xref: /csrg-svn/old/sh/args.c (revision 34082)
114477Ssam #ifndef lint
2*34082Sbostic static char sccsid[] = "@(#)args.c	4.5 04/24/88";
314477Ssam #endif
46681Smckusick 
56681Smckusick #
66681Smckusick /*
76681Smckusick  * UNIX shell
86681Smckusick  *
96681Smckusick  * S. R. Bourne
106681Smckusick  * Bell Telephone Laboratories
116681Smckusick  *
126681Smckusick  */
136681Smckusick 
146681Smckusick #include	"defs.h"
156681Smckusick 
16*34082Sbostic PROC DOLPTR copyargs();
176681Smckusick LOCAL DOLPTR	dolh;
186681Smckusick 
196681Smckusick CHAR	flagadr[10];
206681Smckusick 
216681Smckusick CHAR	flagchar[] = {
2224112Sbloom 	'x',	'n',	'v',	't',	's',	'i',	'e',	'r',	'k',	'u',	0
236681Smckusick };
246681Smckusick INT	flagval[]  = {
2524112Sbloom 	execpr,	noexec,	readpr,	oneflg,	stdflg,	intflg,	errflg,	rshflg,	keyflg,	setflg,	0
266681Smckusick };
276681Smckusick 
286681Smckusick /* ========	option handling	======== */
296681Smckusick 
306681Smckusick 
options(argc,argv)316681Smckusick INT	options(argc,argv)
326681Smckusick 	STRING		*argv;
336681Smckusick 	INT		argc;
346681Smckusick {
356681Smckusick 	REG STRING	cp;
366681Smckusick 	REG STRING	*argp=argv;
376681Smckusick 	REG STRING	flagc;
386681Smckusick 	STRING		flagp;
396681Smckusick 
406681Smckusick 	IF argc>1 ANDF *argp[1]=='-'
416681Smckusick 	THEN	cp=argp[1];
426681Smckusick 		flags &= ~(execpr|readpr);
436681Smckusick 		WHILE *++cp
446681Smckusick 		DO	flagc=flagchar;
456681Smckusick 
466681Smckusick 			WHILE *flagc ANDF *flagc != *cp DO flagc++ OD
476681Smckusick 			IF *cp == *flagc
486681Smckusick 			THEN	flags |= flagval[flagc-flagchar];
496681Smckusick 			ELIF *cp=='c' ANDF argc>2 ANDF comdiv==0
506681Smckusick 			THEN	comdiv=argp[2];
516681Smckusick 				argp[1]=argp[0]; argp++; argc--;
526681Smckusick 			ELSE	failed(argv[1],badopt);
536681Smckusick 			FI
546681Smckusick 		OD
556681Smckusick 		argp[1]=argp[0]; argc--;
566681Smckusick 	FI
576681Smckusick 
586681Smckusick 	/* set up $- */
596681Smckusick 	flagc=flagchar;
606681Smckusick 	flagp=flagadr;
616681Smckusick 	WHILE *flagc
626681Smckusick 	DO IF flags&flagval[flagc-flagchar]
636681Smckusick 	   THEN *flagp++ = *flagc;
646681Smckusick 	   FI
656681Smckusick 	   flagc++;
666681Smckusick 	OD
676681Smckusick 	*flagp++=0;
686681Smckusick 
696681Smckusick 	return(argc);
706681Smckusick }
716681Smckusick 
setargs(argi)726681Smckusick VOID	setargs(argi)
736681Smckusick 	STRING		argi[];
746681Smckusick {
756681Smckusick 	/* count args */
766681Smckusick 	REG STRING	*argp=argi;
776681Smckusick 	REG INT		argn=0;
786681Smckusick 
796681Smckusick 	WHILE Rcheat(*argp++)!=ENDARGS DO argn++ OD
806681Smckusick 
816681Smckusick 	/* free old ones unless on for loop chain */
826681Smckusick 	freeargs(dolh);
836681Smckusick 	dolh=copyargs(argi,argn);	/* sets dolv */
846681Smckusick 	assnum(&dolladr,dolc=argn-1);
856681Smckusick }
866681Smckusick 
freeargs(blk)876681Smckusick freeargs(blk)
886681Smckusick 	DOLPTR		blk;
896681Smckusick {
906681Smckusick 	REG STRING	*argp;
916681Smckusick 	REG DOLPTR	argr=0;
926681Smckusick 	REG DOLPTR	argblk;
936681Smckusick 
946681Smckusick 	IF argblk=blk
956681Smckusick 	THEN	argr = argblk->dolnxt;
966681Smckusick 		IF (--argblk->doluse)==0
976681Smckusick 		THEN	FOR argp=argblk->dolarg; Rcheat(*argp)!=ENDARGS; argp++
986681Smckusick 			DO free(*argp) OD
996681Smckusick 			free(argblk);
1006681Smckusick 		FI
1016681Smckusick 	FI
1026681Smckusick 	return(argr);
1036681Smckusick }
1046681Smckusick 
copyargs(from,n)105*34082Sbostic LOCAL DOLPTR	copyargs(from, n)
1066681Smckusick 	STRING		from[];
1076681Smckusick {
108*34082Sbostic 	REG DOLPTR	dp=alloc(sizeof(STRING*)*n+3*BYTESPERWORD);
109*34082Sbostic 	REG STRING *	np;
1106681Smckusick 	REG STRING *	fp=from;
1116681Smckusick 
112*34082Sbostic 	dp->doluse=1;	/* use count */
113*34082Sbostic 	np=dp->dolarg;
1146681Smckusick 	dolv=np;
1156681Smckusick 
1166681Smckusick 	WHILE n--
1176681Smckusick 	DO *np++ = make(*fp++) OD
1186681Smckusick 	*np++ = ENDARGS;
119*34082Sbostic 	return(dp);
1206681Smckusick }
1216681Smckusick 
clearup()1226681Smckusick clearup()
1236681Smckusick {
1246681Smckusick 	/* force `for' $* lists to go away */
1256681Smckusick 	WHILE argfor=freeargs(argfor) DONE
1266681Smckusick 
1276681Smckusick 	/* clean up io files */
1286681Smckusick 	WHILE pop() DONE
1296681Smckusick }
1306681Smckusick 
useargs()1316681Smckusick DOLPTR	useargs()
1326681Smckusick {
1336681Smckusick 	IF dolh
1346681Smckusick 	THEN	dolh->doluse++;
1356681Smckusick 		dolh->dolnxt=argfor;
1366681Smckusick 		return(argfor=dolh);
1376681Smckusick 	ELSE	return(0);
1386681Smckusick 	FI
1396681Smckusick }
140