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