date and time created 83/08/11 20:49:33 by sam
[unix-history] / usr / src / old / sh / args.c
CommitLineData
f6227721
SL
1#ifndef lint
2static char sccsid[] = "@(#)args.c 4.2 %G%";
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[] = {
22 'x', 'n', 'v', 't', 's', 'i', 'e', 'r', 'k', 'u', 0
23};
24INT flagval[] = {
25 execpr, noexec, readpr, oneflg, stdflg, intflg, errflg, rshflg, keyflg, setflg, 0
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
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
72VOID 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
87freeargs(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
105LOCAL STRING * copyargs(from, n)
106 STRING from[];
107{
108 REG STRING * np=alloc(sizeof(STRING*)*n+3*BYTESPERWORD);
109 REG STRING * fp=from;
110 REG STRING * pp=np;
111
112 np->doluse=1; /* use count */
113 np=np->dolarg;
114 dolv=np;
115
116 WHILE n--
117 DO *np++ = make(*fp++) OD
118 *np++ = ENDARGS;
119 return(pp);
120}
121
122clearup()
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
131DOLPTR useargs()
132{
133 IF dolh
134 THEN dolh->doluse++;
135 dolh->dolnxt=argfor;
136 return(argfor=dolh);
137 ELSE return(0);
138 FI
139}