zsh-workers
 help / color / mirror / code / Atom feed
* PATCH: Support ${PARAM:OFFSET:LENGTH} with an empty offset
@ 2020-05-09  6:31 Mikael Magnusson
  0 siblings, 0 replies; only message in thread
From: Mikael Magnusson @ 2020-05-09  6:31 UTC (permalink / raw)
  To: zsh-workers

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


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-05-09  6:32 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-09  6:31 PATCH: Support ${PARAM:OFFSET:LENGTH} with an empty offset Mikael Magnusson

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).