diff options
author | Rebecca Turner <rbt@sent.as> | 2024-03-14 17:44:43 -0700 |
---|---|---|
committer | Rebecca Turner <rbt@sent.as> | 2024-03-26 16:44:04 -0700 |
commit | aee3d639b5096349413021537ae842c8c33ef6cf (patch) | |
tree | ee8557f970f5c477116bd1b77a8b9cacce59d03a /src/nix-build | |
parent | da22dbc33397c9c6c5d115ce753d5cf11585291e (diff) |
Move `shell_words` into its own file
Change-Id: I34c0ebfb6dcea49bf632d8880e04075335a132bf
Diffstat (limited to 'src/nix-build')
-rw-r--r-- | src/nix-build/nix-build.cc | 61 |
1 files changed, 2 insertions, 59 deletions
diff --git a/src/nix-build/nix-build.cc b/src/nix-build/nix-build.cc index 3928e39a9..9a3994842 100644 --- a/src/nix-build/nix-build.cc +++ b/src/nix-build/nix-build.cc @@ -23,70 +23,13 @@ #include "common-eval-args.hh" #include "attr-path.hh" #include "legacy.hh" +#include "shlex.hh" using namespace nix; using namespace std::string_literals; extern char * * environ __attribute__((weak)); -/* Recreate the effect of the perl shellwords function, breaking up a - * string into arguments like a shell word, including escapes - */ -static std::vector<std::string> shellwords(const std::string & s) -{ - std::regex whitespace("^\\s+"); - auto begin = s.cbegin(); - std::vector<std::string> res; - std::string cur; - enum state { - sBegin, - sSingleQuote, - sDoubleQuote - }; - state st = sBegin; - auto it = begin; - for (; it != s.cend(); ++it) { - if (st == sBegin) { - std::smatch match; - if (regex_search(it, s.cend(), match, whitespace)) { - cur.append(begin, it); - res.push_back(cur); - it = match[0].second; - if (it == s.cend()) return res; - begin = it; - cur.clear(); - } - } - switch (*it) { - case '\'': - if (st != sDoubleQuote) { - cur.append(begin, it); - begin = it + 1; - st = st == sBegin ? sSingleQuote : sBegin; - } - break; - case '"': - if (st != sSingleQuote) { - cur.append(begin, it); - begin = it + 1; - st = st == sBegin ? sDoubleQuote : sBegin; - } - break; - case '\\': - if (st != sSingleQuote) { - /* perl shellwords mostly just treats the next char as part of the string with no special processing */ - cur.append(begin, it); - begin = ++it; - } - break; - } - } - if (st != sBegin) throw Error("unterminated quote in shebang line"); - cur.append(begin, it); - res.push_back(cur); - return res; -} - static void main_nix_build(int argc, char * * argv) { auto dryRun = false; @@ -143,7 +86,7 @@ static void main_nix_build(int argc, char * * argv) line = chomp(line); std::smatch match; if (std::regex_match(line, match, std::regex("^#!\\s*nix-shell\\s+(.*)$"))) - for (const auto & word : shellwords(match[1].str())) + for (const auto & word : shell_split(match[1].str())) args.push_back(word); } } |