1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-11-01 18:30:55 +01:00

53260: zparseopts: add options -v (argv) and -G (GNU-style parsing)

This commit is contained in:
dana 2024-12-26 09:39:11 -06:00
parent 6bb792dba8
commit d051857e03
4 changed files with 313 additions and 31 deletions

View file

@ -103,6 +103,14 @@
0:zparseopts -M
>ret: 0, optv: --aaa bar, opts: --aaa bar, argv: 1 2 3
() {
local -a optv argvv=( -a -b -c 1 2 3 )
zparseopts -D -a optv -v argvv - a b c
print -r - ret: $?, optv: $optv, argvv: $argvv, argv: $argv
} -x -y -z 7 8 9
0:zparseopts -v
>ret: 0, optv: -a -b -c, argvv: 1 2 3, argv: -x -y -z 7 8 9
() {
local -a optv aa ab
zparseopts -a optv - a=aa b:=ab c:- z
@ -151,16 +159,35 @@
>ret: 0, optv: -+ -: -= -\, argv: 1 2 3
>ret: 0, optv: --::: foo, argv: 1 2 3
for specs in '-foo: -foobar' '-foobar -foo:'; do
for specs in \
'-foo: -foobar' '-foobar -foo:' '-foo: -foobar:' '-foobar: -foo:'
do
() {
local -a optv
zparseopts -a optv - $=specs
zparseopts -a optv -D - $=specs
print -r - ret: $?, optv: $optv, argv: $argv
} --foobar 1 2 3
done
0:overlapping option specs (scan order)
>ret: 0, optv: --foobar, argv: --foobar 1 2 3
>ret: 0, optv: --foo bar, argv: --foobar 1 2 3
0:overlapping option specs without -G (scan order)
>ret: 0, optv: --foobar, argv: 1 2 3
>ret: 0, optv: --foo bar, argv: 1 2 3
>ret: 0, optv: --foobar 1, argv: 2 3
>ret: 0, optv: --foo bar, argv: 1 2 3
for specs in \
'-foo: -foobar' '-foobar -foo:' '-foo: -foobar:' '-foobar: -foo:'
do
() {
local -a optv
zparseopts -a optv -D -G - $=specs
print -r - ret: $?, optv: $optv, argv: $argv
} --foobar 1 2 3
done
0:overlapping option specs with -G (scan order)
>ret: 0, optv: --foobar, argv: 1 2 3
>ret: 0, optv: --foobar, argv: 1 2 3
>ret: 0, optv: --foobar 1, argv: 2 3
>ret: 0, optv: --foobar 1, argv: 2 3
() {
local -a optv
@ -170,3 +197,147 @@
0:missing optarg
?(anon):zparseopts:2: missing argument for option: -c
>ret: 1, optv: , argv: -ab1 -c
for spec in -foo: -foo:- -foo::; do
() {
local -a optv
zparseopts -a optv -D -F - $=spec
print -r - ret: $?, optv: $optv, argv: $argv
} --foo=bar 1 2 3
done
0:zparseopts without -G, =optarg handling
>ret: 0, optv: --foo =bar, argv: 1 2 3
>ret: 0, optv: --foo=bar, argv: 1 2 3
>ret: 0, optv: --foo=bar, argv: 1 2 3
for spec in -foo: -foo:- -foo::; do
() {
local -a optv
zparseopts -a optv -D -F -G - $=spec
print -r - ret: $?, optv: $optv, argv: $argv
} --foo=bar 1 2 3
done
0:zparseopts -G, single parameter, with =
>ret: 0, optv: --foo bar, argv: 1 2 3
>ret: 0, optv: --foo=bar, argv: 1 2 3
>ret: 0, optv: --foo=bar, argv: 1 2 3
for spec in -foo: -foo:- -foo:: ; do
() {
local -a optv
zparseopts -a optv -D -F -G - $=spec
print -r - ret: $?, optv: $optv, argv: $argv
} --foobar 1 2 3
done
0:zparseopts -G, single parameter, without =
?(anon):zparseopts:2: bad option: --foobar
>ret: 1, optv: , argv: --foobar 1 2 3
?(anon):zparseopts:2: bad option: --foobar
>ret: 1, optv: , argv: --foobar 1 2 3
?(anon):zparseopts:2: bad option: --foobar
>ret: 1, optv: , argv: --foobar 1 2 3
for spec in -foo: -foo:- -foo::; do
() {
local -a optv
zparseopts -a optv -D -F -G - $=spec
print -r - ret: $?, optv: $optv, argv: $argv
} --foo bar 1 2 3
done
0:zparseopts -G, separate parameters
>ret: 0, optv: --foo bar, argv: 1 2 3
>ret: 0, optv: --foo=bar, argv: 1 2 3
>ret: 0, optv: --foo, argv: bar 1 2 3
for spec in -foo: -foo:- -foo::; do
() {
local -a optv
zparseopts -a optv -D -F -G - $=spec
print -r - ret: $?, optv: ${(j< >)${(q+)optv}}, argv: $argv
} --foo= 1 2 3
done
0:zparseopts -G, empty optarg
>ret: 0, optv: --foo '', argv: 1 2 3
>ret: 0, optv: '--foo=', argv: 1 2 3
>ret: 0, optv: '--foo=', argv: 1 2 3
for gopt in '' -G; do
for spec args in \
f: '-fbar 1 2 3' \
f: '-f=bar 1 2 3' \
f: '-f bar 1 2 3' \
f:- '-fbar 1 2 3' \
f:- '-f=bar 1 2 3' \
f:- '-f bar 1 2 3' \
f:: '-fbar 1 2 3' \
f:: '-f=bar 1 2 3' \
f:: '-f bar 1 2 3'
do
() {
local -a optv
zparseopts -a optv -D -F $gopt - $=spec
print -r - ret: $?, gopt: $gopt, optv: $optv, argv: $argv
} $=args
done
done
0:short options, with and without -G
>ret: 0, gopt: , optv: -f bar, argv: 1 2 3
>ret: 0, gopt: , optv: -f =bar, argv: 1 2 3
>ret: 0, gopt: , optv: -f bar, argv: 1 2 3
>ret: 0, gopt: , optv: -fbar, argv: 1 2 3
>ret: 0, gopt: , optv: -f=bar, argv: 1 2 3
>ret: 0, gopt: , optv: -fbar, argv: 1 2 3
>ret: 0, gopt: , optv: -fbar, argv: 1 2 3
>ret: 0, gopt: , optv: -f=bar, argv: 1 2 3
>ret: 0, gopt: , optv: -fbar, argv: 1 2 3
>ret: 0, gopt: -G, optv: -f bar, argv: 1 2 3
>ret: 0, gopt: -G, optv: -f =bar, argv: 1 2 3
>ret: 0, gopt: -G, optv: -f bar, argv: 1 2 3
>ret: 0, gopt: -G, optv: -fbar, argv: 1 2 3
>ret: 0, gopt: -G, optv: -f=bar, argv: 1 2 3
>ret: 0, gopt: -G, optv: -fbar, argv: 1 2 3
>ret: 0, gopt: -G, optv: -fbar, argv: 1 2 3
>ret: 0, gopt: -G, optv: -f=bar, argv: 1 2 3
>ret: 0, gopt: -G, optv: -f, argv: bar 1 2 3
for gopt in '' -G; do
for spec args in \
foo: '-foobar 1 2 3' \
foo: '-foo=bar 1 2 3' \
foo: '-foo bar 1 2 3' \
foo:- '-foobar 1 2 3' \
foo:- '-foo=bar 1 2 3' \
foo:- '-foo bar 1 2 3' \
foo:: '-foobar 1 2 3' \
foo:: '-foo=bar 1 2 3' \
foo:: '-foo bar 1 2 3'
do
() {
local -a optv
zparseopts -a optv -D -F $gopt - $=spec
print -r - ret: $?, gopt: $gopt, optv: $optv, argv: $argv
} $=args
done
done
0:Sun-style long options, with and without -G
>ret: 0, gopt: , optv: -foo bar, argv: 1 2 3
>ret: 0, gopt: , optv: -foo =bar, argv: 1 2 3
>ret: 0, gopt: , optv: -foo bar, argv: 1 2 3
>ret: 0, gopt: , optv: -foobar, argv: 1 2 3
>ret: 0, gopt: , optv: -foo=bar, argv: 1 2 3
>ret: 0, gopt: , optv: -foobar, argv: 1 2 3
>ret: 0, gopt: , optv: -foobar, argv: 1 2 3
>ret: 0, gopt: , optv: -foo=bar, argv: 1 2 3
>ret: 0, gopt: , optv: -foobar, argv: 1 2 3
?(anon):zparseopts:2: bad option: -f
>ret: 1, gopt: -G, optv: , argv: -foobar 1 2 3
>ret: 0, gopt: -G, optv: -foo bar, argv: 1 2 3
>ret: 0, gopt: -G, optv: -foo bar, argv: 1 2 3
?(anon):zparseopts:2: bad option: -f
>ret: 1, gopt: -G, optv: , argv: -foobar 1 2 3
>ret: 0, gopt: -G, optv: -foo=bar, argv: 1 2 3
>ret: 0, gopt: -G, optv: -foo=bar, argv: 1 2 3
?(anon):zparseopts:2: bad option: -f
>ret: 1, gopt: -G, optv: , argv: -foobar 1 2 3
>ret: 0, gopt: -G, optv: -foo=bar, argv: 1 2 3
>ret: 0, gopt: -G, optv: -foo, argv: bar 1 2 3