aboutsummaryrefslogtreecommitdiff
path: root/strutil.cc
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2016-02-18 17:20:08 +0900
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2016-02-18 17:21:26 +0900
commit348a960f31d42c63ec6fff68a27c5b161b59a89f (patch)
tree867a4d5127635d88c9e9399ea7d774dd9d6f2340 /strutil.cc
parent3deff5bf54db9c5d36b775beffadbae33381d1b1 (diff)
[C++] Handle multi-word SHELL in $(shell)
Diffstat (limited to 'strutil.cc')
-rw-r--r--strutil.cc30
1 files changed, 30 insertions, 0 deletions
diff --git a/strutil.cc b/strutil.cc
index bcef302..80a4b5b 100644
--- a/strutil.cc
+++ b/strutil.cc
@@ -521,3 +521,33 @@ string EchoEscape(const string str) {
}
return buf;
}
+
+void EscapeShell(string* s) {
+ if (s->find_first_of("$`\\\"") == string::npos)
+ return;
+ string r;
+ bool last_dollar = false;
+ for (char c : *s) {
+ switch (c) {
+ case '$':
+ if (last_dollar) {
+ r += c;
+ last_dollar = false;
+ } else {
+ r += '\\';
+ r += c;
+ last_dollar = true;
+ }
+ break;
+ case '`':
+ case '"':
+ case '\\':
+ r += '\\';
+ // fall through.
+ default:
+ r += c;
+ last_dollar = false;
+ }
+ }
+ s->swap(r);
+}