114477Ssam #ifndef lint
2*34082Sbostic static char sccsid[] = "@(#)args.c 4.5 04/24/88";
314477Ssam #endif
46681Smckusick
56681Smckusick #
66681Smckusick /*
76681Smckusick * UNIX shell
86681Smckusick *
96681Smckusick * S. R. Bourne
106681Smckusick * Bell Telephone Laboratories
116681Smckusick *
126681Smckusick */
136681Smckusick
146681Smckusick #include "defs.h"
156681Smckusick
16*34082Sbostic PROC DOLPTR copyargs();
176681Smckusick LOCAL DOLPTR dolh;
186681Smckusick
196681Smckusick CHAR flagadr[10];
206681Smckusick
216681Smckusick CHAR flagchar[] = {
2224112Sbloom 'x', 'n', 'v', 't', 's', 'i', 'e', 'r', 'k', 'u', 0
236681Smckusick };
246681Smckusick INT flagval[] = {
2524112Sbloom execpr, noexec, readpr, oneflg, stdflg, intflg, errflg, rshflg, keyflg, setflg, 0
266681Smckusick };
276681Smckusick
286681Smckusick /* ======== option handling ======== */
296681Smckusick
306681Smckusick
options(argc,argv)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
setargs(argi)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
freeargs(blk)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
copyargs(from,n)105*34082Sbostic LOCAL DOLPTR copyargs(from, n)
1066681Smckusick STRING from[];
1076681Smckusick {
108*34082Sbostic REG DOLPTR dp=alloc(sizeof(STRING*)*n+3*BYTESPERWORD);
109*34082Sbostic REG STRING * np;
1106681Smckusick REG STRING * fp=from;
1116681Smckusick
112*34082Sbostic dp->doluse=1; /* use count */
113*34082Sbostic np=dp->dolarg;
1146681Smckusick dolv=np;
1156681Smckusick
1166681Smckusick WHILE n--
1176681Smckusick DO *np++ = make(*fp++) OD
1186681Smckusick *np++ = ENDARGS;
119*34082Sbostic return(dp);
1206681Smckusick }
1216681Smckusick
clearup()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
useargs()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