From 817d461932eabff7c1bc950411715ef8ea10c593 Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Sat, 9 May 2020 07:43:10 +0200 Subject: Support ${name:offset:length} with an empty offset --- Src/subst.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'Src/subst.c') diff --git a/Src/subst.c b/Src/subst.c index 94ddb9ceb..90b5fc121 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); @@ -2781,7 +2788,6 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, } if (bct) { - noclosebrace: zerr("closing brace expected"); return NULL; } @@ -2937,9 +2943,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 ${name:offset:length} with an empty offset */ + if (*s != '=' && *s != Equals) { + s -= 1; + goto colonsubscript; + } vunset = 1; s++; /* Fall through */ @@ -3282,6 +3291,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; -- cgit 1.4.1