summaryrefslogtreecommitdiff
path: root/Src/Zle
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Zle')
-rw-r--r--Src/Zle/complete.c3
-rw-r--r--Src/Zle/computil.c6
-rw-r--r--Src/Zle/zle_params.c14
3 files changed, 19 insertions, 4 deletions
diff --git a/Src/Zle/complete.c b/Src/Zle/complete.c
index 313dcb92f..1dc2b01c2 100644
--- a/Src/Zle/complete.c
+++ b/Src/Zle/complete.c
@@ -1325,7 +1325,8 @@ set_compstate(UNUSED(Param pm), HashTable ht)
break;
}
- deleteparamtable(ht);
+ if (ht != pm->u.hash)
+ deleteparamtable(ht);
}
/**/
diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c
index 4ce8eeee5..5526e0ad0 100644
--- a/Src/Zle/computil.c
+++ b/Src/Zle/computil.c
@@ -2675,7 +2675,7 @@ bin_comparguments(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
for (; lstate; lstate = lstate->snext) {
if (lstate->actopts &&
- (lstate->opt || lstate->def ||
+ (lstate->opt || (ca_doff && lstate->def) ||
(lstate->def && lstate->def->opt &&
(lstate->def->type == CAA_OPT ||
(lstate->def->type >= CAA_RARGS &&
@@ -3022,6 +3022,7 @@ parse_cvdef(char *nam, char **args)
if (hassep && !sep && name + bs + 1 < p) {
freecvdef(ret);
+ if (xor) freearray(xor);
zwarnnam(nam, "no multi-letter values with empty separator allowed");
return NULL;
}
@@ -3035,6 +3036,7 @@ parse_cvdef(char *nam, char **args)
if (!*p) {
freecvdef(ret);
+ if (xor) freearray(xor);
zwarnnam(nam, "invalid value definition: %s", *args);
return NULL;
}
@@ -3046,6 +3048,7 @@ parse_cvdef(char *nam, char **args)
}
if (c && c != ':') {
freecvdef(ret);
+ if (xor) freearray(xor);
zwarnnam(nam, "invalid value definition: %s", *args);
return NULL;
}
@@ -3054,6 +3057,7 @@ parse_cvdef(char *nam, char **args)
if (c == ':') {
if (hassep && !sep) {
freecvdef(ret);
+ if (xor) freearray(xor);
zwarnnam(nam, "no value with argument with empty separator allowed");
return NULL;
}
diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c
index 0a922d2d6..f3112165a 100644
--- a/Src/Zle/zle_params.c
+++ b/Src/Zle/zle_params.c
@@ -124,7 +124,7 @@ static const struct gsu_array killring_gsu =
static const struct gsu_scalar register_gsu =
{ strgetfn, set_register, unset_register };
static const struct gsu_hash registers_gsu =
-{ hashgetfn, set_registers, zleunsetfn };
+{ hashgetfn, set_registers, unset_registers };
/* implementation is in zle_refresh.c */
static const struct gsu_array region_highlight_gsu =
@@ -837,7 +837,17 @@ set_registers(UNUSED(Param pm), HashTable ht)
set_register(v.pm, getstrvalue(&v));
}
- deleteparamtable(ht);
+ if (ht != pm->u.hash)
+ deleteparamtable(ht);
+}
+
+/**/
+static void
+unset_registers(Param pm, int exp)
+{
+ stdunsetfn(pm, exp);
+ deletehashtable(pm->u.hash);
+ pm->u.hash = NULL;
}
static void