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

PATCH: Support ${PARAM:OFFSET:LENGTH} with an empty offset



Bash allows using this syntax with an empty offset and it doesn't conflict
with any existing zsh syntax. The error message you received before this
also didn't make much sense:
% echo ${a::1}
zsh: closing brace expected
as no matter where you put a closing brace, the syntax is invalid (until
you've removed all colons).

---
 Src/subst.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/Src/subst.c b/Src/subst.c
index ecd3c7c50a..40edf3d72a 100644
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -1565,6 +1565,11 @@ check_colon_subscript(char *str, char **endp)
     if (!*str || ialpha(*str) || *str == '&')
 	return NULL;
 
+    if (*str == ':') {
+	*endp = str;
+	return dupstring("0");
+    }
+
     *endp = parse_subscript(str, 0, ':');
     if (!*endp) {
 	/* No trailing colon? */
@@ -1575,8 +1580,10 @@ check_colon_subscript(char *str, char **endp)
     sav = **endp;
     **endp = '\0';
     str = dupstring(str);
-    if (parsestr(&str))
+    if (parsestr(&str)) {
+	**endp = sav;
 	return NULL;
+    }
     singsub(&str);
     remnulargs(str);
     untokenize(str);
@@ -2782,7 +2789,6 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
 	}
 
 	if (bct) {
-	noclosebrace:
 	    zerr("closing brace expected");
 	    return NULL;
 	}
@@ -2938,9 +2944,12 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
 	    }
 	    break;
 	case ':':
-	    /* this must be `::=', unconditional assignment */
-	    if (*s != '=' && *s != Equals)
-		goto noclosebrace;
+	    /* this could be either `::=', unconditional assignment
+	     * or a ${PARAM:OFFSET:LENGTH} with an empty offset */
+	    if (*s != '=' && *s != Equals) {
+		s -= 1;
+		goto colonsubscript;
+	    }
 	    vunset = 1;
 	    s++;
 	    /* Fall through */
@@ -3283,6 +3292,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
 	 * if there isn't a trailing modifier?  Why don't we do this
 	 * e.g. when we handle the ${(t)...} flag?
 	 */
+colonsubscript:
 	if (chkset) {
 	    val = dupstring(vunset ? "0" : "1");
 	    isarr = 0;
-- 
2.15.1



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