diff --git a/src/commandline.cxx b/src/commandline.cxx index df2bff1..ece87cf 100644 --- a/src/commandline.cxx +++ b/src/commandline.cxx @@ -113,10 +113,6 @@ bool IsRelocate(const char* arg) { return CLICheck(arg, "relocate"); } -bool IsReport(const char* arg) { - return CLICheck(arg, "report"); -} - /** * Parse the command line arguments supportin the relocate command */ @@ -157,32 +153,11 @@ std::map ParseRelocate(const char** args, int argc) { return opts; } -std::map ParseReport(int argc, const char** args) { - std::map opts; - for (int i = 0; i < argc; ++i) { - if (endswith(std::string(args[i]), ".dll") || - endswith(std::string(args[i]), ".exe")) { - if (redefinedArgCheck(opts, "pe", "pe")) { - opts.clear(); - return opts; - } - opts.insert(std::pair("pe", args[i])); - } else if (endswith(std::string(args[i]), ".lib")) { - if (redefinedArgCheck(opts, "coff", "coff")) { - opts.clear(); - return opts; - } - opts.insert(std::pair("coff", args[i])); - } - } - return opts; -} - -bool CheckAndPrintHelp(const char** arg, int argc) { - if (argc < 2) { +bool CheckAndPrintHelp(const char** arg, bool no_args, bool is_relocate) { + if (no_args && is_relocate) { return print_help(); } - if (strcmp(arg[1], "--help") == 0 || strcmp(arg[1], "-h") == 0) { + if (!no_args && (strcmp(arg[1], "--help") == 0 || strcmp(arg[1], "-h") == 0)) { return print_help(); } return false; diff --git a/src/commandline.h b/src/commandline.h index 28c93e2..2e2ac03 100644 --- a/src/commandline.h +++ b/src/commandline.h @@ -6,17 +6,9 @@ // of this executable bool IsRelocate(const char* arg); -// Determines if a command line invocation is for the report form of this -// Executable -bool IsReport(const char* arg); - // Parses the command line for an invocation of the relocate command // and returns the arguments mapped from argument name to value std::map ParseRelocate(const char** args, int argc); -// Parses the command line for an invocation of the report command -// adn returns the arguments mappedfrom argument name to value -std::map ParseReport(int argc, const char** args); - // Writes CLI help message to stdout -bool CheckAndPrintHelp(const char** arg, int argc); \ No newline at end of file +bool CheckAndPrintHelp(const char** arg, bool no_args, bool is_relocate); \ No newline at end of file diff --git a/src/ld.cxx b/src/ld.cxx index c3fbc76..e209571 100644 --- a/src/ld.cxx +++ b/src/ld.cxx @@ -47,6 +47,11 @@ DWORD LdInvocation::InvokeToolchain() { } catch (const FileIOError& e) { return ExitConditions::FILE_IO_FAILURE; } + // If there are no arguments (or the argument is just "/?") + // just print help and return + if(link_run.get_input_files().empty() || link_run.isHelp()) { + return ToolChainInvocation::InvokeToolchain(); + } try { link_run.makeRsp(); diff --git a/src/linker_invocation.cxx b/src/linker_invocation.cxx index e7b7b4f..07fe2e7 100644 --- a/src/linker_invocation.cxx +++ b/src/linker_invocation.cxx @@ -78,6 +78,9 @@ void LinkerInvocation::ProcessTokens(const std::string &normal_token, const std: this->piped_args_.end()) { this->piped_args_.at(normal_token).emplace_back(token); } + else if (normal_token == "?") { + this->is_help_ = true; + } } @@ -113,7 +116,9 @@ void LinkerInvocation::Parse() { // /NAME // if no /NAME // first input file (post rc expansion) - + if (this->is_help_ || this->input_files_.empty()) { + return; + } this->processDefFile(); std::string const ext = this->is_exe_ ? ".exe" : ".dll"; if (this->output_.empty()) { @@ -318,3 +323,7 @@ std::string LinkerInvocation::get_mangled_out() const { bool LinkerInvocation::IsExeLink() const { return this->is_exe_ || endswith(this->get_out(), ".exe"); } + +bool LinkerInvocation::isHelp() const { + return this->is_help_; +} diff --git a/src/linker_invocation.h b/src/linker_invocation.h index 2a41639..7429351 100644 --- a/src/linker_invocation.h +++ b/src/linker_invocation.h @@ -24,6 +24,7 @@ class LinkerInvocation { StrList get_input_files() const; std::string get_lib_link_args() const; bool makeRsp(); + bool isHelp() const; private: void ProcessTokens(const std::string &normal_token, const std::string& token); @@ -39,7 +40,8 @@ class LinkerInvocation { StrList command_files_; StrList input_files_; StrList tokens_; - bool is_exe_; + bool is_exe_ = true; + bool is_help_ = false; std::map piped_args_ = { {"export", {}}, {"include", {}}, {"libpath", {}}, {"ltcg", {}}, {"machine", {}}, {"nodefaultlib", {}}, diff --git a/src/main.cxx b/src/main.cxx index 7fa7708..dcd4f88 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -19,11 +19,12 @@ #include int main(int argc, const char* argv[]) { - - if (CheckAndPrintHelp(argv, argc)) { + const bool is_relocate = IsRelocate(argv[0]); + const bool no_args = argc < 2; + if (CheckAndPrintHelp(argv, no_args, is_relocate)) { return 0; } - if (IsRelocate(argv[0])) { + if (is_relocate) { std::map patch_args = ParseRelocate(argv + 1, argc - 1); if (patch_args.empty()) { @@ -90,32 +91,6 @@ int main(int argc, const char* argv[]) { std::cerr << "Library rename failed\n"; return ExitConditions::RENAME_FAILURE; } - } else if (IsReport(argv[0])) { - std::map report_args = - ParseReport(argc - 1, argv + 1); - if (report_args.empty()) { - std::cerr << "Unable to parse command line for reporting\n" - << "run command with --help flag for accepted command " - "line arguments\n"; - return ExitConditions::CLI_FAILURE; - } - if (report_args.find("pe") != report_args.end()) { - try { - LibRename portable_executable(report_args.at("pe"), - std::string(), false, true); - portable_executable.ExecuteRename(); - } catch (const NameTooLongError& e) { - std::cerr - << "Unable to parse command line for reporting\n" - << "run command with --help flag for accepted command " - "line arguments\n"; - return ExitConditions::CLI_FAILURE; - } - } else { - CoffReaderWriter coff_reader(report_args.at("coff")); - CoffParser coff(&coff_reader); - return static_cast(reportCoff(coff)); - } } else { // Ensure required variables are set if (!ValidateSpackEnv()) {