forked from JACoders/OpenJK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblockstream.h
181 lines (123 loc) · 3.84 KB
/
blockstream.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
// BlockStream.h
#ifndef __INTERPRETED_BLOCK_STREAM__
#define __INTERPRETED_BLOCK_STREAM__
#pragma warning(disable : 4786) //identifier was truncated
#include <stdio.h>
#include <list>
#include <vector>
using namespace std;
#define IBI_EXT ".IBI" //(I)nterpreted (B)lock (I)nstructions
#define IBI_HEADER_ID "IBI"
const float IBI_VERSION = 1.57f;
const int MAX_FILENAME_LENGTH = 1024;
typedef float vector_t[3];
enum
{
POP_FRONT,
POP_BACK,
PUSH_FRONT,
PUSH_BACK
};
// Templates
// CBlockMember
class CBlockMember
{
public:
CBlockMember();
~CBlockMember();
void Free( void );
int WriteMember ( FILE * ); //Writes the member's data, in block format, to FILE *
int ReadMember( char **, long * ); //Reads the member's data, in block format, from FILE *
void SetID( int id ) { m_id = id; } //Set the ID member variable
void SetSize( int size ) { m_size = size; } //Set the size member variable
void GetInfo( int *, int *, void **);
//SetData overloads
void SetData( const char * );
void SetData( vector_t );
void SetData( void *data, int size );
int GetID( void ) const { return m_id; } //Get ID member variables
void *GetData( void ) const { return m_data; } //Get data member variable
int GetSize( void ) const { return m_size; } //Get size member variable
CBlockMember *Duplicate( void );
template <class T> WriteData(T &data)
{
if ( m_data )
free( m_data );
m_data = malloc( sizeof(T) );
*((T *) m_data) = data;
m_size = sizeof(T);
}
template <class T> WriteDataPointer(const T *data, int num)
{
if ( m_data )
free( m_data );
m_data = malloc( num*sizeof(T) );
memcpy( m_data, data, num*sizeof(T) );
m_size = num*sizeof(T);
}
protected:
int m_id; //ID of the value contained in data
int m_size; //Size of the data member variable
void *m_data; //Data for this member
};
//CBlock
class CBlock
{
typedef vector< CBlockMember * > blockMember_v;
public:
CBlock();
~CBlock();
int Init( void );
int Create( int );
int Free();
//Write Overloads
int Write( int, vector_t );
int Write( int, float );
int Write( int, const char * );
int Write( int, int );
int Write( CBlockMember * );
//Member push / pop functions
int AddMember( CBlockMember * );
CBlockMember *GetMember( int memberNum );
void *GetMemberData( int memberNum );
CBlock *Duplicate( void );
int GetBlockID( void ) const { return m_id; } //Get the ID for the block
int GetNumMembers( void ) const { return m_numMembers; } //Get the number of member in the block's list
void SetFlags( unsigned char flags ) { m_flags = flags; }
void SetFlag( unsigned char flag ) { m_flags |= flag; }
int HasFlag( unsigned char flag ) const { return ( m_flags & flag ); }
unsigned char GetFlags( void ) const { return m_flags; }
protected:
blockMember_v m_members; //List of all CBlockMembers owned by this list
int m_numMembers; //Number of members in m_members
int m_id; //ID of the block
unsigned char m_flags;
};
// CBlockStream
class CBlockStream
{
public:
CBlockStream();
~CBlockStream();
int Init( void );
int Create( char * );
int Free( void );
// Stream I/O functions
int BlockAvailable( void );
int WriteBlock( CBlock * ); //Write the block out
int ReadBlock( CBlock * ); //Read the block in
int Open( char *, long ); //Open a stream for reading / writing
protected:
unsigned GetUnsignedInteger( void );
int GetInteger( void );
char GetChar( void );
long GetLong( void );
float GetFloat( void );
void StripExtension( const char *, char * ); //Utility function to strip away file extensions
long m_fileSize; //Size of the file
FILE *m_fileHandle; //Global file handle of current I/O source
char m_fileName[MAX_FILENAME_LENGTH]; //Name of the current file
char *m_stream; //Stream of data to be parsed
long m_streamPos;
};
#endif //__INTERPRETED_BLOCK_STREAM__