DEADSOFTWARE

buffer network messages (broke a lot of shit)
[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;
205 e_Buffer_Write(B, Word(N));
207 if (B^.WritePos + N >= BUF_SIZE) then Exit;
208 if (B^.WritePos + N > B^.Cap) then
209 B^.Cap := B^.WritePos + N + 1;
211 CopyMemory(Pointer(NativeUInt(Addr(B^.Data)) + B^.WritePos),
212 Addr(V^.Data), N);
214 B^.WritePos := B^.WritePos + N;
215 end;
218 function e_Buffer_Read_Char(B: pTBuffer): Char;
219 begin
220 e_Buffer_Read_Generic(B, Result, 1);
221 end;
223 function e_Buffer_Read_Byte(B: pTBuffer): Byte;
224 begin
225 e_Buffer_Read_Generic(B, Result, 1);
226 end;
227 function e_Buffer_Read_Word(B: pTBuffer): Word;
228 begin
229 e_Buffer_Read_Generic(B, Result, 2);
230 end;
231 function e_Buffer_Read_LongWord(B: pTBuffer): LongWord;
232 begin
233 e_Buffer_Read_Generic(B, Result, 4);
234 end;
236 function e_Buffer_Read_ShortInt(B: pTBuffer): ShortInt;
237 begin
238 e_Buffer_Read_Generic(B, Result, 1);
239 end;
240 function e_Buffer_Read_SmallInt(B: pTBuffer): SmallInt;
241 begin
242 e_Buffer_Read_Generic(B, Result, 2);
243 end;
244 function e_Buffer_Read_LongInt(B: pTBuffer): LongInt;
245 begin
246 e_Buffer_Read_Generic(B, Result, 4);
247 end;
248 function e_Buffer_Read_Int64(B: pTBuffer): Int64;
249 begin
250 e_Buffer_Read_Generic(B, Result, 8);
251 end;
253 function e_Buffer_Read_String(B: pTBuffer): string;
254 var
255 Len: Byte;
256 begin
257 Len := e_Buffer_Read_Byte(B);
258 Result := '';
259 if Len = 0 then Exit;
261 if B^.ReadPos + Len > B^.Cap then
262 Len := B^.Cap - B^.ReadPos;
264 SetLength(Result, Len);
265 CopyMemory(@Result[1], Pointer(NativeUInt(Addr(B^.Data)) + B^.ReadPos), Len);
267 B^.ReadPos := B^.ReadPos + Len;
268 end;
270 function e_Buffer_Read_MD5(B: pTBuffer): TMD5Digest;
271 var
272 I: Integer;
273 begin
274 for I := 0 to 15 do
275 Result[I] := e_Buffer_Read_Byte(B);
276 end;
278 procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
279 begin
280 CopyMemory(@V, Pointer(NativeUInt(P) + RawPos), N);
282 RawPos := RawPos + N;
283 end;
285 function e_Raw_Read_Char(P: Pointer): Char;
286 begin
287 e_Raw_Read_Generic(P, Result, 1);
288 end;
290 function e_Raw_Read_Byte(P: Pointer): Byte;
291 begin
292 e_Raw_Read_Generic(P, Result, 1);
293 end;
294 function e_Raw_Read_Word(P: Pointer): Word;
295 begin
296 e_Raw_Read_Generic(P, Result, 2);
297 end;
298 function e_Raw_Read_LongWord(P: Pointer): LongWord;
299 begin
300 e_Raw_Read_Generic(P, Result, 4);
301 end;
303 function e_Raw_Read_ShortInt(P: Pointer): ShortInt;
304 begin
305 e_Raw_Read_Generic(P, Result, 1);
306 end;
307 function e_Raw_Read_SmallInt(P: Pointer): SmallInt;
308 begin
309 e_Raw_Read_Generic(P, Result, 2);
310 end;
311 function e_Raw_Read_LongInt(P: Pointer): LongInt;
312 begin
313 e_Raw_Read_Generic(P, Result, 4);
314 end;
316 function e_Raw_Read_String(P: Pointer): string;
317 var
318 Len: Byte;
319 begin
320 Len := e_Raw_Read_Byte(P);
321 Result := '';
322 if Len = 0 then Exit;
324 SetLength(Result, Len);
325 CopyMemory(@Result[1], Pointer(NativeUInt(P) + RawPos), Len);
327 RawPos := RawPos + Len;
328 end;
330 function e_Raw_Read_MD5(P: Pointer): TMD5Digest;
331 var
332 I: Integer;
333 begin
334 for I := 0 to 15 do
335 Result[I] := e_Raw_Read_Byte(P);
336 end;
338 procedure e_Raw_Seek(I: Cardinal);
339 begin
340 RawPos := I;
341 end;
343 end.