diff --git a/Src/builtin.c b/Src/builtin.c index a16fddcb7..ec0376367 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -1933,10 +1933,14 @@ getasg(char ***argvp, LinkList assigns) asg.flags = 0; /* search for `=' */ - for (; *s && *s != '='; s++); + for (; *s && *s != '[' && *s != '=' /* && *s != '+' */; s++); + if (s > asg.name && *s == '[') { + char *se = parse_subscript(s + 1, 1, ']'); + if (se && *se == ']') s = se + 1; + } /* found `=', so return with a value */ - if (*s) { + if (*s && *s == '=') { *s = '\0'; asg.value.scalar = s + 1; } else { @@ -3724,6 +3728,11 @@ bin_unset(char *name, char **argv, Options ops, int func) while ((s = *argv++)) { char *ss = strchr(s, '['), *subscript = 0; if (ss) { +#define unset_workers_37914 0 +#define unset_hashelem_empty_only 0 +#define unset_hashelem_literal 1 +#define unset_hashelem_stripquote 0 +#if unset_workers_37914 char *sse; *ss = 0; if ((sse = parse_subscript(ss+1, 1, ']'))) { @@ -3733,6 +3742,47 @@ bin_unset(char *name, char **argv, Options ops, int func) remnulargs(subscript); untokenize(subscript); } +#elif unset_hashelem_empty_only + char *sse; + *ss = 0; + if (ss[1] == ']' && !ss[2] ? (sse = ss+1) : + (sse = parse_subscript(ss+1, 1, ']'))) { + *sse = 0; + subscript = dupstring(ss+1); + *sse = ']'; + remnulargs(subscript); + untokenize(subscript); + } +#else + char *sse = ss + strlen(ss)-1; + *ss = 0; + if (*sse == ']') { +# if unset_hashelem_literal + *sse = 0; + subscript = dupstring(ss+1); + *sse = ']'; +# elif unset_hashelem_stripquote + int ne = noerrs; + noerrs = 2; + *ss = 0; + *sse = 0; + subscript = dupstring(ss+1); + *sse = ']'; + /* + * parse_subst_string() removes one level of quoting. + * If it returns nonzero, substring is unchanged, else + * it has been re-tokenized in place, so clean it up. + */ + if (!parse_subst_string(subscript)) { + remnulargs(subscript); + untokenize(subscript); + } + noerrs = ne; +# else + XXX parse error XXX +# endif + } +#endif } if ((ss && !subscript) || !isident(s)) { if (ss)