diff options
author | Thomas Lively <7121787+tlively@users.noreply.github.com> | 2021-08-27 10:36:12 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-27 10:36:12 -0700 |
commit | c2007eab91ed60ac4bc8a6a555e9dc3e76ef2242 (patch) | |
tree | 71255c327ca6e8b8bf5f09dc94a61dc82f0fa01c /src | |
parent | 83e70667d4b06885000d35d1d70b3f16363bf405 (diff) | |
download | binaryen-c2007eab91ed60ac4bc8a6a555e9dc3e76ef2242.tar.gz binaryen-c2007eab91ed60ac4bc8a6a555e9dc3e76ef2242.tar.bz2 binaryen-c2007eab91ed60ac4bc8a6a555e9dc3e76ef2242.zip |
Read from stdin when the input file is `-` (#4106)
We already supported `-` as meaning stdout for output and this is useful in
similar situations. Fixes #4105.
Diffstat (limited to 'src')
-rw-r--r-- | src/support/command-line.cpp | 6 | ||||
-rw-r--r-- | src/support/file.cpp | 14 |
2 files changed, 18 insertions, 2 deletions
diff --git a/src/support/command-line.cpp b/src/support/command-line.cpp index 355d704bb..d9b7170f5 100644 --- a/src/support/command-line.cpp +++ b/src/support/command-line.cpp @@ -124,16 +124,18 @@ void Options::parse(int argc, const char* argv[]) { assert(argc > 0 && "expect at least program name as an argument"); size_t positionalsSeen = 0; auto dashes = [](const std::string& s) { - for (size_t i = 0;; ++i) { + for (size_t i = 0; i < s.size(); ++i) { if (s[i] != '-') { return i; } } + return s.size(); }; for (size_t i = 1, e = argc; i != e; ++i) { std::string currentOption = argv[i]; - if (dashes(currentOption) == 0) { + // "-" alone is a positional option + if (dashes(currentOption) == 0 || currentOption == "-") { // Positional. switch (positional) { case Arguments::Zero: diff --git a/src/support/file.cpp b/src/support/file.cpp index d17e3a338..dc9707a1b 100644 --- a/src/support/file.cpp +++ b/src/support/file.cpp @@ -34,8 +34,22 @@ std::vector<char> wasm::read_stdin() { return input; } +template<typename T> struct do_read_stdin { T operator()(); }; + +template<> std::vector<char> do_read_stdin<std::vector<char>>::operator()() { + return wasm::read_stdin(); +} + +template<> std::string do_read_stdin<std::string>::operator()() { + auto vec = wasm::read_stdin(); + return std::string(vec.begin(), vec.end()); +} + template<typename T> T wasm::read_file(const std::string& filename, Flags::BinaryOption binary) { + if (filename == "-") { + return do_read_stdin<T>{}(); + } BYN_TRACE("Loading '" << filename << "'...\n"); std::ifstream infile; std::ios_base::openmode flags = std::ifstream::in; |