Added cell loading option -C to esmtool

This commit is contained in:
Nicolay Korslund 2010-03-04 15:42:59 +01:00
parent 5d2394a78b
commit b68e859b6d
5 changed files with 118 additions and 56 deletions

View file

@ -41,10 +41,9 @@ struct CellRef
float charge; float charge;
// I have no idea, these are present some times, often along with // I have no idea, these are present some times, often along with
// owner (ANAM) and sometimes otherwise. Is NAM9 is always 1? INTV // owner (ANAM) and sometimes otherwise. They are often (but not
// is usually one, but big for lights. Perhaps something to do with // always) 1. INTV is big for lights (possibly a float?), might have
// remaining light "charge". I haven't tried reading it as a float // something to do with remaining light "charge".
// in those cases.
int intv, nam9; int intv, nam9;
// For doors - true if this door teleports to somewhere else, false // For doors - true if this door teleports to somewhere else, false
@ -180,8 +179,8 @@ struct Cell
esm.getHNT(ref.refnum, "FRMR"); esm.getHNT(ref.refnum, "FRMR");
ref.refID = esm.getHNString("NAME"); ref.refID = esm.getHNString("NAME");
// getHNOT will not change the existing value (1.0) if the // getHNOT will not change the existing value if the subrecord is
// subrecord is missing // missing
ref.scale = 1.0; ref.scale = 1.0;
esm.getHNOT(ref.scale, "XSCL"); esm.getHNOT(ref.scale, "XSCL");
@ -190,9 +189,10 @@ struct Cell
ref.soul = esm.getHNOString("XSOL"); ref.soul = esm.getHNOString("XSOL");
ref.faction = esm.getHNOString("CNAM"); ref.faction = esm.getHNOString("CNAM");
ref.factIndex = -1;
esm.getHNOT(ref.factIndex, "INDX"); esm.getHNOT(ref.factIndex, "INDX");
ref.charge = 0.0; ref.charge = -1.0;
esm.getHNOT(ref.charge, "XCHG"); esm.getHNOT(ref.charge, "XCHG");
ref.intv = 0; ref.intv = 0;
@ -209,7 +209,8 @@ struct Cell
} }
else ref.teleport = false; else ref.teleport = false;
esm.getHNOT(ref.lockLevel, "FLTV"); // int, despite the name // Integer, despite the name suggesting otherwise
esm.getHNOT(ref.lockLevel, "FLTV");
ref.key = esm.getHNOString("KNAM"); ref.key = esm.getHNOString("KNAM");
ref.trap = esm.getHNOString("TNAM"); ref.trap = esm.getHNOString("TNAM");

View file

@ -9,6 +9,7 @@ using namespace std;
using namespace ESM; using namespace ESM;
void printRaw(ESMReader &esm); void printRaw(ESMReader &esm);
void loadCell(Cell &cell, ESMReader &esm, bool quiet);
int main(int argc, char**argv) int main(int argc, char**argv)
{ {
@ -31,6 +32,8 @@ int main(int argc, char**argv)
const char* filename = info.inputs[0]; const char* filename = info.inputs[0];
cout << "\nFile: " << filename << endl; cout << "\nFile: " << filename << endl;
try {
if(info.raw_given) if(info.raw_given)
{ {
cout << "RAW file listing:\n"; cout << "RAW file listing:\n";
@ -43,6 +46,7 @@ int main(int argc, char**argv)
} }
bool quiet = info.quiet_given; bool quiet = info.quiet_given;
bool loadCells = info.loadcells_given;
esm.open(filename); esm.open(filename);
@ -139,9 +143,13 @@ int main(int argc, char**argv)
{ {
Cell b; Cell b;
b.load(esm); b.load(esm);
if(quiet) break; if(!quiet)
cout << " Name: " << b.name << endl; {
cout << " Region: " << b.region << endl; cout << " Name: " << b.name << endl;
cout << " Region: " << b.region << endl;
}
if(loadCells)
loadCell(b, esm, quiet);
break; break;
} }
case REC_CLAS: case REC_CLAS:
@ -250,9 +258,34 @@ int main(int argc, char**argv)
} }
} }
} catch(exception &e)
{
cout << "\nERROR:\n\n " << e.what() << endl;
return 1;
}
return 0; return 0;
} }
void loadCell(Cell &cell, ESMReader &esm, bool quiet)
{
// Skip back to the beginning of the reference list
cell.restore(esm);
// Loop through all the references
CellRef ref;
if(!quiet) cout << " References:\n";
while(cell.getNextRef(esm, ref))
{
if(quiet) continue;
cout << " Refnum: " << ref.refnum << endl;
cout << " ID: '" << ref.refID << "'\n";
cout << " Owner: '" << ref.owner << "'\n";
cout << " INTV: " << ref.intv << " NAM9: " << ref.intv << endl;
}
}
void printRaw(ESMReader &esm) void printRaw(ESMReader &esm)
{ {
while(esm.hasMoreRecs()) while(esm.hasMoreRecs())

View file

@ -5,5 +5,6 @@ args "--unamed-opts=ES-FILE -F esmtool_cmd -G"
option "raw" r "Show an unformattet list of all records and subrecords" optional 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 "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 the entire archive and diplay diagnostic information." text "\nIf no option is given, the default action is to parse all records in the archive and display diagnostic information."

View file

@ -1,5 +1,5 @@
/* /*
File autogenerated by gengetopt version 2.22.2 File autogenerated by gengetopt version 2.22
generated with the following command: generated with the following command:
gengetopt --unamed-opts=ES-FILE -F esmtool_cmd -G gengetopt --unamed-opts=ES-FILE -F esmtool_cmd -G
@ -17,10 +17,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#ifndef FIX_UNUSED
#define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */
#endif
#include "esmtool_cmd.h" #include "esmtool_cmd.h"
@ -31,11 +27,12 @@ const char *gengetopt_args_info_usage = "Usage: esmtool [OPTIONS]... [ES-FILE]..
const char *gengetopt_args_info_description = ""; const char *gengetopt_args_info_description = "";
const char *gengetopt_args_info_help[] = { const char *gengetopt_args_info_help[] = {
" -h, --help Print help and exit", " -h, --help Print help and exit",
" -V, --version Print version and exit", " -V, --version Print version and exit",
" -r, --raw Show an unformattet list of all records and subrecords", " -r, --raw Show an unformattet list of all records and subrecords",
" -q, --quiet Supress all record information. Useful for speed tests.", " -q, --quiet Supress all record information. Useful for speed tests.",
"\nIf no option is given, the default action is to parse the entire archive and \ndiplay diagnostic information.", " -C, --loadcells Browse through contents of all cells.",
"\nIf no option is given, the default action is to parse all records in the \narchive and display diagnostic information.",
0 0
}; };
@ -62,12 +59,12 @@ void clear_given (struct gengetopt_args_info *args_info)
args_info->version_given = 0 ; args_info->version_given = 0 ;
args_info->raw_given = 0 ; args_info->raw_given = 0 ;
args_info->quiet_given = 0 ; args_info->quiet_given = 0 ;
args_info->loadcells_given = 0 ;
} }
static static
void clear_args (struct gengetopt_args_info *args_info) void clear_args (struct gengetopt_args_info *args_info)
{ {
FIX_UNUSED (args_info);
} }
@ -80,15 +77,14 @@ void init_args_info(struct gengetopt_args_info *args_info)
args_info->version_help = gengetopt_args_info_help[1] ; args_info->version_help = gengetopt_args_info_help[1] ;
args_info->raw_help = gengetopt_args_info_help[2] ; args_info->raw_help = gengetopt_args_info_help[2] ;
args_info->quiet_help = gengetopt_args_info_help[3] ; args_info->quiet_help = gengetopt_args_info_help[3] ;
args_info->loadcells_help = gengetopt_args_info_help[4] ;
} }
void void
cmdline_parser_print_version (void) cmdline_parser_print_version (void)
{ {
printf ("%s %s\n", printf ("%s %s\n", CMDLINE_PARSER_PACKAGE, CMDLINE_PARSER_VERSION);
(strlen(CMDLINE_PARSER_PACKAGE_NAME) ? CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE),
CMDLINE_PARSER_VERSION);
} }
static void print_help_common(void) { static void print_help_common(void) {
@ -103,7 +99,7 @@ static void print_help_common(void) {
printf("\n"); printf("\n");
if (strlen(gengetopt_args_info_description) > 0) if (strlen(gengetopt_args_info_description) > 0)
printf("%s\n\n", gengetopt_args_info_description); printf("%s\n", gengetopt_args_info_description);
} }
void void
@ -122,7 +118,7 @@ cmdline_parser_init (struct gengetopt_args_info *args_info)
clear_args (args_info); clear_args (args_info);
init_args_info (args_info); init_args_info (args_info);
args_info->inputs = 0; args_info->inputs = NULL;
args_info->inputs_num = 0; args_info->inputs_num = 0;
} }
@ -167,9 +163,8 @@ cmdline_parser_release (struct gengetopt_args_info *args_info)
static void static void
write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[]) write_into_file(FILE *outfile, const char *opt, const char *arg, char *values[])
{ {
FIX_UNUSED (values);
if (arg) { if (arg) {
fprintf(outfile, "%s=\"%s\"\n", opt, arg); fprintf(outfile, "%s=\"%s\"\n", opt, arg);
} else { } else {
@ -197,6 +192,8 @@ cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info)
write_into_file(outfile, "raw", 0, 0 ); write_into_file(outfile, "raw", 0, 0 );
if (args_info->quiet_given) if (args_info->quiet_given)
write_into_file(outfile, "quiet", 0, 0 ); write_into_file(outfile, "quiet", 0, 0 );
if (args_info->loadcells_given)
write_into_file(outfile, "loadcells", 0, 0 );
i = EXIT_SUCCESS; i = EXIT_SUCCESS;
@ -233,7 +230,7 @@ cmdline_parser_free (struct gengetopt_args_info *args_info)
char * char *
gengetopt_strdup (const char *s) gengetopt_strdup (const char *s)
{ {
char *result = 0; char *result = NULL;
if (!s) if (!s)
return result; return result;
@ -255,7 +252,7 @@ cmdline_parser_ext (int argc, char * const *argv, struct gengetopt_args_info *ar
struct cmdline_parser_params *params) struct cmdline_parser_params *params)
{ {
int result; int result;
result = cmdline_parser_internal (argc, argv, args_info, params, 0); result = cmdline_parser_internal (argc, argv, args_info, params, NULL);
if (result == EXIT_FAILURE) if (result == EXIT_FAILURE)
{ {
@ -278,7 +275,7 @@ cmdline_parser2 (int argc, char * const *argv, struct gengetopt_args_info *args_
params.check_ambiguity = 0; params.check_ambiguity = 0;
params.print_errors = 1; params.print_errors = 1;
result = cmdline_parser_internal (argc, argv, args_info, &params, 0); result = cmdline_parser_internal (argc, argv, args_info, &params, NULL);
if (result == EXIT_FAILURE) if (result == EXIT_FAILURE)
{ {
@ -292,8 +289,6 @@ cmdline_parser2 (int argc, char * const *argv, struct gengetopt_args_info *args_
int int
cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name) cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name)
{ {
FIX_UNUSED (args_info);
FIX_UNUSED (prog_name);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
@ -327,6 +322,37 @@ struct option
int val; int val;
}; };
/* For communication from `getopt' to the caller.
When `getopt' finds an option that takes an argument,
the argument value is returned here.
Also, when `ordering' is RETURN_IN_ORDER,
each non-option ARGV-element is returned here. */
static char *optarg;
/* Index in ARGV of the next element to be scanned.
This is used for communication to and from the caller
and for communication between successive calls to `getopt'.
On entry to `getopt', zero means this is the first call; initialize.
When `getopt' returns -1, this is the index of the first of the
non-option elements that the caller should itself scan.
Otherwise, `optind' communicates from one call to the next
how much of ARGV has been scanned so far. */
static int optind;
/* Callers store zero here to inhibit the error message `getopt' prints
for unrecognized options. */
static int opterr;
/* Set to an option character which was unrecognized. */
static int optopt;
/* This version of `getopt' appears to the caller like standard Unix `getopt' /* This version of `getopt' appears to the caller like standard Unix `getopt'
but it behaves differently for the user, since it allows the user but it behaves differently for the user, since it allows the user
to intersperse the options with the other arguments. to intersperse the options with the other arguments.
@ -708,7 +734,7 @@ static int check_short_opt(int argc, char *const *argv, const char *optstring,
int print_errors, struct custom_getopt_data *d) int print_errors, struct custom_getopt_data *d)
{ {
char c = *d->nextchar++; char c = *d->nextchar++;
const char *temp = strchr(optstring, c); char *temp = strchr(optstring, c);
/* Increment `custom_optind' when we start to process its last character. */ /* Increment `custom_optind' when we start to process its last character. */
if (*d->nextchar == '\0') if (*d->nextchar == '\0')
@ -913,15 +939,13 @@ static char *package_name = 0;
static static
int update_arg(void *field, char **orig_field, int update_arg(void *field, char **orig_field,
unsigned int *field_given, unsigned int *prev_given, unsigned int *field_given, unsigned int *prev_given,
char *value, const char *possible_values[], char *value, char *possible_values[], const char *default_value,
const char *default_value,
cmdline_parser_arg_type arg_type, cmdline_parser_arg_type arg_type,
int check_ambiguity, int override, int check_ambiguity, int override,
int no_free, int multiple_option, int no_free, int multiple_option,
const char *long_opt, char short_opt, const char *long_opt, char short_opt,
const char *additional_error) const char *additional_error)
{ {
FIX_UNUSED (field);
char *stop_char = 0; char *stop_char = 0;
const char *val = value; const char *val = value;
int found; int found;
@ -942,7 +966,6 @@ int update_arg(void *field, char **orig_field,
return 1; /* failure */ return 1; /* failure */
} }
FIX_UNUSED (default_value);
if (field_given && *field_given && ! override) if (field_given && *field_given && ! override)
return 0; return 0;
@ -980,8 +1003,7 @@ int update_arg(void *field, char **orig_field,
int int
cmdline_parser_internal ( cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info,
int argc, char * const *argv, struct gengetopt_args_info *args_info,
struct cmdline_parser_params *params, const char *additional_error) struct cmdline_parser_params *params, const char *additional_error)
{ {
int c; /* Character of the parsed option. */ int c; /* Character of the parsed option. */
@ -993,11 +1015,6 @@ cmdline_parser_internal (
int initialize; int initialize;
int check_required; int check_required;
int check_ambiguity; int check_ambiguity;
char *optarg;
int optind;
int opterr;
int optopt;
package_name = argv[0]; package_name = argv[0];
@ -1025,7 +1042,8 @@ cmdline_parser_internal (
{ "version", 0, NULL, 'V' }, { "version", 0, NULL, 'V' },
{ "raw", 0, NULL, 'r' }, { "raw", 0, NULL, 'r' },
{ "quiet", 0, NULL, 'q' }, { "quiet", 0, NULL, 'q' },
{ 0, 0, 0, 0 } { "loadcells", 0, NULL, 'C' },
{ NULL, 0, NULL, 0 }
}; };
custom_optarg = optarg; custom_optarg = optarg;
@ -1033,7 +1051,7 @@ cmdline_parser_internal (
custom_opterr = opterr; custom_opterr = opterr;
custom_optopt = optopt; custom_optopt = optopt;
c = custom_getopt_long (argc, argv, "hVrq", long_options, &option_index); c = custom_getopt_long (argc, argv, "hVrqC", long_options, &option_index);
optarg = custom_optarg; optarg = custom_optarg;
optind = custom_optind; optind = custom_optind;
@ -1078,6 +1096,18 @@ cmdline_parser_internal (
goto failure; goto failure;
break; break;
case 'C': /* Browse through contents of all cells.. */
if (update_arg( 0 ,
0 , &(args_info->loadcells_given),
&(local_args_info.loadcells_given), optarg, 0, 0, ARG_NO,
check_ambiguity, override, 0, 0,
"loadcells", 'C',
additional_error))
goto failure;
break;
case 0: /* Long option with no short option */ case 0: /* Long option with no short option */
case '?': /* Invalid option. */ case '?': /* Invalid option. */

View file

@ -1,6 +1,6 @@
/** @file esmtool_cmd.h /** @file esmtool_cmd.h
* @brief The header file for the command line option parser * @brief The header file for the command line option parser
* generated by GNU Gengetopt version 2.22.2 * generated by GNU Gengetopt version 2.22
* http://www.gnu.org/software/gengetopt. * http://www.gnu.org/software/gengetopt.
* DO NOT modify this file, since it can be overwritten * DO NOT modify this file, since it can be overwritten
* @author GNU Gengetopt by Lorenzo Bettini */ * @author GNU Gengetopt by Lorenzo Bettini */
@ -20,15 +20,10 @@ extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#ifndef CMDLINE_PARSER_PACKAGE #ifndef CMDLINE_PARSER_PACKAGE
/** @brief the program name (used for printing errors) */ /** @brief the program name */
#define CMDLINE_PARSER_PACKAGE "esmtool" #define CMDLINE_PARSER_PACKAGE "esmtool"
#endif #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 #ifndef CMDLINE_PARSER_VERSION
/** @brief the program version */ /** @brief the program version */
#define CMDLINE_PARSER_VERSION "1.0" #define CMDLINE_PARSER_VERSION "1.0"
@ -41,11 +36,13 @@ struct gengetopt_args_info
const char *version_help; /**< @brief Print version 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 *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 *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 help_given ; /**< @brief Whether help was given. */
unsigned int version_given ; /**< @brief Whether version was given. */ unsigned int version_given ; /**< @brief Whether version was given. */
unsigned int raw_given ; /**< @brief Whether raw was given. */ unsigned int raw_given ; /**< @brief Whether raw was given. */
unsigned int quiet_given ; /**< @brief Whether quiet 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) */ char **inputs ; /**< @brief unamed options (options without names) */
unsigned inputs_num ; /**< @brief unamed options number */ unsigned inputs_num ; /**< @brief unamed options number */