aboutsummaryrefslogtreecommitdiff
path: root/parse.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-02-13 19:57:46 -0500
committerBruce Hill <bruce@bruce-hill.com>2024-02-13 19:57:46 -0500
commit1a0bd10d3d09ad9f94d351f6014dc0bdf4a23b43 (patch)
tree1bc3305ae515af54d516328513afb7ffdcd6303c /parse.c
parentb3c6fb80b344b3bfe7cd6c852f306cdc1037d90d (diff)
Tweak interp rules
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/parse.c b/parse.c
index a955ce76..e0690ff8 100644
--- a/parse.c
+++ b/parse.c
@@ -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;
}