1 diff -u -x CVS -x work -x core -x *.core -x #* -x *~ -x *.orig -x *.rej -I $Id.*$ -I $.+BSD.*$ args.c.orig args.c 2 --- args.c.orig Fri Jun 4 02:51:00 2004 3 +++ args.c Sat Jun 19 18:42:21 2004 4 @@ -9,24 +9,24 @@ 5 6 #include "defs.h" 7 8 -PROC STRING *copyargs(); 9 +LOCAL DOLPTR copyargs(STRING *, INT); 10 LOCAL DOLPTR dolh; 11 12 CHAR flagadr[10]; 13 - 14 CHAR flagchar[] = { 15 - 'x', 'n', 'v', 't', 's', 'i', 'e', 'r', 'k', 'u', 0 16 + 'x', 'n', 'v', 't', STDFLG, 'i', 'e', 'r', 'k', 'u', 0 17 }; 18 INT flagval[] = { 19 execpr, noexec, readpr, oneflg, stdflg, intflg, errflg, rshflg, keyflg, setflg, 0 20 }; 21 +DOLPTR argfor; 22 23 /* ======== option handling ======== */ 24 25 26 INT options(argc,argv) 27 - STRING *argv; 28 INT argc; 29 + STRING *argv; 30 { 31 REG STRING cp; 32 REG STRING *argp=argv; 33 @@ -34,21 +34,66 @@ 34 STRING flagp; 35 36 IF argc>1 ANDF *argp[1]=='-' 37 +#if defined(SYSIII) 38 + THEN 39 + IF argp[1][1] == '-' 40 + THEN /* if first argument is "--" then options are not 41 + to be changed Fix for problems getting 42 + $1 starting with a "-" 43 + */ 44 + argp[1] = argp[0]; argc--; 45 + return(argc); 46 + FI 47 + cp = argp[1]; 48 + IF cp[1] == '\0' THEN flags &= ~(execpr|readpr) FI 49 + /* Step along 'flagchar[]' looking for matches. 50 + 'sicr' are not legal with 'set' command. 51 + */ 52 +#else /* V7 */ 53 THEN cp=argp[1]; 54 flags &= ~(execpr|readpr); 55 +#endif 56 WHILE *++cp 57 DO flagc=flagchar; 58 59 WHILE *flagc ANDF *flagc != *cp DO flagc++ OD 60 IF *cp == *flagc 61 +#if defined(SYSIII) 62 + THEN IF eq(argv[0], "set") ANDF any(*cp, "sicr") 63 + THEN failed(argv[1], badopt); 64 + /*NOTREACHED*/ 65 + ELSE flags |= flagval[flagc-flagchar]; 66 + FI 67 +#else /* V7 */ 68 THEN flags |= flagval[flagc-flagchar]; 69 +#endif 70 ELIF *cp=='c' ANDF argc>2 ANDF comdiv==0 71 THEN comdiv=argp[2]; 72 argp[1]=argp[0]; argp++; argc--; 73 ELSE failed(argv[1],badopt); 74 + /*NOTREACHED*/ 75 + FI 76 + OD 77 + argp[1]=argp[0]; argc--; 78 +#if defined(SYSIII) 79 + ELIF argc >1 ANDF *argp[1]=='+' /* unset flags x, k, t, n, v, e, u */ 80 + THEN cp = argp[1]; 81 + WHILE *++cp 82 + DO 83 + flagc = flagchar; 84 + WHILE *flagc ANDF *flagc != *cp DO flagc++ OD 85 + /* step through flags */ 86 + IF !any(*cp, "csir") ANDF *cp == *flagc 87 + THEN 88 + IF (flags&flagval[flagc-flagchar]) 89 + /* only turn off if already on */ 90 + THEN 91 + flags &= ~(flagval[flagc-flagchar]) 92 + FI 93 FI 94 OD 95 argp[1]=argp[0]; argc--; 96 +#endif 97 FI 98 99 /* set up $- */ 100 @@ -67,6 +112,7 @@ 101 102 VOID setargs(argi) 103 STRING argi[]; 104 + /* sets up positional parameters */ 105 { 106 /* count args */ 107 REG STRING *argp=argi; 108 @@ -80,45 +126,46 @@ 109 assnum(&dolladr,dolc=argn-1); 110 } 111 112 -freeargs(blk) 113 +DOLPTR freeargs(blk) 114 DOLPTR blk; 115 { 116 REG STRING *argp; 117 REG DOLPTR argr=0; 118 REG DOLPTR argblk; 119 120 - IF argblk=blk 121 + IF (argblk=blk)!=NIL /* GCC */ 122 THEN argr = argblk->dolnxt; 123 IF (--argblk->doluse)==0 124 - THEN FOR argp=argblk->dolarg; Rcheat(*argp)!=ENDARGS; argp++ 125 - DO free(*argp) OD 126 - free(argblk); 127 + THEN FOR argp=(STRING *) argblk->dolarg; Rcheat(*argp)!=ENDARGS; argp++ 128 + DO free((BLKPTR) *argp) OD 129 + free((BLKPTR) argblk); 130 FI 131 FI 132 return(argr); 133 } 134 135 -LOCAL STRING * copyargs(from, n) 136 +LOCAL DOLPTR copyargs(from, n) 137 STRING from[]; 138 + INT n; 139 { 140 - REG STRING * np=alloc(sizeof(STRING*)*n+3*BYTESPERWORD); 141 - REG STRING * fp=from; 142 - REG STRING * pp=np; 143 + REG DOLPTR dp=(DOLPTR) alloc(sizeof(STRING*)*n+3*BYTESPERWORD); 144 + REG STRING *np; 145 + REG STRING *fp=from; 146 147 - np->doluse=1; /* use count */ 148 - np=np->dolarg; 149 + dp->doluse=1; /* use count */ 150 + np=(STRING *) dp->dolarg; 151 dolv=np; 152 153 WHILE n-- 154 DO *np++ = make(*fp++) OD 155 *np++ = ENDARGS; 156 - return(pp); 157 + return(dp); 158 } 159 160 -clearup() 161 +VOID clearup() 162 { 163 /* force `for' $* lists to go away */ 164 - WHILE argfor=freeargs(argfor) DONE 165 + WHILE (argfor=freeargs(argfor))!=NIL DONE /* GCC */ 166 167 /* clean up io files */ 168 WHILE pop() DONE 169