1*14477Ssam #ifndef lint 2*14477Ssam static char sccsid[] = "@(#)args.c 4.2 08/11/83"; 3*14477Ssam #endif 46681Smckusick 56681Smckusick # 66681Smckusick /* 76681Smckusick * UNIX shell 86681Smckusick * 96681Smckusick * S. R. Bourne 106681Smckusick * Bell Telephone Laboratories 116681Smckusick * 126681Smckusick */ 136681Smckusick 146681Smckusick #include "defs.h" 156681Smckusick 166681Smckusick PROC STRING *copyargs(); 176681Smckusick LOCAL DOLPTR dolh; 186681Smckusick 196681Smckusick CHAR flagadr[10]; 206681Smckusick 216681Smckusick CHAR flagchar[] = { 226681Smckusick 'x', 'n', 'v', 't', 's', 'i', 'e', 'r', 'k', 'u', 0 236681Smckusick }; 246681Smckusick INT flagval[] = { 256681Smckusick execpr, noexec, readpr, oneflg, stdflg, intflg, errflg, rshflg, keyflg, setflg, 0 266681Smckusick }; 276681Smckusick 286681Smckusick /* ======== option handling ======== */ 296681Smckusick 306681Smckusick 316681Smckusick INT options(argc,argv) 326681Smckusick STRING *argv; 336681Smckusick INT argc; 346681Smckusick { 356681Smckusick REG STRING cp; 366681Smckusick REG STRING *argp=argv; 376681Smckusick REG STRING flagc; 386681Smckusick STRING flagp; 396681Smckusick 406681Smckusick IF argc>1 ANDF *argp[1]=='-' 416681Smckusick THEN cp=argp[1]; 426681Smckusick flags &= ~(execpr|readpr); 436681Smckusick WHILE *++cp 446681Smckusick DO flagc=flagchar; 456681Smckusick 466681Smckusick WHILE *flagc ANDF *flagc != *cp DO flagc++ OD 476681Smckusick IF *cp == *flagc 486681Smckusick THEN flags |= flagval[flagc-flagchar]; 496681Smckusick ELIF *cp=='c' ANDF argc>2 ANDF comdiv==0 506681Smckusick THEN comdiv=argp[2]; 516681Smckusick argp[1]=argp[0]; argp++; argc--; 526681Smckusick ELSE failed(argv[1],badopt); 536681Smckusick FI 546681Smckusick OD 556681Smckusick argp[1]=argp[0]; argc--; 566681Smckusick FI 576681Smckusick 586681Smckusick /* set up $- */ 596681Smckusick flagc=flagchar; 606681Smckusick flagp=flagadr; 616681Smckusick WHILE *flagc 626681Smckusick DO IF flags&flagval[flagc-flagchar] 636681Smckusick THEN *flagp++ = *flagc; 646681Smckusick FI 656681Smckusick flagc++; 666681Smckusick OD 676681Smckusick *flagp++=0; 686681Smckusick 696681Smckusick return(argc); 706681Smckusick } 716681Smckusick 726681Smckusick VOID setargs(argi) 736681Smckusick STRING argi[]; 746681Smckusick { 756681Smckusick /* count args */ 766681Smckusick REG STRING *argp=argi; 776681Smckusick REG INT argn=0; 786681Smckusick 796681Smckusick WHILE Rcheat(*argp++)!=ENDARGS DO argn++ OD 806681Smckusick 816681Smckusick /* free old ones unless on for loop chain */ 826681Smckusick freeargs(dolh); 836681Smckusick dolh=copyargs(argi,argn); /* sets dolv */ 846681Smckusick assnum(&dolladr,dolc=argn-1); 856681Smckusick } 866681Smckusick 876681Smckusick freeargs(blk) 886681Smckusick DOLPTR blk; 896681Smckusick { 906681Smckusick REG STRING *argp; 916681Smckusick REG DOLPTR argr=0; 926681Smckusick REG DOLPTR argblk; 936681Smckusick 946681Smckusick IF argblk=blk 956681Smckusick THEN argr = argblk->dolnxt; 966681Smckusick IF (--argblk->doluse)==0 976681Smckusick THEN FOR argp=argblk->dolarg; Rcheat(*argp)!=ENDARGS; argp++ 986681Smckusick DO free(*argp) OD 996681Smckusick free(argblk); 1006681Smckusick FI 1016681Smckusick FI 1026681Smckusick return(argr); 1036681Smckusick } 1046681Smckusick 1056681Smckusick LOCAL STRING * copyargs(from, n) 1066681Smckusick STRING from[]; 1076681Smckusick { 1086681Smckusick REG STRING * np=alloc(sizeof(STRING*)*n+3*BYTESPERWORD); 1096681Smckusick REG STRING * fp=from; 1106681Smckusick REG STRING * pp=np; 1116681Smckusick 1126681Smckusick np->doluse=1; /* use count */ 1136681Smckusick np=np->dolarg; 1146681Smckusick dolv=np; 1156681Smckusick 1166681Smckusick WHILE n-- 1176681Smckusick DO *np++ = make(*fp++) OD 1186681Smckusick *np++ = ENDARGS; 1196681Smckusick return(pp); 1206681Smckusick } 1216681Smckusick 1226681Smckusick clearup() 1236681Smckusick { 1246681Smckusick /* force `for' $* lists to go away */ 1256681Smckusick WHILE argfor=freeargs(argfor) DONE 1266681Smckusick 1276681Smckusick /* clean up io files */ 1286681Smckusick WHILE pop() DONE 1296681Smckusick } 1306681Smckusick 1316681Smckusick DOLPTR useargs() 1326681Smckusick { 1336681Smckusick IF dolh 1346681Smckusick THEN dolh->doluse++; 1356681Smckusick dolh->dolnxt=argfor; 1366681Smckusick return(argfor=dolh); 1376681Smckusick ELSE return(0); 1386681Smckusick FI 1396681Smckusick } 140