From e8a564897cfd3945a097bd07c553d7a5d29355b8 Mon Sep 17 00:00:00 2001 From: JF Bastien Date: Tue, 29 Dec 2015 17:19:32 -0800 Subject: Start moving command-line processing to libsupport.a This only moves things, no functional change yet. --- src/command-line.h | 83 -------------------------------------------- src/s2wasm-main.cpp | 2 +- src/support/command-line.cpp | 62 +++++++++++++++++++++++++++++++++ src/support/command-line.h | 43 +++++++++++++++++++++++ 4 files changed, 106 insertions(+), 84 deletions(-) delete mode 100644 src/command-line.h create mode 100644 src/support/command-line.cpp create mode 100644 src/support/command-line.h (limited to 'src') diff --git a/src/command-line.h b/src/command-line.h deleted file mode 100644 index 4b8b12b4c..000000000 --- a/src/command-line.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 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_command_line_h -#define wasm_command_line_h - -#include "wasm.h" - -namespace wasm { - -struct Options { - // standard options - bool debug; - std::string infile; - std::string outfile; - // extra options - std::map extra; - Options() : debug(false) {} -}; - -bool optionIs(const char *arg, const char *LongOpt, const char *ShortOpt) { - return strcmp(arg, LongOpt) == 0 || strcmp(arg, ShortOpt) == 0; -} - -// TODO(jfb) Make this configurable: callers should pass in option handlers. -void 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 (argv[i][0] == '-' && argv[i][1] == '-') { - 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]; - } - } -} - -} // namespace wasm - -#endif // wasm_command_line_h diff --git a/src/s2wasm-main.cpp b/src/s2wasm-main.cpp index 86a9737a7..00b71ab16 100644 --- a/src/s2wasm-main.cpp +++ b/src/s2wasm-main.cpp @@ -18,7 +18,7 @@ // wasm2asm console tool // -#include "command-line.h" +#include "support/command-line.h" #include "s2wasm.h" using namespace cashew; diff --git a/src/support/command-line.cpp b/src/support/command-line.cpp new file mode 100644 index 000000000..b023fcb66 --- /dev/null +++ b/src/support/command-line.cpp @@ -0,0 +1,62 @@ +/* + * 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; +} +} // 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 (argv[i][0] == '-' && argv[i][1] == '-') { + 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..f52e962f7 --- /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_command_line_h +#define wasm_command_line_h + +#include "wasm.h" + +namespace wasm { + +struct Options { + // standard options + bool debug; + std::string infile; + std::string outfile; + // extra options + std::map extra; + Options() : debug(false) {} +}; + +void processCommandLine(int argc, const char *argv[], Options *options, + const char *help); + +} // namespace wasm + +#endif // wasm_command_line_h -- cgit v1.2.3 From e78f6ad3b4c9af4eaaec7309768525ea541d1c3e Mon Sep 17 00:00:00 2001 From: JF Bastien Date: Tue, 29 Dec 2015 17:22:45 -0800 Subject: Fix include guards. --- src/support/command-line.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/support/command-line.h b/src/support/command-line.h index f52e962f7..f57929b6b 100644 --- a/src/support/command-line.h +++ b/src/support/command-line.h @@ -18,8 +18,8 @@ // Command line helpers. // -#ifndef wasm_command_line_h -#define wasm_command_line_h +#ifndef wasm_support_command_line_h +#define wasm_support_command_line_h #include "wasm.h" @@ -40,4 +40,4 @@ void processCommandLine(int argc, const char *argv[], Options *options, } // namespace wasm -#endif // wasm_command_line_h +#endif // wasm_support_command_line_h -- cgit v1.2.3 From 3bf113b601de6d1a55f54ed1b788037cd5514419 Mon Sep 17 00:00:00 2001 From: JF Bastien Date: Tue, 29 Dec 2015 17:29:13 -0800 Subject: Add a help to avoid out-of-bounds. --- src/support/command-line.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/support/command-line.cpp b/src/support/command-line.cpp index b023fcb66..3c03d48f4 100644 --- a/src/support/command-line.cpp +++ b/src/support/command-line.cpp @@ -20,6 +20,9 @@ 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, @@ -42,7 +45,7 @@ void wasm::processCommandLine(int argc, const char *argv[], Options *options, exit(EXIT_FAILURE); } options->outfile = argv[++i]; - } else if (argv[i][0] == '-' && argv[i][1] == '-') { + } else if (startsWith(argv[i], "--")) { size_t j = 2; std::string name; while (argv[i][j] && argv[i][j] != '=') { -- cgit v1.2.3