diff options
author | Rory Dudley | 2024-03-31 00:14:46 -0600 |
---|---|---|
committer | Rory Dudley | 2024-03-31 00:14:46 -0600 |
commit | f03f4e0fcf62c9b3267bc5d8b62068d89ec593cd (patch) | |
tree | 59601f4d451a462572ebe024121ce396749d8f03 /src | |
parent | c433dd2c400d9f2e8421f074be1b287d27b709df (diff) | |
download | dwarvish-f03f4e0fcf62c9b3267bc5d8b62068d89ec593cd.tar.gz |
Don't interpret environment variables in single quoted stringscompose
Previously, if an environment variable was given in a string, such as:
'$PATH' or "$PATH", both would be replaced with the value of $PATH from
the environment. However, for single quotes strings, any values inside
should be taken at face value. In other words, echo '$PATH' should
simply write out: $PATH, and not whatever environment value $PATH
happens to be. This patch replaced '$' in single quoted strings with
the ASCII shift out (x0e) character. Any ASCII SO placeholder is
replaced with a '$' in recite(), after the environment variables have
been accounted for.
Diffstat (limited to 'src')
-rw-r--r-- | src/poem/read/parse.rs | 4 | ||||
-rw-r--r-- | src/poem/recite.rs | 5 |
2 files changed, 9 insertions, 0 deletions
diff --git a/src/poem/read/parse.rs b/src/poem/read/parse.rs index c1dec44..0836eea 100644 --- a/src/poem/read/parse.rs +++ b/src/poem/read/parse.rs @@ -31,6 +31,10 @@ macro_rules! string { match $chars.next() { None => return Err(Mishap::PartialMishap($j, $i, $c)), Some(c) if c == token => break, + Some(c) if token == '\'' && c == '$' => { + $word.push('\x0e'); + $i += 1; + } Some(c) => { $word.push(c); $i += 1; diff --git a/src/poem/recite.rs b/src/poem/recite.rs index d95af92..45d4d2e 100644 --- a/src/poem/recite.rs +++ b/src/poem/recite.rs @@ -52,6 +52,11 @@ impl Reciteable for Poem { }; *word = word.replace(name.as_str(), envar.as_str()); } + + // For any words in single quotes strings that began with a '$', + // need to replace the ASCII SO placeholder with the '$' char once + // more + *word = word.replace('\x0e', "$"); } // Check for aliases |