--- builtin.c.old Sun Jan 11 20:23:15 1998 +++ builtin.c Sat Mar 7 15:27:15 1998 @@ -2531,7 +2531,7 @@ char *optstr = unmetafy(*argv++, &lenoptstr), *var = *argv++; char **args = (*argv) ? argv : pparams; static int optcind = 0; - char *str, optbuf[2], *p, opch; + char *str, optbuf[2] = " ", *p, opch; /* zoptind keeps count of the current argument number */ if (zoptind < 1) { @@ -2550,11 +2550,11 @@ /* find place in relevant argument */ str = unmetafy(dupstring(args[zoptind - 1]), &lenstr); - if(optcind && optcind >= lenstr) { + if(optcind >= lenstr) { + optcind = 0; if(!args[zoptind++]) return 1; str = unmetafy(dupstring(args[zoptind - 1]), &lenstr); - optcind = 0; } if(!optcind) { if(lenstr < 2 || (*str != '-' && *str != '+')) @@ -2577,20 +2577,21 @@ if(optbuf[1] == ':' || !(p = memchr(optstr, opch, lenoptstr))) { p = "?"; err: + zsfree(zoptarg); if(quiet) { setsparam(var, ztrdup(p)); - zsfree(zoptarg); zoptarg = metafy(optbuf, lenoptbuf, META_DUP); } else { zerr(*p == '?' ? "bad option: -%c" : "argument expected after -%c option", NULL, opch); + zoptarg=ztrdup(""); errflag = 0; } return 0; } /* check for required argument */ - if(p != optstr+lenoptstr && p[1] == ':') { + if(p != optstr+lenoptstr-1 && p[1] == ':') { if(optcind == lenstr) { if(!args[zoptind]) { p = ":";