DEADSOFTWARE

more buffer fixes (?)
[d2df-sdl.git] / src / engine / e_fixedbuffer.pas
1 (* Copyright (C) DooM 2D:Forever Developers
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *)
16 {$INCLUDE e_amodes.inc}
17 unit e_fixedbuffer;
19 interface
21 uses md5;
23 const
24 BUF_SIZE = 65536;
26 type
27 TBuffer = record
28 Data: array [0..BUF_SIZE] of Byte; // îäèí áàéò ñâåðõó íà âñÿêèé ñëó÷àé
29 ReadPos: Cardinal;
30 WritePos: Cardinal;
31 Cap: Cardinal;
32 end;
33 pTBuffer = ^TBuffer;
35 var
36 RawPos: Cardinal = 0;
38 procedure e_Buffer_Clear(B: pTBuffer);
41 procedure e_Buffer_Write_Generic(B: pTBuffer; var V; N: Cardinal);
42 procedure e_Buffer_Read_Generic(B: pTBuffer; var V; N: Cardinal);
45 procedure e_Buffer_Write(B: pTBuffer; V: Char); overload;
47 procedure e_Buffer_Write(B: pTBuffer; V: Byte); overload;
48 procedure e_Buffer_Write(B: pTBuffer; V: Word); overload;
49 procedure e_Buffer_Write(B: pTBuffer; V: LongWord); overload;
51 procedure e_Buffer_Write(B: pTBuffer; V: ShortInt); overload;
52 procedure e_Buffer_Write(B: pTBuffer; V: SmallInt); overload;
53 procedure e_Buffer_Write(B: pTBuffer; V: LongInt); overload;
54 procedure e_Buffer_Write(B: pTBuffer; V: Int64); overload;
56 procedure e_Buffer_Write(B: pTBuffer; V: string); overload;
58 procedure e_Buffer_Write(B: pTBuffer; V: TMD5Digest); overload;
60 procedure e_Buffer_Write(B: pTBuffer; V: pTBuffer); overload;
63 function e_Buffer_Read_Char(B: pTBuffer): Char;
65 function e_Buffer_Read_Byte(B: pTBuffer): Byte;
66 function e_Buffer_Read_Word(B: pTBuffer): Word;
67 function e_Buffer_Read_LongWord(B: pTBuffer): LongWord;
69 function e_Buffer_Read_ShortInt(B: pTBuffer): ShortInt;
70 function e_Buffer_Read_SmallInt(B: pTBuffer): SmallInt;
71 function e_Buffer_Read_LongInt(B: pTBuffer): LongInt;
72 function e_Buffer_Read_Int64(B: pTBuffer): Int64;
74 function e_Buffer_Read_String(B: pTBuffer): string;
76 function e_Buffer_Read_MD5(B: pTBuffer): TMD5Digest;
79 procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
81 function e_Raw_Read_Char(P: Pointer): Char;
83 function e_Raw_Read_Byte(P: Pointer): Byte;
84 function e_Raw_Read_Word(P: Pointer): Word;
85 function e_Raw_Read_LongWord(P: Pointer): LongWord;
87 function e_Raw_Read_ShortInt(P: Pointer): ShortInt;
88 function e_Raw_Read_SmallInt(P: Pointer): SmallInt;
89 function e_Raw_Read_LongInt(P: Pointer): LongInt;
91 function e_Raw_Read_String(P: Pointer): string;
93 function e_Raw_Read_MD5(P: Pointer): TMD5Digest;
95 procedure e_Raw_Seek(I: Cardinal);
97 implementation
99 uses SysUtils, BinEditor;
101 procedure e_Buffer_Clear(B: pTBuffer);
102 begin
103 B^.WritePos := 0;
104 B^.ReadPos := 0;
105 B^.Cap := 0;
106 end;
109 procedure e_Buffer_Write_Generic(B: pTBuffer; var V; N: Cardinal);
110 begin
111 if (B^.WritePos + N >= BUF_SIZE) then Exit;
112 if (B^.WritePos + N > B^.Cap) then
113 B^.Cap := B^.WritePos + N + 1;
115 CopyMemory(Pointer(NativeUInt(Addr(B^.Data)) + B^.WritePos),
116 @V, N);
118 B^.WritePos := B^.WritePos + N;
119 end;
120 procedure e_Buffer_Read_Generic(B: pTBuffer; var V; N: Cardinal);
121 begin
122 if (B^.ReadPos + N >= BUF_SIZE) then Exit;
124 CopyMemory(@V, Pointer(NativeUInt(Addr(B^.Data)) + B^.ReadPos), N);
126 B^.ReadPos := B^.ReadPos + N;
127 end;
130 procedure e_Buffer_Write(B: pTBuffer; V: Char); overload;
131 begin
132 e_Buffer_Write_Generic(B, V, 1);
133 end;
135 procedure e_Buffer_Write(B: pTBuffer; V: Byte); overload;
136 begin
137 e_Buffer_Write_Generic(B, V, 1);
138 end;
139 procedure e_Buffer_Write(B: pTBuffer; V: Word); overload;
140 begin
141 e_Buffer_Write_Generic(B, V, 2);
142 end;
143 procedure e_Buffer_Write(B: pTBuffer; V: LongWord); overload;
144 begin
145 e_Buffer_Write_Generic(B, V, 4);
146 end;
148 procedure e_Buffer_Write(B: pTBuffer; V: ShortInt); overload;
149 begin
150 e_Buffer_Write_Generic(B, V, 1);
151 end;
152 procedure e_Buffer_Write(B: pTBuffer; V: SmallInt); overload;
153 begin
154 e_Buffer_Write_Generic(B, V, 2);
155 end;
156 procedure e_Buffer_Write(B: pTBuffer; V: LongInt); overload;
157 begin
158 e_Buffer_Write_Generic(B, V, 4);
159 end;
160 procedure e_Buffer_Write(B: pTBuffer; V: Int64); overload;
161 begin
162 e_Buffer_Write_Generic(B, V, 8);
163 end;
165 procedure e_Buffer_Write(B: pTBuffer; V: string); overload;
166 var
167 Len: Byte;
168 P: Cardinal;
169 begin
170 Len := Length(V);
171 e_Buffer_Write_Generic(B, Len, 1);
173 if (Len = 0) then Exit;
175 P := B^.WritePos + Len;
176 if (P >= BUF_SIZE) then
177 begin
178 Len := BUF_SIZE - B^.WritePos;
179 P := BUF_SIZE;
180 end;
182 if (P > B^.Cap) then B^.Cap := P;
184 CopyMemory(Pointer(NativeUInt(Addr(B^.Data)) + B^.WritePos),
185 @V[1], Len);
187 B^.WritePos := P;
188 end;
190 procedure e_Buffer_Write(B: pTBuffer; V: TMD5Digest); overload;
191 var
192 I: Integer;
193 begin
194 for I := 0 to 15 do
195 e_Buffer_Write(B, V[I]);
196 end;
198 procedure e_Buffer_Write(B: pTBuffer; V: pTBuffer); overload;
199 var
200 N: Cardinal;
201 begin
202 if V = nil then Exit;
203 N := V^.WritePos;
204 Assert(N <> 0, 'don''t write empty buffers you fuck');
205 if N = 0 then Exit;
207 e_Buffer_Write(B, Word(N));
209 if (B^.WritePos + N >= BUF_SIZE) then Exit;
210 if (B^.WritePos + N > B^.Cap) then
211 B^.Cap := B^.WritePos + N + 1;
213 CopyMemory(Pointer(NativeUInt(Addr(B^.Data)) + B^.WritePos),
214 Addr(V^.Data), N);
216 B^.WritePos := B^.WritePos + N;
217 end;
220 function e_Buffer_Read_Char(B: pTBuffer): Char;
221 begin
222 e_Buffer_Read_Generic(B, Result, 1);
223 end;
225 function e_Buffer_Read_Byte(B: pTBuffer): Byte;
226 begin
227 e_Buffer_Read_Generic(B, Result, 1);
228 end;
229 function e_Buffer_Read_Word(B: pTBuffer): Word;
230 begin
231 e_Buffer_Read_Generic(B, Result, 2);
232 end;
233 function e_Buffer_Read_LongWord(B: pTBuffer): LongWord;
234 begin
235 e_Buffer_Read_Generic(B, Result, 4);
236 end;
238 function e_Buffer_Read_ShortInt(B: pTBuffer): ShortInt;
239 begin
240 e_Buffer_Read_Generic(B, Result, 1);
241 end;
242 function e_Buffer_Read_SmallInt(B: pTBuffer): SmallInt;
243 begin
244 e_Buffer_Read_Generic(B, Result, 2);
245 end;
246 function e_Buffer_Read_LongInt(B: pTBuffer): LongInt;
247 begin
248 e_Buffer_Read_Generic(B, Result, 4);
249 end;
250 function e_Buffer_Read_Int64(B: pTBuffer): Int64;
251 begin
252 e_Buffer_Read_Generic(B, Result, 8);
253 end;
255 function e_Buffer_Read_String(B: pTBuffer): string;
256 var
257 Len: Byte;
258 begin
259 Len := e_Buffer_Read_Byte(B);
260 Result := '';
261 if Len = 0 then Exit;
263 if B^.ReadPos + Len > B^.Cap then
264 Len := B^.Cap - B^.ReadPos;
266 SetLength(Result, Len);
267 CopyMemory(@Result[1], Pointer(NativeUInt(Addr(B^.Data)) + B^.ReadPos), Len);
269 B^.ReadPos := B^.ReadPos + Len;
270 end;
272 function e_Buffer_Read_MD5(B: pTBuffer): TMD5Digest;
273 var
274 I: Integer;
275 begin
276 for I := 0 to 15 do
277 Result[I] := e_Buffer_Read_Byte(B);
278 end;
280 procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
281 begin
282 CopyMemory(@V, Pointer(NativeUInt(P) + RawPos), N);
284 RawPos := RawPos + N;
285 end;
287 function e_Raw_Read_Char(P: Pointer): Char;
288 begin
289 e_Raw_Read_Generic(P, Result, 1);
290 end;
292 function e_Raw_Read_Byte(P: Pointer): Byte;
293 begin
294 e_Raw_Read_Generic(P, Result, 1);
295 end;
296 function e_Raw_Read_Word(P: Pointer): Word;
297 begin
298 e_Raw_Read_Generic(P, Result, 2);
299 end;
300 function e_Raw_Read_LongWord(P: Pointer): LongWord;
301 begin
302 e_Raw_Read_Generic(P, Result, 4);
303 end;
305 function e_Raw_Read_ShortInt(P: Pointer): ShortInt;
306 begin
307 e_Raw_Read_Generic(P, Result, 1);
308 end;
309 function e_Raw_Read_SmallInt(P: Pointer): SmallInt;
310 begin
311 e_Raw_Read_Generic(P, Result, 2);
312 end;
313 function e_Raw_Read_LongInt(P: Pointer): LongInt;
314 begin
315 e_Raw_Read_Generic(P, Result, 4);
316 end;
318 function e_Raw_Read_String(P: Pointer): string;
319 var
320 Len: Byte;
321 begin
322 Len := e_Raw_Read_Byte(P);
323 Result := '';
324 if Len = 0 then Exit;
326 SetLength(Result, Len);
327 CopyMemory(@Result[1], Pointer(NativeUInt(P) + RawPos), Len);
329 RawPos := RawPos + Len;
330 end;
332 function e_Raw_Read_MD5(P: Pointer): TMD5Digest;
333 var
334 I: Integer;
335 begin
336 for I := 0 to 15 do
337 Result[I] := e_Raw_Read_Byte(P);
338 end;
340 procedure e_Raw_Seek(I: Cardinal);
341 begin
342 RawPos := I;
343 end;
345 end.