forked from mirror/openmw-tes3mp
Replace gengetopt with bullet program options for esmtool's argument handling
This commit is contained in:
parent
185cd63462
commit
b3159683a4
5 changed files with 118 additions and 1348 deletions
|
@ -1,6 +1,4 @@
|
||||||
set(ESMTOOL
|
set(ESMTOOL
|
||||||
esmtool_cmd.c
|
|
||||||
esmtool_cmd.h
|
|
||||||
esmtool.cpp
|
esmtool.cpp
|
||||||
)
|
)
|
||||||
source_group(apps\\esmtool FILES ${ESMTOOL})
|
source_group(apps\\esmtool FILES ${ESMTOOL})
|
||||||
|
|
|
@ -1,36 +1,138 @@
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <boost/program_options.hpp>
|
||||||
|
|
||||||
#include <components/esm/esm_reader.hpp>
|
#include <components/esm/esm_reader.hpp>
|
||||||
#include <components/esm/records.hpp>
|
#include <components/esm/records.hpp>
|
||||||
|
|
||||||
#include "esmtool_cmd.h"
|
#define ESMTOOL_VERSION 1.1
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace ESM;
|
using namespace ESM;
|
||||||
|
|
||||||
|
// Create a local alias for brevity
|
||||||
|
namespace bpo = boost::program_options;
|
||||||
|
|
||||||
void printRaw(ESMReader &esm);
|
void printRaw(ESMReader &esm);
|
||||||
void loadCell(Cell &cell, ESMReader &esm, bool quiet);
|
void loadCell(Cell &cell, ESMReader &esm, bool quiet);
|
||||||
|
|
||||||
int main(int argc, char**argv)
|
// Based on the legacy struct
|
||||||
|
struct Arguments
|
||||||
{
|
{
|
||||||
gengetopt_args_info info;
|
unsigned int raw_given;
|
||||||
|
unsigned int quiet_given;
|
||||||
|
unsigned int loadcells_given;
|
||||||
|
std::string encoding;
|
||||||
|
std::string filename;
|
||||||
|
};
|
||||||
|
|
||||||
if(cmdline_parser(argc, argv, &info) != 0)
|
bool parseOptions (int argc, char** argv, Arguments &info)
|
||||||
return 1;
|
{
|
||||||
|
bpo::options_description desc("Inspect and extract from Morrowind ES files (ESM, ESP, ESS)\nSyntax: esmtool [options] file \nAllowed options");
|
||||||
|
|
||||||
if(info.inputs_num != 1)
|
desc.add_options()
|
||||||
|
("help,h", "print help message.")
|
||||||
|
("version,v", "print version information and quit.")
|
||||||
|
("raw,r", "Show an unformattet list of all records and subrecords.")
|
||||||
|
("quiet,q", "Supress all record information. Useful for speed tests.")
|
||||||
|
("loadcells,C", "Browse through contents of all cells.")
|
||||||
|
|
||||||
|
( "encoding,e", bpo::value<std::string>(&(info.encoding))->
|
||||||
|
default_value("win1252"),
|
||||||
|
"Character encoding used in ESMTool:\n"
|
||||||
|
"\n\twin1250 - Central and Eastern European such as Polish, Czech, Slovak, Hungarian, Slovene, Bosnian, Croatian, Serbian (Latin script), Romanian and Albanian languages\n"
|
||||||
|
"\n\twin1251 - Cyrillic alphabet such as Russian, Bulgarian, Serbian Cyrillic and other languages\n"
|
||||||
|
"\n\twin1252 - Western European (Latin) alphabet, used by default")
|
||||||
|
;
|
||||||
|
|
||||||
|
std::string finalText = "\nIf no option is given, the default action is to parse all records in the archive\nand display diagnostic information.";
|
||||||
|
|
||||||
|
// input-file is hidden and used as a positional argument
|
||||||
|
bpo::options_description hidden("Hidden Options");
|
||||||
|
|
||||||
|
hidden.add_options()
|
||||||
|
( "input-file,i", bpo::value< vector<std::string> >(), "input file")
|
||||||
|
;
|
||||||
|
|
||||||
|
bpo::positional_options_description p;
|
||||||
|
p.add("input-file", -1);
|
||||||
|
|
||||||
|
// there might be a better way to do this
|
||||||
|
bpo::options_description all;
|
||||||
|
all.add(desc).add(hidden);
|
||||||
|
bpo::parsed_options valid_opts = bpo::command_line_parser(argc, argv)
|
||||||
|
.options(all).positional(p).run();
|
||||||
|
|
||||||
|
bpo::variables_map variables;
|
||||||
|
bpo::store(valid_opts, variables);
|
||||||
|
bpo::notify(variables);
|
||||||
|
|
||||||
|
if (variables.count ("help"))
|
||||||
{
|
{
|
||||||
if(info.inputs_num == 0)
|
std::cout << desc << finalText << std::endl;
|
||||||
cout << "ERROR: missing ES file\n\n";
|
return false;
|
||||||
else
|
}
|
||||||
cout << "ERROR: more than one ES file specified\n\n";
|
if (variables.count ("version"))
|
||||||
cmdline_parser_print_help();
|
{
|
||||||
return 1;
|
std::cout << "ESMTool version " << ESMTOOL_VERSION << std::endl;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( !variables.count("input-file") )
|
||||||
|
{
|
||||||
|
std::cout << "\nERROR: missing ES file\n\n";
|
||||||
|
std::cout << desc << finalText << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// handling gracefully the user adding multiple files
|
||||||
|
if (variables["input-file"].as< vector<std::string> >().size() > 1)
|
||||||
|
{
|
||||||
|
std::cout << "\nERROR: more than one ES file specified\n\n";
|
||||||
|
std::cout << desc << finalText << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
info.filename = variables["input-file"].as< vector<std::string> >()[0];
|
||||||
|
|
||||||
|
info.raw_given = variables.count ("raw");
|
||||||
|
info.quiet_given = variables.count ("quiet");
|
||||||
|
info.loadcells_given = variables.count ("loadcells");
|
||||||
|
|
||||||
|
// Font encoding settings
|
||||||
|
info.encoding = variables["encoding"].as<std::string>();
|
||||||
|
if (info.encoding == "win1250")
|
||||||
|
{
|
||||||
|
std::cout << "Using Central and Eastern European font encoding." << std::endl;
|
||||||
|
}
|
||||||
|
else if (info.encoding == "win1251")
|
||||||
|
{
|
||||||
|
std::cout << "Using Cyrillic font encoding." << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(info.encoding != "win1252")
|
||||||
|
{
|
||||||
|
std::cout << info.encoding << " is not a valid encoding option." << std::endl;
|
||||||
|
info.encoding = "win1252";
|
||||||
|
}
|
||||||
|
std::cout << "Using default (English) font encoding." << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char**argv)
|
||||||
|
{
|
||||||
|
Arguments info;
|
||||||
|
if(!parseOptions (argc, argv, info))
|
||||||
|
return 1;
|
||||||
|
|
||||||
ESMReader esm;
|
ESMReader esm;
|
||||||
esm.setEncoding("win1252"); // FIXME: This should be configurable
|
esm.setEncoding(info.encoding);
|
||||||
const char* filename = info.inputs[0];
|
|
||||||
|
string filename = info.filename;
|
||||||
cout << "\nFile: " << filename << endl;
|
cout << "\nFile: " << filename << endl;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
package "esmtool"
|
|
||||||
version "1.0"
|
|
||||||
purpose "Inspect and extract from Morrowind ES files (ESM, ESP, ESS)"
|
|
||||||
args "--unamed-opts=ES-FILE -F esmtool_cmd -G"
|
|
||||||
|
|
||||||
option "raw" r "Show an unformattet list of all records and subrecords" optional
|
|
||||||
option "quiet" q "Supress all record information. Useful for speed tests." optional
|
|
||||||
option "loadcells" C "Browse through contents of all cells." optional
|
|
||||||
|
|
||||||
text "\nIf no option is given, the default action is to parse all records in the archive and display diagnostic information."
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,179 +0,0 @@
|
||||||
/** @file esmtool_cmd.h
|
|
||||||
* @brief The header file for the command line option parser
|
|
||||||
* generated by GNU Gengetopt version 2.22.2
|
|
||||||
* http://www.gnu.org/software/gengetopt.
|
|
||||||
* DO NOT modify this file, since it can be overwritten
|
|
||||||
* @author GNU Gengetopt by Lorenzo Bettini */
|
|
||||||
|
|
||||||
#ifndef ESMTOOL_CMD_H
|
|
||||||
#define ESMTOOL_CMD_H
|
|
||||||
|
|
||||||
/* If we use autoconf. */
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h> /* for FILE */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
#ifndef CMDLINE_PARSER_PACKAGE
|
|
||||||
/** @brief the program name (used for printing errors) */
|
|
||||||
#define CMDLINE_PARSER_PACKAGE "esmtool"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CMDLINE_PARSER_PACKAGE_NAME
|
|
||||||
/** @brief the complete program name (used for help and version) */
|
|
||||||
#define CMDLINE_PARSER_PACKAGE_NAME "esmtool"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CMDLINE_PARSER_VERSION
|
|
||||||
/** @brief the program version */
|
|
||||||
#define CMDLINE_PARSER_VERSION "1.0"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** @brief Where the command line options are stored */
|
|
||||||
struct gengetopt_args_info
|
|
||||||
{
|
|
||||||
const char *help_help; /**< @brief Print help and exit help description. */
|
|
||||||
const char *version_help; /**< @brief Print version and exit help description. */
|
|
||||||
const char *raw_help; /**< @brief Show an unformattet list of all records and subrecords help description. */
|
|
||||||
const char *quiet_help; /**< @brief Supress all record information. Useful for speed tests. help description. */
|
|
||||||
const char *loadcells_help; /**< @brief Browse through contents of all cells. help description. */
|
|
||||||
|
|
||||||
unsigned int help_given ; /**< @brief Whether help was given. */
|
|
||||||
unsigned int version_given ; /**< @brief Whether version was given. */
|
|
||||||
unsigned int raw_given ; /**< @brief Whether raw was given. */
|
|
||||||
unsigned int quiet_given ; /**< @brief Whether quiet was given. */
|
|
||||||
unsigned int loadcells_given ; /**< @brief Whether loadcells was given. */
|
|
||||||
|
|
||||||
char **inputs ; /**< @brief unamed options (options without names) */
|
|
||||||
unsigned inputs_num ; /**< @brief unamed options number */
|
|
||||||
} ;
|
|
||||||
|
|
||||||
/** @brief The additional parameters to pass to parser functions */
|
|
||||||
struct cmdline_parser_params
|
|
||||||
{
|
|
||||||
int override; /**< @brief whether to override possibly already present options (default 0) */
|
|
||||||
int initialize; /**< @brief whether to initialize the option structure gengetopt_args_info (default 1) */
|
|
||||||
int check_required; /**< @brief whether to check that all required options were provided (default 1) */
|
|
||||||
int check_ambiguity; /**< @brief whether to check for options already specified in the option structure gengetopt_args_info (default 0) */
|
|
||||||
int print_errors; /**< @brief whether getopt_long should print an error message for a bad option (default 1) */
|
|
||||||
} ;
|
|
||||||
|
|
||||||
/** @brief the purpose string of the program */
|
|
||||||
extern const char *gengetopt_args_info_purpose;
|
|
||||||
/** @brief the usage string of the program */
|
|
||||||
extern const char *gengetopt_args_info_usage;
|
|
||||||
/** @brief all the lines making the help output */
|
|
||||||
extern const char *gengetopt_args_info_help[];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The command line parser
|
|
||||||
* @param argc the number of command line options
|
|
||||||
* @param argv the command line options
|
|
||||||
* @param args_info the structure where option information will be stored
|
|
||||||
* @return 0 if everything went fine, NON 0 if an error took place
|
|
||||||
*/
|
|
||||||
int cmdline_parser (int argc, char * const *argv,
|
|
||||||
struct gengetopt_args_info *args_info);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The command line parser (version with additional parameters - deprecated)
|
|
||||||
* @param argc the number of command line options
|
|
||||||
* @param argv the command line options
|
|
||||||
* @param args_info the structure where option information will be stored
|
|
||||||
* @param override whether to override possibly already present options
|
|
||||||
* @param initialize whether to initialize the option structure my_args_info
|
|
||||||
* @param check_required whether to check that all required options were provided
|
|
||||||
* @return 0 if everything went fine, NON 0 if an error took place
|
|
||||||
* @deprecated use cmdline_parser_ext() instead
|
|
||||||
*/
|
|
||||||
int cmdline_parser2 (int argc, char * const *argv,
|
|
||||||
struct gengetopt_args_info *args_info,
|
|
||||||
int override, int initialize, int check_required);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The command line parser (version with additional parameters)
|
|
||||||
* @param argc the number of command line options
|
|
||||||
* @param argv the command line options
|
|
||||||
* @param args_info the structure where option information will be stored
|
|
||||||
* @param params additional parameters for the parser
|
|
||||||
* @return 0 if everything went fine, NON 0 if an error took place
|
|
||||||
*/
|
|
||||||
int cmdline_parser_ext (int argc, char * const *argv,
|
|
||||||
struct gengetopt_args_info *args_info,
|
|
||||||
struct cmdline_parser_params *params);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save the contents of the option struct into an already open FILE stream.
|
|
||||||
* @param outfile the stream where to dump options
|
|
||||||
* @param args_info the option struct to dump
|
|
||||||
* @return 0 if everything went fine, NON 0 if an error took place
|
|
||||||
*/
|
|
||||||
int cmdline_parser_dump(FILE *outfile,
|
|
||||||
struct gengetopt_args_info *args_info);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save the contents of the option struct into a (text) file.
|
|
||||||
* This file can be read by the config file parser (if generated by gengetopt)
|
|
||||||
* @param filename the file where to save
|
|
||||||
* @param args_info the option struct to save
|
|
||||||
* @return 0 if everything went fine, NON 0 if an error took place
|
|
||||||
*/
|
|
||||||
int cmdline_parser_file_save(const char *filename,
|
|
||||||
struct gengetopt_args_info *args_info);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Print the help
|
|
||||||
*/
|
|
||||||
void cmdline_parser_print_help(void);
|
|
||||||
/**
|
|
||||||
* Print the version
|
|
||||||
*/
|
|
||||||
void cmdline_parser_print_version(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes all the fields a cmdline_parser_params structure
|
|
||||||
* to their default values
|
|
||||||
* @param params the structure to initialize
|
|
||||||
*/
|
|
||||||
void cmdline_parser_params_init(struct cmdline_parser_params *params);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocates dynamically a cmdline_parser_params structure and initializes
|
|
||||||
* all its fields to their default values
|
|
||||||
* @return the created and initialized cmdline_parser_params structure
|
|
||||||
*/
|
|
||||||
struct cmdline_parser_params *cmdline_parser_params_create(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes the passed gengetopt_args_info structure's fields
|
|
||||||
* (also set default values for options that have a default)
|
|
||||||
* @param args_info the structure to initialize
|
|
||||||
*/
|
|
||||||
void cmdline_parser_init (struct gengetopt_args_info *args_info);
|
|
||||||
/**
|
|
||||||
* Deallocates the string fields of the gengetopt_args_info structure
|
|
||||||
* (but does not deallocate the structure itself)
|
|
||||||
* @param args_info the structure to deallocate
|
|
||||||
*/
|
|
||||||
void cmdline_parser_free (struct gengetopt_args_info *args_info);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks that all the required options were specified
|
|
||||||
* @param args_info the structure to check
|
|
||||||
* @param prog_name the name of the program that will be used to print
|
|
||||||
* possible errors
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
int cmdline_parser_required (struct gengetopt_args_info *args_info,
|
|
||||||
const char *prog_name);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
#endif /* ESMTOOL_CMD_H */
|
|
Loading…
Reference in a new issue