Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: zparseopts varieties
- X-seq: zsh-workers 37802
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: Re: zparseopts varieties
- Date: Tue, 26 Jan 2016 19:00:44 -0800
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20150623.gappssmtp.com; s=20150623; h=from:message-id:date:in-reply-to:comments:references:to:subject :mime-version:content-type; bh=szuw8izjOrdX09YxTqQjTAo9PuP3Igx3VbvsxX8J25A=; b=REeJHDReiLWSATrz+OmJnBgTewI8Hbf2/F2XSSFNHDvGvWZvhdjEV4USYTLfWjKYNw krEftbo5s/229H9loVWSz/4YauKGAQZXBnab9fuwrQDYUf+d8q6E/PefafakZbgzCB8z PmA1qVdWqJIej3JcRgYTAL77M6K8cImUjNnMgplGG3EM6bUPNJhZDPv+dCyT+L6G/Gfc aOC6Ot34iJo9y4PuUSt+JuD7RHaBvd7aqpW2m4mHELBJqgR9yG6nIHRNnWkSxPTU9/3O JJSbBdL5Fm5485jXBDxIIhkvm7OHVHtJ35rvntDJVfYFptJE9hfcbmCeSpwXVIq7Cvbn kp3w==
- In-reply-to: <CAKc7PVCxCs7hfAvG=ZG1v=6Ez=yX-wQHnjyeuN17V-Ky+rdAvw@mail.gmail.com>
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
- References: <CAKc7PVCxCs7hfAvG=ZG1v=6Ez=yX-wQHnjyeuN17V-Ky+rdAvw@mail.gmail.com>
On Jan 26, 9:53am, Sebastian Gniazdowski wrote:
}
} Argument of -M will not be put into Mopt associative array:
}
} % typeset -A Mopt; set -- -M arg; zparseopts -D -A Mopt "M::"; echo
} ${(kv)Mopt}; echo "1: $1, 2: $2"
} -M
} 1: arg, 2:
Curious.
The code to handle the argument in the next word is unreachable in the
optional case, and it appears to have been so ever since zparseopts was
invented; or, at least, as long as we've had code in version control.
Also, there's this:
torch% zparseopts -A opts -DE b: c
../../zsh-5.0/Src/params.c:2986: BUG: assigning to undeclared associative array
Which actually is probably a case of an over-aggressive DPUTS assertion
(that I added a few months ago) rather than an actual bug.
} Also, double colon (optionality of argument) cannot take array name:
This is intentional: you aren't meant to use an associative array with
the =array form, double colon or not.
torch% typeset -A Mopt
torch% set -- -b -c
torch% zparseopts b=Mopt
zsh: bad set of key/value pairs for associative array
It accidentally works to use the same associative array for an even number
of options, but the results are wrong -- the options alternate as keys
and values:
torch% zparseopts c=Mopt b=Mopt
torch% print -rl -- ${(k)Mopt}
-b
torch% print -rl -- ${(v)Mopt}
-c
I scanned the distributed functions for uses of zparseopts with "::" and
did not find any, so hopefully the following won't break anything.
diff --git a/Doc/Zsh/mod_zutil.yo b/Doc/Zsh/mod_zutil.yo
index fd6f2f3..dc17161 100644
--- a/Doc/Zsh/mod_zutil.yo
+++ b/Doc/Zsh/mod_zutil.yo
@@ -179,13 +179,14 @@ item(tt(zregexparse))(
This implements some internals of the tt(_regex_arguments) function.
)
findex(zparseopts)
-item(tt(zparseopts) [ tt(-DKME) ] [ tt(-a) var(array) ] [ tt(-A) var(assoc) ] var(spec) ...)(
+item(tt(zparseopts) [ tt(-D) tt(-K) tt(-M) tt(-E) ] [ tt(-a) var(array) ] [ tt(-A) var(assoc) ] var(spec) ...)(
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 must be of the form `var(opt)[tt(=)var(array)]'. If an option
described by var(opt) is found in the positional parameters it is copied
into the var(array) specified with the tt(-a) option; if the optional
-`tt(=)var(array)' is given, it is instead copied into that array.
+`tt(=)var(array)' is given, it is instead copied into that array, which
+should be declared as a normal array and never as an associative array.
Note that it is an error to give any var(spec) without an
`tt(=)var(array)' unless one of the tt(-a) or tt(-A) options is used.
@@ -232,7 +233,10 @@ first colon.
)
enditem()
-The options of tt(zparseopts) itself are:
+The options of tt(zparseopts) itself cannot be stacked because, for
+example, the stack `tt(-DEK)' is indistinguishable from a var(spec) for
+the GNU-style long option `tt(--DEK)'. The options of tt(zparseopts)
+itself are:
startitem()
item(tt(-a) var(array))(
diff --git a/Src/Modules/zutil.c b/Src/Modules/zutil.c
index 376cd84..d98028a 100644
--- a/Src/Modules/zutil.c
+++ b/Src/Modules/zutil.c
@@ -1833,7 +1833,8 @@ bin_zparseopts(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
if (o[1]) {
add_opt_val(d, o + 1);
break;
- } else if (!(d->flags & ZOF_OPT)) {
+ } else if (!(d->flags & ZOF_OPT) ||
+ (pp[1] && pp[1][0] != '-')) {
if (!pp[1]) {
zwarnnam(nam, "missing argument for option: %s",
d->name);
@@ -1859,7 +1860,8 @@ bin_zparseopts(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
if (*e)
add_opt_val(d, e);
- else if (!(d->flags & ZOF_OPT)) {
+ else if (!(d->flags & ZOF_OPT) ||
+ (pp[1] && pp[1][0] != '-')) {
if (!pp[1]) {
zwarnnam(nam, "missing argument for option: %s",
d->name);
Messages sorted by:
Reverse Date,
Date,
Thread,
Author