}
#endif
+#define ALLOW_TOKEN_VALUE_SEPARATOR_BEING_WHITESPACE 1
+#define CHECK_TOKEN_VALUE_SEPARATOR__WARN_IF_MISSING 0
+
static void *loadSetupFileData(char *filename, boolean use_hash)
{
- char line[MAX_LINE_LEN], previous_line[MAX_LINE_LEN];
+ char line[MAX_LINE_LEN], line_raw[MAX_LINE_LEN], previous_line[MAX_LINE_LEN];
char *token, *value, *line_ptr;
void *setup_file_data, *insert_ptr = NULL;
boolean read_continued_line = FALSE;
+ boolean token_value_separator_found;
+#if CHECK_TOKEN_VALUE_SEPARATOR__WARN_IF_MISSING
+ boolean token_value_separator_warning = FALSE;
+#endif
FILE *file;
+ int line_nr = 0;
if (!(file = fopen(filename, MODE_READ)))
{
if (!fgets(line, MAX_LINE_LEN, file))
break;
- /* cut trailing newline or carriage return */
+ /* check if line was completely read and is terminated by line break */
+ if (strlen(line) > 0 && line[strlen(line) - 1] == '\n')
+ line_nr++;
+
+ /* cut trailing line break (this can be newline and/or carriage return) */
for (line_ptr = &line[strlen(line)]; line_ptr >= line; line_ptr--)
if ((*line_ptr == '\n' || *line_ptr == '\r') && *(line_ptr + 1) == '\0')
*line_ptr = '\0';
+ /* copy raw input line for later use (mainly debugging output) */
+ strcpy(line_raw, line);
+
if (read_continued_line)
{
/* cut leading whitespaces from input line */
/* start with empty value as reliable default */
value = "";
+ token_value_separator_found = FALSE;
+
/* find end of token to determine start of value */
for (line_ptr = token; *line_ptr; line_ptr++)
{
#if 1
+ /* first look for an explicit token/value separator, like ':' or '=' */
if (*line_ptr == ':' || *line_ptr == '=')
#else
if (*line_ptr == ' ' || *line_ptr == '\t' || *line_ptr == ':')
*line_ptr = '\0'; /* terminate token string */
value = line_ptr + 1; /* set beginning of value */
+ token_value_separator_found = TRUE;
+
break;
}
}
+#if ALLOW_TOKEN_VALUE_SEPARATOR_BEING_WHITESPACE
+ /* fallback: if no token/value separator found, also allow whitespaces */
+ if (!token_value_separator_found)
+ {
+ for (line_ptr = token; *line_ptr; line_ptr++)
+ {
+ if (*line_ptr == ' ' || *line_ptr == '\t')
+ {
+ *line_ptr = '\0'; /* terminate token string */
+ value = line_ptr + 1; /* set beginning of value */
+
+ token_value_separator_found = TRUE;
+
+ break;
+ }
+ }
+
+#if CHECK_TOKEN_VALUE_SEPARATOR__WARN_IF_MISSING
+ if (token_value_separator_found)
+ {
+ if (!token_value_separator_warning)
+ {
+ Error(ERR_RETURN_LINE, "-");
+ Error(ERR_WARN, "missing token/value separator(s) in config file:");
+ Error(ERR_RETURN, "- config file: '%s'", filename);
+
+ token_value_separator_warning = TRUE;
+ }
+
+ Error(ERR_RETURN, "- line %d: '%s'", line_nr, line_raw);
+ }
+#endif
+ }
+#endif
+
/* cut trailing whitespaces from token */
for (line_ptr = &token[strlen(token)]; line_ptr >= token; line_ptr--)
if ((*line_ptr == ' ' || *line_ptr == '\t') && *(line_ptr + 1) == '\0')
fclose(file);
+#if CHECK_TOKEN_VALUE_SEPARATOR__WARN_IF_MISSING
+ if (token_value_separator_warning)
+ Error(ERR_RETURN_LINE, "-");
+#endif
+
if (use_hash)
{
if (hashtable_count((SetupFileHash *)setup_file_data) == 0)
if (value == NULL)
{
#if 1
- printf("::: - WARNING: cache entry '%s' invalid\n", token);
+ Error(ERR_WARN, "cache entry '%s' invalid", token);
#endif
cached = FALSE;
}
}
+
*artwork_info = ldi;
}
char *level_directory,
char *directory_name)
{
+ static unsigned long progress_delay = 0;
+ unsigned long progress_delay_value = 100; /* (in milliseconds) */
char *directory_path = getPath2(level_directory, directory_name);
char *filename = getPath2(directory_path, LEVELINFO_FILENAME);
SetupFileHash *setup_file_hash;
leveldir_new->last_level : leveldir_new->first_level);
#if 1
- if (leveldir_new->level_group)
+ if (leveldir_new->level_group ||
+ DelayReached(&progress_delay, progress_delay_value))
DrawInitText(leveldir_new->name, 150, FC_YELLOW);
#else
DrawInitText(leveldir_new->name, 150, FC_YELLOW);
void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node,
LevelDirTree *level_node)
{
+ static unsigned long progress_delay = 0;
+ unsigned long progress_delay_value = 100; /* (in milliseconds) */
int type = (*artwork_node)->type;
/* recursively check all level directories for artwork sub-directories */
}
#if 1
- if (level_node->level_group)
+ if (level_node->level_group ||
+ DelayReached(&progress_delay, progress_delay_value))
DrawInitText(level_node->name, 150, FC_YELLOW);
#endif