syntax error (from casey)
[unix-history] / usr / src / old / sh / args.c
CommitLineData
f6227721 1#ifndef lint
7406c10f 2static char sccsid[] = "@(#)args.c 4.4 %G%";
f6227721 3#endif
67c48f0a
KM
4
5#
6/*
7 * UNIX shell
8 *
9 * S. R. Bourne
10 * Bell Telephone Laboratories
11 *
12 */
13
14#include "defs.h"
15
16PROC STRING *copyargs();
17LOCAL DOLPTR dolh;
18
19CHAR flagadr[10];
20
21CHAR flagchar[] = {
b363d33e 22 'x', 'n', 'v', 't', 's', 'i', 'e', 'r', 'k', 'u', 'b', 0
67c48f0a
KM
23};
24INT flagval[] = {
b363d33e 25 execpr, noexec, readpr, oneflg, stdflg, intflg, errflg, rshflg, keyflg, setflg, batchflg, 0
67c48f0a
KM
26};
27
28/* ======== option handling ======== */
29
30
31INT 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
b363d33e
S
58 IF !(flags&batchflg) ANDF (getuid()!=geteuid() ORF getgid()!=getegid())
59 THEN
60 failed("sh","Permission denied");
61 FI
62
67c48f0a
KM
63 /* set up $- */
64 flagc=flagchar;
65 flagp=flagadr;
66 WHILE *flagc
67 DO IF flags&flagval[flagc-flagchar]
68 THEN *flagp++ = *flagc;
69 FI
70 flagc++;
71 OD
72 *flagp++=0;
73
74 return(argc);
75}
76
77VOID setargs(argi)
78 STRING argi[];
79{
80 /* count args */
81 REG STRING *argp=argi;
82 REG INT argn=0;
83
84 WHILE Rcheat(*argp++)!=ENDARGS DO argn++ OD
85
86 /* free old ones unless on for loop chain */
87 freeargs(dolh);
88 dolh=copyargs(argi,argn); /* sets dolv */
89 assnum(&dolladr,dolc=argn-1);
90}
91
92freeargs(blk)
93 DOLPTR blk;
94{
95 REG STRING *argp;
96 REG DOLPTR argr=0;
97 REG DOLPTR argblk;
98
99 IF argblk=blk
100 THEN argr = argblk->dolnxt;
101 IF (--argblk->doluse)==0
102 THEN FOR argp=argblk->dolarg; Rcheat(*argp)!=ENDARGS; argp++
103 DO free(*argp) OD
104 free(argblk);
105 FI
106 FI
107 return(argr);
108}
109
110LOCAL STRING * copyargs(from, n)
111 STRING from[];
112{
113 REG STRING * np=alloc(sizeof(STRING*)*n+3*BYTESPERWORD);
114 REG STRING * fp=from;
115 REG STRING * pp=np;
116
117 np->doluse=1; /* use count */
118 np=np->dolarg;
119 dolv=np;
120
121 WHILE n--
122 DO *np++ = make(*fp++) OD
123 *np++ = ENDARGS;
124 return(pp);
125}
126
127clearup()
128{
129 /* force `for' $* lists to go away */
130 WHILE argfor=freeargs(argfor) DONE
131
132 /* clean up io files */
133 WHILE pop() DONE
134}
135
136DOLPTR useargs()
137{
138 IF dolh
139 THEN dolh->doluse++;
140 dolh->dolnxt=argfor;
141 return(argfor=dolh);
142 ELSE return(0);
143 FI
144}