diff --git a/oodle-cli.cpp b/oodle-cli.cpp index b066b51..d74b1b0 100644 --- a/oodle-cli.cpp +++ b/oodle-cli.cpp @@ -1,7 +1,16 @@ +// oodle-cli.cpp : This file contains the 'main' function. Program execution begins and ends there. +// + #include #include #include #include +#include +#include +#include +#include +#include +#include #include #include @@ -9,22 +18,75 @@ #include "oodle2.h" const LPCWSTR LIB_NAME = L"oo2core_8_win64"; +// Printing a `LPCWSTR` is a pain, so it's much easier to just have this second variable. +// It's not like this is going to change often. +const char* LIB_FILE = "oo2core_8_win64.dll"; void usage() { std::cerr << - "Usage: oodle-cli [OPTIONS] \n" + "Usage: oodle-cli \n" "Decompress a to using the Oodle algorithm.\n" "The size of the uncompressed data must be known.\n" "\n" - " -v Increase verbosity. May be specified up to three times.\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[]) { - HINSTANCE hDLL; - hDLL = LoadLibrary(LIB_NAME); + if (argc < 4) { + std::cerr << "Arguments missing!\n\n"; + usage(); + return 1; + } + + 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) { + std::string search_path(var, len); + std::istringstream ss(search_path); + std::string token; + + while (std::getline(ss, token, ':')) { + auto path = std::filesystem::path(token); + if (!path.is_absolute()) { + path = std::filesystem::absolute(path); + } + + if (!path.is_absolute() || !AddDllDirectory(path.c_str())) { + std::cerr << "Failed to add DLL search path: '" << token << "'!\n"; + } + else { + std::cout << "Added DLL search path: '" << path << "'.\n"; + } + } + + load_flags = LOAD_LIBRARY_SEARCH_DEFAULT_DIRS; + free(var); + } + } + else { + std::cerr << "Failed to read environment variable 'DLL_SEARCH_PATH'. Skipping.\n"; + } + + HINSTANCE hDLL = LoadLibraryEx(LIB_NAME, NULL, load_flags); if (hDLL == NULL) { - std::cerr << "ERROR: Couldn't find library file '" << LIB_NAME << ".dll'!\n"; + std::cerr << "ERROR: Couldn't find library file '" << LIB_FILE << "'!\n"; return 1; } @@ -33,32 +95,12 @@ int main(int argc, char* argv[]) std::cerr << "ERROR: The library is incompatible!\n"; return 1; } - int verbosity = 0; - size_t i = 1; - for (; i < argc; i++) - { - if (strcmp(argv[i], "-v") == 0) { - if (verbosity < 3) { - verbosity++; - } - } - else { - break; - } - } + std::string in_name = argv[1]; + std::string out_name = argv[2]; + size_t raw_buffer_size = std::stoi(argv[3]); - if (argc - i < 3) { - std::cerr << "Arguments missing!\n\n"; - usage(); - return 1; - } - - 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 << "Attempting to decompress from '" << in_name << "' to '" << out_name << "' (" << raw_buffer_size << " bytes), with verbosity " << verbosity << ".\n"; + 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) { diff --git a/oodle-cli.vcxproj b/oodle-cli.vcxproj index 9dbeb2a..78a8e60 100644 --- a/oodle-cli.vcxproj +++ b/oodle-cli.vcxproj @@ -104,6 +104,7 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpp17 Console @@ -118,6 +119,7 @@ true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpp17 Console @@ -135,4 +137,4 @@ - + \ No newline at end of file diff --git a/oodle-cli.vcxproj.filters b/oodle-cli.vcxproj.filters index ff4a7e0..385a323 100644 --- a/oodle-cli.vcxproj.filters +++ b/oodle-cli.vcxproj.filters @@ -20,9 +20,6 @@ - - Header Files - Header Files