fixed compiler warnings (after adding "-Wmissing-prototypes")
[rocksndiamonds.git] / src / game_sp / file.c
index 27cb452a08136c6e8a8a0934a4bac64efb35f19c..8467cbf03877ab770470259a6519c8841571e89c 100644 (file)
@@ -7,13 +7,13 @@
 /* functions for loading Supaplex level                                      */
 /* ------------------------------------------------------------------------- */
 
-void setTapeInfoToDefaults_SP()
+static void setTapeInfoToDefaults_SP(void)
 {
   native_sp_level.demo.is_available = FALSE;
   native_sp_level.demo.length = 0;
 }
 
-void setLevelInfoToDefaults_SP()
+void setLevelInfoToDefaults_SP(void)
 {
   LevelInfoType *header = &native_sp_level.header;
   char *empty_title = "-------- EMPTY --------";
@@ -58,7 +58,7 @@ void setLevelInfoToDefaults_SP()
   setTapeInfoToDefaults_SP();
 }
 
-void copyInternalEngineVars_SP()
+void copyInternalEngineVars_SP(void)
 {
   int count;
   int i, x, y;
@@ -72,17 +72,6 @@ void copyInternalEngineVars_SP()
   FieldMax = (FieldWidth * FieldHeight) + HeaderSize - 1;
   LevelMax = (FieldWidth * FieldHeight) - 1;
 
-#if 0
-  /* (add one byte for the level number stored as first byte of demo data) */
-  FileMax = FieldMax + native_sp_level.demo.length + 1;
-#endif
-
-#if 0
-  PlayField8 = REDIM_1D(sizeof(byte), 0, FileMax);
-  DisPlayField = REDIM_1D(sizeof(byte), 0, FieldMax);
-  PlayField16 = REDIM_1D(sizeof(int), -game_sp.preceding_buffer_size, FieldMax);
-#endif
-
   /* initialize preceding playfield buffer */
   for (i = -game_sp.preceding_buffer_size; i < 0; i++)
     PlayField16[i] = 0;
@@ -137,38 +126,17 @@ void copyInternalEngineVars_SP()
   }
 
   if (native_sp_level.demo.is_available)
-  {
     DemoAvailable = True;
 
-#if 0
-    /* !!! NEVER USED !!! */
-    PlayField8[FieldMax + 1] = native_sp_level.demo.level_nr;
-
-    /* !!! NEVER USED !!! */
-    for (i = 0; i < native_sp_level.demo.length; i++)
-      PlayField8[FieldMax + 2 + i] = native_sp_level.demo.data[i];
-#endif
-  }
-
-#if 0
-  AnimationPosTable = REDIM_1D(sizeof(int), 0, LevelMax - 2 * FieldWidth);
-  AnimationSubTable = REDIM_1D(sizeof(byte), 0, LevelMax - 2 * FieldWidth);
-  TerminalState = REDIM_1D(sizeof(byte), 0, FieldMax);
-#endif
-
   GravityFlag = LInfo.InitialGravity;
   FreezeZonks = LInfo.InitialFreezeZonks;
 
-#if 1
-  /* this is set by main game tape code to native random generator directly */
-#else
-  RandomSeed = LInfo.DemoRandomSeed;
-#endif
-
   LevelLoaded = True;
+
+  /* random seed set by main game tape code to native random generator seed */
 }
 
-static void LoadNativeLevelFromFileStream_SP(FILE *file, int width, int height,
+static void LoadNativeLevelFromFileStream_SP(File *file, int width, int height,
                                             boolean demo_available)
 {
   LevelInfoType *header = &native_sp_level.header;
@@ -265,9 +233,9 @@ static void LoadNativeLevelFromFileStream_SP(FILE *file, int width, int height,
 
   /* read raw level header bytes (96 bytes) */
 
-  fseek(file, -(SP_HEADER_SIZE), SEEK_CUR);    /* rewind file */
+  seekFile(file, -(SP_HEADER_SIZE), SEEK_CUR); /* rewind file */
   for (i = 0; i < SP_HEADER_SIZE; i++)
-    native_sp_level.header_raw_bytes[i] = fgetc(file);
+    native_sp_level.header_raw_bytes[i] = getByteFromFile(file);
 
   /* also load demo tape, if available (only in single level files) */
 
@@ -281,26 +249,27 @@ static void LoadNativeLevelFromFileStream_SP(FILE *file, int width, int height,
 
     native_sp_level.demo.level_nr = level_nr;
 
-    for (i = 0; i < SP_MAX_TAPE_LEN && !feof(file); i++)
+    for (i = 0; i < SP_MAX_TAPE_LEN && !checkEndOfFile(file); i++)
     {
       native_sp_level.demo.data[i] = getFile8Bit(file);
 
       if (native_sp_level.demo.data[i] == 0xff)        /* "end of demo" byte */
-      {
-       i++;
-
        break;
-      }
     }
 
+    if (i >= SP_MAX_TAPE_LEN)
+      Error(ERR_WARN, "SP demo truncated: size exceeds maximum SP demo size %d",
+           SP_MAX_TAPE_LEN);
+
     native_sp_level.demo.length = i;
     native_sp_level.demo.is_available = (native_sp_level.demo.length > 0);
   }
 }
 
-boolean LoadNativeLevel_SP(char *filename, int level_pos)
+boolean LoadNativeLevel_SP(char *filename, int level_pos,
+                          boolean level_info_only)
 {
-  FILE *file;
+  File *file;
   int i, l, x, y;
   char name_first, name_last;
   struct LevelInfo_SP multipart_level;
@@ -322,9 +291,10 @@ boolean LoadNativeLevel_SP(char *filename, int level_pos)
   setLevelInfoToDefaults_SP();
   copyInternalEngineVars_SP();
 
-  if (!(file = fopen(filename, MODE_READ)))
+  if (!(file = openFile(filename, MODE_READ)))
   {
-    Error(ERR_WARN, "cannot open file '%s' -- using empty level", filename);
+    if (!level_info_only)
+      Error(ERR_WARN, "cannot open file '%s' -- using empty level", filename);
 
     return FALSE;
   }
@@ -393,7 +363,7 @@ boolean LoadNativeLevel_SP(char *filename, int level_pos)
   }
 
   /* position file stream to the requested level (in case of level package) */
-  if (fseek(file, file_seek_pos, SEEK_SET) != 0)
+  if (seekFile(file, file_seek_pos, SEEK_SET) != 0)
   {
     Error(ERR_WARN, "cannot fseek in file '%s' -- using empty level", filename);
 
@@ -504,11 +474,6 @@ boolean LoadNativeLevel_SP(char *filename, int level_pos)
     multipart_xpos = (int)(name_first - '0');
     multipart_ypos = (int)(name_last  - '0');
 
-#if 0
-    printf("----------> part (%d/%d) of multi-part level '%s'\n",
-          multipart_xpos, multipart_ypos, multipart_level.header.LevelTitle);
-#endif
-
     if (multipart_xpos * SP_STD_PLAYFIELD_WIDTH  > SP_MAX_PLAYFIELD_WIDTH ||
        multipart_ypos * SP_STD_PLAYFIELD_HEIGHT > SP_MAX_PLAYFIELD_HEIGHT)
     {
@@ -536,7 +501,7 @@ boolean LoadNativeLevel_SP(char *filename, int level_pos)
     }
   }
 
-  fclose(file);
+  closeFile(file);
 
   if (use_empty_level)
   {
@@ -609,6 +574,8 @@ void SaveNativeLevel_SP(char *filename)
 
     for (i = 0; i < native_sp_level.demo.length; i++)
       putFile8Bit(file, native_sp_level.demo.data[i]);
+
+    putFile8Bit(file, 0xff);   /* "end of demo" byte */
   }
 
   fclose(file);