diff options
Diffstat (limited to 'Src/lex.c')
-rw-r--r-- | Src/lex.c | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/Src/lex.c b/Src/lex.c index de58ade7a..46d83cb21 100644 --- a/Src/lex.c +++ b/Src/lex.c @@ -1302,10 +1302,13 @@ dquote_parse(char endchar, int sub) c = hgetc(); if (c != '\n') { if (c == '$' || c == '\\' || (c == '}' && !intick && bct) || - c == endchar || c == '`') + c == endchar || c == '`' || + (math && (c == '[' || c == ']' || + c == '(' || c == ')' || + c == '{' || c == '}'))) add(Bnull); else { - /* lexstop is implicitely handled here */ + /* lexstop is implicitly handled here */ add('\\'); goto cont; } @@ -1458,6 +1461,38 @@ parsestrnoerr(char *s) return err; } +/**/ +mod_export char * +parse_subscript(char *s) +{ + int l = strlen(s), err; + char *t; + + if (!*s || *s == ']') + return 0; + lexsave(); + untokenize(t = dupstring(s)); + inpush(t, 0, NULL); + strinbeg(0); + len = 0; + bptr = tokstr = s; + bsiz = l + 1; + err = dquote_parse(']', 1); + if (err) { + err = *bptr; + *bptr = 0; + untokenize(s); + *bptr = err; + s = 0; + } else + s = bptr; + strinend(); + inpop(); + DPUTS(cmdsp, "BUG: parse_subscript: cmdstack not empty."); + lexrestore(); + return s; +} + /* Tokenize a string given in s. Parsing is done as if s were a normal * * command-line argument but it may contain separators. This is used * * to parse the right-hand side of ${...%...} substitutions. */ |