summaryrefslogtreecommitdiff
path: root/Src/Zle/computil.c
diff options
context:
space:
mode:
authorSven Wischnowsky <wischnow@users.sourceforge.net>2001-05-08 12:24:21 +0000
committerSven Wischnowsky <wischnow@users.sourceforge.net>2001-05-08 12:24:21 +0000
commit83032fe8761f8830f4894aad6e84cbe46bbe7512 (patch)
tree34c816fa0d40faccb11fdcc1d4c4deb25ec45e19 /Src/Zle/computil.c
parent671fda58c0cf5c37232854fcc0b7f72c94287a89 (diff)
downloadzsh-83032fe8761f8830f4894aad6e84cbe46bbe7512.tar.gz
zsh-83032fe8761f8830f4894aad6e84cbe46bbe7512.zip
add -S option to specify separator between values and their arguments; make _values add the value-separator as a suffix for most types of actions (14257)
Diffstat (limited to 'Src/Zle/computil.c')
-rw-r--r--Src/Zle/computil.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c
index a4620151b..72ec4d9e6 100644
--- a/Src/Zle/computil.c
+++ b/Src/Zle/computil.c
@@ -2029,6 +2029,7 @@ struct cvdef {
char *descr; /* global description */
int hassep; /* multiple values allowed */
char sep; /* separator character */
+ char argsep; /* argument separator */
Cvdef next; /* next in cache */
Cvval vals; /* value definitions */
char **defs; /* original strings */
@@ -2090,16 +2091,21 @@ parse_cvdef(char *nam, char **args)
Cvdef ret;
Cvval val, *valp;
Caarg arg;
- char **oargs = args, sep = '\0', *name, *descr, *p, *q, **xor, c;
+ char **oargs = args, sep = '\0', asep = '=', *name, *descr, *p, *q, **xor, c;
int xnum, multi, vtype, hassep = 0;
- if (args[0][0] == '-' && args[0][1] == 's' && !args[0][2]) {
+ while (args[0][0] == '-' && (args[0][1] == 's' || args[0][1] == 'S') &&
+ !args[0][2]) {
if (args[1][0] && args[1][1]) {
zwarnnam(nam, "invalid separator: %s", args[1], 0);
return NULL;
}
- hassep = 1;
- sep = args[1][0];
+ if (args[0][1] == 's') {
+ hassep = 1;
+ sep = args[1][0];
+ } else
+ asep = args[1][0];
+
args += 2;
}
if (!args[0] || !args[1]) {
@@ -2112,6 +2118,7 @@ parse_cvdef(char *nam, char **args)
ret->descr = ztrdup(descr);
ret->hassep = hassep;
ret->sep = sep;
+ ret->argsep = asep;
ret->next = NULL;
ret->vals = NULL;
ret->defs = zarrdup(oargs);
@@ -2330,7 +2337,7 @@ cv_parse_word(Cvdef d)
for (str = compprefix, end = strchr(str, d->sep); end;) {
*end = '\0';
- if ((heq = !!(eq = strchr(str, '='))))
+ if ((heq = !!(eq = strchr(str, d->argsep))))
*eq++ = '\0';
else
eq = "";
@@ -2342,7 +2349,7 @@ cv_parse_word(Cvdef d)
cv_inactive(d, ptr->xor);
}
if (heq)
- eq[-1] = '=';
+ eq[-1] = d->argsep;
*end = d->sep;
str = end + 1;
@@ -2357,7 +2364,7 @@ cv_parse_word(Cvdef d)
if ((end = strchr(str, d->sep)))
*end = '\0';
- if ((heq = !!(eq = strchr(str, '='))))
+ if ((heq = !!(eq = strchr(str, d->argsep))))
*eq++ = '\0';
else
eq = "";
@@ -2369,7 +2376,7 @@ cv_parse_word(Cvdef d)
cv_inactive(d, ptr->xor);
}
if (heq)
- eq[-1] = '=';
+ eq[-1] = d->argsep;
if (end)
*end++ = d->sep;
}
@@ -2408,16 +2415,16 @@ cv_parse_word(Cvdef d)
compprefix = str;
compsuffix = ztrdup("");
- if ((eq = strchr(str, '='))) {
+ if ((eq = strchr(str, d->argsep))) {
*eq++ = '\0';
if ((ptr = cv_get_val(d, str)) && ptr->type != CVV_NOARG) {
- eq[-1] = '=';
+ eq[-1] = d->argsep;
ignore_prefix(eq - str);
state.def = ptr->arg;
state.val = ptr;
} else
- eq[-1] = '=';
+ eq[-1] = d->argsep;
}
memcpy(&cv_laststate, &state, sizeof(state));
}
@@ -2445,6 +2452,7 @@ bin_compvalues(char *nam, char **args, char *ops, int func)
case 'C': min = 1; max = 1; break;
case 'V': min = 3; max = 3; break;
case 's': min = 1; max = 1; break;
+ case 'S': min = 1; max = 1; break;
case 'd': min = 1; max = 1; break;
case 'L': min = 3; max = 4; break;
case 'v': min = 1; max = 1; break;
@@ -2546,6 +2554,15 @@ bin_compvalues(char *nam, char **args, char *ops, int func)
return 0;
}
return 1;
+ case 'S':
+ {
+ char tmp[2];
+
+ tmp[0] = cv_laststate.d->argsep;
+ tmp[1] = '\0';
+ setsparam(args[1], ztrdup(tmp));
+ }
+ return 0;
case 'd':
setsparam(args[1], ztrdup(cv_laststate.d->descr));
return 0;