DEADSOFTWARE

network: fixed server pings
[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;
39 procedure e_Buffer_Write(B: pTBuffer; V: Int64); overload;
41 procedure e_Buffer_Write(B: pTBuffer; V: string); overload;
43 procedure e_Buffer_Write(B: pTBuffer; V: TMD5Digest); overload;
46 function e_Buffer_Read_Char(B: pTBuffer): Char;
48 function e_Buffer_Read_Byte(B: pTBuffer): Byte;
49 function e_Buffer_Read_Word(B: pTBuffer): Word;
50 function e_Buffer_Read_LongWord(B: pTBuffer): LongWord;
52 function e_Buffer_Read_ShortInt(B: pTBuffer): ShortInt;
53 function e_Buffer_Read_SmallInt(B: pTBuffer): SmallInt;
54 function e_Buffer_Read_LongInt(B: pTBuffer): LongInt;
55 function e_Buffer_Read_Int64(B: pTBuffer): Int64;
57 function e_Buffer_Read_String(B: pTBuffer): string;
59 function e_Buffer_Read_MD5(B: pTBuffer): TMD5Digest;
62 procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
64 function e_Raw_Read_Char(P: Pointer): Char;
66 function e_Raw_Read_Byte(P: Pointer): Byte;
67 function e_Raw_Read_Word(P: Pointer): Word;
68 function e_Raw_Read_LongWord(P: Pointer): LongWord;
70 function e_Raw_Read_ShortInt(P: Pointer): ShortInt;
71 function e_Raw_Read_SmallInt(P: Pointer): SmallInt;
72 function e_Raw_Read_LongInt(P: Pointer): LongInt;
74 function e_Raw_Read_String(P: Pointer): string;
76 function e_Raw_Read_MD5(P: Pointer): TMD5Digest;
78 procedure e_Raw_Seek(I: Cardinal);
80 implementation
82 uses SysUtils, BinEditor;
84 procedure e_Buffer_Clear(B: pTBuffer);
85 begin
86 B^.WritePos := 0;
87 B^.ReadPos := 0;
88 B^.Len := 0;
89 end;
92 procedure e_Buffer_Write_Generic(B: pTBuffer; var V; N: Cardinal);
93 begin
94 if (B^.WritePos + N >= BUF_SIZE) then Exit;
95 if (B^.WritePos + N > B^.Len) then
96 B^.Len := B^.WritePos + N + 1;
98 CopyMemory(Pointer(Cardinal(Addr(B^.Data)) + B^.WritePos),
99 @V, N);
101 B^.WritePos := B^.WritePos + N;
102 end;
103 procedure e_Buffer_Read_Generic(B: pTBuffer; var V; N: Cardinal);
104 begin
105 if (B^.ReadPos + N >= BUF_SIZE) then Exit;
107 CopyMemory(@V, Pointer(Cardinal(Addr(B^.Data)) + B^.ReadPos), N);
109 B^.ReadPos := B^.ReadPos + N;
110 end;
113 procedure e_Buffer_Write(B: pTBuffer; V: Char); overload;
114 begin
115 e_Buffer_Write_Generic(B, V, 1);
116 end;
118 procedure e_Buffer_Write(B: pTBuffer; V: Byte); overload;
119 begin
120 e_Buffer_Write_Generic(B, V, 1);
121 end;
122 procedure e_Buffer_Write(B: pTBuffer; V: Word); overload;
123 begin
124 e_Buffer_Write_Generic(B, V, 2);
125 end;
126 procedure e_Buffer_Write(B: pTBuffer; V: LongWord); overload;
127 begin
128 e_Buffer_Write_Generic(B, V, 4);
129 end;
131 procedure e_Buffer_Write(B: pTBuffer; V: ShortInt); overload;
132 begin
133 e_Buffer_Write_Generic(B, V, 1);
134 end;
135 procedure e_Buffer_Write(B: pTBuffer; V: SmallInt); overload;
136 begin
137 e_Buffer_Write_Generic(B, V, 2);
138 end;
139 procedure e_Buffer_Write(B: pTBuffer; V: LongInt); overload;
140 begin
141 e_Buffer_Write_Generic(B, V, 4);
142 end;
143 procedure e_Buffer_Write(B: pTBuffer; V: Int64); overload;
144 begin
145 e_Buffer_Write_Generic(B, V, 8);
146 end;
148 procedure e_Buffer_Write(B: pTBuffer; V: string); overload;
149 var
150 Len: Byte;
151 P: Cardinal;
152 begin
153 Len := Length(V);
154 e_Buffer_Write_Generic(B, Len, 1);
156 if (Len = 0) then Exit;
158 P := B^.WritePos + Len;
159 if (P >= BUF_SIZE) then
160 begin
161 Len := BUF_SIZE - B^.WritePos;
162 P := BUF_SIZE;
163 end;
165 if (P > B^.Len) then B^.Len := P;
167 CopyMemory(Pointer(Cardinal(Addr(B^.Data)) + B^.WritePos),
168 @V[1], Len);
170 B^.WritePos := P;
171 end;
173 procedure e_Buffer_Write(B: pTBuffer; V: TMD5Digest); overload;
174 var
175 I: Integer;
176 begin
177 for I := 0 to 15 do
178 e_Buffer_Write(B, V[I]);
179 end;
182 function e_Buffer_Read_Char(B: pTBuffer): Char;
183 begin
184 e_Buffer_Read_Generic(B, Result, 1);
185 end;
187 function e_Buffer_Read_Byte(B: pTBuffer): Byte;
188 begin
189 e_Buffer_Read_Generic(B, Result, 1);
190 end;
191 function e_Buffer_Read_Word(B: pTBuffer): Word;
192 begin
193 e_Buffer_Read_Generic(B, Result, 2);
194 end;
195 function e_Buffer_Read_LongWord(B: pTBuffer): LongWord;
196 begin
197 e_Buffer_Read_Generic(B, Result, 4);
198 end;
200 function e_Buffer_Read_ShortInt(B: pTBuffer): ShortInt;
201 begin
202 e_Buffer_Read_Generic(B, Result, 1);
203 end;
204 function e_Buffer_Read_SmallInt(B: pTBuffer): SmallInt;
205 begin
206 e_Buffer_Read_Generic(B, Result, 2);
207 end;
208 function e_Buffer_Read_LongInt(B: pTBuffer): LongInt;
209 begin
210 e_Buffer_Read_Generic(B, Result, 4);
211 end;
212 function e_Buffer_Read_Int64(B: pTBuffer): Int64;
213 begin
214 e_Buffer_Read_Generic(B, Result, 8);
215 end;
217 function e_Buffer_Read_String(B: pTBuffer): string;
218 var
219 Len: Byte;
220 begin
221 Len := e_Buffer_Read_Byte(B);
222 Result := '';
223 if Len = 0 then Exit;
225 if B^.ReadPos + Len > B^.Len then
226 Len := B^.Len - B^.ReadPos;
228 SetLength(Result, Len);
229 CopyMemory(@Result[1], Pointer(Cardinal(Addr(B^.Data)) + B^.ReadPos), Len);
231 B^.ReadPos := B^.ReadPos + Len;
232 end;
234 function e_Buffer_Read_MD5(B: pTBuffer): TMD5Digest;
235 var
236 I: Integer;
237 begin
238 for I := 0 to 15 do
239 Result[I] := e_Buffer_Read_Byte(B);
240 end;
242 procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
243 begin
244 CopyMemory(@V, Pointer(Cardinal(P) + RawPos), N);
246 RawPos := RawPos + N;
247 end;
249 function e_Raw_Read_Char(P: Pointer): Char;
250 begin
251 e_Raw_Read_Generic(P, Result, 1);
252 end;
254 function e_Raw_Read_Byte(P: Pointer): Byte;
255 begin
256 e_Raw_Read_Generic(P, Result, 1);
257 end;
258 function e_Raw_Read_Word(P: Pointer): Word;
259 begin
260 e_Raw_Read_Generic(P, Result, 2);
261 end;
262 function e_Raw_Read_LongWord(P: Pointer): LongWord;
263 begin
264 e_Raw_Read_Generic(P, Result, 4);
265 end;
267 function e_Raw_Read_ShortInt(P: Pointer): ShortInt;
268 begin
269 e_Raw_Read_Generic(P, Result, 1);
270 end;
271 function e_Raw_Read_SmallInt(P: Pointer): SmallInt;
272 begin
273 e_Raw_Read_Generic(P, Result, 2);
274 end;
275 function e_Raw_Read_LongInt(P: Pointer): LongInt;
276 begin
277 e_Raw_Read_Generic(P, Result, 4);
278 end;
280 function e_Raw_Read_String(P: Pointer): string;
281 var
282 Len: Byte;
283 begin
284 Len := e_Raw_Read_Byte(P);
285 Result := '';
286 if Len = 0 then Exit;
288 SetLength(Result, Len);
289 CopyMemory(@Result[1], Pointer(Cardinal(P) + RawPos), Len);
291 RawPos := RawPos + Len;
292 end;
294 function e_Raw_Read_MD5(P: Pointer): TMD5Digest;
295 var
296 I: Integer;
297 begin
298 for I := 0 to 15 do
299 Result[I] := e_Raw_Read_Byte(P);
300 end;
302 procedure e_Raw_Seek(I: Cardinal);
303 begin
304 RawPos := I;
305 end;
307 end.