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