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