X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=355eefedc5e3a6213a4650dc8c8b8235eec845ac;hb=dd84b7b1787629d37dd3cabeb8c5c6218190730f;hp=3cd7bf0f435437cf2759685155d84a87bbefc361;hpb=84896718e08519d12c08894394fe9a9f6aea537a;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 3cd7bf0f..355eefed 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -1619,13 +1619,21 @@ static void printSetupFileHash(SetupFileHash *hash) } #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))) { @@ -1645,11 +1653,18 @@ static void *loadSetupFileData(char *filename, boolean use_hash) 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 */ @@ -1704,10 +1719,13 @@ static void *loadSetupFileData(char *filename, boolean use_hash) /* 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 == ':') @@ -1716,10 +1734,47 @@ static void *loadSetupFileData(char *filename, boolean use_hash) *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') @@ -1746,6 +1801,11 @@ static void *loadSetupFileData(char *filename, boolean use_hash) 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) @@ -2346,12 +2406,13 @@ static TreeInfo *getArtworkInfoCacheEntry(LevelDirTree *level_node, int type) 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; } @@ -2452,6 +2513,8 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first, 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; @@ -2552,7 +2615,8 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first, 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); @@ -3000,6 +3064,8 @@ void LoadArtworkInfo() 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 */ @@ -3045,7 +3111,8 @@ void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node, } #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