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