X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=355eefedc5e3a6213a4650dc8c8b8235eec845ac;hb=dd84b7b1787629d37dd3cabeb8c5c6218190730f;hp=496b867b42440951bdc8144d4bcef043f1ef99df;hpb=8511bdf9d8df009aae3e4abd68ac5b5f18970237;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 496b867b..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) @@ -2352,6 +2412,7 @@ static TreeInfo *getArtworkInfoCacheEntry(LevelDirTree *level_node, int type) cached = FALSE; } } + *artwork_info = ldi; }