DEADSOFTWARE

put "{$MODE ...}" directive in each source file; removed trailing spaces, and convert...
[d2df-sdl.git] / src / engine / e_fixedbuffer.pas
1 {$MODE DELPHI}
2 unit e_fixedbuffer;
4 interface
6 uses md5;
8 const
9 BUF_SIZE = 65536;
11 type
12 TBuffer = record
13 Data: array [0..BUF_SIZE] of Byte; // îäèí áàéò ñâåðõó íà âñÿêèé ñëó÷àé
14 ReadPos: Cardinal;
15 WritePos: Cardinal;
16 Len: Cardinal;
17 end;
18 pTBuffer = ^TBuffer;
20 var
21 RawPos: Cardinal = 0;
23 procedure e_Buffer_Clear(B: pTBuffer);
26 procedure e_Buffer_Write_Generic(B: pTBuffer; var V; N: Cardinal);
27 procedure e_Buffer_Read_Generic(B: pTBuffer; var V; N: Cardinal);
30 procedure e_Buffer_Write(B: pTBuffer; V: Char); overload;
32 procedure e_Buffer_Write(B: pTBuffer; V: Byte); overload;
33 procedure e_Buffer_Write(B: pTBuffer; V: Word); overload;
34 procedure e_Buffer_Write(B: pTBuffer; V: LongWord); overload;
36 procedure e_Buffer_Write(B: pTBuffer; V: ShortInt); overload;
37 procedure e_Buffer_Write(B: pTBuffer; V: SmallInt); overload;
38 procedure e_Buffer_Write(B: pTBuffer; V: LongInt); overload;
40 procedure e_Buffer_Write(B: pTBuffer; V: string); overload;
42 procedure e_Buffer_Write(B: pTBuffer; V: TMD5Digest); overload;
45 function e_Buffer_Read_Char(B: pTBuffer): Char;
47 function e_Buffer_Read_Byte(B: pTBuffer): Byte;
48 function e_Buffer_Read_Word(B: pTBuffer): Word;
49 function e_Buffer_Read_LongWord(B: pTBuffer): LongWord;
51 function e_Buffer_Read_ShortInt(B: pTBuffer): ShortInt;
52 function e_Buffer_Read_SmallInt(B: pTBuffer): SmallInt;
53 function e_Buffer_Read_LongInt(B: pTBuffer): LongInt;
54 function e_Buffer_Read_Int64(B: pTBuffer): Int64;
56 function e_Buffer_Read_String(B: pTBuffer): string;
58 function e_Buffer_Read_MD5(B: pTBuffer): TMD5Digest;
61 procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
63 function e_Raw_Read_Char(P: Pointer): Char;
65 function e_Raw_Read_Byte(P: Pointer): Byte;
66 function e_Raw_Read_Word(P: Pointer): Word;
67 function e_Raw_Read_LongWord(P: Pointer): LongWord;
69 function e_Raw_Read_ShortInt(P: Pointer): ShortInt;
70 function e_Raw_Read_SmallInt(P: Pointer): SmallInt;
71 function e_Raw_Read_LongInt(P: Pointer): LongInt;
73 function e_Raw_Read_String(P: Pointer): string;
75 function e_Raw_Read_MD5(P: Pointer): TMD5Digest;
77 procedure e_Raw_Seek(I: Cardinal);
79 implementation
81 uses SysUtils, BinEditor;
83 procedure e_Buffer_Clear(B: pTBuffer);
84 begin
85 B^.WritePos := 0;
86 B^.ReadPos := 0;
87 B^.Len := 0;
88 end;
91 procedure e_Buffer_Write_Generic(B: pTBuffer; var V; N: Cardinal);
92 begin
93 if (B^.WritePos + N >= BUF_SIZE) then Exit;
94 if (B^.WritePos + N > B^.Len) then
95 B^.Len := B^.WritePos + N + 1;
97 CopyMemory(Pointer(Cardinal(Addr(B^.Data)) + B^.WritePos),
98 @V, N);
100 B^.WritePos := B^.WritePos + N;
101 end;
102 procedure e_Buffer_Read_Generic(B: pTBuffer; var V; N: Cardinal);
103 begin
104 if (B^.ReadPos + N >= BUF_SIZE) then Exit;
106 CopyMemory(@V, Pointer(Cardinal(Addr(B^.Data)) + B^.ReadPos), N);
108 B^.ReadPos := B^.ReadPos + N;
109 end;
112 procedure e_Buffer_Write(B: pTBuffer; V: Char); overload;
113 begin
114 e_Buffer_Write_Generic(B, V, 1);
115 end;
117 procedure e_Buffer_Write(B: pTBuffer; V: Byte); overload;
118 begin
119 e_Buffer_Write_Generic(B, V, 1);
120 end;
121 procedure e_Buffer_Write(B: pTBuffer; V: Word); overload;
122 begin
123 e_Buffer_Write_Generic(B, V, 2);
124 end;
125 procedure e_Buffer_Write(B: pTBuffer; V: LongWord); overload;
126 begin
127 e_Buffer_Write_Generic(B, V, 4);
128 end;
130 procedure e_Buffer_Write(B: pTBuffer; V: ShortInt); overload;
131 begin
132 e_Buffer_Write_Generic(B, V, 1);
133 end;
134 procedure e_Buffer_Write(B: pTBuffer; V: SmallInt); overload;
135 begin
136 e_Buffer_Write_Generic(B, V, 2);
137 end;
138 procedure e_Buffer_Write(B: pTBuffer; V: LongInt); overload;
139 begin
140 e_Buffer_Write_Generic(B, V, 4);
141 end;
143 procedure e_Buffer_Write(B: pTBuffer; V: string); overload;
144 var
145 Len: Byte;
146 P: Cardinal;
147 begin
148 Len := Length(V);
149 e_Buffer_Write_Generic(B, Len, 1);
151 if (Len = 0) then Exit;
153 P := B^.WritePos + Len;
154 if (P >= BUF_SIZE) then
155 begin
156 Len := BUF_SIZE - B^.WritePos;
157 P := BUF_SIZE;
158 end;
160 if (P > B^.Len) then B^.Len := P;
162 CopyMemory(Pointer(Cardinal(Addr(B^.Data)) + B^.WritePos),
163 @V[1], Len);
165 B^.WritePos := P;
166 end;
168 procedure e_Buffer_Write(B: pTBuffer; V: TMD5Digest); overload;
169 var
170 I: Integer;
171 begin
172 for I := 0 to 15 do
173 e_Buffer_Write(B, V[I]);
174 end;
177 function e_Buffer_Read_Char(B: pTBuffer): Char;
178 begin
179 e_Buffer_Read_Generic(B, Result, 1);
180 end;
182 function e_Buffer_Read_Byte(B: pTBuffer): Byte;
183 begin
184 e_Buffer_Read_Generic(B, Result, 1);
185 end;
186 function e_Buffer_Read_Word(B: pTBuffer): Word;
187 begin
188 e_Buffer_Read_Generic(B, Result, 2);
189 end;
190 function e_Buffer_Read_LongWord(B: pTBuffer): LongWord;
191 begin
192 e_Buffer_Read_Generic(B, Result, 4);
193 end;
195 function e_Buffer_Read_ShortInt(B: pTBuffer): ShortInt;
196 begin
197 e_Buffer_Read_Generic(B, Result, 1);
198 end;
199 function e_Buffer_Read_SmallInt(B: pTBuffer): SmallInt;
200 begin
201 e_Buffer_Read_Generic(B, Result, 2);
202 end;
203 function e_Buffer_Read_LongInt(B: pTBuffer): LongInt;
204 begin
205 e_Buffer_Read_Generic(B, Result, 4);
206 end;
207 function e_Buffer_Read_Int64(B: pTBuffer): Int64;
208 begin
209 e_Buffer_Read_Generic(B, Result, 8);
210 end;
212 function e_Buffer_Read_String(B: pTBuffer): string;
213 var
214 Len: Byte;
215 begin
216 Len := e_Buffer_Read_Byte(B);
217 Result := '';
218 if Len = 0 then Exit;
220 if B^.ReadPos + Len > B^.Len then
221 Len := B^.Len - B^.ReadPos;
223 SetLength(Result, Len);
224 CopyMemory(@Result[1], Pointer(Cardinal(Addr(B^.Data)) + B^.ReadPos), Len);
226 B^.ReadPos := B^.ReadPos + Len;
227 end;
229 function e_Buffer_Read_MD5(B: pTBuffer): TMD5Digest;
230 var
231 I: Integer;
232 begin
233 for I := 0 to 15 do
234 Result[I] := e_Buffer_Read_Byte(B);
235 end;
237 procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
238 begin
239 CopyMemory(@V, Pointer(Cardinal(P) + RawPos), N);
241 RawPos := RawPos + N;
242 end;
244 function e_Raw_Read_Char(P: Pointer): Char;
245 begin
246 e_Raw_Read_Generic(P, Result, 1);
247 end;
249 function e_Raw_Read_Byte(P: Pointer): Byte;
250 begin
251 e_Raw_Read_Generic(P, Result, 1);
252 end;
253 function e_Raw_Read_Word(P: Pointer): Word;
254 begin
255 e_Raw_Read_Generic(P, Result, 2);
256 end;
257 function e_Raw_Read_LongWord(P: Pointer): LongWord;
258 begin
259 e_Raw_Read_Generic(P, Result, 4);
260 end;
262 function e_Raw_Read_ShortInt(P: Pointer): ShortInt;
263 begin
264 e_Raw_Read_Generic(P, Result, 1);
265 end;
266 function e_Raw_Read_SmallInt(P: Pointer): SmallInt;
267 begin
268 e_Raw_Read_Generic(P, Result, 2);
269 end;
270 function e_Raw_Read_LongInt(P: Pointer): LongInt;
271 begin
272 e_Raw_Read_Generic(P, Result, 4);
273 end;
275 function e_Raw_Read_String(P: Pointer): string;
276 var
277 Len: Byte;
278 begin
279 Len := e_Raw_Read_Byte(P);
280 Result := '';
281 if Len = 0 then Exit;
283 SetLength(Result, Len);
284 CopyMemory(@Result[1], Pointer(Cardinal(P) + RawPos), Len);
286 RawPos := RawPos + Len;
287 end;
289 function e_Raw_Read_MD5(P: Pointer): TMD5Digest;
290 var
291 I: Integer;
292 begin
293 for I := 0 to 15 do
294 Result[I] := e_Raw_Read_Byte(P);
295 end;
297 procedure e_Raw_Seek(I: Cardinal);
298 begin
299 RawPos := I;
300 end;
302 end.