diff options
Diffstat (limited to 'shells/v7sh/files/patch-args.c')
-rw-r--r-- | shells/v7sh/files/patch-args.c | 168 |
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 |