+ if (num_suffix_list_entries > 0)
+ {
+ int parameter_array_size = num_suffix_list_entries * sizeof(char *);
+
+ file_list[i].default_parameter = checked_calloc(parameter_array_size);
+ file_list[i].parameter = checked_calloc(parameter_array_size);
+
+ for (j = 0; j < num_suffix_list_entries; j++)
+ {
+ setString(&file_list[i].default_parameter[j], suffix_list[j].value);
+ setString(&file_list[i].parameter[j], suffix_list[j].value);
+ }
+
+ file_list[i].redefined = FALSE;
+ file_list[i].fallback_to_default = FALSE;
+ }
+ }
+
+ list_pos = 0;
+ for (i = 0; config_list[i].token != NULL; i++)
+ {
+ int len_config_token = strlen(config_list[i].token);
+ int len_config_value = strlen(config_list[i].value);
+ boolean is_file_entry = TRUE;
+
+ for (j = 0; suffix_list[j].token != NULL; j++)
+ {
+ int len_suffix = strlen(suffix_list[j].token);
+
+ if (len_suffix < len_config_token &&
+ strEqual(&config_list[i].token[len_config_token - len_suffix],
+ suffix_list[j].token))
+ {
+ setString(&file_list[list_pos].default_parameter[j],
+ config_list[i].value);
+
+ is_file_entry = FALSE;
+ break;
+ }
+ }
+
+ /* the following tokens are no file definitions, but other config tokens */
+ for (j = 0; ignore_tokens[j] != NULL; j++)
+ if (strEqual(config_list[i].token, ignore_tokens[j]))
+ is_file_entry = FALSE;
+
+ if (is_file_entry)
+ {
+ if (i > 0)
+ list_pos++;
+
+ if (list_pos >= num_file_list_entries)
+ break;
+
+ /* simple sanity check if this is really a file definition */
+ if (!strEqual(&config_list[i].value[len_config_value - 4], ".pcx") &&
+ !strEqual(&config_list[i].value[len_config_value - 4], ".wav") &&
+ !strEqual(config_list[i].value, UNDEFINED_FILENAME))
+ {
+ Error(ERR_RETURN, "Configuration directive '%s' -> '%s':",
+ config_list[i].token, config_list[i].value);
+ Error(ERR_EXIT, "This seems to be no valid definition -- please fix");
+ }
+
+ file_list[list_pos].token = config_list[i].token;
+ file_list[list_pos].default_filename = config_list[i].value;
+ }
+ }
+
+ num_file_list_entries_found = list_pos + 1;
+ if (num_file_list_entries_found != num_file_list_entries)
+ {
+ Error(ERR_RETURN_LINE, "-");
+ 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;
+}
+
+static boolean token_suffix_match(char *token, char *suffix, int start_pos)
+{
+ int len_token = strlen(token);
+ int len_suffix = strlen(suffix);
+
+ if (start_pos < 0) /* compare suffix from end of string */
+ start_pos += len_token;
+
+ if (start_pos < 0 || start_pos + len_suffix > len_token)
+ return FALSE;
+
+ if (strncmp(&token[start_pos], suffix, len_suffix) != 0)
+ return FALSE;
+
+ if (token[start_pos + len_suffix] == '\0')
+ return TRUE;
+
+ if (token[start_pos + len_suffix] == '.')
+ return TRUE;
+
+ return FALSE;
+}
+
+#define KNOWN_TOKEN_VALUE "[KNOWN_TOKEN_VALUE]"
+
+static void read_token_parameters(SetupFileHash *setup_file_hash,
+ struct ConfigTypeInfo *suffix_list,
+ struct FileInfo *file_list_entry)
+{
+ /* check for config token that is the base token without any suffixes */
+ char *filename = getHashEntry(setup_file_hash, file_list_entry->token);
+ char *known_token_value = KNOWN_TOKEN_VALUE;
+ int i;
+
+ if (filename != NULL)
+ {
+ setString(&file_list_entry->filename, filename);
+
+ /* when file definition found, set all parameters to default values */
+ for (i = 0; suffix_list[i].token != NULL; i++)
+ setString(&file_list_entry->parameter[i], suffix_list[i].value);
+
+ file_list_entry->redefined = TRUE;
+
+ /* mark config file token as well known from default config */
+ setHashEntry(setup_file_hash, file_list_entry->token, known_token_value);