shithub: choc

Download patch

ref: b693c7f12dbbf367ef41c8aba08774968bfe0604
parent: d0d3b5a6945ece4bd6c8bb1102e8fe55f25852e8
author: Simon Howard <fraggle@gmail.com>
date: Wed Feb 15 07:57:58 EST 2006

Remove the savegame buffer entirely. Keep the old savegame size limit
bug add a "vanilla_savegame_limit" config file option which allows
the limit to be disabled if necessary.

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 367

--- a/src/g_game.c
+++ b/src/g_game.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: g_game.c 351 2006-01-27 18:23:08Z fraggle $
+// $Id: g_game.c 367 2006-02-15 12:57:58Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -22,6 +22,11 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.24  2006/02/15 12:57:58  fraggle
+// Remove the savegame buffer entirely.  Keep the old savegame size limit
+// bug add a "vanilla_savegame_limit" config file option which allows
+// the limit to be disabled if necessary.
+//
 // Revision 1.23  2006/01/27 18:23:08  fraggle
 // Exit with an error when playing a demo with the wrong version, like Vanilla Doom
 //
@@ -114,7 +119,7 @@
 
 
 static const char
-rcsid[] = "$Id: g_game.c 351 2006-01-27 18:23:08Z fraggle $";
+rcsid[] = "$Id: g_game.c 367 2006-02-15 12:57:58Z fraggle $";
 
 #include <string.h>
 #include <stdlib.h>
@@ -234,9 +239,7 @@
  
 short		consistancy[MAXPLAYERS][BACKUPTICS]; 
  
-byte*		savebuffer;
  
- 
 // 
 // Controls 
 // 
@@ -313,6 +316,7 @@
 mobj_t*		bodyque[BODYQUESIZE]; 
 int		bodyqueslot; 
  
+int             vanilla_savegame_limit = 1;
  
  
 int G_CmdChecksum (ticcmd_t* cmd) 
@@ -1337,17 +1341,20 @@
 
 void G_DoLoadGame (void) 
 { 
-    int	length; 
     int savedleveltime;
 	 
     gameaction = ga_nothing; 
 	 
-    length = M_ReadFile (savename, &savebuffer); 
-    save_p = savebuffer;
+    save_stream = fopen(savename, "rb");
 
+    if (save_stream == NULL)
+    {
+        return;
+    }
+
     if (!P_ReadSaveGameHeader())
     {
-        Z_Free(savebuffer);
+        fclose(save_stream);
         return;
     }
 
@@ -1366,10 +1373,9 @@
  
     if (!P_ReadSaveGameEOF())
 	I_Error ("Bad savegame");
+
+    fclose(save_stream);
     
-    // done 
-    Z_Free (savebuffer); 
- 
     if (setsizeneeded)
 	R_ExecuteSetViewSize ();
     
@@ -1397,14 +1403,19 @@
 { 
     char	name[100]; 
     char*	description; 
-    int		length; 
+    unsigned long length;
 	
     strcpy(name, P_SaveGameFile(savegameslot));
 
     description = savedescription; 
 	 
-    save_p = savebuffer = screens[1]+0x4000; 
-	 
+    save_stream = fopen(name, "wb");
+
+    if (save_stream == NULL)
+    {
+        return;
+    }
+
     P_WriteSaveGameHeader(description);
  
     P_ArchivePlayers (); 
@@ -1414,10 +1425,16 @@
 	 
     P_WriteSaveGameEOF();
 	 
-    length = save_p - savebuffer; 
-    if (length > SAVEGAMESIZE) 
-	I_Error ("Savegame buffer overrun"); 
-    M_WriteFile (name, savebuffer, length); 
+    // Enforce the same savegame size limit as in Vanilla Doom, 
+    // except if the vanilla_savegame_limit setting is turned off.
+
+    if (vanilla_savegame_limit && ftell(save_stream) > SAVEGAMESIZE)
+    {
+        I_Error ("Savegame buffer overrun");
+    }
+    
+    fclose(save_stream);
+
     gameaction = ga_nothing; 
     strcpy(savedescription, "");
 	 
--- a/src/m_misc.c
+++ b/src/m_misc.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: m_misc.c 309 2006-01-20 21:04:59Z fraggle $
+// $Id: m_misc.c 367 2006-02-15 12:57:58Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -23,6 +23,11 @@
 //
 //
 // $Log$
+// Revision 1.19  2006/02/15 12:57:58  fraggle
+// Remove the savegame buffer entirely.  Keep the old savegame size limit
+// bug add a "vanilla_savegame_limit" config file option which allows
+// the limit to be disabled if necessary.
+//
 // Revision 1.18  2006/01/20 21:04:59  fraggle
 // Import differences from stable branch.
 //
@@ -101,7 +106,7 @@
 //-----------------------------------------------------------------------------
 
 static const char
-rcsid[] = "$Id: m_misc.c 309 2006-01-20 21:04:59Z fraggle $";
+rcsid[] = "$Id: m_misc.c 367 2006-02-15 12:57:58Z fraggle $";
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -289,6 +294,7 @@
 extern char*	chat_macros[];
 
 extern int      show_endoom;
+extern int      vanilla_savegame_limit;
 
 // dos specific options: these are unused but should be maintained
 // so that the config file can be shared between chocolate
@@ -388,13 +394,14 @@
 
 static default_t extra_defaults_list[] = 
 {
-    {"grabmouse",          &grabmouse},
-    {"fullscreen",         &fullscreen},
-    {"screenmultiply",     &screenmultiply},
-    {"novert",             &novert},
-    {"mouse_acceleration", &mouse_acceleration,   DEFAULT_FLOAT},
-    {"show_endoom",        &show_endoom},
-    {"player_name",        &net_player_name,      DEFAULT_STRING},
+    {"grabmouse",              &grabmouse},
+    {"fullscreen",             &fullscreen},
+    {"screenmultiply",         &screenmultiply},
+    {"novert",                 &novert},
+    {"mouse_acceleration",     &mouse_acceleration,   DEFAULT_FLOAT},
+    {"show_endoom",            &show_endoom},
+    {"vanilla_savegame_limit", &vanilla_savegame_limit},
+    {"player_name",            &net_player_name,      DEFAULT_STRING},
 };
 
 static default_collection_t extra_defaults =
--- a/src/p_saveg.c
+++ b/src/p_saveg.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: p_saveg.c 300 2006-01-19 18:46:24Z fraggle $
+// $Id: p_saveg.c 367 2006-02-15 12:57:58Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -22,6 +22,11 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.8  2006/02/15 12:57:58  fraggle
+// Remove the savegame buffer entirely.  Keep the old savegame size limit
+// bug add a "vanilla_savegame_limit" config file option which allows
+// the limit to be disabled if necessary.
+//
 // Revision 1.7  2006/01/19 18:46:24  fraggle
 // Move savegame header read/write code into p_saveg.c
 //
@@ -55,8 +60,10 @@
 //-----------------------------------------------------------------------------
 
 static const char
-rcsid[] = "$Id: p_saveg.c 300 2006-01-19 18:46:24Z fraggle $";
+rcsid[] = "$Id: p_saveg.c 367 2006-02-15 12:57:58Z fraggle $";
 
+#include <stdio.h>
+
 #include "dstrings.h"
 #include "deh_main.h"
 #include "i_system.h"
@@ -71,14 +78,9 @@
 #define SAVEGAME_EOF 0x1d
 #define VERSIONSIZE 16 
 
-byte*		save_p;
+FILE *save_stream;
+int savegamelength;
 
-
-// Pads save_p to a 4-byte boundary
-//  so that the load/save works on SGI&Gecko.
-#define PADSAVEP()	save_p += (4 - ((int) save_p & 3)) & 3
-
-
 char *P_SaveGameFile(int slot)
 {
     static char filename[256];
@@ -95,20 +97,16 @@
 
 static byte saveg_read8(void)
 {
-    int result;
+    byte result;
 
-    result = *save_p;
+    fread(&result, 1, 1, save_stream);
 
-    save_p += 1;
-
     return result;
 }
 
 static void saveg_write8(byte value)
 {
-    *save_p = value;
-
-    save_p += 1;
+    fwrite(&value, 1, 1, save_stream);
 }
 
 static short saveg_read16(void)
@@ -115,19 +113,16 @@
 {
     int result;
 
-    result = save_p[0] | (save_p[1] << 8);
+    result = saveg_read8();
+    result |= saveg_read8() << 8;
 
-    save_p += 2;
-
     return result;
 }
 
 static void saveg_write16(short value)
 {
-    save_p[0] = value & 0xff;
-    save_p[1] = (value >> 8) & 0xff;
-
-    save_p += 2;
+    saveg_write8(value & 0xff);
+    saveg_write8((value >> 8) & 0xff);
 }
 
 static int saveg_read32(void)
@@ -134,24 +129,57 @@
 {
     int result;
 
-    result = save_p[0] | (save_p[1] << 8)
-           | (save_p[2] << 16) | (save_p[3] << 24);
+    result = saveg_read8();
+    result |= saveg_read8() << 8;
+    result |= saveg_read8() << 16;
+    result |= saveg_read8() << 24;
 
-    save_p += 4;
-
     return result;
 }
 
 static void saveg_write32(int value)
 {
-    save_p[0] = value & 0xff;
-    save_p[1] = (value >> 8) & 0xff;
-    save_p[2] = (value >> 16) & 0xff;
-    save_p[3] = (value >> 24) & 0xff;
+    saveg_write8(value & 0xff);
+    saveg_write8((value >> 8) & 0xff);
+    saveg_write8((value >> 16) & 0xff);
+    saveg_write8((value >> 24) & 0xff);
+}
 
-    save_p += 4;
+// Pad to 4-byte boundaries
+
+static void saveg_read_pad(void)
+{
+    unsigned long pos;
+    int padding;
+    int i;
+
+    pos = ftell(save_stream);
+
+    padding = (4 - (pos & 3)) & 3;
+
+    for (i=0; i<padding; ++i)
+    {
+        saveg_read8();
+    }
 }
 
+static void saveg_write_pad(void)
+{
+    unsigned long pos;
+    int padding;
+    int i;
+
+    pos = ftell(save_stream);
+
+    padding = (4 - (pos & 3)) & 3;
+
+    for (i=0; i<padding; ++i)
+    {
+        saveg_write8(0);
+    }
+}
+
+
 // Pointers
 
 static void *saveg_readp(void)
@@ -1321,13 +1349,16 @@
     char name[VERSIONSIZE]; 
     int i; 
 	
-    memcpy (save_p, description, SAVESTRINGSIZE); 
-    save_p += SAVESTRINGSIZE; 
+    for (i=0; description[i] != '\0'; ++i)
+        saveg_write8(description[i]);
+    for (; i<SAVESTRINGSIZE; ++i)
+        saveg_write8(0);
 
     memset (name,0,sizeof(name)); 
     sprintf (name,"version %i",DOOM_VERSION); 
-    memcpy (save_p, name, VERSIONSIZE); 
-    save_p += VERSIONSIZE; 
+
+    for (i=0; i<VERSIONSIZE; ++i)
+        saveg_write8(name[i]);
 	 
     saveg_write8(gameskill);
     saveg_write8(gameepisode);
@@ -1350,15 +1381,20 @@
     int	 i; 
     byte a, b, c; 
     char vcheck[VERSIONSIZE]; 
+    char read_vcheck[VERSIONSIZE];
 	 
-    save_p += SAVESTRINGSIZE;
-    
     // skip the description field 
+
+    for (i=0; i<SAVESTRINGSIZE; ++i)
+        saveg_read8();
+    
+    for (i=0; i<VERSIONSIZE; ++i)
+        read_vcheck[i] = saveg_read8();
+
     memset (vcheck,0,sizeof(vcheck)); 
     sprintf (vcheck,"version %i",DOOM_VERSION); 
-    if (strcmp ((char *) save_p, vcheck)) 
+    if (strcmp(read_vcheck, vcheck) != 0)
 	return false;				// bad version 
-    save_p += VERSIONSIZE; 
 			 
     gameskill = saveg_read8();
     gameepisode = saveg_read8();
@@ -1410,7 +1446,7 @@
 	if (!playeringame[i])
 	    continue;
 	
-	PADSAVEP();
+	saveg_write_pad();
 
         saveg_write_player_t(&players[i]);
     }
@@ -1430,7 +1466,7 @@
 	if (!playeringame[i])
 	    continue;
 	
-	PADSAVEP();
+	saveg_read_pad();
 
         saveg_read_player_t(&players[i]);
 	
@@ -1563,7 +1599,7 @@
 	if (th->function.acp1 == (actionf_p1)P_MobjThinker)
 	{
             saveg_write8(tc_mobj);
-	    PADSAVEP();
+	    saveg_write_pad();
             saveg_write_mobj_t((mobj_t *) th);
 
 	    continue;
@@ -1613,7 +1649,7 @@
 	    return; 	// end of list
 			
 	  case tc_mobj:
-	    PADSAVEP();
+	    saveg_read_pad();
 	    mobj = Z_Malloc (sizeof(*mobj), PU_LEVEL, NULL);
             saveg_read_mobj_t(mobj);
 
@@ -1681,7 +1717,7 @@
 	    if (i<MAXCEILINGS)
 	    {
                 saveg_write8(tc_ceiling);
-		PADSAVEP();
+		saveg_write_pad();
                 saveg_write_ceiling_t((ceiling_t *) th);
 	    }
 	    continue;
@@ -1690,7 +1726,7 @@
 	if (th->function.acp1 == (actionf_p1)T_MoveCeiling)
 	{
             saveg_write8(tc_ceiling);
-	    PADSAVEP();
+	    saveg_write_pad();
             saveg_write_ceiling_t((ceiling_t *) th);
 	    continue;
 	}
@@ -1698,7 +1734,7 @@
 	if (th->function.acp1 == (actionf_p1)T_VerticalDoor)
 	{
             saveg_write8(tc_door);
-	    PADSAVEP();
+	    saveg_write_pad();
             saveg_write_vldoor_t((vldoor_t *) th);
 	    continue;
 	}
@@ -1706,7 +1742,7 @@
 	if (th->function.acp1 == (actionf_p1)T_MoveFloor)
 	{
             saveg_write8(tc_floor);
-	    PADSAVEP();
+	    saveg_write_pad();
             saveg_write_floormove_t((floormove_t *) th);
 	    continue;
 	}
@@ -1714,7 +1750,7 @@
 	if (th->function.acp1 == (actionf_p1)T_PlatRaise)
 	{
             saveg_write8(tc_plat);
-	    PADSAVEP();
+	    saveg_write_pad();
             saveg_write_plat_t((plat_t *) th);
 	    continue;
 	}
@@ -1722,7 +1758,7 @@
 	if (th->function.acp1 == (actionf_p1)T_LightFlash)
 	{
             saveg_write8(tc_flash);
-	    PADSAVEP();
+	    saveg_write_pad();
             saveg_write_lightflash_t((lightflash_t *) th);
 	    continue;
 	}
@@ -1730,7 +1766,7 @@
 	if (th->function.acp1 == (actionf_p1)T_StrobeFlash)
 	{
             saveg_write8(tc_strobe);
-	    PADSAVEP();
+	    saveg_write_pad();
             saveg_write_strobe_t((strobe_t *) th);
 	    continue;
 	}
@@ -1738,7 +1774,7 @@
 	if (th->function.acp1 == (actionf_p1)T_Glow)
 	{
             saveg_write8(tc_glow);
-	    PADSAVEP();
+	    saveg_write_pad();
             saveg_write_glow_t((glow_t *) th);
 	    continue;
 	}
@@ -1776,7 +1812,7 @@
 	    return;	// end of list
 			
 	  case tc_ceiling:
-	    PADSAVEP();
+	    saveg_read_pad();
 	    ceiling = Z_Malloc (sizeof(*ceiling), PU_LEVEL, NULL);
             saveg_read_ceiling_t(ceiling);
 	    ceiling->sector->specialdata = ceiling;
@@ -1789,7 +1825,7 @@
 	    break;
 				
 	  case tc_door:
-	    PADSAVEP();
+	    saveg_read_pad();
 	    door = Z_Malloc (sizeof(*door), PU_LEVEL, NULL);
             saveg_read_vldoor_t(door);
 	    door->sector->specialdata = door;
@@ -1798,7 +1834,7 @@
 	    break;
 				
 	  case tc_floor:
-	    PADSAVEP();
+	    saveg_read_pad();
 	    floor = Z_Malloc (sizeof(*floor), PU_LEVEL, NULL);
             saveg_read_floormove_t(floor);
 	    floor->sector->specialdata = floor;
@@ -1807,7 +1843,7 @@
 	    break;
 				
 	  case tc_plat:
-	    PADSAVEP();
+	    saveg_read_pad();
 	    plat = Z_Malloc (sizeof(*plat), PU_LEVEL, NULL);
             saveg_read_plat_t(plat);
 	    plat->sector->specialdata = plat;
@@ -1820,7 +1856,7 @@
 	    break;
 				
 	  case tc_flash:
-	    PADSAVEP();
+	    saveg_read_pad();
 	    flash = Z_Malloc (sizeof(*flash), PU_LEVEL, NULL);
             saveg_read_lightflash_t(flash);
 	    flash->thinker.function.acp1 = (actionf_p1)T_LightFlash;
@@ -1828,7 +1864,7 @@
 	    break;
 				
 	  case tc_strobe:
-	    PADSAVEP();
+	    saveg_read_pad();
 	    strobe = Z_Malloc (sizeof(*strobe), PU_LEVEL, NULL);
             saveg_read_strobe_t(strobe);
 	    strobe->thinker.function.acp1 = (actionf_p1)T_StrobeFlash;
@@ -1836,7 +1872,7 @@
 	    break;
 				
 	  case tc_glow:
-	    PADSAVEP();
+	    saveg_read_pad();
 	    glow = Z_Malloc (sizeof(*glow), PU_LEVEL, NULL);
             saveg_read_glow_t(glow);
 	    glow->thinker.function.acp1 = (actionf_p1)T_Glow;
--- a/src/p_saveg.h
+++ b/src/p_saveg.h
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: p_saveg.h 300 2006-01-19 18:46:24Z fraggle $
+// $Id: p_saveg.h 367 2006-02-15 12:57:58Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -30,6 +30,8 @@
 #ifndef __P_SAVEG__
 #define __P_SAVEG__
 
+#include <stdio.h>
+
 // maximum size of a savegame description
 
 #define SAVESTRINGSIZE 24
@@ -59,7 +61,7 @@
 void P_ArchiveSpecials (void);
 void P_UnArchiveSpecials (void);
 
-extern byte*		save_p; 
+extern FILE *save_stream;
 
 
 #endif
@@ -66,6 +68,11 @@
 //-----------------------------------------------------------------------------
 //
 // $Log$
+// Revision 1.6  2006/02/15 12:57:58  fraggle
+// Remove the savegame buffer entirely.  Keep the old savegame size limit
+// bug add a "vanilla_savegame_limit" config file option which allows
+// the limit to be disabled if necessary.
+//
 // Revision 1.5  2006/01/19 18:46:24  fraggle
 // Move savegame header read/write code into p_saveg.c
 //