[nstool] Enables unicode support for commandline arguments for windows platorm. Fixes #35.

This commit is contained in:
jakcron 2018-07-31 13:50:29 +08:00
parent ca13bbd24b
commit 4836189338
3 changed files with 93 additions and 84 deletions

View file

@ -26,10 +26,10 @@
UserSettings::UserSettings() UserSettings::UserSettings()
{} {}
void UserSettings::parseCmdArgs(int argc, char** argv) void UserSettings::parseCmdArgs(const std::vector<std::string>& arg_list)
{ {
sCmdArgs args; sCmdArgs args;
populateCmdArgs(argc, argv, args); populateCmdArgs(arg_list, args);
populateKeyset(args); populateKeyset(args);
populateUserSettings(args); populateUserSettings(args);
} }
@ -182,184 +182,177 @@ const sOptional<std::string>& UserSettings::getAssetNacpPath() const
return mAssetNacpPath; return mAssetNacpPath;
} }
void UserSettings::populateCmdArgs(int argc, char** argv, sCmdArgs& cmd_args) void UserSettings::populateCmdArgs(const std::vector<std::string>& arg_list, sCmdArgs& cmd_args)
{ {
// create vector of args
std::vector<std::string> args;
for (size_t i = 0; i < (size_t)argc; i++)
{
args.push_back(argv[i]);
}
// show help text // show help text
if (args.size() < 2) if (arg_list.size() < 2)
{ {
showHelp(); showHelp();
throw fnd::Exception(kModuleName, "Not enough arguments."); 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(); showHelp();
throw fnd::Exception(kModuleName, "Nothing to do."); 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; 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; 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; 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; 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; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.keyset_path = args[i+1]; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.file_type = args[i+1]; 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; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.update_path = args[i+1]; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.normal_path = args[i+1]; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.secure_path = args[i+1]; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.logo_path = args[i+1]; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.fs_path = args[i+1]; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.nca_titlekey = args[i+1]; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.nca_bodykey = args[i+1]; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.part0_path = args[i+1]; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.part1_path = args[i+1]; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.part2_path = args[i+1]; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.part3_path = args[i+1]; 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; 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; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.inst_type = args[i + 1]; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.asset_icon_path = args[i + 1]; 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."); if (!hasParamter) throw fnd::Exception(kModuleName, arg_list[i] + " requries a parameter.");
cmd_args.asset_nacp_path = args[i + 1]; cmd_args.asset_nacp_path = arg_list[i + 1];
} }
else else
{ {
throw fnd::Exception(kModuleName, args[i] + " is not recognised."); throw fnd::Exception(kModuleName, arg_list[i] + " is not recognised.");
} }
i += hasParamter; i += hasParamter;

View file

@ -1,4 +1,5 @@
#pragma once #pragma once
#include <vector>
#include <string> #include <string>
#include <fnd/types.h> #include <fnd/types.h>
#include <fnd/Vec.h> #include <fnd/Vec.h>
@ -10,7 +11,7 @@ class UserSettings
public: public:
UserSettings(); UserSettings();
void parseCmdArgs(int argc, char** argv); void parseCmdArgs(const std::vector<std::string>& arg_list);
void showHelp(); void showHelp();
// generic options // generic options
@ -97,7 +98,7 @@ private:
bool mListSymbols; bool mListSymbols;
nx::npdm::InstructionType mInstructionType; nx::npdm::InstructionType mInstructionType;
void populateCmdArgs(int argc, char** argv, sCmdArgs& cmd_args); void populateCmdArgs(const std::vector<std::string>& arg_list, sCmdArgs& cmd_args);
void populateKeyset(sCmdArgs& args); void populateKeyset(sCmdArgs& args);
void populateUserSettings(sCmdArgs& args); void populateUserSettings(sCmdArgs& args);
void decodeHexStringToBytes(const std::string& name, const std::string& str, byte_t* out, size_t out_len); void decodeHexStringToBytes(const std::string& name, const std::string& str, byte_t* out, size_t out_len);

View file

@ -1,5 +1,6 @@
#include <cstdio> #include <cstdio>
#include <fnd/SimpleFile.h> #include <fnd/SimpleFile.h>
#include <fnd/StringConv.h>
#include "UserSettings.h" #include "UserSettings.h"
#include "XciProcess.h" #include "XciProcess.h"
#include "PfsProcess.h" #include "PfsProcess.h"
@ -12,11 +13,25 @@
#include "NacpProcess.h" #include "NacpProcess.h"
#include "AssetProcess.h" #include "AssetProcess.h"
#ifdef _WIN32
int wmain(int argc, wchar_t** argv)
#else
int main(int argc, char** argv) int main(int argc, char** argv)
#endif
{ {
std::vector<std::string> 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; UserSettings user_set;
try { try {
user_set.parseCmdArgs(argc, argv); user_set.parseCmdArgs(args);
if (user_set.getFileType() == FILE_XCI) if (user_set.getFileType() == FILE_XCI)
{ {