diff options
author | Sven Wischnowsky <wischnow@users.sourceforge.net> | 2000-06-07 07:38:02 +0000 |
---|---|---|
committer | Sven Wischnowsky <wischnow@users.sourceforge.net> | 2000-06-07 07:38:02 +0000 |
commit | 9bb23440d2db294cc2f1ce7b840030d6d1e85003 (patch) | |
tree | 8630cac6ae42ae755667446ebe5ac5bf418aeae4 /Src | |
parent | 6bdaf4e1745e78993c72660dea12b06e9aeece17 (diff) | |
download | zsh-9bb23440d2db294cc2f1ce7b840030d6d1e85003.tar.gz zsh-9bb23440d2db294cc2f1ce7b840030d6d1e85003.tar.xz zsh-9bb23440d2db294cc2f1ce7b840030d6d1e85003.zip |
-K option for zparseopts to keep previous array values (11792)
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Modules/zutil.c | 76 |
1 files changed, 44 insertions, 32 deletions
diff --git a/Src/Modules/zutil.c b/Src/Modules/zutil.c index 62beb8b64..b2eb99df2 100644 --- a/Src/Modules/zutil.c +++ b/Src/Modules/zutil.c @@ -1262,7 +1262,7 @@ static int bin_zparseopts(char *nam, char **args, char *ops, int func) { char *o, *p, *n, **pp, **aval, **ap, *assoc = NULL, **cp, **np; - int del = 0, f, extract = 0; + int del = 0, f, extract = 0, keep = 0; Zoptdesc sopts[256], d; Zoptarr a, defarr = NULL; Zoptval v; @@ -1298,6 +1298,14 @@ bin_zparseopts(char *nam, char **args, char *ops, int func) } extract = 1; break; + case 'K': + if (o[2]) { + args--; + o = NULL; + break; + } + keep = 1; + break; case 'a': if (defarr) { zwarnnam(nam, "default array given more than once", NULL, 0); @@ -1478,18 +1486,20 @@ bin_zparseopts(char *nam, char **args, char *ops, int func) *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) { - if (v->str) - *ap = ztrdup(v->str); - else { - *ap = ztrdup(v->name); - if (v->arg) - *++ap = ztrdup(v->arg); + if (!keep || a->num) { + aval = (char **) zalloc((a->num + 1) * sizeof(char *)); + for (ap = aval, v = a->vals; v; ap++, v = v->next) { + if (v->str) + *ap = ztrdup(v->str); + else { + *ap = ztrdup(v->name); + if (v->arg) + *++ap = ztrdup(v->arg); + } } + *ap = NULL; + setaparam(a->name, aval); } - *ap = NULL; - setaparam(a->name, aval); } if (assoc) { int num; @@ -1498,31 +1508,33 @@ bin_zparseopts(char *nam, char **args, char *ops, int func) if (d->vals) num++; - aval = (char **) zalloc(((num * 2) + 1) * sizeof(char *)); - for (ap = aval, d = opt_descs; d; d = d->next) { - if (d->vals) { - *ap++ = n = (char *) zalloc(strlen(d->name) + 2); - *n = '-'; - strcpy(n + 1, d->name); - - for (num = 1, v = d->vals; v; v = v->onext) { - num += (v->arg ? strlen(v->arg) : 0); - if (v->next) - num++; - } - *ap++ = n = (char *) zalloc(num); - for (v = d->vals; v; v = v->onext) { - if (v->arg) { - strcpy(n, v->arg); - n += strlen(v->arg); + if (!keep || num) { + aval = (char **) zalloc(((num * 2) + 1) * sizeof(char *)); + for (ap = aval, d = opt_descs; d; d = d->next) { + if (d->vals) { + *ap++ = n = (char *) zalloc(strlen(d->name) + 2); + *n = '-'; + strcpy(n + 1, d->name); + + for (num = 1, v = d->vals; v; v = v->onext) { + num += (v->arg ? strlen(v->arg) : 0); + if (v->next) + num++; + } + *ap++ = n = (char *) zalloc(num); + for (v = d->vals; v; v = v->onext) { + if (v->arg) { + strcpy(n, v->arg); + n += strlen(v->arg); + } + *n = ' '; } - *n = ' '; + *n = '\0'; } - *n = '\0'; } + *ap = NULL; + sethparam(assoc, aval); } - *ap = NULL; - sethparam(assoc, aval); } if (del) { if (extract) { |