summaryrefslogtreecommitdiff
path: root/src/support
diff options
context:
space:
mode:
Diffstat (limited to 'src/support')
-rw-r--r--src/support/command-line.cpp65
-rw-r--r--src/support/command-line.h43
2 files changed, 108 insertions, 0 deletions
diff --git a/src/support/command-line.cpp b/src/support/command-line.cpp
new file mode 100644
index 000000000..3c03d48f4
--- /dev/null
+++ b/src/support/command-line.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2015 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "support/command-line.h"
+
+namespace {
+bool optionIs(const char *arg, const char *LongOpt, const char *ShortOpt) {
+ return strcmp(arg, LongOpt) == 0 || strcmp(arg, ShortOpt) == 0;
+}
+bool startsWith(const char *str, const char *prefix) {
+ return strncmp(str, prefix, strlen(prefix)) == 0;
+}
+} // anonymous namespace
+
+void wasm::processCommandLine(int argc, const char *argv[], Options *options,
+ const char *help) {
+ assert(argc > 0 && "expect at least program name as an argument");
+ for (size_t i = 1, e = argc; i != e; ++i) {
+ if (optionIs(argv[i], "--help", "-h")) {
+ std::cerr << help;
+ exit(EXIT_SUCCESS);
+ } else if (optionIs(argv[i], "--debug", "-d")) {
+ options->debug = true;
+ } else if (optionIs(argv[i], "--output", "-o")) {
+ if (i + 1 == e) {
+ std::cerr << "No output file" << std::endl;
+ exit(EXIT_FAILURE);
+ }
+ if (options->outfile.size()) {
+ std::cerr << "Expected only one output file, got '" << options->outfile
+ << "' and '" << argv[i] << "'" << std::endl;
+ exit(EXIT_FAILURE);
+ }
+ options->outfile = argv[++i];
+ } else if (startsWith(argv[i], "--")) {
+ size_t j = 2;
+ std::string name;
+ while (argv[i][j] && argv[i][j] != '=') {
+ name += argv[i][j];
+ j++;
+ }
+ options->extra[name] = argv[i][j] == '=' ? &argv[i][j + 1] : "(no value)";
+ } else {
+ if (options->infile.size()) {
+ std::cerr << "Expected only one input file, got '" << options->infile
+ << "' and '" << argv[i] << "'" << std::endl;
+ exit(EXIT_FAILURE);
+ }
+ options->infile = argv[i];
+ }
+ }
+}
diff --git a/src/support/command-line.h b/src/support/command-line.h
new file mode 100644
index 000000000..f57929b6b
--- /dev/null
+++ b/src/support/command-line.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2015 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//
+// Command line helpers.
+//
+
+#ifndef wasm_support_command_line_h
+#define wasm_support_command_line_h
+
+#include "wasm.h"
+
+namespace wasm {
+
+struct Options {
+ // standard options
+ bool debug;
+ std::string infile;
+ std::string outfile;
+ // extra options
+ std::map<std::string, const char *> extra;
+ Options() : debug(false) {}
+};
+
+void processCommandLine(int argc, const char *argv[], Options *options,
+ const char *help);
+
+} // namespace wasm
+
+#endif // wasm_support_command_line_h