summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Lively <7121787+tlively@users.noreply.github.com>2021-08-27 10:36:12 -0700
committerGitHub <noreply@github.com>2021-08-27 10:36:12 -0700
commitc2007eab91ed60ac4bc8a6a555e9dc3e76ef2242 (patch)
tree71255c327ca6e8b8bf5f09dc94a61dc82f0fa01c /src
parent83e70667d4b06885000d35d1d70b3f16363bf405 (diff)
downloadbinaryen-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.cpp6
-rw-r--r--src/support/file.cpp14
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;