aboutsummaryrefslogtreecommitdiff
path: root/shells/v7sh/files/patch-args.c
diff options
context:
space:
mode:
Diffstat (limited to 'shells/v7sh/files/patch-args.c')
-rw-r--r--shells/v7sh/files/patch-args.c168
1 files changed, 168 insertions, 0 deletions
diff --git a/shells/v7sh/files/patch-args.c b/shells/v7sh/files/patch-args.c
new file mode 100644
index 000000000000..f7ba2a806d74
--- /dev/null
+++ b/shells/v7sh/files/patch-args.c
@@ -0,0 +1,168 @@
+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
+--- args.c.orig Fri Jun 4 02:51:00 2004
++++ args.c Sat Jun 19 18:42:21 2004
+@@ -9,24 +9,24 @@
+
+ #include "defs.h"
+
+-PROC STRING *copyargs();
++LOCAL DOLPTR copyargs(STRING *, INT);
+ LOCAL DOLPTR dolh;
+
+ CHAR flagadr[10];
+-
+ CHAR flagchar[] = {
+- 'x', 'n', 'v', 't', 's', 'i', 'e', 'r', 'k', 'u', 0
++ 'x', 'n', 'v', 't', STDFLG, 'i', 'e', 'r', 'k', 'u', 0
+ };
+ INT flagval[] = {
+ execpr, noexec, readpr, oneflg, stdflg, intflg, errflg, rshflg, keyflg, setflg, 0
+ };
++DOLPTR argfor;
+
+ /* ======== option handling ======== */
+
+
+ INT options(argc,argv)
+- STRING *argv;
+ INT argc;
++ STRING *argv;
+ {
+ REG STRING cp;
+ REG STRING *argp=argv;
+@@ -34,21 +34,66 @@
+ STRING flagp;
+
+ IF argc>1 ANDF *argp[1]=='-'
++#if defined(SYSIII)
++ THEN
++ IF argp[1][1] == '-'
++ THEN /* if first argument is "--" then options are not
++ to be changed Fix for problems getting
++ $1 starting with a "-"
++ */
++ argp[1] = argp[0]; argc--;
++ return(argc);
++ FI
++ cp = argp[1];
++ IF cp[1] == '\0' THEN flags &= ~(execpr|readpr) FI
++ /* Step along 'flagchar[]' looking for matches.
++ 'sicr' are not legal with 'set' command.
++ */
++#else /* V7 */
+ THEN cp=argp[1];
+ flags &= ~(execpr|readpr);
++#endif
+ WHILE *++cp
+ DO flagc=flagchar;
+
+ WHILE *flagc ANDF *flagc != *cp DO flagc++ OD
+ IF *cp == *flagc
++#if defined(SYSIII)
++ THEN IF eq(argv[0], "set") ANDF any(*cp, "sicr")
++ THEN failed(argv[1], badopt);
++ /*NOTREACHED*/
++ ELSE flags |= flagval[flagc-flagchar];
++ FI
++#else /* V7 */
+ THEN flags |= flagval[flagc-flagchar];
++#endif
+ ELIF *cp=='c' ANDF argc>2 ANDF comdiv==0
+ THEN comdiv=argp[2];
+ argp[1]=argp[0]; argp++; argc--;
+ ELSE failed(argv[1],badopt);
++ /*NOTREACHED*/
++ FI
++ OD
++ argp[1]=argp[0]; argc--;
++#if defined(SYSIII)
++ ELIF argc >1 ANDF *argp[1]=='+' /* unset flags x, k, t, n, v, e, u */
++ THEN cp = argp[1];
++ WHILE *++cp
++ DO
++ flagc = flagchar;
++ WHILE *flagc ANDF *flagc != *cp DO flagc++ OD
++ /* step through flags */
++ IF !any(*cp, "csir") ANDF *cp == *flagc
++ THEN
++ IF (flags&flagval[flagc-flagchar])
++ /* only turn off if already on */
++ THEN
++ flags &= ~(flagval[flagc-flagchar])
++ FI
+ FI
+ OD
+ argp[1]=argp[0]; argc--;
++#endif
+ FI
+
+ /* set up $- */
+@@ -67,6 +112,7 @@
+
+ VOID setargs(argi)
+ STRING argi[];
++ /* sets up positional parameters */
+ {
+ /* count args */
+ REG STRING *argp=argi;
+@@ -80,45 +126,46 @@
+ assnum(&dolladr,dolc=argn-1);
+ }
+
+-freeargs(blk)
++DOLPTR freeargs(blk)
+ DOLPTR blk;
+ {
+ REG STRING *argp;
+ REG DOLPTR argr=0;
+ REG DOLPTR argblk;
+
+- IF argblk=blk
++ IF (argblk=blk)!=NIL /* GCC */
+ THEN argr = argblk->dolnxt;
+ IF (--argblk->doluse)==0
+- THEN FOR argp=argblk->dolarg; Rcheat(*argp)!=ENDARGS; argp++
+- DO free(*argp) OD
+- free(argblk);
++ THEN FOR argp=(STRING *) argblk->dolarg; Rcheat(*argp)!=ENDARGS; argp++
++ DO free((BLKPTR) *argp) OD
++ free((BLKPTR) argblk);
+ FI
+ FI
+ return(argr);
+ }
+
+-LOCAL STRING * copyargs(from, n)
++LOCAL DOLPTR copyargs(from, n)
+ STRING from[];
++ INT n;
+ {
+- REG STRING * np=alloc(sizeof(STRING*)*n+3*BYTESPERWORD);
+- REG STRING * fp=from;
+- REG STRING * pp=np;
++ REG DOLPTR dp=(DOLPTR) alloc(sizeof(STRING*)*n+3*BYTESPERWORD);
++ REG STRING *np;
++ REG STRING *fp=from;
+
+- np->doluse=1; /* use count */
+- np=np->dolarg;
++ dp->doluse=1; /* use count */
++ np=(STRING *) dp->dolarg;
+ dolv=np;
+
+ WHILE n--
+ DO *np++ = make(*fp++) OD
+ *np++ = ENDARGS;
+- return(pp);
++ return(dp);
+ }
+
+-clearup()
++VOID clearup()
+ {
+ /* force `for' $* lists to go away */
+- WHILE argfor=freeargs(argfor) DONE
++ WHILE (argfor=freeargs(argfor))!=NIL DONE /* GCC */
+
+ /* clean up io files */
+ WHILE pop() DONE