zsh-workers
 help / color / mirror / code / Atom feed
* [PATCH] (final) unset "array[$anything]"
@ 2021-06-13 22:56 Bart Schaefer
  2021-06-14  9:04 ` Mikael Magnusson
  0 siblings, 1 reply; 3+ messages in thread
From: Bart Schaefer @ 2021-06-13 22:56 UTC (permalink / raw)
  To: Zsh hackers list

[-- Attachment #1: Type: text/plain, Size: 299 bytes --]

Here's the diff just for "literal" unset, omitting all the
alternatives and omitting the problematic hunk that modified getasg().

I've included a NEWS entry, but have not yet attempted to create an
incompatibilities section for README since it's not clear what the
next zsh version number will be.

[-- Attachment #2: unset_hash_literal.txt --]
[-- Type: text/plain, Size: 1504 bytes --]

diff --git a/NEWS b/NEWS
index ee97868f9..c12ec3b0e 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,18 @@ Note also the list of incompatibilities in the README file.
 Changes since 5.8
 -----------------
 
+When unsetting a hash element, the string enclosed in square brackets is
+interpreted literally after any normal command-line-argument expansions.
+Thus
+  unset "hash[$key]"
+first expands $key as usual for a double-quoted string, and then interprets
+that result as the exact hash element to unset.  This differs from previous
+versions of the shell, which would also remove a leading backslash for an
+unusual subset of characters in the expansion of $key.  Note this also
+means, for example, that
+  unset 'hash[ab]cd]'
+unsets the element with key "ab]cd" rather than silently doing nothing.
+
 The function command learnt a -T option to declare a function and enable
 tracing for it simultaneously.
 
diff --git a/Src/builtin.c b/Src/builtin.c
index a16fddcb7..d7d2ea297 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -3724,14 +3724,12 @@ bin_unset(char *name, char **argv, Options ops, int func)
     while ((s = *argv++)) {
 	char *ss = strchr(s, '['), *subscript = 0;
 	if (ss) {
-	    char *sse;
+	    char *sse = ss + strlen(ss)-1;
 	    *ss = 0;
-	    if ((sse = parse_subscript(ss+1, 1, ']'))) {
+	    if (*sse == ']') {
 		*sse = 0;
 		subscript = dupstring(ss+1);
 		*sse = ']';
-		remnulargs(subscript);
-		untokenize(subscript);
 	    }
 	}
 	if ((ss && !subscript) || !isident(s)) {

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] (final) unset "array[$anything]"
  2021-06-13 22:56 [PATCH] (final) unset "array[$anything]" Bart Schaefer
@ 2021-06-14  9:04 ` Mikael Magnusson
  2021-06-14 16:54   ` Bart Schaefer
  0 siblings, 1 reply; 3+ messages in thread
From: Mikael Magnusson @ 2021-06-14  9:04 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: Zsh hackers list

On 6/14/21, Bart Schaefer <schaefer@brasslantern.com> wrote:
> Here's the diff just for "literal" unset, omitting all the
> alternatives and omitting the problematic hunk that modified getasg().
>
> I've included a NEWS entry, but have not yet attempted to create an
> incompatibilities section for README since it's not clear what the
> next zsh version number will be.

+that result as the exact hash element to unset.  This differs from previous
+versions of the shell, which would also remove a leading backslash for an
+unusual subset of characters in the expansion of $key.  Note this also
+means, for example, that
+  unset 'hash[ab]cd]'
+unsets the element with key "ab]cd" rather than silently doing nothing.

It is somewhat unclear (without using my contextual knowledge) if the
"Note this" applies to the old or the new behavior. Perhaps "Note
this" can be replaced explicitly with "Note that the new behaviour" or
so. (or "unsets" on the last line could become "now unsets".)

-- 
Mikael Magnusson


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] (final) unset "array[$anything]"
  2021-06-14  9:04 ` Mikael Magnusson
@ 2021-06-14 16:54   ` Bart Schaefer
  0 siblings, 0 replies; 3+ messages in thread
From: Bart Schaefer @ 2021-06-14 16:54 UTC (permalink / raw)
  To: Mikael Magnusson; +Cc: Zsh hackers list

On Mon, Jun 14, 2021 at 2:04 AM Mikael Magnusson <mikachu@gmail.com> wrote:
>
> On 6/14/21, Bart Schaefer <schaefer@brasslantern.com> wrote:
> +unusual subset of characters in the expansion of $key.  Note this also
> +means, for example, that
> +  unset 'hash[ab]cd]'
> +unsets the element with key "ab]cd" rather than silently doing nothing.
>
> It is somewhat unclear (without using my contextual knowledge) if the
> "Note this" applies to the old or the new behavior.

The "rather than" doesn't give away that "doing nothing" is the old behavior?

I'll commit an edit, it doesn't seem worth sending a patch.


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-06-14 16:54 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-13 22:56 [PATCH] (final) unset "array[$anything]" Bart Schaefer
2021-06-14  9:04 ` Mikael Magnusson
2021-06-14 16:54   ` Bart Schaefer

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).