return s_copy;
}
+static void printUsage()
+{
+ printf("\n"
+ "Usage: %s [OPTION]... [HOSTNAME [PORT]]\n"
+ "\n"
+ "Options:\n"
+ " -d, --display HOSTNAME[:SCREEN] specify X server display\n"
+ " -b, --basepath DIRECTORY alternative base DIRECTORY\n"
+ " -l, --level DIRECTORY alternative level DIRECTORY\n"
+ " -g, --graphics DIRECTORY alternative graphics DIRECTORY\n"
+ " -s, --sounds DIRECTORY alternative sounds DIRECTORY\n"
+ " -m, --music DIRECTORY alternative music DIRECTORY\n"
+ " -n, --network network multiplayer game\n"
+ " --serveronly only start network server\n"
+ " -v, --verbose verbose mode\n"
+ " --debug display debugging information\n"
+ " -e, --execute COMMAND execute batch COMMAND:\n"
+ "\n"
+ "Valid commands for '--execute' option:\n"
+ " \"print graphicsinfo.conf\" print default graphics config\n"
+ " \"print soundsinfo.conf\" print default sounds config\n"
+ " \"print musicinfo.conf\" print default music config\n"
+ " \"dump tape FILE\" dump tape data from FILE\n"
+ " \"autoplay LEVELDIR\" play level tapes for LEVELDIR\n"
+ "\n",
+ program.command_basename);
+}
+
void GetOptions(char *argv[])
{
char **options_left = &argv[1];
options.graphics_directory = RO_BASE_PATH "/" GRAPHICS_DIRECTORY;
options.sounds_directory = RO_BASE_PATH "/" SOUNDS_DIRECTORY;
options.music_directory = RO_BASE_PATH "/" MUSIC_DIRECTORY;
- options.autoplay_leveldir = NULL;
+ options.execute_command = NULL;
options.serveronly = FALSE;
options.network = FALSE;
options.verbose = FALSE;
options.debug = FALSE;
- options.debug_command = NULL;
while (*options_left)
{
Error(ERR_EXIT_HELP, "unrecognized option '%s'", option);
else if (strncmp(option, "-help", option_len) == 0)
{
- printf("Usage: %s [options] [<server host> [<server port>]]\n"
- "Options:\n"
- " -d, --display <host>[:<scr>] X server display\n"
- " -b, --basepath <directory> alternative base directory\n"
- " -l, --level <directory> alternative level directory\n"
- " -g, --graphics <directory> alternative graphics directory\n"
- " -s, --sounds <directory> alternative sounds directory\n"
- " -m, --music <directory> alternative music directory\n"
- " -a, --autoplay <level series> automatically play level tapes\n"
- " -n, --network network multiplayer game\n"
- " --serveronly only start network server\n"
- " -v, --verbose verbose mode\n"
- " --debug display debugging information\n",
- program.command_basename);
-
- if (options.debug)
- printf(" --debug-command <command> execute special command\n");
+ printUsage();
exit(0);
}
if (option_arg == next_option)
options_left++;
}
- else if (strncmp(option, "-autoplay", option_len) == 0)
- {
- if (option_arg == NULL)
- Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str);
-
- options.autoplay_leveldir = option_arg;
- if (option_arg == next_option)
- options_left++;
- }
else if (strncmp(option, "-network", option_len) == 0)
{
options.network = TRUE;
{
options.debug = TRUE;
}
- else if (strncmp(option, "-debug-command", option_len) == 0)
+ else if (strncmp(option, "-execute", option_len) == 0)
{
if (option_arg == NULL)
Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str);
- options.debug_command = option_arg;
+ options.execute_command = option_arg;
if (option_arg == next_option)
options_left++;
}
}
+/* ------------------------------------------------------------------------- */
+/* functions to translate string identifiers to integer or boolean value */
+/* ------------------------------------------------------------------------- */
+
+int get_integer_from_string(char *s)
+{
+ static char *number_text[][3] =
+ {
+ { "0", "zero", "null", },
+ { "1", "one", "first" },
+ { "2", "two", "second" },
+ { "3", "three", "third" },
+ { "4", "four", "fourth" },
+ { "5", "five", "fifth" },
+ { "6", "six", "sixth" },
+ { "7", "seven", "seventh" },
+ { "8", "eight", "eighth" },
+ { "9", "nine", "ninth" },
+ { "10", "ten", "tenth" },
+ { "11", "eleven", "eleventh" },
+ { "12", "twelve", "twelfth" },
+ };
+
+ int i, j;
+ char *s_lower = getStringToLower(s);
+ int result = -1;
+
+ for (i=0; i<13; i++)
+ for (j=0; j<3; j++)
+ if (strcmp(s_lower, number_text[i][j]) == 0)
+ result = i;
+
+ if (result == -1)
+ result = atoi(s);
+
+ free(s_lower);
+
+ return result;
+}
+
+boolean get_boolean_from_string(char *s)
+{
+ char *s_lower = getStringToLower(s);
+ boolean result = FALSE;
+
+ if (strcmp(s_lower, "true") == 0 ||
+ strcmp(s_lower, "yes") == 0 ||
+ strcmp(s_lower, "on") == 0 ||
+ get_integer_from_string(s) == 1)
+ result = TRUE;
+
+ free(s_lower);
+
+ return result;
+}
+
+
/* ========================================================================= */
/* functions for generic lists */
/* ========================================================================= */
/* functions for loading artwork configuration information */
/* ========================================================================= */
+static int get_parameter_value(int type, char *value)
+{
+ return (type == TYPE_INTEGER ? get_integer_from_string(value) :
+ type == TYPE_BOOLEAN ? get_boolean_from_string(value) :
+ -1);
+}
+
struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list,
struct ConfigInfo *suffix_list,
int num_file_list_entries)
{
struct FileInfo *file_list;
+ int num_file_list_entries_found = 0;
int num_suffix_list_entries = 0;
int list_pos = 0;
int i, j;
for (j=0; j<num_suffix_list_entries; j++)
{
- int default_parameter = atoi(suffix_list[j].value);
+ int default_parameter =
+ get_parameter_value(suffix_list[j].type, suffix_list[j].value);
file_list[i].default_parameter[j] = default_parameter;
file_list[i].parameter[j] = default_parameter;
strcmp(&config_list[i].token[len_config_token - len_suffix],
suffix_list[j].token) == 0)
{
- file_list[list_pos].default_parameter[j] = atoi(config_list[i].value);
+ file_list[list_pos].default_parameter[j] =
+ get_parameter_value(suffix_list[j].type, config_list[i].value);
is_file_entry = FALSE;
break;
if (i > 0)
list_pos++;
- if (list_pos > num_file_list_entries - 1)
+ if (list_pos >= num_file_list_entries)
break;
/* simple sanity check if this is really a file definition */
}
}
- if (list_pos != num_file_list_entries - 1)
- Error(ERR_EXIT, "inconsistant config list information (%d != %d) -- please fix", list_pos, num_file_list_entries - 1);
+ num_file_list_entries_found = list_pos + 1;
+ if (num_file_list_entries_found != num_file_list_entries)
+ {
+ Error(ERR_RETURN, "inconsistant config list information:");
+ Error(ERR_RETURN, "- should be: %d (according to 'src/conf_gfx.h')",
+ num_file_list_entries);
+ Error(ERR_RETURN, "- found to be: %d (according to 'src/conf_gfx.c')",
+ num_file_list_entries_found);
+ Error(ERR_EXIT, "please fix");
+ }
return file_list;
}
{
char *filename = getTokenValue(setup_file_list, file_list[i].token);
- if (filename == NULL)
+ if (filename)
+ for (j=0; j<num_suffix_list_entries; j++)
+ file_list[i].parameter[j] =
+ get_parameter_value(suffix_list[j].type, suffix_list[j].value);
+ else
filename = file_list[i].default_filename;
+
file_list[i].filename = getStringCopy(filename);
for (j=0; j<num_suffix_list_entries; j++)
char *value = getTokenValue(setup_file_list, token);
if (value != NULL)
- file_list[i].parameter[j] = atoi(value);
+ file_list[i].parameter[j] =
+ get_parameter_value(suffix_list[j].type, value);
free(token);
}
#endif
+/* ========================================================================= */
+/* some generic helper functions */
+/* ========================================================================= */
+
+void printf_line(char line_char, int line_length)
+{
+ int i;
+
+ for (i=0; i<line_length; i++)
+ printf("%c", line_char);
+
+ printf("\n");
+}
+
+
/* ========================================================================= */
/* the following is only for debugging purpose and normally not used */
/* ========================================================================= */