diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-02-13 19:57:46 -0500 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-02-13 19:57:46 -0500 |
| commit | 1a0bd10d3d09ad9f94d351f6014dc0bdf4a23b43 (patch) | |
| tree | 1bc3305ae515af54d516328513afb7ffdcd6303c /parse.c | |
| parent | b3c6fb80b344b3bfe7cd6c852f306cdc1037d90d (diff) | |
Tweak interp rules
Diffstat (limited to 'parse.c')
| -rw-r--r-- | parse.c | 23 |
1 files changed, 17 insertions, 6 deletions
@@ -884,12 +884,23 @@ PARSER(parse_string) { } else if (match(&pos, "'")) { open_quote = '\'', close_quote = '\''; } else if (match(&pos, "$")) { - open_interp = *(pos++); - close_interp = closing[(int)open_interp]; - if (*pos == close_interp) ++pos; - open_quote = *pos; - close_quote = closing[(int)*pos] ? closing[(int)*pos] : *pos; - ++pos; + if (strspn(pos, (char[]){*pos, 0}) >= 2) { + // Disable interp using a double opener: $;;...; or $``text` + open_quote = *pos; + pos += 2; + } else { + // $@"...." or $()"....." + open_interp = *pos; + ++pos; + close_interp = closing[(int)open_interp]; + if (close_interp && *pos == close_interp) + ++pos; + open_quote = *pos; + ++pos; + } + close_quote = closing[(int)open_quote] ? closing[(int)open_quote] : open_quote; + if (open_interp == close_quote) + open_interp = '\0'; } else { return NULL; } |
