1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-06-08 16:26:04 +02:00

add -E option to zparseopts (11530)

This commit is contained in:
Sven Wischnowsky 2000-05-23 13:18:36 +00:00
parent ee681a32ad
commit 00772b72a7
3 changed files with 50 additions and 11 deletions

View File

@ -1,5 +1,8 @@
2000-05-23 Sven Wischnowsky <wischnow@zsh.org>
* 11530: Doc/Zsh/mod_zutil.yo, Src/Modules/zutil.c: add -E option
to zparseopts
* 11525: Completion/Base/_arguments, Completion/Commands/_complete_help,
Completion/Commands/_next_tags, Completion/Core/_description,
Completion/Core/_next_label: use `set -A' instead of `eval' in

View File

@ -131,7 +131,7 @@ item(tt(zregexparse))(
This implements the internals of the `tt(_regex_arguments)'.
)
findex(zparseopts)
item(tt(zparseopts) [ tt(-D) ] [ tt(-a) var(array) ] [ tt(-A) var(assoc) ] var(specs))(
item(tt(zparseopts) [ tt(-D) ] [ tt(-E) ] [ tt(-a) var(array) ] [ tt(-A) var(assoc) ] var(specs))(
This builtin simplifies the parsing of options in positional
parameters, i.e. the set of arguments given by tt($*). Each var(spec)
describes one option and should be of the form
@ -167,6 +167,9 @@ positional parameters, up to but not including any not described by the
var(specs). This means that any options processed by tt(zparseopts) are
removed from the positional parameters.
The tt(-E) option allows to extract the options described by the
var(specs) from the positional parameters, ignoring all other strings.
For example,
example(set -- -a -bx -c y -cz baz -cend

View File

@ -1261,8 +1261,8 @@ add_opt_val(Zoptdesc d, char *arg)
static int
bin_zparseopts(char *nam, char **args, char *ops, int func)
{
char *o, *p, *n, **pp, **aval, **ap, *assoc = NULL;
int del = 0, f;
char *o, *p, *n, **pp, **aval, **ap, *assoc = NULL, **cp, **np;
int del = 0, f, extract = 0;
Zoptdesc sopts[256], d;
Zoptarr a, defarr = NULL;
Zoptval v;
@ -1290,6 +1290,14 @@ bin_zparseopts(char *nam, char **args, char *ops, int func)
}
del = 1;
break;
case 'E':
if (o[2]) {
args--;
o = NULL;
break;
}
extract = 1;
break;
case 'a':
if (defarr) {
zwarnnam(nam, "default array given more than once", NULL, 0);
@ -1400,10 +1408,19 @@ bin_zparseopts(char *nam, char **args, char *ops, int func)
if (!o[1])
sopts[STOUC(*o)] = d;
}
for (pp = pparams; (o = *pp); pp++) {
if (*o != '-')
break;
np = cp = pp = ((extract && del) ? arrdup(pparams) : pparams);
for (; (o = *pp); pp++) {
if (*o != '-') {
if (extract) {
if (del)
*cp++ = o;
continue;
} else
break;
}
if (!o[1] || (o[1] == '-' && !o[2])) {
if (del && extract)
*cp++ = o;
pp++;
break;
}
@ -1429,8 +1446,14 @@ bin_zparseopts(char *nam, char **args, char *ops, int func)
} else
add_opt_val(d, NULL);
}
if (!o)
break;
if (!o) {
if (extract) {
if (del)
*cp++ = *pp;
continue;
} else
break;
}
} else {
if (d->flags & ZOF_ARG) {
char *e = o + strlen(d->name) + 1;
@ -1450,6 +1473,10 @@ bin_zparseopts(char *nam, char **args, char *ops, int func)
add_opt_val(d, NULL);
}
}
if (extract && del)
while (*pp)
*cp++ = *pp++;
for (a = opt_arrs; a; a = a->next) {
aval = (char **) zalloc((a->num + 1) * sizeof(char *));
for (ap = aval, v = a->vals; v; ap++, v = v->next) {
@ -1498,9 +1525,15 @@ bin_zparseopts(char *nam, char **args, char *ops, int func)
sethparam(assoc, aval);
}
if (del) {
pp = zarrdup(pp);
freearray(pparams);
pparams = pp;
if (extract) {
*cp = NULL;
freearray(pparams);
pparams = zarrdup(np);
} else {
pp = zarrdup(pp);
freearray(pparams);
pparams = pp;
}
}
return 0;
}