🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by rsne... Robert Wesley Snedegar Thu, 20 Jan 1994 03:41
Question For DOOM Add-On Programmers
#2372
Author: rsne... Robert Wesley Snedegar
Date: Thu, 20 Jan 1994 03:41
175 lines
7775 bytes
Well, I was writing a program to view the contents of the WAD, but I am
having a little problem reading in part of the file.  I am posting
here because there is not an alt.games.doom.programmer group that I
know of.  I am including my Header file and program code so that those
who are interested can look at it / use it as a basis for more and better
things.   
 
   The problem is that I my program is bombing when attempting to read in 
the offsets (as a long int) from the WAD.  Some times, one of the bytes
of the long is the EOF character ( at least according to PCTOOLS HexEdit
and other hex viewing programs.) This presents a problem to either
  a)  my code
  b)  the C++ file I/O routines 
If any one can help me with thisI would appreciate it.  If you want to 
use the code for a much better (i.e. working correctly) program of your
own, feel free to modify as wanted.  (Leave my name in the source if
you redistribute).

Source Code Coming Through




---------------------------- CUT HERE --------------------------------

//
//  doominfo.h
//
//  header file with structures and function declarations
//  for the stuff stored in the WAD file.
//  (At least as far as I can deduce.)
//

struct WAD_header
   {
   char      iwad[5];      // The string 'IWAD'
   long int  num_entries;  // number of items in pointer table
   long int  table_offset; // offset into file to beginning of pointer table
   };

struct reference           // pointer table entry
   {                       //
   long int  data_offset;  // offset from begining of file to data
   long int  data_length;  // size of data segment
   char      data_name[9]; // data name
   };

struct pointer_table
   {
   reference     * entry;   // array or references
   unsigned int    number;  // how many there are
   };

void writedata(reference output);  // function declaration for writing data

----------------------------- CUT HERE -----------------------------
//
//  doomdat.cpp
//
//  By: Robert Snedegar
//  Date: 1/18/94
//
//  Main code for my DOOM WAD data extractor
//

#include <fstream.h>        // for io and file io in c++
#include <string.h>         // for string mainipulation
#include <process.h>        // for exit()

#include "doominfo.h"       // local header

void writedata(reference output)
   {
   char temp;                                   // temp variable
   char *filename = new char[12];               // local filename of outfile
   strcpy (filename, output.data_name);         // create filename from ref.
   strcat ( filename, ".dat");                  // and append ".dat"
   ifstream infile("doom1.wad");                // open DOOM1.wad
   ofstream outfile(filename, ios::out);        // open/create filename

   infile.seekg(output.data_offset, ios::beg);  // goto offset in doom1.wad
   for ( long int i = 0; i < output.data_length; i++)  // loop till done
	  {
	  infile.read((char*)&temp, sizeof(char));    // read a character
	  outfile.write((char*)&temp, sizeof(char));  // write a character
	  }                                           // very kludgy, I know!
   outfile.close();                               // close outfile
   infile.close();                                // close infile
   delete filename;                               // free pointer
   }

void main()
   {
   WAD_header     doom_header;                    // header variable
   pointer_table  doom_point;                     // table variable
   char *filename = new char[127];                // input filename-allocated

   cout << "Enter the path and file name (default = doom1.wad) \n>";
   cin.get(filename, 127);                        // get filename or enter
   if ( strlen (filename) < 1 )                   // if enter, then set to
	  strcpy ( filename, "doom1.wad");            // doom1.wad

   ifstream doomfile;                             // make infile object
   doomfile.open (filename, ios::in);             // open it up

   doom_header.iwad[4] = '\x0';                   // put NULL in string
   //
   // The following is the C++ version of fscanf(FILE, char *, arglist)
   // I know this more then fscanf, thats why I am using it.  maybe
   // fscanf will work better.  For those that dont use C++ or dont
   // yet understand it all, this is reading into the variable
   // the amount asked for
   //    read ((char*)&input, how many bytes);
   // This part works fine.  (debugger approved!)
   //
   doomfile.read((char*)&doom_header.iwad,         4*sizeof(char));
   doomfile.read((char*)&doom_header.num_entries,  sizeof(long int));
   doomfile.read((char*)&doom_header.table_offset, sizeof(long int));
   //
   //  set table size in its struct and output for my use
   //
   doom_point.number = (unsigned int)doom_header.num_entries;
   cout << "Number of Entries = " << doom_point.number << endl;
   //
   //  Attempt to allocate appropriate ammount of memory
   //  if fails, then EXIT
   //
   if ( !(doom_point.entry = new reference[(int)doom_point.number]))
	  {
	  cout << "Error allocating pointer storage.\n";
	  exit (-1);
	  }
   //
   //  Go to the beginning of the offset table
   //  and prepare to read it in
   //
   doomfile.seekg(doom_header.table_offset, ios::beg);
   //  Loop  -- Duhhh!
   for (unsigned int i = 0; i < doom_point.number; i++)
	  {
	  //
	  //  This is where things start going funny.
	  //  when reading in the data, when it comes acress the char that
	  //  represents EOF, (as in part of a long int mostly)
	  //  (thanks to help from PCTOOLS HexEdit in viewing hex/ascii), it
	  //  chokes out and starts spewing garbage values for everything
	  //  any one who can help me out on this, I would greatly appreciate it.
	  //
	  doom_point.entry[i].data_name[8] = '\x0';   // terminate string
	  doomfile.read((unsigned char*)&doom_point.entry[i].data_offset, sizeof(long int));
	  doomfile.read((unsigned char*)&doom_point.entry[i].data_length, sizeof(long int));
	  doomfile.read((char*)doom_point.entry[i].data_name, 8*sizeof(char));
	  // output for my conveinience
	  cout << "Name : " << doom_point.entry[i].data_name << "    Length : ";
	  cout << doom_point.entry[i].data_length << endl;
	  //
	  // This is to dump the files for my later inspection
	  // writedata(doom_point.entry[i]);
	  //
	  }
   doomfile.close();     // close when we are done

   delete filename;         // free memory
   delete doom_point.entry; // free memory
   }
-------------------------- CUT HERE ---------------------------------

  -- Robert

/*******************************************************************\
**         Robert Snedegar           ***  The beatings will        **    
**   rsne...@oboe.aix.calpoly.edu   ***  continue until the       **
**  rsne...@hertz.elee.calpoly.edu  ***  moral improves.          **  
**  rsne...@galaxy.csc.calpoly.edu  ***         - The Management  **
\*******************************************************************/
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads