blockstream.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. // BlockStream.h
  2. #ifndef __INTERPRETED_BLOCK_STREAM__
  3. #define __INTERPRETED_BLOCK_STREAM__
  4. #include <assert.h>
  5. typedef float vec3_t[3];
  6. // Templates
  7. // CBlockMember
  8. class CBlockMember
  9. {
  10. public:
  11. CBlockMember();
  12. protected:
  13. ~CBlockMember();
  14. public:
  15. void Free(IGameInterface* game);
  16. int WriteMember ( FILE * ); //Writes the member's data, in block format, to FILE *
  17. int ReadMember( char **, long *, CIcarus* icarus ); //Reads the member's data, in block format, from FILE *
  18. void SetID( int id ) { m_id = id; } //Set the ID member variable
  19. void SetSize( int size ) { m_size = size; } //Set the size member variable
  20. void GetInfo( int *, int *, void **);
  21. //SetData overloads
  22. void SetData( const char * ,CIcarus* icarus);
  23. void SetData( vec3_t , CIcarus* icarus);
  24. void SetData( void *data, int size, CIcarus* icarus);
  25. int GetID( void ) const { return m_id; } //Get ID member variables
  26. void *GetData( void ) const { return m_data; } //Get data member variable
  27. int GetSize( void ) const { return m_size; } //Get size member variable
  28. // Overloaded new operator.
  29. inline void *operator new( size_t size )
  30. { // Allocate the memory.
  31. return IGameInterface::GetGame()->Malloc( size );
  32. }
  33. // Overloaded delete operator.
  34. inline void operator delete( void *pRawData )
  35. { // Free the Memory.
  36. IGameInterface::GetGame()->Free( pRawData );
  37. }
  38. CBlockMember *Duplicate( CIcarus* icarus );
  39. template <class T> void WriteData(T &data, CIcarus* icarus)
  40. {
  41. IGameInterface* game = icarus->GetGame();
  42. if ( m_data )
  43. {
  44. game->Free( m_data );
  45. }
  46. m_data = game->Malloc( sizeof(T) );
  47. *((T *) m_data) = data;
  48. m_size = sizeof(T);
  49. }
  50. template <class T> void WriteDataPointer(const T *data, int num, CIcarus* icarus)
  51. {
  52. IGameInterface* game =icarus->GetGame();
  53. if ( m_data )
  54. {
  55. game->Free( m_data );
  56. }
  57. m_data = game->Malloc( num*sizeof(T) );
  58. memcpy( m_data, data, num*sizeof(T) );
  59. m_size = num*sizeof(T);
  60. }
  61. protected:
  62. int m_id; //ID of the value contained in data
  63. int m_size; //Size of the data member variable
  64. void *m_data; //Data for this member
  65. };
  66. //CBlock
  67. class CBlock
  68. {
  69. typedef vector< CBlockMember * > blockMember_v;
  70. public:
  71. CBlock()
  72. {
  73. m_flags = 0;
  74. m_id = 0;
  75. }
  76. ~CBlock() { assert(!GetNumMembers()); }
  77. int Init( void );
  78. int Create( int );
  79. int Free(CIcarus* icarus);
  80. //Write Overloads
  81. int Write( int, vec3_t, CIcarus* icaru );
  82. int Write( int, float, CIcarus* icaru );
  83. int Write( int, const char *, CIcarus* icaru );
  84. int Write( int, int, CIcarus* icaru );
  85. int Write( CBlockMember *, CIcarus* icaru );
  86. //Member push / pop functions
  87. int AddMember( CBlockMember * );
  88. CBlockMember *GetMember( int memberNum );
  89. void *GetMemberData( int memberNum );
  90. CBlock *Duplicate( CIcarus* icarus );
  91. int GetBlockID( void ) const { return m_id; } //Get the ID for the block
  92. int GetNumMembers( void ) const { return m_members.size();} //Get the number of member in the block's list
  93. void SetFlags( unsigned char flags ) { m_flags = flags; }
  94. void SetFlag( unsigned char flag ) { m_flags |= flag; }
  95. int HasFlag( unsigned char flag ) const { return ( m_flags & flag ); }
  96. unsigned char GetFlags( void ) const { return m_flags; }
  97. // Overloaded new operator.
  98. inline void *operator new( size_t size )
  99. { // Allocate the memory.
  100. return IGameInterface::GetGame()->Malloc( size );
  101. }
  102. // Overloaded delete operator.
  103. inline void operator delete( void *pRawData )
  104. { // Validate data.
  105. if ( pRawData == 0 )
  106. return;
  107. // Free the Memory.
  108. IGameInterface::GetGame()->Free( pRawData );
  109. }
  110. protected:
  111. blockMember_v m_members; //List of all CBlockMembers owned by this list
  112. int m_id; //ID of the block
  113. unsigned char m_flags;
  114. };
  115. // CBlockStream
  116. class CBlockStream
  117. {
  118. public:
  119. CBlockStream()
  120. {
  121. m_stream = NULL;
  122. m_streamPos = 0;
  123. }
  124. ~CBlockStream() {};
  125. int Init( void );
  126. int Create( char * );
  127. int Free( void );
  128. // Stream I/O functions
  129. int BlockAvailable( void );
  130. int WriteBlock( CBlock *, CIcarus* icarus ); //Write the block out
  131. int ReadBlock( CBlock *, CIcarus* icarus ); //Read the block in
  132. int Open( char *, long ); //Open a stream for reading / writing
  133. // Overloaded new operator.
  134. static void *operator new( size_t size )
  135. { // Allocate the memory.
  136. return IGameInterface::GetGame()->Malloc( size );
  137. }
  138. // Overloaded delete operator.
  139. static void operator delete( void *pRawData )
  140. { // Free the Memory.
  141. IGameInterface::GetGame()->Free( pRawData );
  142. }
  143. protected:
  144. long m_fileSize; //Size of the file
  145. FILE *m_fileHandle; //Global file handle of current I/O source
  146. char m_fileName[CIcarus::MAX_FILENAME_LENGTH]; //Name of the current file
  147. char *m_stream; //Stream of data to be parsed
  148. long m_streamPos;
  149. static char* s_IBI_EXT;
  150. static char* s_IBI_HEADER_ID;
  151. static const float s_IBI_VERSION;
  152. };
  153. #endif //__INTERPRETED_BLOCK_STREAM__