1 (* Copyright (C) DooM 2D:Forever Developers
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.
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.
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/>.
16 {$INCLUDE e_amodes.inc}
28 Data
: array [0..BUF_SIZE
] of Byte; // îäèí áàéò ñâåðõó íà âñÿêèé ñëó÷àé
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);
99 uses SysUtils
, BinEditor
;
101 procedure e_Buffer_Clear(B
: pTBuffer
);
109 procedure e_Buffer_Write_Generic(B
: pTBuffer
; var V
; N
: Cardinal);
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
),
118 B
^.WritePos
:= B
^.WritePos
+ N
;
120 procedure e_Buffer_Read_Generic(B
: pTBuffer
; var V
; N
: Cardinal);
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
;
130 procedure e_Buffer_Write(B
: pTBuffer
; V
: Char); overload
;
132 e_Buffer_Write_Generic(B
, V
, 1);
135 procedure e_Buffer_Write(B
: pTBuffer
; V
: Byte); overload
;
137 e_Buffer_Write_Generic(B
, V
, 1);
139 procedure e_Buffer_Write(B
: pTBuffer
; V
: Word); overload
;
141 e_Buffer_Write_Generic(B
, V
, 2);
143 procedure e_Buffer_Write(B
: pTBuffer
; V
: LongWord); overload
;
145 e_Buffer_Write_Generic(B
, V
, 4);
148 procedure e_Buffer_Write(B
: pTBuffer
; V
: ShortInt); overload
;
150 e_Buffer_Write_Generic(B
, V
, 1);
152 procedure e_Buffer_Write(B
: pTBuffer
; V
: SmallInt); overload
;
154 e_Buffer_Write_Generic(B
, V
, 2);
156 procedure e_Buffer_Write(B
: pTBuffer
; V
: LongInt); overload
;
158 e_Buffer_Write_Generic(B
, V
, 4);
160 procedure e_Buffer_Write(B
: pTBuffer
; V
: Int64); overload
;
162 e_Buffer_Write_Generic(B
, V
, 8);
165 procedure e_Buffer_Write(B
: pTBuffer
; V
: string); overload
;
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
178 Len
:= BUF_SIZE
- B
^.WritePos
;
182 if (P
> B
^.Cap
) then B
^.Cap
:= P
;
184 CopyMemory(Pointer(NativeUInt(Addr(B
^.Data
)) + B
^.WritePos
),
190 procedure e_Buffer_Write(B
: pTBuffer
; V
: TMD5Digest
); overload
;
195 e_Buffer_Write(B
, V
[I
]);
198 procedure e_Buffer_Write(B
: pTBuffer
; V
: pTBuffer
); overload
;
202 if V
= nil then Exit
;
204 Assert(N
<> 0, 'don''t write empty buffers you fuck');
207 e_Buffer_Write(B
, Word(N
));
209 if (B
^.WritePos
+ N
>= BUF_SIZE
) then Exit
;
210 if (B
^.WritePos
+ N
> B
^.Cap
) then
211 B
^.Cap
:= B
^.WritePos
+ N
+ 1;
213 CopyMemory(Pointer(NativeUInt(Addr(B
^.Data
)) + B
^.WritePos
),
216 B
^.WritePos
:= B
^.WritePos
+ N
;
220 function e_Buffer_Read_Char(B
: pTBuffer
): Char;
222 e_Buffer_Read_Generic(B
, Result
, 1);
225 function e_Buffer_Read_Byte(B
: pTBuffer
): Byte;
227 e_Buffer_Read_Generic(B
, Result
, 1);
229 function e_Buffer_Read_Word(B
: pTBuffer
): Word;
231 e_Buffer_Read_Generic(B
, Result
, 2);
233 function e_Buffer_Read_LongWord(B
: pTBuffer
): LongWord;
235 e_Buffer_Read_Generic(B
, Result
, 4);
238 function e_Buffer_Read_ShortInt(B
: pTBuffer
): ShortInt;
240 e_Buffer_Read_Generic(B
, Result
, 1);
242 function e_Buffer_Read_SmallInt(B
: pTBuffer
): SmallInt;
244 e_Buffer_Read_Generic(B
, Result
, 2);
246 function e_Buffer_Read_LongInt(B
: pTBuffer
): LongInt;
248 e_Buffer_Read_Generic(B
, Result
, 4);
250 function e_Buffer_Read_Int64(B
: pTBuffer
): Int64;
252 e_Buffer_Read_Generic(B
, Result
, 8);
255 function e_Buffer_Read_String(B
: pTBuffer
): string;
259 Len
:= e_Buffer_Read_Byte(B
);
261 if Len
= 0 then Exit
;
263 if B
^.ReadPos
+ Len
> B
^.Cap
then
264 Len
:= B
^.Cap
- B
^.ReadPos
;
266 SetLength(Result
, Len
);
267 CopyMemory(@Result
[1], Pointer(NativeUInt(Addr(B
^.Data
)) + B
^.ReadPos
), Len
);
269 B
^.ReadPos
:= B
^.ReadPos
+ Len
;
272 function e_Buffer_Read_MD5(B
: pTBuffer
): TMD5Digest
;
277 Result
[I
] := e_Buffer_Read_Byte(B
);
280 procedure e_Raw_Read_Generic(P
: Pointer; var V
; N
: Cardinal);
282 CopyMemory(@V
, Pointer(NativeUInt(P
) + RawPos
), N
);
284 RawPos
:= RawPos
+ N
;
287 function e_Raw_Read_Char(P
: Pointer): Char;
289 e_Raw_Read_Generic(P
, Result
, 1);
292 function e_Raw_Read_Byte(P
: Pointer): Byte;
294 e_Raw_Read_Generic(P
, Result
, 1);
296 function e_Raw_Read_Word(P
: Pointer): Word;
298 e_Raw_Read_Generic(P
, Result
, 2);
300 function e_Raw_Read_LongWord(P
: Pointer): LongWord;
302 e_Raw_Read_Generic(P
, Result
, 4);
305 function e_Raw_Read_ShortInt(P
: Pointer): ShortInt;
307 e_Raw_Read_Generic(P
, Result
, 1);
309 function e_Raw_Read_SmallInt(P
: Pointer): SmallInt;
311 e_Raw_Read_Generic(P
, Result
, 2);
313 function e_Raw_Read_LongInt(P
: Pointer): LongInt;
315 e_Raw_Read_Generic(P
, Result
, 4);
318 function e_Raw_Read_String(P
: Pointer): string;
322 Len
:= e_Raw_Read_Byte(P
);
324 if Len
= 0 then Exit
;
326 SetLength(Result
, Len
);
327 CopyMemory(@Result
[1], Pointer(NativeUInt(P
) + RawPos
), Len
);
329 RawPos
:= RawPos
+ Len
;
332 function e_Raw_Read_MD5(P
: Pointer): TMD5Digest
;
337 Result
[I
] := e_Raw_Read_Byte(P
);
340 procedure e_Raw_Seek(I
: Cardinal);