diff --git a/oodle-cli.cpp b/oodle-cli.cpp index d74b1b0..caf2b44 100644 --- a/oodle-cli.cpp +++ b/oodle-cli.cpp @@ -24,37 +24,43 @@ const char* LIB_FILE = "oo2core_8_win64.dll"; void usage() { std::cerr << - "Usage: oodle-cli \n" + "Usage: oodle-cli [OPTIONS] [--] \n" "Decompress a to using the Oodle algorithm.\n" "The size of the uncompressed data must be known.\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" - " 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"; } int main(int argc, char* argv[]) { - if (argc < 4) { - std::cerr << "Arguments missing!\n\n"; - usage(); - return 1; + int verbosity = 0; + int i = 1; + + for (; i < argc; i++) { + char* arg = argv[i]; + + if (strcmp(arg, "--") == 0 || arg[0] != '-') { + break; + } + + if (strcmp(arg, "--help") == 0) { + usage(); + return 0; + } + else if (strcmp(arg, "-v") == 0) { + verbosity++; + } + else { + std::cerr << "WARN: Unknown option '" << arg << "'!\n\n"; + } } char* var; 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; if (_dupenv_s(&var, &len, "DLL_SEARCH_PATH") == 0) { if (var) { @@ -69,10 +75,10 @@ int main(int argc, char* argv[]) } 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 { - 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 { - 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); @@ -96,21 +102,22 @@ int main(int argc, char* argv[]) 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"; - - std::ifstream in_file(in_name, std::ios::binary | std::ios::ate); - if (!in_file) { - std::cerr << "Failed to open compressed file!\n"; + if (argc - i < 3) { + std::cerr << "ERROR: Arguments missing!\n\n"; + usage(); return 1; } - std::ofstream out_file(out_name, std::ios::binary); - if (!out_file) { - std::cerr << "Failed to open output file!\n"; + std::string in_name = argv[i]; + std::string out_name = argv[i + 1]; + 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; } @@ -121,7 +128,7 @@ int main(int argc, char* argv[]) in_file.read(compressed_buffer.data(), compressed_buffer_size); if (in_file.fail()) { - std::cerr << "Failed to read compressed file!\n"; + std::cerr << "ERROR: Failed to read compressed file!\n"; return 1; } @@ -156,5 +163,5 @@ int main(int argc, char* argv[]) return 1; } - std::cout << "Done!\n"; + std::cout << "INFO: Done!\n"; }