From 4836189338a9d919a4aeed65a3b116211c0f5edd Mon Sep 17 00:00:00 2001 From: jakcron Date: Tue, 31 Jul 2018 13:50:29 +0800 Subject: [PATCH] [nstool] Enables unicode support for commandline arguments for windows platorm. Fixes #35. --- programs/nstool/source/UserSettings.cpp | 155 +++++++++++------------- programs/nstool/source/UserSettings.h | 5 +- programs/nstool/source/main.cpp | 17 ++- 3 files changed, 93 insertions(+), 84 deletions(-) diff --git a/programs/nstool/source/UserSettings.cpp b/programs/nstool/source/UserSettings.cpp index ce6975a..7b844f5 100644 --- a/programs/nstool/source/UserSettings.cpp +++ b/programs/nstool/source/UserSettings.cpp @@ -26,10 +26,10 @@ UserSettings::UserSettings() {} -void UserSettings::parseCmdArgs(int argc, char** argv) +void UserSettings::parseCmdArgs(const std::vector& arg_list) { sCmdArgs args; - populateCmdArgs(argc, argv, args); + populateCmdArgs(arg_list, args); populateKeyset(args); populateUserSettings(args); } @@ -182,184 +182,177 @@ const sOptional& UserSettings::getAssetNacpPath() const return mAssetNacpPath; } -void UserSettings::populateCmdArgs(int argc, char** argv, sCmdArgs& cmd_args) +void UserSettings::populateCmdArgs(const std::vector& arg_list, sCmdArgs& cmd_args) { - // create vector of args - std::vector args; - for (size_t i = 0; i < (size_t)argc; i++) - { - args.push_back(argv[i]); - } - // show help text - if (args.size() < 2) + if (arg_list.size() < 2) { showHelp(); throw fnd::Exception(kModuleName, "Not enough arguments."); } - cmd_args.input_path = args.back(); + cmd_args.input_path = arg_list.back(); - for (size_t i = 1; i < args.size(); i++) + for (size_t i = 1; i < arg_list.size(); i++) { - if (args[i] == "-h" || args[i] == "--help") + if (arg_list[i] == "-h" || arg_list[i] == "--help") { showHelp(); throw fnd::Exception(kModuleName, "Nothing to do."); } } - for (size_t i = 1; i+1 < args.size(); i++) + for (size_t i = 1; i+1 < arg_list.size(); i++) { - bool hasParamter = args[i+1][0] != '-' && i+2 < args.size(); + bool hasParamter = arg_list[i+1][0] != '-' && i+2 < arg_list.size(); - if (args[i] == "-d" || args[i] == "--dev") + if (arg_list[i] == "-d" || arg_list[i] == "--dev") { - if (hasParamter) throw fnd::Exception(kModuleName, args[i] + " does not take a parameter."); + if (hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " does not take a parameter."); cmd_args.devkit_keys = true; } - else if (args[i] == "-y" || args[i] == "--verify") + else if (arg_list[i] == "-y" || arg_list[i] == "--verify") { - if (hasParamter) throw fnd::Exception(kModuleName, args[i] + " does not take a parameter."); + if (hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " does not take a parameter."); cmd_args.verify_file = true; } - else if (args[i] == "--showkeys") + else if (arg_list[i] == "--showkeys") { - if (hasParamter) throw fnd::Exception(kModuleName, args[i] + " does not take a parameter."); + if (hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " does not take a parameter."); cmd_args.show_keys = true; } - else if (args[i] == "--showlayout") + else if (arg_list[i] == "--showlayout") { - if (hasParamter) throw fnd::Exception(kModuleName, args[i] + " does not take a parameter."); + if (hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " does not take a parameter."); cmd_args.show_layout = true; } - else if (args[i] == "-v" || args[i] == "--verbose") + else if (arg_list[i] == "-v" || arg_list[i] == "--verbose") { - if (hasParamter) throw fnd::Exception(kModuleName, args[i] + " does not take a parameter."); + if (hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " does not take a parameter."); cmd_args.verbose_output = true; } - else if (args[i] == "-k" || args[i] == "--keyset") + else if (arg_list[i] == "-k" || arg_list[i] == "--keyset") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.keyset_path = args[i+1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.keyset_path = arg_list[i+1]; } - else if (args[i] == "-t" || args[i] == "--type") + else if (arg_list[i] == "-t" || arg_list[i] == "--type") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.file_type = args[i+1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.file_type = arg_list[i+1]; } - else if (args[i] == "--listfs") + else if (arg_list[i] == "--listfs") { - if (hasParamter) throw fnd::Exception(kModuleName, args[i] + " does not take a parameter."); + if (hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " does not take a parameter."); cmd_args.list_fs = true; } - else if (args[i] == "--update") + else if (arg_list[i] == "--update") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.update_path = args[i+1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.update_path = arg_list[i+1]; } - else if (args[i] == "--normal") + else if (arg_list[i] == "--normal") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.normal_path = args[i+1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.normal_path = arg_list[i+1]; } - else if (args[i] == "--secure") + else if (arg_list[i] == "--secure") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.secure_path = args[i+1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.secure_path = arg_list[i+1]; } - else if (args[i] == "--logo") + else if (arg_list[i] == "--logo") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.logo_path = args[i+1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.logo_path = arg_list[i+1]; } - else if (args[i] == "--fsdir") + else if (arg_list[i] == "--fsdir") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.fs_path = args[i+1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.fs_path = arg_list[i+1]; } - else if (args[i] == "--titlekey") + else if (arg_list[i] == "--titlekey") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.nca_titlekey = args[i+1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.nca_titlekey = arg_list[i+1]; } - else if (args[i] == "--bodykey") + else if (arg_list[i] == "--bodykey") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.nca_bodykey = args[i+1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.nca_bodykey = arg_list[i+1]; } - else if (args[i] == "--part0") + else if (arg_list[i] == "--part0") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.part0_path = args[i+1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.part0_path = arg_list[i+1]; } - else if (args[i] == "--part1") + else if (arg_list[i] == "--part1") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.part1_path = args[i+1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.part1_path = arg_list[i+1]; } - else if (args[i] == "--part2") + else if (arg_list[i] == "--part2") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.part2_path = args[i+1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.part2_path = arg_list[i+1]; } - else if (args[i] == "--part3") + else if (arg_list[i] == "--part3") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.part3_path = args[i+1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.part3_path = arg_list[i+1]; } - else if (args[i] == "--listapi") + else if (arg_list[i] == "--listapi") { - if (hasParamter) throw fnd::Exception(kModuleName, args[i] + " does not take a parameter."); + if (hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " does not take a parameter."); cmd_args.list_api = true; } - else if (args[i] == "--listsym") + else if (arg_list[i] == "--listsym") { - if (hasParamter) throw fnd::Exception(kModuleName, args[i] + " does not take a parameter."); + if (hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " does not take a parameter."); cmd_args.list_sym = true; } - else if (args[i] == "--insttype") + else if (arg_list[i] == "--insttype") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.inst_type = args[i + 1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.inst_type = arg_list[i + 1]; } - else if (args[i] == "--icon") + else if (arg_list[i] == "--icon") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.asset_icon_path = args[i + 1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.asset_icon_path = arg_list[i + 1]; } - else if (args[i] == "--nacp") + else if (arg_list[i] == "--nacp") { - if (!hasParamter) throw fnd::Exception(kModuleName, args[i] + " requries a parameter."); - cmd_args.asset_nacp_path = args[i + 1]; + if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter."); + cmd_args.asset_nacp_path = arg_list[i + 1]; } else { - throw fnd::Exception(kModuleName, args[i] + " is not recognised."); + throw fnd::Exception(kModuleName, arg_list[i] + " is not recognised."); } i += hasParamter; diff --git a/programs/nstool/source/UserSettings.h b/programs/nstool/source/UserSettings.h index d7c27b9..f7e1969 100644 --- a/programs/nstool/source/UserSettings.h +++ b/programs/nstool/source/UserSettings.h @@ -1,4 +1,5 @@ #pragma once +#include #include #include #include @@ -10,7 +11,7 @@ class UserSettings public: UserSettings(); - void parseCmdArgs(int argc, char** argv); + void parseCmdArgs(const std::vector& arg_list); void showHelp(); // generic options @@ -97,7 +98,7 @@ private: bool mListSymbols; nx::npdm::InstructionType mInstructionType; - void populateCmdArgs(int argc, char** argv, sCmdArgs& cmd_args); + void populateCmdArgs(const std::vector& arg_list, sCmdArgs& cmd_args); void populateKeyset(sCmdArgs& args); void populateUserSettings(sCmdArgs& args); void decodeHexStringToBytes(const std::string& name, const std::string& str, byte_t* out, size_t out_len); diff --git a/programs/nstool/source/main.cpp b/programs/nstool/source/main.cpp index 9039e59..ef1fafb 100644 --- a/programs/nstool/source/main.cpp +++ b/programs/nstool/source/main.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "UserSettings.h" #include "XciProcess.h" #include "PfsProcess.h" @@ -12,11 +13,25 @@ #include "NacpProcess.h" #include "AssetProcess.h" +#ifdef _WIN32 +int wmain(int argc, wchar_t** argv) +#else int main(int argc, char** argv) +#endif { + std::vector args; + for (size_t i = 0; i < (size_t)argc; i++) + { +#ifdef _WIN32 + args.push_back(fnd::StringConv::ConvertChar16ToChar8(std::u16string((char16_t*)argv[i]))); +#else + args.push_back(argv[i]); +#endif + } + UserSettings user_set; try { - user_set.parseCmdArgs(argc, argv); + user_set.parseCmdArgs(args); if (user_set.getFileType() == FILE_XCI) {