+static boolean token_suffix_match(char *token, char *suffix, int start_pos)
+{
+ int len_token = strlen(token);
+ int len_suffix = strlen(suffix);
+
+#if 0
+ if (IS_PARENT_PROCESS())
+ printf(":::::::::: check '%s' for '%s' ::::::::::\n", token, suffix);
+#endif
+
+ 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]"
+
+static void read_token_parameters(struct SetupFileList *setup_file_list,
+ struct ConfigInfo *suffix_list,
+ struct FileInfo *file_list_entry)
+{
+ /* check for config token that is the base token without any suffixes */
+ char *filename = getTokenValue(setup_file_list, file_list_entry->token);
+ char *known_token_value = KNOWN_TOKEN_VALUE;
+ int i;
+
+ if (file_list_entry->filename != NULL)
+ free(file_list_entry->filename);
+
+ if (filename != NULL)
+ {
+ /* when file definition found, set all parameters to default values */
+ for (i=0; suffix_list[i].token != NULL; i++)
+ file_list_entry->parameter[i] =
+ get_parameter_value(suffix_list[i].type, suffix_list[i].value);
+
+ file_list_entry->filename = getStringCopy(filename);
+
+ /* mark config file token as well known from default config */
+ setTokenValue(setup_file_list, file_list_entry->token, known_token_value);
+ }
+ else
+ file_list_entry->filename =
+ getStringCopy(file_list_entry->default_filename);
+
+ /* check for config tokens that can be build by base token and suffixes */
+ for (i=0; suffix_list[i].token != NULL; i++)
+ {
+ char *token = getStringCat2(file_list_entry->token, suffix_list[i].token);
+ char *value = getTokenValue(setup_file_list, token);
+
+ if (value != NULL)
+ {
+ file_list_entry->parameter[i] =
+ get_parameter_value(suffix_list[i].type, value);
+
+ /* mark config file token as well known from default config */
+ setTokenValue(setup_file_list, token, known_token_value);
+ }
+
+ free(token);
+ }
+}
+
+static void add_dynamic_file_list_entry(struct FileInfo **list,
+ int *num_list_entries,
+ struct SetupFileList *extra_file_list,
+ struct ConfigInfo *suffix_list,
+ int num_suffix_list_entries,
+ char *token)
+{
+ struct FileInfo *new_list_entry;
+ int parameter_array_size = num_suffix_list_entries * sizeof(int);
+
+#if 0
+ if (IS_PARENT_PROCESS())
+ printf("===> found dynamic definition '%s'\n", token);
+#endif
+
+ (*num_list_entries)++;
+ *list = checked_realloc(*list, *num_list_entries * sizeof(struct FileInfo));
+ new_list_entry = &(*list)[*num_list_entries - 1];
+
+ new_list_entry->token = getStringCopy(token);
+ new_list_entry->filename = NULL;
+ new_list_entry->parameter = checked_calloc(parameter_array_size);
+
+ read_token_parameters(extra_file_list, suffix_list, new_list_entry);
+}
+
+static void add_property_mapping(struct PropertyMapping **list,
+ int *num_list_entries,
+ int base_index, int ext1_index,
+ int ext2_index, int ext3_index,
+ int artwork_index)
+{
+ struct PropertyMapping *new_list_entry;
+
+ (*num_list_entries)++;
+ *list = checked_realloc(*list,
+ *num_list_entries * sizeof(struct PropertyMapping));
+ new_list_entry = &(*list)[*num_list_entries - 1];
+
+ new_list_entry->base_index = base_index;
+ new_list_entry->ext1_index = ext1_index;
+ new_list_entry->ext2_index = ext2_index;
+ new_list_entry->ext3_index = ext3_index;
+
+ new_list_entry->artwork_index = artwork_index;
+}
+
+void LoadArtworkConfig(struct ArtworkListInfo *artwork_info)