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:
parent
ee681a32ad
commit
00772b72a7
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue