ref: 5547ba06ca0e267fa82a6b9b7953a980e0876e61
parent: 25f6da1861deedeb2d0650ecf0ebe42a83b682c8
author: Simon Howard <fraggle@gmail.com>
date: Sat Oct 8 16:54:16 EDT 2005
Proper dehacked error/warning framework. Catch a load more errors. Subversion-branch: /trunk/chocolate-doom Subversion-revision: 175
--- a/src/deh_ammo.c
+++ b/src/deh_ammo.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_ammo.c 163 2005-10-04 22:04:06Z fraggle $
+// $Id: deh_ammo.c 175 2005-10-08 20:54:16Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.4 2005/10/08 20:54:15 fraggle
+// Proper dehacked error/warning framework. Catch a load more errors.
+//
// Revision 1.3 2005/10/04 22:04:06 fraggle
// Parse dehacked "Ammo" sections properly
//
@@ -45,6 +48,7 @@
#include "doomdef.h"
#include "doomtype.h"
#include "deh_defs.h"
+#include "deh_io.h"
#include "deh_main.h"
#include "p_local.h"
@@ -52,11 +56,18 @@
{
int ammo_number = 0;
- sscanf(line, "Ammo %i", &ammo_number);
+ if (sscanf(line, "Ammo %i", &ammo_number) != 1)
+ {
+ DEH_Warning(context, "Parse error on section start");
+ return NULL;
+ }
if (ammo_number < 0 || ammo_number >= NUMAMMO)
+ {
+ DEH_Warning(context, "Invalid ammo number: %i", ammo_number);
return NULL;
-
+ }
+
return &maxammo[ammo_number];
}
@@ -77,6 +88,7 @@
{
// Failed to parse
+ DEH_Warning(context, "Failed to parse assignment");
return;
}
@@ -90,8 +102,7 @@
maxammo[ammo_number] = ivalue;
else
{
- fprintf(stderr, "DEH_AmmoParseLine: field named '%s' not found\n",
- variable_name);
+ DEH_Warning(context, "Field named '%s' not found", variable_name);
}
}
--- a/src/deh_cheat.c
+++ b/src/deh_cheat.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_cheat.c 162 2005-10-04 21:41:42Z fraggle $
+// $Id: deh_cheat.c 175 2005-10-08 20:54:16Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.2 2005/10/08 20:54:16 fraggle
+// Proper dehacked error/warning framework. Catch a load more errors.
+//
// Revision 1.1 2005/10/04 21:41:42 fraggle
// Rewrite cheats code. Add dehacked cheat replacement.
//
@@ -40,7 +43,9 @@
#include "doomdef.h"
#include "doomtype.h"
+
#include "deh_defs.h"
+#include "deh_io.h"
#include "deh_main.h"
#include "am_map.h"
#include "st_stuff.h"
@@ -97,10 +102,11 @@
unsigned char *value;
int i;
- if (!DEH_ParseAssignment(line, &variable_name, (char *) &value))
+ if (!DEH_ParseAssignment(line, &variable_name, (char **) &value))
{
// Failed to parse
-
+
+ DEH_Warning(context, "Failed to parse assignment");
return;
}
@@ -108,8 +114,7 @@
if (cheat == NULL)
{
- fprintf(stderr, "DEH_ParseCheatLine: Unknown cheat '%s'\n",
- variable_name);
+ DEH_Warning(context, "Unknown cheat '%s'", variable_name);
return;
}
--- a/src/deh_frame.c
+++ b/src/deh_frame.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_frame.c 157 2005-10-03 11:08:16Z fraggle $
+// $Id: deh_frame.c 175 2005-10-08 20:54:16Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.5 2005/10/08 20:54:16 fraggle
+// Proper dehacked error/warning framework. Catch a load more errors.
+//
// Revision 1.4 2005/10/03 11:08:16 fraggle
// Replace end of section functions with NULLs as they arent currently being
// used for anything.
@@ -49,6 +52,7 @@
#include "info.h"
#include "deh_defs.h"
+#include "deh_io.h"
#include "deh_main.h"
#include "deh_mapping.h"
@@ -66,10 +70,17 @@
int frame_number = 0;
state_t *state;
- sscanf(line, "Frame %i", &frame_number);
+ if (sscanf(line, "Frame %i", &frame_number) != 1)
+ {
+ DEH_Warning(context, "Parse error on section start");
+ return NULL;
+ }
if (frame_number < 0 || frame_number >= NUMSTATES)
+ {
+ DEH_Warning(context, "Invalid frame number: %i", frame_number);
return NULL;
+ }
state = &states[frame_number];
@@ -93,11 +104,10 @@
{
// Failed to parse
+ DEH_Warning(context, "Failed to parse assignment");
return;
}
-// printf("Set %s to %s for state\n", variable_name, value);
-
// all values are integers
ivalue = atoi(value);
@@ -104,7 +114,7 @@
// set the appropriate field
- DEH_SetMapping(&state_mapping, state, variable_name, ivalue);
+ DEH_SetMapping(context, &state_mapping, state, variable_name, ivalue);
}
deh_section_t deh_section_frame =
--- a/src/deh_io.c
+++ b/src/deh_io.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_io.c 153 2005-10-02 23:49:01Z fraggle $
+// $Id: deh_io.c 175 2005-10-08 20:54:16Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.2 2005/10/08 20:54:16 fraggle
+// Proper dehacked error/warning framework. Catch a load more errors.
+//
// Revision 1.1 2005/10/02 23:49:01 fraggle
// The beginnings of dehacked support
//
@@ -31,10 +34,12 @@
//
//-----------------------------------------------------------------------------
+#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include "i_system.h"
#include "z_zone.h"
#include "deh_defs.h"
@@ -43,6 +48,9 @@
struct deh_context_s
{
FILE *stream;
+ char *filename;
+ int linenum;
+ boolean last_was_newline;
char *readbuffer;
int readbuffer_size;
};
@@ -67,6 +75,9 @@
context->readbuffer_size = 128;
context->readbuffer = Z_Malloc(context->readbuffer_size, PU_STATIC, NULL);
+ context->filename = filename;
+ context->linenum = 0;
+ context->last_was_newline = true;
return context;
}
@@ -104,6 +115,15 @@
} while (result == '\r');
+ // Track the current line number
+
+ if (context->last_was_newline)
+ {
+ ++context->linenum;
+ }
+
+ context->last_was_newline = result == '\n';
+
return result;
}
@@ -129,7 +149,6 @@
char *DEH_ReadLine(deh_context_t *context)
{
- char *p;
int c;
int pos;
@@ -166,4 +185,33 @@
return context->readbuffer;
}
+
+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");
+
+ va_end(args);
+}
+
+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");
+}
+
--- a/src/deh_io.h
+++ b/src/deh_io.h
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_io.h 153 2005-10-02 23:49:01Z fraggle $
+// $Id: deh_io.h 175 2005-10-08 20:54:16Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.2 2005/10/08 20:54:16 fraggle
+// Proper dehacked error/warning framework. Catch a load more errors.
+//
// Revision 1.1 2005/10/02 23:49:01 fraggle
// The beginnings of dehacked support
//
@@ -40,6 +43,8 @@
void DEH_CloseFile(deh_context_t *context);
int DEH_GetChar(deh_context_t *context);
char *DEH_ReadLine(deh_context_t *context);
+void DEH_Error(deh_context_t *context, char *msg, ...);
+void DEH_Warning(deh_context_t *context, char *msg, ...);
#endif /* #ifndef DEH_IO_H */
--- a/src/deh_mapping.c
+++ b/src/deh_mapping.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_mapping.c 173 2005-10-08 20:14:24Z fraggle $
+// $Id: deh_mapping.c 175 2005-10-08 20:54:16Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.3 2005/10/08 20:54:16 fraggle
+// Proper dehacked error/warning framework. Catch a load more errors.
+//
// Revision 1.2 2005/10/08 20:14:24 fraggle
// Add the ability to specify unsupported fields
//
@@ -47,7 +50,7 @@
// Set the value of a particular field in a structure by name
//
-boolean DEH_SetMapping(deh_mapping_t *mapping,
+boolean DEH_SetMapping(deh_context_t *context, deh_mapping_t *mapping,
void *structptr, char *name, int value)
{
int i;
@@ -62,8 +65,7 @@
if (entry->location == NULL)
{
- fprintf(stderr, "DEH_SetMapping: Field '%s' is unsupported.\n",
- name);
+ DEH_Warning(context, "Field '%s' is unsupported", name);
return false;
}
@@ -87,7 +89,7 @@
* ((unsigned long long *) location) = value;
break;
default:
- fprintf(stderr, "DEH_SetMapping: Unknown field type for %s\n", name);
+ DEH_Error(context, "Unknown field type for '%s' (BUG)", name);
return false;
}
@@ -97,8 +99,7 @@
// field with this name not found
- fprintf(stderr, "DEH_SetMapping: field named '%s' not found\n",
- name);
+ DEH_Warning(context, "Field named '%s' not found", name);
return false;
}
--- a/src/deh_mapping.h
+++ b/src/deh_mapping.h
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_mapping.h 173 2005-10-08 20:14:24Z fraggle $
+// $Id: deh_mapping.h 175 2005-10-08 20:54:16Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.3 2005/10/08 20:54:16 fraggle
+// Proper dehacked error/warning framework. Catch a load more errors.
+//
// Revision 1.2 2005/10/08 20:14:24 fraggle
// Add the ability to specify unsupported fields
//
@@ -41,6 +44,7 @@
#define DEH_MAPPING_H
#include "doomtype.h"
+#include "deh_io.h"
#define DEH_BEGIN_MAPPING(mapping_name, structname) \
static structname deh_mapping_base; \
@@ -90,7 +94,8 @@
deh_mapping_entry_t entries[MAX_MAPPING_ENTRIES];
};
-boolean DEH_SetMapping(deh_mapping_t *mapping, void *structptr, char *name, int value);
+boolean DEH_SetMapping(deh_context_t *context, deh_mapping_t *mapping,
+ void *structptr, char *name, int value);
#endif /* #ifndef DEH_MAPPING_H */
--- a/src/deh_misc.c
+++ b/src/deh_misc.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_misc.c 164 2005-10-04 22:10:32Z fraggle $
+// $Id: deh_misc.c 175 2005-10-08 20:54:16Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.2 2005/10/08 20:54:16 fraggle
+// Proper dehacked error/warning framework. Catch a load more errors.
+//
// Revision 1.1 2005/10/04 22:10:32 fraggle
// Dehacked "Misc" section parser (currently a dummy)
//
@@ -34,11 +37,11 @@
#include "doomdef.h"
#include "doomtype.h"
#include "deh_defs.h"
+#include "deh_io.h"
static void *DEH_MiscStart(deh_context_t *context, char *line)
{
- fprintf(stderr, "DEH_MiscStart: Warning: dehacked 'Misc' sections are "
- "not yet supported.\n");
+ DEH_Warning(context, "Dehacked 'Misc' sections are not supported yet.");
return NULL;
}
--- a/src/deh_ptr.c
+++ b/src/deh_ptr.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_ptr.c 157 2005-10-03 11:08:16Z fraggle $
+// $Id: deh_ptr.c 175 2005-10-08 20:54:16Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.4 2005/10/08 20:54:16 fraggle
+// Proper dehacked error/warning framework. Catch a load more errors.
+//
// Revision 1.3 2005/10/03 11:08:16 fraggle
// Replace end of section functions with NULLs as they arent currently being
// used for anything.
@@ -46,6 +49,7 @@
#include "info.h"
#include "deh_defs.h"
+#include "deh_io.h"
#include "deh_main.h"
static actionf_t codeptrs[NUMSTATES];
@@ -67,10 +71,17 @@
// FIXME: can the third argument here be something other than "Frame"
// or are we ok?
- sscanf(line, "%*s %*i (%*s %i)", &frame_number);
+ if (sscanf(line, "Pointer %*i (%*s %i)", &frame_number) != 1)
+ {
+ DEH_Warning(context, "Parse error on section start");
+ return NULL;
+ }
if (frame_number < 0 || frame_number >= NUMSTATES)
+ {
+ DEH_Warning(context, "Invalid frame number: %i", frame_number);
return NULL;
+ }
return &states[frame_number];
}
@@ -91,7 +102,7 @@
if (!DEH_ParseAssignment(line, &variable_name, &value))
{
// Failed to parse
-
+ DEH_Warning(context, "Failed to parse assignment");
return;
}
@@ -107,8 +118,7 @@
{
if (ivalue < 0 || ivalue >= NUMSTATES)
{
- fprintf(stderr, "DEH_PointerParseLine: Invalid state %i\n",
- ivalue);
+ DEH_Warning(context, "Invalid state '%i'", ivalue);
}
else
{
@@ -117,8 +127,7 @@
}
else
{
- fprintf(stderr, "DEH_PointerParseLine: Unknown variable name '%s'\n",
- variable_name);
+ DEH_Warning(context, "Unknown variable name '%s'", variable_name);
}
}
--- a/src/deh_sound.c
+++ b/src/deh_sound.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_sound.c 174 2005-10-08 20:14:38Z fraggle $
+// $Id: deh_sound.c 175 2005-10-08 20:54:16Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.2 2005/10/08 20:54:16 fraggle
+// Proper dehacked error/warning framework. Catch a load more errors.
+//
// Revision 1.1 2005/10/08 20:14:38 fraggle
// Dehacked "Sound" section support
//
@@ -60,10 +63,17 @@
int sound_number = 0;
sfxinfo_t *sfx;
- sscanf(line, "Sound %i", &sound_number);
+ if (sscanf(line, "Sound %i", &sound_number) != 1)
+ {
+ DEH_Warning(context, "Parse error on section start");
+ return NULL;
+ }
if (sound_number < 0 || sound_number >= NUMSFX)
+ {
+ DEH_Warning(context, "Invalid sound number: %i", sound_number);
return NULL;
+ }
sfx = &S_sfx[sound_number];
@@ -86,7 +96,7 @@
if (!DEH_ParseAssignment(line, &variable_name, &value))
{
// Failed to parse
-
+ DEH_Warning(context, "Failed to parse assignment");
return;
}
@@ -96,7 +106,7 @@
// Set the field value
- DEH_SetMapping(&sound_mapping, sfx, variable_name, ivalue);
+ DEH_SetMapping(context, &sound_mapping, sfx, variable_name, ivalue);
}
--- a/src/deh_text.c
+++ b/src/deh_text.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_text.c 160 2005-10-03 21:39:39Z fraggle $
+// $Id: deh_text.c 175 2005-10-08 20:54:16Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.4 2005/10/08 20:54:16 fraggle
+// Proper dehacked error/warning framework. Catch a load more errors.
+//
// Revision 1.3 2005/10/03 21:39:39 fraggle
// Dehacked text substitutions
//
@@ -174,7 +177,11 @@
int fromlen, tolen;
int i;
- sscanf(line, "Text %i %i", &fromlen, &tolen);
+ if (sscanf(line, "Text %i %i", &fromlen, &tolen) != 2)
+ {
+ DEH_Warning(context, "Parse error on section start");
+ return NULL;
+ }
sub = Z_Malloc(sizeof(deh_substitution_t), PU_STATIC, NULL);
sub->from_text = Z_Malloc(fromlen + 1, PU_STATIC, NULL);
--- a/src/deh_thing.c
+++ b/src/deh_thing.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_thing.c 157 2005-10-03 11:08:16Z fraggle $
+// $Id: deh_thing.c 175 2005-10-08 20:54:16Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.4 2005/10/08 20:54:16 fraggle
+// Proper dehacked error/warning framework. Catch a load more errors.
+//
// Revision 1.3 2005/10/03 11:08:16 fraggle
// Replace end of section functions with NULLs as they arent currently being
// used for anything.
@@ -81,13 +84,20 @@
int thing_number = 0;
mobjinfo_t *mobj;
- sscanf(line, "Thing %i", &thing_number);
+ if (sscanf(line, "Thing %i", &thing_number) != 1)
+ {
+ DEH_Warning(context, "Parse error on section start");
+ return NULL;
+ }
// dehacked files are indexed from 1
--thing_number;
if (thing_number < 0 || thing_number >= NUMMOBJTYPES)
+ {
+ DEH_Warning("Invalid thing number: %i", thing_number);
return NULL;
+ }
mobj = &mobjinfo[thing_number];
@@ -111,6 +121,7 @@
{
// Failed to parse
+ DEH_Warning(context, "Failed to parse assignment");
return;
}
@@ -122,7 +133,7 @@
// Set the field value
- DEH_SetMapping(&thing_mapping, mobj, variable_name, ivalue);
+ DEH_SetMapping(context, &thing_mapping, mobj, variable_name, ivalue);
}
deh_section_t deh_section_thing =
--- a/src/deh_weapon.c
+++ b/src/deh_weapon.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_weapon.c 158 2005-10-03 13:21:11Z fraggle $
+// $Id: deh_weapon.c 175 2005-10-08 20:54:16Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.5 2005/10/08 20:54:16 fraggle
+// Proper dehacked error/warning framework. Catch a load more errors.
+//
// Revision 1.4 2005/10/03 13:21:11 fraggle
// Weapons mapping code
//
@@ -66,11 +69,18 @@
{
int weapon_number = 0;
- sscanf(line, "Weapon %i", &weapon_number);
+ if (sscanf(line, "Weapon %i", &weapon_number) != 1)
+ {
+ DEH_Warning(context, "Parse error on section start");
+ return NULL;
+ }
if (weapon_number < 0 || weapon_number >= NUMWEAPONS)
+ {
+ DEH_Warning(context, "Invalid weapon number: %i", weapon_number);
return NULL;
-
+ }
+
return &weaponinfo[weapon_number];
}
@@ -88,13 +98,14 @@
if (!DEH_ParseAssignment(line, &variable_name, &value))
{
// Failed to parse
-
+
+ DEH_Warning(context, "Failed to parse assignment");
return;
}
ivalue = atoi(value);
- DEH_SetMapping(&weapon_mapping, weapon, variable_name, ivalue);
+ DEH_SetMapping(context, &weapon_mapping, weapon, variable_name, ivalue);
}
deh_section_t deh_section_weapon =