DEADSOFTWARE

833fd05b8fc8908b13691f35f96e73ea5fe0bb15
[d2df-sdl.git] / src / engine / e_fixedbuffer.pas
1 unit e_fixedbuffer;
3 interface
5 uses md5;
7 const
8 BUF_SIZE = 65536;
10 type
11 TBuffer = record
12 Data: array [0..BUF_SIZE] of Byte; // îäèí áàéò ñâåðõó íà âñÿêèé ñëó÷àé
13 ReadPos: Cardinal;
14 WritePos: Cardinal;
15 Len: Cardinal;
16 end;
17 pTBuffer = ^TBuffer;
19 var
20 RawPos: Cardinal = 0;
22 procedure e_Buffer_Clear(B: pTBuffer);
25 procedure e_Buffer_Write_Generic(B: pTBuffer; var V; N: Cardinal);
26 procedure e_Buffer_Read_Generic(B: pTBuffer; var V; N: Cardinal);
29 procedure e_Buffer_Write(B: pTBuffer; V: Char); overload;
31 procedure e_Buffer_Write(B: pTBuffer; V: Byte); overload;
32 procedure e_Buffer_Write(B: pTBuffer; V: Word); overload;
33 procedure e_Buffer_Write(B: pTBuffer; V: LongWord); overload;
35 procedure e_Buffer_Write(B: pTBuffer; V: ShortInt); overload;
36 procedure e_Buffer_Write(B: pTBuffer; V: SmallInt); overload;
37 procedure e_Buffer_Write(B: pTBuffer; V: LongInt); overload;
39 procedure e_Buffer_Write(B: pTBuffer; V: string); overload;
41 procedure e_Buffer_Write(B: pTBuffer; V: TMD5Digest); overload;
44 function e_Buffer_Read_Char(B: pTBuffer): Char;
46 function e_Buffer_Read_Byte(B: pTBuffer): Byte;
47 function e_Buffer_Read_Word(B: pTBuffer): Word;
48 function e_Buffer_Read_LongWord(B: pTBuffer): LongWord;
50 function e_Buffer_Read_ShortInt(B: pTBuffer): ShortInt;
51 function e_Buffer_Read_SmallInt(B: pTBuffer): SmallInt;
52 function e_Buffer_Read_LongInt(B: pTBuffer): LongInt;
53 function e_Buffer_Read_Int64(B: pTBuffer): Int64;
55 function e_Buffer_Read_String(B: pTBuffer): string;
57 function e_Buffer_Read_MD5(B: pTBuffer): TMD5Digest;
60 procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
62 function e_Raw_Read_Char(P: Pointer): Char;
64 function e_Raw_Read_Byte(P: Pointer): Byte;
65 function e_Raw_Read_Word(P: Pointer): Word;
66 function e_Raw_Read_LongWord(P: Pointer): LongWord;
68 function e_Raw_Read_ShortInt(P: Pointer): ShortInt;
69 function e_Raw_Read_SmallInt(P: Pointer): SmallInt;
70 function e_Raw_Read_LongInt(P: Pointer): LongInt;
72 function e_Raw_Read_String(P: Pointer): string;
74 function e_Raw_Read_MD5(P: Pointer): TMD5Digest;
76 procedure e_Raw_Seek(I: Cardinal);
78 implementation
80 uses SysUtils, BinEditor;
82 procedure e_Buffer_Clear(B: pTBuffer);
83 begin
84 B^.WritePos := 0;
85 B^.ReadPos := 0;
86 B^.Len := 0;
87 end;
90 procedure e_Buffer_Write_Generic(B: pTBuffer; var V; N: Cardinal);
91 begin
92 if (B^.WritePos + N >= BUF_SIZE) then Exit;
93 if (B^.WritePos + N > B^.Len) then
94 B^.Len := B^.WritePos + N + 1;
96 CopyMemory(Pointer(Cardinal(Addr(B^.Data)) + B^.WritePos),
97 @V, N);
99 B^.WritePos := B^.WritePos + N;
100 end;
101 procedure e_Buffer_Read_Generic(B: pTBuffer; var V; N: Cardinal);
102 begin
103 if (B^.ReadPos + N >= BUF_SIZE) then Exit;
105 CopyMemory(@V, Pointer(Cardinal(Addr(B^.Data)) + B^.ReadPos), N);
107 B^.ReadPos := B^.ReadPos + N;
108 end;
111 procedure e_Buffer_Write(B: pTBuffer; V: Char); overload;
112 begin
113 e_Buffer_Write_Generic(B, V, 1);
114 end;
116 procedure e_Buffer_Write(B: pTBuffer; V: Byte); overload;
117 begin
118 e_Buffer_Write_Generic(B, V, 1);
119 end;
120 procedure e_Buffer_Write(B: pTBuffer; V: Word); overload;
121 begin
122 e_Buffer_Write_Generic(B, V, 2);
123 end;
124 procedure e_Buffer_Write(B: pTBuffer; V: LongWord); overload;
125 begin
126 e_Buffer_Write_Generic(B, V, 4);
127 end;
129 procedure e_Buffer_Write(B: pTBuffer; V: ShortInt); overload;
130 begin
131 e_Buffer_Write_Generic(B, V, 1);
132 end;
133 procedure e_Buffer_Write(B: pTBuffer; V: SmallInt); overload;
134 begin
135 e_Buffer_Write_Generic(B, V, 2);
136 end;
137 procedure e_Buffer_Write(B: pTBuffer; V: LongInt); overload;
138 begin
139 e_Buffer_Write_Generic(B, V, 4);
140 end;
142 procedure e_Buffer_Write(B: pTBuffer; V: string); overload;
143 var
144 Len: Byte;
145 P: Cardinal;
146 begin
147 Len := Length(V);
148 e_Buffer_Write_Generic(B, Len, 1);
150 if (Len = 0) then Exit;
152 P := B^.WritePos + Len;
153 if (P >= BUF_SIZE) then
154 begin
155 Len := BUF_SIZE - B^.WritePos;
156 P := BUF_SIZE;
157 end;
159 if (P > B^.Len) then B^.Len := P;
161 CopyMemory(Pointer(Cardinal(Addr(B^.Data)) + B^.WritePos),
162 @V[1], Len);
164 B^.WritePos := P;
165 end;
167 procedure e_Buffer_Write(B: pTBuffer; V: TMD5Digest); overload;
168 var
169 I: Integer;
170 begin
171 for I := 0 to 15 do
172 e_Buffer_Write(B, V[I]);
173 end;
176 function e_Buffer_Read_Char(B: pTBuffer): Char;
177 begin
178 e_Buffer_Read_Generic(B, Result, 1);
179 end;
181 function e_Buffer_Read_Byte(B: pTBuffer): Byte;
182 begin
183 e_Buffer_Read_Generic(B, Result, 1);
184 end;
185 function e_Buffer_Read_Word(B: pTBuffer): Word;
186 begin
187 e_Buffer_Read_Generic(B, Result, 2);
188 end;
189 function e_Buffer_Read_LongWord(B: pTBuffer): LongWord;
190 begin
191 e_Buffer_Read_Generic(B, Result, 4);
192 end;
194 function e_Buffer_Read_ShortInt(B: pTBuffer): ShortInt;
195 begin
196 e_Buffer_Read_Generic(B, Result, 1);
197 end;
198 function e_Buffer_Read_SmallInt(B: pTBuffer): SmallInt;
199 begin
200 e_Buffer_Read_Generic(B, Result, 2);
201 end;
202 function e_Buffer_Read_LongInt(B: pTBuffer): LongInt;
203 begin
204 e_Buffer_Read_Generic(B, Result, 4);
205 end;
206 function e_Buffer_Read_Int64(B: pTBuffer): Int64;
207 begin
208 e_Buffer_Read_Generic(B, Result, 8);
209 end;
211 function e_Buffer_Read_String(B: pTBuffer): string;
212 var
213 Len: Byte;
214 begin
215 Len := e_Buffer_Read_Byte(B);
216 Result := '';
217 if Len = 0 then Exit;
219 if B^.ReadPos + Len > B^.Len then
220 Len := B^.Len - B^.ReadPos;
222 SetLength(Result, Len);
223 CopyMemory(@Result[1], Pointer(Cardinal(Addr(B^.Data)) + B^.ReadPos), Len);
225 B^.ReadPos := B^.ReadPos + Len;
226 end;
228 function e_Buffer_Read_MD5(B: pTBuffer): TMD5Digest;
229 var
230 I: Integer;
231 begin
232 for I := 0 to 15 do
233 Result[I] := e_Buffer_Read_Byte(B);
234 end;
236 procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
237 begin
238 CopyMemory(@V, Pointer(Cardinal(P) + RawPos), N);
240 RawPos := RawPos + N;
241 end;
243 function e_Raw_Read_Char(P: Pointer): Char;
244 begin
245 e_Raw_Read_Generic(P, Result, 1);
246 end;
248 function e_Raw_Read_Byte(P: Pointer): Byte;
249 begin
250 e_Raw_Read_Generic(P, Result, 1);
251 end;
252 function e_Raw_Read_Word(P: Pointer): Word;
253 begin
254 e_Raw_Read_Generic(P, Result, 2);
255 end;
256 function e_Raw_Read_LongWord(P: Pointer): LongWord;
257 begin
258 e_Raw_Read_Generic(P, Result, 4);
259 end;
261 function e_Raw_Read_ShortInt(P: Pointer): ShortInt;
262 begin
263 e_Raw_Read_Generic(P, Result, 1);
264 end;
265 function e_Raw_Read_SmallInt(P: Pointer): SmallInt;
266 begin
267 e_Raw_Read_Generic(P, Result, 2);
268 end;
269 function e_Raw_Read_LongInt(P: Pointer): LongInt;
270 begin
271 e_Raw_Read_Generic(P, Result, 4);
272 end;
274 function e_Raw_Read_String(P: Pointer): string;
275 var
276 Len: Byte;
277 begin
278 Len := e_Raw_Read_Byte(P);
279 Result := '';
280 if Len = 0 then Exit;
282 SetLength(Result, Len);
283 CopyMemory(@Result[1], Pointer(Cardinal(P) + RawPos), Len);
285 RawPos := RawPos + Len;
286 end;
288 function e_Raw_Read_MD5(P: Pointer): TMD5Digest;
289 var
290 I: Integer;
291 begin
292 for I := 0 to 15 do
293 Result[I] := e_Raw_Read_Byte(P);
294 end;
296 procedure e_Raw_Seek(I: Cardinal);
297 begin
298 RawPos := I;
299 end;
301 end.