diff options
-rw-r--r-- | src/deh_io.c | 31 | ||||
-rw-r--r-- | src/deh_main.c | 21 | ||||
-rw-r--r-- | src/deh_main.h | 1 | ||||
-rw-r--r-- | src/doom/deh_bexstr.c | 4 |
4 files changed, 39 insertions, 18 deletions
diff --git a/src/deh_io.c b/src/deh_io.c index a502a2d1..46f4c9fb 100644 --- a/src/deh_io.c +++ b/src/deh_io.c @@ -28,6 +28,7 @@ #include "deh_defs.h" #include "deh_io.h" +#include "deh_main.h" typedef enum { @@ -229,6 +230,7 @@ char *DEH_ReadLine(deh_context_t *context, boolean extended) { int c; int pos; + boolean escaped = false; for (pos = 0;;) { @@ -249,9 +251,8 @@ char *DEH_ReadLine(deh_context_t *context, boolean extended) } // extended string support - if (extended && c == '\\') + if (deh_allow_extended_strings && extended && c == '\\') { - escaped: c = DEH_GetChar(context); // "\n" in the middle of a string indicates an internal linefeed @@ -266,22 +267,22 @@ char *DEH_ReadLine(deh_context_t *context, boolean extended) // each line that is to be continued with a backslash if (c == '\n') { - // blanks before the backslash are included in the string - // but indentation after the linefeed is not - do - { - c = DEH_GetChar(context); - } while (isspace(c) && c != '\n'); - - // if the next non-space character after an escaped linefeed - // is another backslash, repeat again - if (c == '\\') - { - goto escaped; - } + escaped = true; + continue; } } + // blanks before the backslash are included in the string + // but indentation after the linefeed is not + if (escaped && isspace(c) && c != '\n') + { + continue; + } + else + { + escaped = false; + } + if (c == '\n') { // end of line: a full line has been read diff --git a/src/deh_main.c b/src/deh_main.c index 4ab9a8f3..55e26c70 100644 --- a/src/deh_main.c +++ b/src/deh_main.c @@ -33,6 +33,10 @@ extern char *deh_signatures[]; static boolean deh_initialized = false; +// If true, we can parse [STRINGS] sections in BEX format. + +boolean deh_allow_extended_strings = false; + // If true, we can do long string replacements. boolean deh_allow_long_strings = false; @@ -220,6 +224,16 @@ static void DEH_ParseComment(char *comment) { deh_allow_long_cheats = true; } + + // Allow magic comments to allow parsing [STRINGS] section + // that are usually only found in BEX format files. This allows + // for substitution of map and episode names when loading + // Freedoom/FreeDM IWADs. + + if (strstr(comment, "*allow-extended-strings*") != NULL) + { + deh_allow_extended_strings = true; + } } // Parses a dehacked file by reading from the context @@ -230,6 +244,7 @@ static void DEH_ParseContext(deh_context_t *context) char section_name[20]; void *tag = NULL; char *line; + deh_section_t *bexstr; // Read the header and check it matches the signature @@ -242,9 +257,13 @@ static void DEH_ParseContext(deh_context_t *context) for (;;) { + // extended string support required? + + bexstr = GetSectionByName("[STRINGS]"); + // read a new line - line = DEH_ReadLine(context, current_section == GetSectionByName("[STRINGS]")); + line = DEH_ReadLine(context, bexstr && current_section == bexstr); // end of file? diff --git a/src/deh_main.h b/src/deh_main.h index 9689d1c2..4b3f9d8a 100644 --- a/src/deh_main.h +++ b/src/deh_main.h @@ -39,6 +39,7 @@ boolean DEH_ParseAssignment(char *line, char **variable_name, char **value); void DEH_Checksum(sha1_digest_t digest); +extern boolean deh_allow_extended_strings; extern boolean deh_allow_long_strings; extern boolean deh_allow_long_cheats; extern boolean deh_apply_cheats; diff --git a/src/doom/deh_bexstr.c b/src/doom/deh_bexstr.c index 5adc2fd6..e29b71dc 100644 --- a/src/doom/deh_bexstr.c +++ b/src/doom/deh_bexstr.c @@ -28,10 +28,10 @@ typedef struct { char *macro; char *string; -} bex_string; +} bex_string_t; // mnemonic keys table -static bex_string bex_stringtable[] = { +static const bex_string_t bex_stringtable[] = { // part 1 - general initialization and prompts {"D_DEVSTR", D_DEVSTR}, {"D_CDROM", D_CDROM}, |