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
options(argc,argv)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
setargs(argi)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
freeargs(blk)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
copyargs(from,n)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
clearup()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
useargs()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