DEADSOFTWARE

63570f7ec541a652724ba2421c59114b9986a6ec
[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;
54 function e_Buffer_Read_String(B: pTBuffer): string;
56 function e_Buffer_Read_MD5(B: pTBuffer): TMD5Digest;
59 procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
61 function e_Raw_Read_Char(P: Pointer): Char;
63 function e_Raw_Read_Byte(P: Pointer): Byte;
64 function e_Raw_Read_Word(P: Pointer): Word;
65 function e_Raw_Read_LongWord(P: Pointer): LongWord;
67 function e_Raw_Read_ShortInt(P: Pointer): ShortInt;
68 function e_Raw_Read_SmallInt(P: Pointer): SmallInt;
69 function e_Raw_Read_LongInt(P: Pointer): LongInt;
71 function e_Raw_Read_String(P: Pointer): string;
73 function e_Raw_Read_MD5(P: Pointer): TMD5Digest;
75 procedure e_Raw_Seek(I: Cardinal);
77 implementation
79 uses SysUtils, BinEditor;
81 procedure e_Buffer_Clear(B: pTBuffer);
82 begin
83 B^.WritePos := 0;
84 B^.ReadPos := 0;
85 B^.Len := 0;
86 end;
89 procedure e_Buffer_Write_Generic(B: pTBuffer; var V; N: Cardinal);
90 begin
91 if (B^.WritePos + N >= BUF_SIZE) then Exit;
92 if (B^.WritePos + N > B^.Len) then
93 B^.Len := B^.WritePos + N + 1;
95 CopyMemory(Pointer(Cardinal(Addr(B^.Data)) + B^.WritePos),
96 @V, N);
98 B^.WritePos := B^.WritePos + N;
99 end;
100 procedure e_Buffer_Read_Generic(B: pTBuffer; var V; N: Cardinal);
101 begin
102 if (B^.ReadPos + N >= BUF_SIZE) then Exit;
104 CopyMemory(@V, Pointer(Cardinal(Addr(B^.Data)) + B^.ReadPos), N);
106 B^.ReadPos := B^.ReadPos + N;
107 end;
110 procedure e_Buffer_Write(B: pTBuffer; V: Char); overload;
111 begin
112 e_Buffer_Write_Generic(B, V, 1);
113 end;
115 procedure e_Buffer_Write(B: pTBuffer; V: Byte); overload;
116 begin
117 e_Buffer_Write_Generic(B, V, 1);
118 end;
119 procedure e_Buffer_Write(B: pTBuffer; V: Word); overload;
120 begin
121 e_Buffer_Write_Generic(B, V, 2);
122 end;
123 procedure e_Buffer_Write(B: pTBuffer; V: LongWord); overload;
124 begin
125 e_Buffer_Write_Generic(B, V, 4);
126 end;
128 procedure e_Buffer_Write(B: pTBuffer; V: ShortInt); overload;
129 begin
130 e_Buffer_Write_Generic(B, V, 1);
131 end;
132 procedure e_Buffer_Write(B: pTBuffer; V: SmallInt); overload;
133 begin
134 e_Buffer_Write_Generic(B, V, 2);
135 end;
136 procedure e_Buffer_Write(B: pTBuffer; V: LongInt); overload;
137 begin
138 e_Buffer_Write_Generic(B, V, 4);
139 end;
141 procedure e_Buffer_Write(B: pTBuffer; V: string); overload;
142 var
143 Len: Byte;
144 P: Cardinal;
145 begin
146 Len := Length(V);
147 e_Buffer_Write_Generic(B, Len, 1);
149 if (Len = 0) then Exit;
151 P := B^.WritePos + Len;
152 if (P >= BUF_SIZE) then
153 begin
154 Len := BUF_SIZE - B^.WritePos;
155 P := BUF_SIZE;
156 end;
158 if (P > B^.Len) then B^.Len := P;
160 CopyMemory(Pointer(Cardinal(Addr(B^.Data)) + B^.WritePos),
161 @V[1], Len);
163 B^.WritePos := P;
164 end;
166 procedure e_Buffer_Write(B: pTBuffer; V: TMD5Digest); overload;
167 var
168 I: Integer;
169 begin
170 for I := 0 to 15 do
171 e_Buffer_Write(B, V[I]);
172 end;
175 function e_Buffer_Read_Char(B: pTBuffer): Char;
176 begin
177 e_Buffer_Read_Generic(B, Result, 1);
178 end;
180 function e_Buffer_Read_Byte(B: pTBuffer): Byte;
181 begin
182 e_Buffer_Read_Generic(B, Result, 1);
183 end;
184 function e_Buffer_Read_Word(B: pTBuffer): Word;
185 begin
186 e_Buffer_Read_Generic(B, Result, 2);
187 end;
188 function e_Buffer_Read_LongWord(B: pTBuffer): LongWord;
189 begin
190 e_Buffer_Read_Generic(B, Result, 4);
191 end;
193 function e_Buffer_Read_ShortInt(B: pTBuffer): ShortInt;
194 begin
195 e_Buffer_Read_Generic(B, Result, 1);
196 end;
197 function e_Buffer_Read_SmallInt(B: pTBuffer): SmallInt;
198 begin
199 e_Buffer_Read_Generic(B, Result, 2);
200 end;
201 function e_Buffer_Read_LongInt(B: pTBuffer): LongInt;
202 begin
203 e_Buffer_Read_Generic(B, Result, 4);
204 end;
206 function e_Buffer_Read_String(B: pTBuffer): string;
207 var
208 Len: Byte;
209 begin
210 Len := e_Buffer_Read_Byte(B);
211 Result := '';
212 if Len = 0 then Exit;
214 if B^.ReadPos + Len > B^.Len then
215 Len := B^.Len - B^.ReadPos;
217 SetLength(Result, Len);
218 CopyMemory(@Result[1], Pointer(Cardinal(Addr(B^.Data)) + B^.ReadPos), Len);
220 B^.ReadPos := B^.ReadPos + Len;
221 end;
223 function e_Buffer_Read_MD5(B: pTBuffer): TMD5Digest;
224 var
225 I: Integer;
226 begin
227 for I := 0 to 15 do
228 Result[I] := e_Buffer_Read_Byte(B);
229 end;
231 procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
232 begin
233 CopyMemory(@V, Pointer(Cardinal(P) + RawPos), N);
235 RawPos := RawPos + N;
236 end;
238 function e_Raw_Read_Char(P: Pointer): Char;
239 begin
240 e_Raw_Read_Generic(P, Result, 1);
241 end;
243 function e_Raw_Read_Byte(P: Pointer): Byte;
244 begin
245 e_Raw_Read_Generic(P, Result, 1);
246 end;
247 function e_Raw_Read_Word(P: Pointer): Word;
248 begin
249 e_Raw_Read_Generic(P, Result, 2);
250 end;
251 function e_Raw_Read_LongWord(P: Pointer): LongWord;
252 begin
253 e_Raw_Read_Generic(P, Result, 4);
254 end;
256 function e_Raw_Read_ShortInt(P: Pointer): ShortInt;
257 begin
258 e_Raw_Read_Generic(P, Result, 1);
259 end;
260 function e_Raw_Read_SmallInt(P: Pointer): SmallInt;
261 begin
262 e_Raw_Read_Generic(P, Result, 2);
263 end;
264 function e_Raw_Read_LongInt(P: Pointer): LongInt;
265 begin
266 e_Raw_Read_Generic(P, Result, 4);
267 end;
269 function e_Raw_Read_String(P: Pointer): string;
270 var
271 Len: Byte;
272 begin
273 Len := e_Raw_Read_Byte(P);
274 Result := '';
275 if Len = 0 then Exit;
277 SetLength(Result, Len);
278 CopyMemory(@Result[1], Pointer(Cardinal(P) + RawPos), Len);
280 RawPos := RawPos + Len;
281 end;
283 function e_Raw_Read_MD5(P: Pointer): TMD5Digest;
284 var
285 I: Integer;
286 begin
287 for I := 0 to 15 do
288 Result[I] := e_Raw_Read_Byte(P);
289 end;
291 procedure e_Raw_Seek(I: Cardinal);
292 begin
293 RawPos := I;
294 end;
296 end.