forked from github/server
argument parsing
fix crash when ct_flyingship is missing
This commit is contained in:
parent
e25a2e3884
commit
e81a47cb31
5 changed files with 84 additions and 12 deletions
|
@ -4,13 +4,14 @@
|
||||||
#include <eressea.h>
|
#include <eressea.h>
|
||||||
#include <gmtool.h>
|
#include <gmtool.h>
|
||||||
#include <kernel/config.h>
|
#include <kernel/config.h>
|
||||||
|
#include <kernel/save.h>
|
||||||
#include <iniparser/iniparser.h>
|
#include <iniparser/iniparser.h>
|
||||||
|
|
||||||
static const char * luafile = "init.lua";
|
static const char * luafile = "init.lua";
|
||||||
static const char * entry_point = NULL;
|
static const char * entry_point = NULL;
|
||||||
static int memdebug = 0;
|
static int memdebug = 0;
|
||||||
|
|
||||||
static void load_config(const char * filename)
|
static void parse_config(const char * filename)
|
||||||
{
|
{
|
||||||
dictionary * d = iniparser_new(filename);
|
dictionary * d = iniparser_new(filename);
|
||||||
if (d) {
|
if (d) {
|
||||||
|
@ -26,12 +27,84 @@ static void load_config(const char * filename)
|
||||||
global.inifile = d;
|
global.inifile = d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
usage(const char * prog, const char * arg)
|
||||||
|
{
|
||||||
|
if (arg) {
|
||||||
|
fprintf(stderr, "unknown argument: %s\n\n", arg);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "Usage: %s [options]\n"
|
||||||
|
"-t <turn> : read this datafile, not the most current one\n"
|
||||||
|
"-q : be quite (same as -v 0)\n"
|
||||||
|
"-v <level> : verbosity level\n"
|
||||||
|
"-C : run in interactive mode\n"
|
||||||
|
"--color : force curses to use colors even when not detected\n"
|
||||||
|
"--help : help\n", prog);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
parse_args(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=1;i!=argc;++i) {
|
||||||
|
if (argv[i][0]!='-') {
|
||||||
|
return usage(argv[0], argv[i]);
|
||||||
|
} else if (argv[i][1]=='-') { /* long format */
|
||||||
|
if (strcmp(argv[i]+2, "version")==0) {
|
||||||
|
printf("\n%s PBEM host\n"
|
||||||
|
"Copyright (C) 1996-2005 C. Schlittchen, K. Zedel, E. Rehling, H. Peters.\n\n"
|
||||||
|
"Compilation: " __DATE__ " at " __TIME__ "\nVersion: %f\n\n", global.gamename, version());
|
||||||
|
}
|
||||||
|
else if (strcmp(argv[i]+2, "color")==0) {
|
||||||
|
/* force the editor to have colors */
|
||||||
|
force_color = 1;
|
||||||
|
}
|
||||||
|
else if (strcmp(argv[i]+2, "help")==0) {
|
||||||
|
return usage(argv[0], NULL);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return usage(argv[0], argv[i]);
|
||||||
|
}
|
||||||
|
} else switch(argv[i][1]) {
|
||||||
|
case 'C':
|
||||||
|
entry_point = NULL;
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
entry_point = argv[++i];
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
turn = atoi(argv[++i]);
|
||||||
|
break;
|
||||||
|
case 'q':
|
||||||
|
verbosity = 0;
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
verbosity = atoi(argv[++i]);
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
return usage(argv[0], NULL);
|
||||||
|
default:
|
||||||
|
return usage(argv[0], argv[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char ** argv)
|
int main(int argc, char ** argv)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
log_open("eressea.log");
|
log_open("eressea.log");
|
||||||
load_config("eressea.ini");
|
parse_config("eressea.ini");
|
||||||
|
|
||||||
|
err = parse_args(argc, argv);
|
||||||
|
if (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
err = eressea_init();
|
err = eressea_init();
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -46,5 +119,6 @@ int main(int argc, char ** argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
eressea_done();
|
eressea_done();
|
||||||
|
log_close();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,7 +187,6 @@ void eressea_done(void)
|
||||||
game_done();
|
game_done();
|
||||||
kernel_done();
|
kernel_done();
|
||||||
lua_done((lua_State *)global.vm_state);
|
lua_done((lua_State *)global.vm_state);
|
||||||
log_close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
|
@ -217,7 +217,7 @@ curse_read(attrib * a, struct storage * store)
|
||||||
if (result!=0) {
|
if (result!=0) {
|
||||||
log_error(("missing curse %s, no compatibility code either.\n", cursename));
|
log_error(("missing curse %s, no compatibility code either.\n", cursename));
|
||||||
}
|
}
|
||||||
assert(result!=0);
|
assert(result==0);
|
||||||
return AT_READ_FAIL;
|
return AT_READ_FAIL;
|
||||||
}
|
}
|
||||||
if (store->version < CURSEFLAGS_VERSION) {
|
if (store->version < CURSEFLAGS_VERSION) {
|
||||||
|
|
|
@ -687,12 +687,15 @@ ship_allowed(const struct ship * sh, const region * r)
|
||||||
static boolean
|
static boolean
|
||||||
flying_ship(const ship * sh)
|
flying_ship(const ship * sh)
|
||||||
{
|
{
|
||||||
|
static int init = 0;
|
||||||
static const curse_type * ct_flyingship;
|
static const curse_type * ct_flyingship;
|
||||||
if (!ct_flyingship) {
|
|
||||||
ct_flyingship = ct_find("flyingship");
|
|
||||||
assert(ct_flyingship);
|
|
||||||
}
|
|
||||||
if (sh->type->flags & SFL_FLY) return true;
|
if (sh->type->flags & SFL_FLY) return true;
|
||||||
|
if (!init) {
|
||||||
|
ct_flyingship = ct_find("flyingship");
|
||||||
|
init = 1;
|
||||||
|
}
|
||||||
|
if (!ct_flyingship) return false;
|
||||||
if (curse_active(get_curse(sh->attribs, ct_flyingship))) return true;
|
if (curse_active(get_curse(sh->attribs, ct_flyingship))) return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -154,7 +154,6 @@ static boolean g_ignore_errors = false;
|
||||||
static const char * luafile = "init.lua";
|
static const char * luafile = "init.lua";
|
||||||
static const char * entry_point = NULL;
|
static const char * entry_point = NULL;
|
||||||
static int memdebug = 0;
|
static int memdebug = 0;
|
||||||
static int g_console = 1;
|
|
||||||
#if defined(HAVE_SIGACTION) && defined(HAVE_EXECINFO)
|
#if defined(HAVE_SIGACTION) && defined(HAVE_EXECINFO)
|
||||||
#include <execinfo.h>
|
#include <execinfo.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
@ -302,14 +301,12 @@ read_args(int argc, char **argv, lua_State * luaState)
|
||||||
return usage(argv[0], argv[i]);
|
return usage(argv[0], argv[i]);
|
||||||
} else switch(argv[i][1]) {
|
} else switch(argv[i][1]) {
|
||||||
case 'C':
|
case 'C':
|
||||||
g_console = 1;
|
|
||||||
entry_point = NULL;
|
entry_point = NULL;
|
||||||
break;
|
break;
|
||||||
case 'R':
|
case 'R':
|
||||||
g_reportdir = argv[++i];
|
g_reportdir = argv[++i];
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
g_console = 0;
|
|
||||||
entry_point = argv[++i];
|
entry_point = argv[++i];
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
|
@ -322,7 +319,6 @@ read_args(int argc, char **argv, lua_State * luaState)
|
||||||
game_name = argv[++i];
|
game_name = argv[++i];
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
g_console = 0;
|
|
||||||
turn = atoi(argv[++i]);
|
turn = atoi(argv[++i]);
|
||||||
break;
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
|
|
Loading…
Reference in a new issue