2
Fork 0

feat: Re-implement argument parsing

This commit is contained in:
Lucas Schwiderski 2022-10-20 17:41:23 +02:00
parent 4cdd7f1b39
commit 7c74a3e786
Signed by: lucas
GPG key ID: AA12679AAA6DF4D8

View file

@ -24,37 +24,43 @@ const char* LIB_FILE = "oo2core_8_win64.dll";
void usage() { void usage() {
std::cerr << std::cerr <<
"Usage: oodle-cli <in_file> <out_file> <uncompressed_size>\n" "Usage: oodle-cli [OPTIONS] [--] <in_file> <out_file> <uncompressed_size>\n"
"Decompress a <in_file> to <out_file> using the Oodle algorithm.\n" "Decompress a <in_file> to <out_file> using the Oodle algorithm.\n"
"The size of the uncompressed data must be known.\n" "The size of the uncompressed data must be known.\n"
"\n" "\n"
"Options:\n"
" -v Increase Oodle's verbosity. May be specified up to three times.\n"
"\n"
"The following environmental variables are recognized:\n" "The following environmental variables are recognized:\n"
" VERBOSITY: An integer between 0 and 3, with 0 being no logging and 3 being maximum logging.\n"
" DLL_SEARCH_PATH: A color (':') separated list of directories to search for the Oodle library. May be relative to the current working directory.\n"; " DLL_SEARCH_PATH: A color (':') separated list of directories to search for the Oodle library. May be relative to the current working directory.\n";
} }
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
if (argc < 4) { int verbosity = 0;
std::cerr << "Arguments missing!\n\n"; int i = 1;
for (; i < argc; i++) {
char* arg = argv[i];
if (strcmp(arg, "--") == 0 || arg[0] != '-') {
break;
}
if (strcmp(arg, "--help") == 0) {
usage(); usage();
return 1; return 0;
}
else if (strcmp(arg, "-v") == 0) {
verbosity++;
}
else {
std::cerr << "WARN: Unknown option '" << arg << "'!\n\n";
}
} }
char* var; char* var;
size_t len; size_t len;
int verbosity = 0;
if (_dupenv_s(&var, &len, "VERBOSITY") == 0) {
if (var) {
verbosity = std::stoi(std::string(var, len));
std::cout << "Setting Oodle verbosity to " << verbosity << ".\n";
free(var);
}
}
else {
std::cerr << "Failed to read environment variable 'VERBOSITY'. Falling back to default.\n";
}
DWORD load_flags = 0; DWORD load_flags = 0;
if (_dupenv_s(&var, &len, "DLL_SEARCH_PATH") == 0) { if (_dupenv_s(&var, &len, "DLL_SEARCH_PATH") == 0) {
if (var) { if (var) {
@ -69,10 +75,10 @@ int main(int argc, char* argv[])
} }
if (!path.is_absolute() || !AddDllDirectory(path.c_str())) { if (!path.is_absolute() || !AddDllDirectory(path.c_str())) {
std::cerr << "Failed to add DLL search path: '" << token << "'!\n"; std::cerr << "WARN: Failed to add DLL search path: '" << token << "'!\n";
} }
else { else {
std::cout << "Added DLL search path: '" << path << "'.\n"; std::cout << "INFO: Added DLL search path: '" << path << "'.\n";
} }
} }
@ -81,7 +87,7 @@ int main(int argc, char* argv[])
} }
} }
else { else {
std::cerr << "Failed to read environment variable 'DLL_SEARCH_PATH'. Skipping.\n"; std::cerr << "ERROR: Failed to read environment variable 'DLL_SEARCH_PATH'. Skipping.\n";
} }
HINSTANCE hDLL = LoadLibraryEx(LIB_NAME, NULL, load_flags); HINSTANCE hDLL = LoadLibraryEx(LIB_NAME, NULL, load_flags);
@ -96,21 +102,22 @@ int main(int argc, char* argv[])
return 1; return 1;
} }
std::string in_name = argv[1];
std::string out_name = argv[2];
size_t raw_buffer_size = std::stoi(argv[3]);
std::cout << "Attempting to decompress from '" << in_name << "' to '" << out_name << "' (" << raw_buffer_size << " bytes).\n"; if (argc - i < 3) {
std::cerr << "ERROR: Arguments missing!\n\n";
std::ifstream in_file(in_name, std::ios::binary | std::ios::ate); usage();
if (!in_file) {
std::cerr << "Failed to open compressed file!\n";
return 1; return 1;
} }
std::ofstream out_file(out_name, std::ios::binary); std::string in_name = argv[i];
if (!out_file) { std::string out_name = argv[i + 1];
std::cerr << "Failed to open output file!\n"; size_t raw_buffer_size = std::stoi(argv[i + 2]);
std::cout << "INFO: Attempting to decompress from '" << in_name << "' to '" << out_name << "' (" << raw_buffer_size << " bytes).\n";
std::ifstream in_file(in_name, std::ios::binary | std::ios::ate);
if (!in_file) {
std::cerr << "ERROR: Failed to open compressed file!\n";
return 1; return 1;
} }
@ -121,7 +128,7 @@ int main(int argc, char* argv[])
in_file.read(compressed_buffer.data(), compressed_buffer_size); in_file.read(compressed_buffer.data(), compressed_buffer_size);
if (in_file.fail()) { if (in_file.fail()) {
std::cerr << "Failed to read compressed file!\n"; std::cerr << "ERROR: Failed to read compressed file!\n";
return 1; return 1;
} }
@ -156,5 +163,5 @@ int main(int argc, char* argv[])
return 1; return 1;
} }
std::cout << "Done!\n"; std::cout << "INFO: Done!\n";
} }