Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Subscript flag (i) not working correctly on empty strings?



> On 06/01/2023 16:01 Philippe Altherr <philippe.altherr@xxxxxxxxx> wrote:
> The following script
> 
> > s=aaa; echo $s[(i)z];
> > s=aa; echo $s[(i)z];
> > s=a; echo $s[(i)z];
> > s=; echo $s[(i)z];
> 
> prints this
> 
> > 4
> > 3
> > 2
> > 0
> 
> Why is the last line 0 and not 1?

Certainly looks plain wrong.  From the source it appears to be
an overzealous safety test --- if we get a NULL value, we should
give up trying to search the string, but not if we get an empty
string.

None of the existing tests fail with this change.

pws

diff --git a/Src/params.c b/Src/params.c
index 2e4a6eae2..6362b382c 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -1669,7 +1669,7 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w,
 	    /* Searching characters */
 	    int slen;
 	    d = getstrvalue(v);
-	    if (!d || !*d)
+	    if (!d)
 		return 0;
 	    /*
 	     * beg and len are character counts, not raw offsets.
diff --git a/Test/D06subscript.ztst b/Test/D06subscript.ztst
index 21127e641..57cdc027c 100644
--- a/Test/D06subscript.ztst
+++ b/Test/D06subscript.ztst
@@ -299,3 +299,12 @@ F:In math, (($i)) should be the same as ((i)), see workers/47748.
   echo ${string[(pws:\0:)1]}
 0:Word splitting by NUL
 >foo
+
+  string="a"
+  print ${string[(i)x]}
+  string=""
+  print ${string[(i)x]}
+0:Can check off end of zero length string
+F:Regression test for inconsistency of failed (i) on zero-length string
+>2
+>1




Messages sorted by: Reverse Date, Date, Thread, Author