DEADSOFTWARE

changed some backslashes to forward slashes
[d2df-editor.git] / src / engine / e_fixedbuffer.pas
1 unit e_fixedbuffer;
3 // ß íå õî÷ó òðàõàòüñÿ ñ êëàññàìè è ñîçäàíèåì ïî äâà îáúåêòà íà êàæäûé áóôåð,
4 // êàê â BinEditor/WADEDITOR, ïîýòîìó áóäåò òàê. Ïëþñ ôèêñèðîâàííûé ðàçìåð
5 // áûñòðåå. -- Primus
7 interface
9 uses md5asm;
11 const
12 BUF_SIZE = 65536;
14 type
15 TBuffer = record
16 Data: array [0..BUF_SIZE] of Byte; // îäèí áàéò ñâåðõó íà âñÿêèé ñëó÷àé
17 ReadPos: Cardinal;
18 WritePos: Cardinal;
19 Len: Cardinal;
20 end;
21 pTBuffer = ^TBuffer;
23 var
24 RawPos: Cardinal = 0;
26 procedure e_Buffer_Clear(B: pTBuffer);
29 procedure e_Buffer_Write_Generic(B: pTBuffer; var V; N: Cardinal);
30 procedure e_Buffer_Read_Generic(B: pTBuffer; var V; N: Cardinal);
33 procedure e_Buffer_Write(B: pTBuffer; V: Char); overload;
35 procedure e_Buffer_Write(B: pTBuffer; V: Byte); overload;
36 procedure e_Buffer_Write(B: pTBuffer; V: Word); overload;
37 procedure e_Buffer_Write(B: pTBuffer; V: LongWord); overload;
39 procedure e_Buffer_Write(B: pTBuffer; V: ShortInt); overload;
40 procedure e_Buffer_Write(B: pTBuffer; V: SmallInt); overload;
41 procedure e_Buffer_Write(B: pTBuffer; V: LongInt); overload;
43 procedure e_Buffer_Write(B: pTBuffer; V: string); overload;
45 procedure e_Buffer_Write(B: pTBuffer; V: TMD5Digest); overload;
48 function e_Buffer_Read_Char(B: pTBuffer): Char;
50 function e_Buffer_Read_Byte(B: pTBuffer): Byte;
51 function e_Buffer_Read_Word(B: pTBuffer): Word;
52 function e_Buffer_Read_LongWord(B: pTBuffer): LongWord;
54 function e_Buffer_Read_ShortInt(B: pTBuffer): ShortInt;
55 function e_Buffer_Read_SmallInt(B: pTBuffer): SmallInt;
56 function e_Buffer_Read_LongInt(B: pTBuffer): LongInt;
58 function e_Buffer_Read_String(B: pTBuffer): string;
60 function e_Buffer_Read_MD5(B: pTBuffer): TMD5Digest;
63 procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
65 function e_Raw_Read_Char(P: Pointer): Char;
67 function e_Raw_Read_Byte(P: Pointer): Byte;
68 function e_Raw_Read_Word(P: Pointer): Word;
69 function e_Raw_Read_LongWord(P: Pointer): LongWord;
71 function e_Raw_Read_ShortInt(P: Pointer): ShortInt;
72 function e_Raw_Read_SmallInt(P: Pointer): SmallInt;
73 function e_Raw_Read_LongInt(P: Pointer): LongInt;
75 function e_Raw_Read_String(P: Pointer): string;
77 function e_Raw_Read_MD5(P: Pointer): TMD5Digest;
79 procedure e_Raw_Seek(I: Cardinal);
81 implementation
83 uses Windows, SysUtils;
85 procedure e_Buffer_Clear(B: pTBuffer);
86 begin
87 B^.WritePos := 0;
88 B^.ReadPos := 0;
89 B^.Len := 0;
90 end;
93 procedure e_Buffer_Write_Generic(B: pTBuffer; var V; N: Cardinal);
94 begin
95 if (B^.WritePos + N >= BUF_SIZE) then Exit;
96 if (B^.WritePos + N > B^.Len) then
97 B^.Len := B^.WritePos + N + 1;
99 MoveMemory(Pointer(Cardinal(Addr(B^.Data)) + B^.WritePos),
100 @V, N);
102 B^.WritePos := B^.WritePos + N;
103 end;
104 procedure e_Buffer_Read_Generic(B: pTBuffer; var V; N: Cardinal);
105 begin
106 if (B^.ReadPos + N >= BUF_SIZE) then Exit;
108 MoveMemory(@V, Pointer(Cardinal(Addr(B^.Data)) + B^.ReadPos), N);
110 B^.ReadPos := B^.ReadPos + N;
111 end;
114 procedure e_Buffer_Write(B: pTBuffer; V: Char); overload;
115 begin
116 e_Buffer_Write_Generic(B, V, 1);
117 end;
119 procedure e_Buffer_Write(B: pTBuffer; V: Byte); overload;
120 begin
121 e_Buffer_Write_Generic(B, V, 1);
122 end;
123 procedure e_Buffer_Write(B: pTBuffer; V: Word); overload;
124 begin
125 e_Buffer_Write_Generic(B, V, 2);
126 end;
127 procedure e_Buffer_Write(B: pTBuffer; V: LongWord); overload;
128 begin
129 e_Buffer_Write_Generic(B, V, 4);
130 end;
132 procedure e_Buffer_Write(B: pTBuffer; V: ShortInt); overload;
133 begin
134 e_Buffer_Write_Generic(B, V, 1);
135 end;
136 procedure e_Buffer_Write(B: pTBuffer; V: SmallInt); overload;
137 begin
138 e_Buffer_Write_Generic(B, V, 2);
139 end;
140 procedure e_Buffer_Write(B: pTBuffer; V: LongInt); overload;
141 begin
142 e_Buffer_Write_Generic(B, V, 4);
143 end;
145 procedure e_Buffer_Write(B: pTBuffer; V: string); overload;
146 var
147 Len: Byte;
148 P: Cardinal;
149 begin
150 Len := Length(V);
151 e_Buffer_Write_Generic(B, Len, 1);
153 if (Len = 0) then Exit;
155 P := B^.WritePos + Len;
156 if (P >= BUF_SIZE) then
157 begin
158 Len := BUF_SIZE - B^.WritePos;
159 P := BUF_SIZE;
160 end;
162 if (P > B^.Len) then B^.Len := P;
164 CopyMemory(Pointer(Cardinal(Addr(B^.Data)) + B^.WritePos),
165 @V[1], Len);
167 B^.WritePos := P;
168 end;
170 procedure e_Buffer_Write(B: pTBuffer; V: TMD5Digest); overload;
171 var
172 I: Integer;
173 begin
174 for I := 0 to 15 do
175 e_Buffer_Write(B, V.v[I]);
176 end;
179 function e_Buffer_Read_Char(B: pTBuffer): Char;
180 begin
181 e_Buffer_Read_Generic(B, Result, 1);
182 end;
184 function e_Buffer_Read_Byte(B: pTBuffer): Byte;
185 begin
186 e_Buffer_Read_Generic(B, Result, 1);
187 end;
188 function e_Buffer_Read_Word(B: pTBuffer): Word;
189 begin
190 e_Buffer_Read_Generic(B, Result, 2);
191 end;
192 function e_Buffer_Read_LongWord(B: pTBuffer): LongWord;
193 begin
194 e_Buffer_Read_Generic(B, Result, 4);
195 end;
197 function e_Buffer_Read_ShortInt(B: pTBuffer): ShortInt;
198 begin
199 e_Buffer_Read_Generic(B, Result, 1);
200 end;
201 function e_Buffer_Read_SmallInt(B: pTBuffer): SmallInt;
202 begin
203 e_Buffer_Read_Generic(B, Result, 2);
204 end;
205 function e_Buffer_Read_LongInt(B: pTBuffer): LongInt;
206 begin
207 e_Buffer_Read_Generic(B, Result, 4);
208 end;
210 function e_Buffer_Read_String(B: pTBuffer): string;
211 var
212 Len: Byte;
213 begin
214 Len := e_Buffer_Read_Byte(B);
215 Result := '';
216 if Len = 0 then Exit;
218 if B^.ReadPos + Len > B^.Len then
219 Len := B^.Len - B^.ReadPos;
221 SetLength(Result, Len);
222 MoveMemory(@Result[1], Pointer(Cardinal(Addr(B^.Data)) + B^.ReadPos), Len);
224 B^.ReadPos := B^.ReadPos + Len;
225 end;
227 function e_Buffer_Read_MD5(B: pTBuffer): TMD5Digest;
228 var
229 I: Integer;
230 begin
231 for I := 0 to 15 do
232 Result.v[I] := e_Buffer_Read_Byte(B);
233 end;
235 procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
236 begin
237 MoveMemory(@V, Pointer(Cardinal(P) + RawPos), N);
239 RawPos := RawPos + N;
240 end;
242 function e_Raw_Read_Char(P: Pointer): Char;
243 begin
244 e_Raw_Read_Generic(P, Result, 1);
245 end;
247 function e_Raw_Read_Byte(P: Pointer): Byte;
248 begin
249 e_Raw_Read_Generic(P, Result, 1);
250 end;
251 function e_Raw_Read_Word(P: Pointer): Word;
252 begin
253 e_Raw_Read_Generic(P, Result, 2);
254 end;
255 function e_Raw_Read_LongWord(P: Pointer): LongWord;
256 begin
257 e_Raw_Read_Generic(P, Result, 4);
258 end;
260 function e_Raw_Read_ShortInt(P: Pointer): ShortInt;
261 begin
262 e_Raw_Read_Generic(P, Result, 1);
263 end;
264 function e_Raw_Read_SmallInt(P: Pointer): SmallInt;
265 begin
266 e_Raw_Read_Generic(P, Result, 2);
267 end;
268 function e_Raw_Read_LongInt(P: Pointer): LongInt;
269 begin
270 e_Raw_Read_Generic(P, Result, 4);
271 end;
273 function e_Raw_Read_String(P: Pointer): string;
274 var
275 Len: Byte;
276 begin
277 Len := e_Raw_Read_Byte(P);
278 Result := '';
279 if Len = 0 then Exit;
281 SetLength(Result, Len);
282 MoveMemory(@Result[1], Pointer(Cardinal(P) + RawPos), Len);
284 RawPos := RawPos + Len;
285 end;
287 function e_Raw_Read_MD5(P: Pointer): TMD5Digest;
288 var
289 I: Integer;
290 begin
291 for I := 0 to 15 do
292 Result.v[I] := e_Raw_Read_Byte(P);
293 end;
295 procedure e_Raw_Seek(I: Cardinal);
296 begin
297 RawPos := I;
298 end;
300 end.