diff -urN netbsd-sh/options.c ash-0.3.7.orig/options.c --- netbsd-sh/options.c Fri Jul 9 13:02:07 1999 +++ ash-0.3.7.orig/options.c Mon Apr 23 22:16:46 2001 @@ -79,7 +79,7 @@ STATIC void options __P((int)); STATIC void minus_o __P((char *, int)); STATIC void setoption __P((int, int)); -STATIC int getopts __P((char *, char *, char **, char ***, char **)); +STATIC int getopts __P((char *, char *, char **, int *, int *)); /* @@ -118,7 +118,8 @@ arg0 = *argptr++; shellparam.p = argptr; - shellparam.reset = 1; + shellparam.optind = 1; + shellparam.optoff = -1; /* assert(shellparam.malloc == 0 && shellparam.nparam == 0); */ while (*argptr) { shellparam.nparam++; @@ -282,7 +283,8 @@ shellparam.malloc = 1; shellparam.nparam = nparam; shellparam.p = newparam; - shellparam.optnext = NULL; + shellparam.optind = 1; + shellparam.optoff = -1; } @@ -330,7 +332,8 @@ } ap2 = shellparam.p; while ((*ap2++ = *ap1++) != NULL); - shellparam.optnext = NULL; + shellparam.optind = 1; + shellparam.optoff = -1; INTON; return 0; } @@ -363,10 +366,8 @@ getoptsreset(value) const char *value; { - if (number(value) == 1) { - shellparam.optnext = NULL; - shellparam.reset = 1; - } + shellparam.optind = number(value); + shellparam.optoff = -1; } /* @@ -385,50 +386,58 @@ if (argc < 3) error("Usage: getopts optstring var [arg]"); - else if (argc == 3) + else if (argc == 3) { optbase = shellparam.p; - else + if (shellparam.optind > shellparam.nparam + 1) { + shellparam.optind = 1; + shellparam.optoff = -1; + } + } + else { optbase = &argv[3]; - - if (shellparam.reset == 1) { - shellparam.optnext = optbase; - shellparam.optptr = NULL; - shellparam.reset = 0; + if (shellparam.optind > argc - 2) { + shellparam.optind = 1; + shellparam.optoff = -1; + } } - return getopts(argv[1], argv[2], optbase, &shellparam.optnext, - &shellparam.optptr); + return getopts(argv[1], argv[2], optbase, &shellparam.optind, + &shellparam.optoff); } STATIC int -getopts(optstr, optvar, optfirst, optnext, optpptr) +getopts(optstr, optvar, optfirst, optind, optoff) char *optstr; char *optvar; char **optfirst; - char ***optnext; - char **optpptr; + int *optind; + int *optoff; { char *p, *q; char c = '?'; int done = 0; - int ind = 0; int err = 0; char s[10]; + char **optnext = optfirst + *optind - 1; - if ((p = *optpptr) == NULL || *p == '\0') { + if (*optind <= 1 || *optoff < 0 || !(*(optnext - 1)) || + strlen(*(optnext - 1)) < *optoff) + p = NULL; + else + p = *(optnext - 1) + *optoff; + if (p == NULL || *p == '\0') { /* Current word is done, advance */ - if (*optnext == NULL) + if (optnext == NULL) return 1; - p = **optnext; + p = *optnext; if (p == NULL || *p != '-' || *++p == '\0') { atend: - ind = *optnext - optfirst + 1; - *optnext = NULL; + *optind = optnext - optfirst + 1; p = NULL; done = 1; goto out; } - (*optnext)++; + optnext++; if (p[0] == '-' && p[1] == '\0') /* check for "--" */ goto atend; } @@ -453,7 +462,7 @@ } if (*++q == ':') { - if (*p == '\0' && (p = **optnext) == NULL) { + if (*p == '\0' && (p = *optnext) == NULL) { if (optstr[0] == ':') { s[0] = c; s[1] = '\0'; @@ -468,30 +477,29 @@ goto bad; } - if (p == **optnext) - (*optnext)++; + if (p == *optnext) + optnext++; setvarsafe("OPTARG", p, 0); p = NULL; } else setvarsafe("OPTARG", "", 0); - ind = *optnext - optfirst + 1; + *optind = optnext - optfirst + 1; goto out; bad: - ind = 1; - *optnext = NULL; + *optind = 1; p = NULL; out: - *optpptr = p; - fmtstr(s, sizeof(s), "%d", ind); + *optoff = p ? p - *(optnext - 1) : -1; + fmtstr(s, sizeof(s), "%d", *optind); err |= setvarsafe("OPTIND", s, VNOFUNC); s[0] = c; s[1] = '\0'; err |= setvarsafe(optvar, s, 0); if (err) { - *optnext = NULL; - *optpptr = NULL; + *optind = 1; + *optoff = -1; flushall(); exraise(EXERROR); } diff -urN netbsd-sh/options.h ash-0.3.7.orig/options.h --- netbsd-sh/options.h Fri Jul 9 13:02:07 1999 +++ ash-0.3.7.orig/options.h Mon Apr 23 22:16:46 2001 @@ -41,10 +41,9 @@ struct shparam { int nparam; /* # of positional parameters (without $0) */ unsigned char malloc; /* if parameter list dynamically allocated */ - unsigned char reset; /* if getopts has been reset */ char **p; /* parameter list */ - char **optnext; /* next parameter to be processed by getopts */ - char *optptr; /* used by getopts */ + int optind; /* next parameter to be processed by getopts */ + int optoff; /* used by getopts */ };