summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRory Dudley2024-03-31 00:14:46 -0600
committerRory Dudley2024-03-31 00:14:46 -0600
commitf03f4e0fcf62c9b3267bc5d8b62068d89ec593cd (patch)
tree59601f4d451a462572ebe024121ce396749d8f03
parentc433dd2c400d9f2e8421f074be1b287d27b709df (diff)
downloaddwarvish-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.
-rw-r--r--src/poem/read/parse.rs4
-rw-r--r--src/poem/recite.rs5
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