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