xref: /csrg-svn/old/sh/args.c (revision 6681)
1*6681Smckusick /*	args.c	4.1	82/05/07	*/
2*6681Smckusick 
3*6681Smckusick #
4*6681Smckusick /*
5*6681Smckusick  * UNIX shell
6*6681Smckusick  *
7*6681Smckusick  * S. R. Bourne
8*6681Smckusick  * Bell Telephone Laboratories
9*6681Smckusick  *
10*6681Smckusick  */
11*6681Smckusick 
12*6681Smckusick #include	"defs.h"
13*6681Smckusick 
14*6681Smckusick PROC STRING *copyargs();
15*6681Smckusick LOCAL DOLPTR	dolh;
16*6681Smckusick 
17*6681Smckusick CHAR	flagadr[10];
18*6681Smckusick 
19*6681Smckusick CHAR	flagchar[] = {
20*6681Smckusick 	'x',	'n',	'v',	't',	's',	'i',	'e',	'r',	'k',	'u',	0
21*6681Smckusick };
22*6681Smckusick INT	flagval[]  = {
23*6681Smckusick 	execpr,	noexec,	readpr,	oneflg,	stdflg,	intflg,	errflg,	rshflg,	keyflg,	setflg,	0
24*6681Smckusick };
25*6681Smckusick 
26*6681Smckusick /* ========	option handling	======== */
27*6681Smckusick 
28*6681Smckusick 
29*6681Smckusick INT	options(argc,argv)
30*6681Smckusick 	STRING		*argv;
31*6681Smckusick 	INT		argc;
32*6681Smckusick {
33*6681Smckusick 	REG STRING	cp;
34*6681Smckusick 	REG STRING	*argp=argv;
35*6681Smckusick 	REG STRING	flagc;
36*6681Smckusick 	STRING		flagp;
37*6681Smckusick 
38*6681Smckusick 	IF argc>1 ANDF *argp[1]=='-'
39*6681Smckusick 	THEN	cp=argp[1];
40*6681Smckusick 		flags &= ~(execpr|readpr);
41*6681Smckusick 		WHILE *++cp
42*6681Smckusick 		DO	flagc=flagchar;
43*6681Smckusick 
44*6681Smckusick 			WHILE *flagc ANDF *flagc != *cp DO flagc++ OD
45*6681Smckusick 			IF *cp == *flagc
46*6681Smckusick 			THEN	flags |= flagval[flagc-flagchar];
47*6681Smckusick 			ELIF *cp=='c' ANDF argc>2 ANDF comdiv==0
48*6681Smckusick 			THEN	comdiv=argp[2];
49*6681Smckusick 				argp[1]=argp[0]; argp++; argc--;
50*6681Smckusick 			ELSE	failed(argv[1],badopt);
51*6681Smckusick 			FI
52*6681Smckusick 		OD
53*6681Smckusick 		argp[1]=argp[0]; argc--;
54*6681Smckusick 	FI
55*6681Smckusick 
56*6681Smckusick 	/* set up $- */
57*6681Smckusick 	flagc=flagchar;
58*6681Smckusick 	flagp=flagadr;
59*6681Smckusick 	WHILE *flagc
60*6681Smckusick 	DO IF flags&flagval[flagc-flagchar]
61*6681Smckusick 	   THEN *flagp++ = *flagc;
62*6681Smckusick 	   FI
63*6681Smckusick 	   flagc++;
64*6681Smckusick 	OD
65*6681Smckusick 	*flagp++=0;
66*6681Smckusick 
67*6681Smckusick 	return(argc);
68*6681Smckusick }
69*6681Smckusick 
70*6681Smckusick VOID	setargs(argi)
71*6681Smckusick 	STRING		argi[];
72*6681Smckusick {
73*6681Smckusick 	/* count args */
74*6681Smckusick 	REG STRING	*argp=argi;
75*6681Smckusick 	REG INT		argn=0;
76*6681Smckusick 
77*6681Smckusick 	WHILE Rcheat(*argp++)!=ENDARGS DO argn++ OD
78*6681Smckusick 
79*6681Smckusick 	/* free old ones unless on for loop chain */
80*6681Smckusick 	freeargs(dolh);
81*6681Smckusick 	dolh=copyargs(argi,argn);	/* sets dolv */
82*6681Smckusick 	assnum(&dolladr,dolc=argn-1);
83*6681Smckusick }
84*6681Smckusick 
85*6681Smckusick freeargs(blk)
86*6681Smckusick 	DOLPTR		blk;
87*6681Smckusick {
88*6681Smckusick 	REG STRING	*argp;
89*6681Smckusick 	REG DOLPTR	argr=0;
90*6681Smckusick 	REG DOLPTR	argblk;
91*6681Smckusick 
92*6681Smckusick 	IF argblk=blk
93*6681Smckusick 	THEN	argr = argblk->dolnxt;
94*6681Smckusick 		IF (--argblk->doluse)==0
95*6681Smckusick 		THEN	FOR argp=argblk->dolarg; Rcheat(*argp)!=ENDARGS; argp++
96*6681Smckusick 			DO free(*argp) OD
97*6681Smckusick 			free(argblk);
98*6681Smckusick 		FI
99*6681Smckusick 	FI
100*6681Smckusick 	return(argr);
101*6681Smckusick }
102*6681Smckusick 
103*6681Smckusick LOCAL STRING *	copyargs(from, n)
104*6681Smckusick 	STRING		from[];
105*6681Smckusick {
106*6681Smckusick 	REG STRING *	np=alloc(sizeof(STRING*)*n+3*BYTESPERWORD);
107*6681Smckusick 	REG STRING *	fp=from;
108*6681Smckusick 	REG STRING *	pp=np;
109*6681Smckusick 
110*6681Smckusick 	np->doluse=1;	/* use count */
111*6681Smckusick 	np=np->dolarg;
112*6681Smckusick 	dolv=np;
113*6681Smckusick 
114*6681Smckusick 	WHILE n--
115*6681Smckusick 	DO *np++ = make(*fp++) OD
116*6681Smckusick 	*np++ = ENDARGS;
117*6681Smckusick 	return(pp);
118*6681Smckusick }
119*6681Smckusick 
120*6681Smckusick clearup()
121*6681Smckusick {
122*6681Smckusick 	/* force `for' $* lists to go away */
123*6681Smckusick 	WHILE argfor=freeargs(argfor) DONE
124*6681Smckusick 
125*6681Smckusick 	/* clean up io files */
126*6681Smckusick 	WHILE pop() DONE
127*6681Smckusick }
128*6681Smckusick 
129*6681Smckusick DOLPTR	useargs()
130*6681Smckusick {
131*6681Smckusick 	IF dolh
132*6681Smckusick 	THEN	dolh->doluse++;
133*6681Smckusick 		dolh->dolnxt=argfor;
134*6681Smckusick 		return(argfor=dolh);
135*6681Smckusick 	ELSE	return(0);
136*6681Smckusick 	FI
137*6681Smckusick }
138