Skip to content

Commit

Permalink
UNHERF: Use CLI class
Browse files Browse the repository at this point in the history
  • Loading branch information
cosmo-ray authored and DrMcCoy committed Apr 13, 2017
1 parent d51ce21 commit 5359444
Showing 1 changed file with 30 additions and 76 deletions.
106 changes: 30 additions & 76 deletions src/unherf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include "src/common/readfile.h"
#include "src/common/filepath.h"
#include "src/common/hash.h"
#include "src/common/cli.h"

#include "src/aurora/util.h"
#include "src/aurora/herffile.h"
Expand All @@ -53,7 +54,6 @@ enum Command {

const char *kCommandChar[kCommandMAX] = { "l", "e" };

void printUsage(FILE *stream, const Common::UString &name);
bool parseCommandLine(const std::vector<Common::UString> &argv, int &returnValue,
Command &command, Common::UString &file);

Expand Down Expand Up @@ -90,85 +90,39 @@ int main(int argc, char **argv) {
return 0;
}

bool parseCommandLine(const std::vector<Common::UString> &argv, int &returnValue,
Command &command, Common::UString &file) {

file.clear();
std::vector<Common::UString> args;

bool optionsEnd = false;
for (size_t i = 1; i < argv.size(); i++) {
// A "--" marks an end to all options
if (argv[i] == "--") {
optionsEnd = true;
continue;
namespace Common {
namespace CLI {
template<>
int ValGetter<Command &>::get(const std::vector<Common::UString> &args, int i, int) {
_val = kCommandNone;
for (int j = 0; j < kCommandMAX; j++) {
if (!strcmp(args[i].c_str(), kCommandChar[j])) {
_val = (Command) j;
return 0;
}

// We're still handling options
if (!optionsEnd) {
// Help text
if ((argv[i] == "-h") || (argv[i] == "--help")) {
printUsage(stdout, argv[0]);
returnValue = 0;

return false;
}

if (argv[i] == "--version") {
Version::printVersion();
returnValue = 0;

return false;
}

if (argv[i].beginsWith("-") || argv[i].beginsWith("--")) {
// An options, but we already checked for all known ones

printUsage(stderr, argv[0]);
returnValue = 1;

return false;
}
}

args.push_back(argv[i]);
}

if (args.size() != 2) {
printUsage(stderr, argv[0]);
returnValue = 1;

return false;
}

// Find out what we should do
command = kCommandNone;
for (int i = 0; i < kCommandMAX; i++)
if (!strcmp(args[0].c_str(), kCommandChar[i]))
command = (Command) i;

// Unknown command
if (command == kCommandNone) {
printUsage(stderr, argv[0]);
returnValue = 1;

return false;
}

file = args[1];

return true;
return -1;
}
}
}

void printUsage(FILE *stream, const Common::UString &name) {
std::fprintf(stream, "BioWare HERF archive extractor\n\n");
std::fprintf(stream, "Usage: %s [<options>] <command> <file>\n\n", name.c_str());
std::fprintf(stream, "Options:\n");
std::fprintf(stream, " -h --help This help text\n");
std::fprintf(stream, " --version Display version information\n\n");
std::fprintf(stream, "Commands:\n");
std::fprintf(stream, " l List archive\n");
std::fprintf(stream, " e Extract files to current directory\n");
bool parseCommandLine(const std::vector<Common::UString> &argv, int &returnValue,
Command &command, Common::UString &file) {
using Common::CLI::NoOption;
using Common::CLI::kContinueParsing;
using Common::CLI::Parser;
using Common::CLI::ValGetter;
using Common::CLI::makeEndArgs;

NoOption cmdOpt(false, new ValGetter<Command &>(command, "command"));
NoOption fileOpt(false, new ValGetter<Common::UString &>(file, "file"));
Parser parser(argv[0], "BioWare HERF archive extractor",
"Commands:\n"
" l List archive\n"
" e Extract files to current directory\n",
returnValue, makeEndArgs(&cmdOpt, &fileOpt));

return parser.process(argv);
}

bool findHashedName(uint32 hash, Common::UString &name, Common::UString &ext) {
Expand Down

0 comments on commit 5359444

Please sign in to comment.