summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/deh_io.c19
-rw-r--r--src/deh_io.h1
-rw-r--r--src/deh_main.c22
-rw-r--r--src/deh_main.h4
-rw-r--r--src/doom/d_main.c14
5 files changed, 44 insertions, 16 deletions
diff --git a/src/deh_io.c b/src/deh_io.c
index fa02aa2e..4b264370 100644
--- a/src/deh_io.c
+++ b/src/deh_io.c
@@ -42,7 +42,6 @@ struct deh_context_s
// If the input comes from a memory buffer, pointer to the memory
// buffer.
-
unsigned char *input_buffer;
size_t input_buffer_len;
unsigned int input_buffer_pos;
@@ -50,18 +49,18 @@ struct deh_context_s
// If the input comes from a file, the file stream for reading
// data.
-
FILE *stream;
// Current line number that we have reached:
-
int linenum;
// Used by DEH_ReadLine:
-
boolean last_was_newline;
char *readbuffer;
int readbuffer_size;
+
+ // Error handling.
+ boolean had_error;
};
static deh_context_t *DEH_NewContext(void)
@@ -77,6 +76,8 @@ static deh_context_t *DEH_NewContext(void)
context->linenum = 0;
context->last_was_newline = true;
+ context->had_error = false;
+
return context;
}
@@ -307,7 +308,7 @@ void DEH_Warning(deh_context_t *context, char *msg, ...)
va_list args;
va_start(args, msg);
-
+
fprintf(stderr, "%s:%i: warning: ", context->filename, context->linenum);
vfprintf(stderr, msg, args);
fprintf(stderr, "\n");
@@ -320,14 +321,18 @@ void DEH_Error(deh_context_t *context, char *msg, ...)
va_list args;
va_start(args, msg);
-
+
fprintf(stderr, "%s:%i: ", context->filename, context->linenum);
vfprintf(stderr, msg, args);
fprintf(stderr, "\n");
va_end(args);
- I_Error("Error parsing dehacked file");
+ context->had_error = true;
}
+boolean DEH_HadError(deh_context_t *context)
+{
+ return context->had_error;
+}
diff --git a/src/deh_io.h b/src/deh_io.h
index 0995cda1..f7c8263f 100644
--- a/src/deh_io.h
+++ b/src/deh_io.h
@@ -27,6 +27,7 @@ int DEH_GetChar(deh_context_t *context);
char *DEH_ReadLine(deh_context_t *context, boolean extended);
void DEH_Error(deh_context_t *context, char *msg, ...);
void DEH_Warning(deh_context_t *context, char *msg, ...);
+boolean DEH_HadError(deh_context_t *context);
#endif /* #ifndef DEH_IO_H */
diff --git a/src/deh_main.c b/src/deh_main.c
index a7846975..ff4500aa 100644
--- a/src/deh_main.c
+++ b/src/deh_main.c
@@ -275,7 +275,7 @@ static void DEH_ParseContext(deh_context_t *context)
// Read the file
- for (;;)
+ while (!DEH_HadError(context))
{
// Read the next line. We only allow the special extended parsing
// for the BEX [STRINGS] section.
@@ -331,7 +331,7 @@ static void DEH_ParseContext(deh_context_t *context)
sscanf(line, "%19s", section_name);
current_section = GetSectionByName(section_name);
-
+
if (current_section != NULL)
{
tag = current_section->start(context, line);
@@ -379,13 +379,18 @@ int DEH_LoadFile(char *filename)
DEH_CloseFile(context);
+ if (DEH_HadError(context))
+ {
+ I_Error("Error parsing dehacked file");
+ }
+
return 1;
}
// Load dehacked file from WAD lump.
// If allow_long is set, allow long strings and cheats just for this lump.
-int DEH_LoadLump(int lumpnum, boolean allow_long)
+int DEH_LoadLump(int lumpnum, boolean allow_long, boolean allow_error)
{
deh_context_t *context;
@@ -412,10 +417,17 @@ int DEH_LoadLump(int lumpnum, boolean allow_long)
DEH_CloseFile(context);
+ // If there was an error while parsing, abort with an error, but allow
+ // errors to just be ignored if allow_error=true.
+ if (!allow_error && DEH_HadError(context))
+ {
+ I_Error("Error parsing dehacked lump");
+ }
+
return 1;
}
-int DEH_LoadLumpByName(char *name, boolean allow_long)
+int DEH_LoadLumpByName(char *name, boolean allow_long, boolean allow_error)
{
int lumpnum;
@@ -427,7 +439,7 @@ int DEH_LoadLumpByName(char *name, boolean allow_long)
return 0;
}
- return DEH_LoadLump(lumpnum, allow_long);
+ return DEH_LoadLump(lumpnum, allow_long, allow_error);
}
// Checks the command line for -deh argument
diff --git a/src/deh_main.h b/src/deh_main.h
index 4b3f9d8a..c9d41bf2 100644
--- a/src/deh_main.h
+++ b/src/deh_main.h
@@ -32,8 +32,8 @@
void DEH_Init(void);
int DEH_LoadFile(char *filename);
-int DEH_LoadLump(int lumpnum, boolean allow_long);
-int DEH_LoadLumpByName(char *name, boolean allow_long);
+int DEH_LoadLump(int lumpnum, boolean allow_long, boolean allow_error);
+int DEH_LoadLumpByName(char *name, boolean allow_long, boolean allow_error);
boolean DEH_ParseAssignment(char *line, char **variable_name, char **value);
diff --git a/src/doom/d_main.c b/src/doom/d_main.c
index 4c1092ac..d4859b30 100644
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -1066,7 +1066,7 @@ static void LoadHacxDeh(void)
if (gameversion == exe_hacx)
{
- if (!DEH_LoadLumpByName("DEHACKED", true))
+ if (!DEH_LoadLumpByName("DEHACKED", true, false))
{
I_Error("DEHACKED lump not found. Please check that this is the "
"Hacx v1.2 IWAD.");
@@ -1299,6 +1299,16 @@ void D_DoomMain (void)
W_CheckCorrectIWAD(doom);
+ // The Freedoom IWADs have DEHACKED lumps with cosmetic changes to the
+ // in-game messages. Load this.
+ // Old versions of Freedoom (before 2014-09) did not have technically
+ // valid DEHACKED lumps, so ignore errors and just continue if this
+ // is an old IWAD.
+ if (W_CheckNumForName("FREEDOOM") >= 0)
+ {
+ DEH_LoadLumpByName("DEHACKED", false, true);
+ }
+
// Doom 3: BFG Edition includes modified versions of the classic
// IWADs which can be identified by an additional DMENUPIC lump.
// Furthermore, the M_GDHIGH lumps have been modified in a way that
@@ -1461,7 +1471,7 @@ void D_DoomMain (void)
{
if (!strncmp(lumpinfo[i].name, "DEHACKED", 8))
{
- DEH_LoadLump(i, false);
+ DEH_LoadLump(i, false, false);
loaded++;
}
}