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
;
205 e_Buffer_Write(B
, Word(N
));
207 if (B
^.WritePos
+ N
>= BUF_SIZE
) then Exit
;
208 if (B
^.WritePos
+ N
> B
^.Cap
) then
209 B
^.Cap
:= B
^.WritePos
+ N
+ 1;
211 CopyMemory(Pointer(NativeUInt(Addr(B
^.Data
)) + B
^.WritePos
),
214 B
^.WritePos
:= B
^.WritePos
+ N
;
218 function e_Buffer_Read_Char(B
: pTBuffer
): Char;
220 e_Buffer_Read_Generic(B
, Result
, 1);
223 function e_Buffer_Read_Byte(B
: pTBuffer
): Byte;
225 e_Buffer_Read_Generic(B
, Result
, 1);
227 function e_Buffer_Read_Word(B
: pTBuffer
): Word;
229 e_Buffer_Read_Generic(B
, Result
, 2);
231 function e_Buffer_Read_LongWord(B
: pTBuffer
): LongWord;
233 e_Buffer_Read_Generic(B
, Result
, 4);
236 function e_Buffer_Read_ShortInt(B
: pTBuffer
): ShortInt;
238 e_Buffer_Read_Generic(B
, Result
, 1);
240 function e_Buffer_Read_SmallInt(B
: pTBuffer
): SmallInt;
242 e_Buffer_Read_Generic(B
, Result
, 2);
244 function e_Buffer_Read_LongInt(B
: pTBuffer
): LongInt;
246 e_Buffer_Read_Generic(B
, Result
, 4);
248 function e_Buffer_Read_Int64(B
: pTBuffer
): Int64;
250 e_Buffer_Read_Generic(B
, Result
, 8);
253 function e_Buffer_Read_String(B
: pTBuffer
): string;
257 Len
:= e_Buffer_Read_Byte(B
);
259 if Len
= 0 then Exit
;
261 if B
^.ReadPos
+ Len
> B
^.Cap
then
262 Len
:= B
^.Cap
- B
^.ReadPos
;
264 SetLength(Result
, Len
);
265 CopyMemory(@Result
[1], Pointer(NativeUInt(Addr(B
^.Data
)) + B
^.ReadPos
), Len
);
267 B
^.ReadPos
:= B
^.ReadPos
+ Len
;
270 function e_Buffer_Read_MD5(B
: pTBuffer
): TMD5Digest
;
275 Result
[I
] := e_Buffer_Read_Byte(B
);
278 procedure e_Raw_Read_Generic(P
: Pointer; var V
; N
: Cardinal);
280 CopyMemory(@V
, Pointer(NativeUInt(P
) + RawPos
), N
);
282 RawPos
:= RawPos
+ N
;
285 function e_Raw_Read_Char(P
: Pointer): Char;
287 e_Raw_Read_Generic(P
, Result
, 1);
290 function e_Raw_Read_Byte(P
: Pointer): Byte;
292 e_Raw_Read_Generic(P
, Result
, 1);
294 function e_Raw_Read_Word(P
: Pointer): Word;
296 e_Raw_Read_Generic(P
, Result
, 2);
298 function e_Raw_Read_LongWord(P
: Pointer): LongWord;
300 e_Raw_Read_Generic(P
, Result
, 4);
303 function e_Raw_Read_ShortInt(P
: Pointer): ShortInt;
305 e_Raw_Read_Generic(P
, Result
, 1);
307 function e_Raw_Read_SmallInt(P
: Pointer): SmallInt;
309 e_Raw_Read_Generic(P
, Result
, 2);
311 function e_Raw_Read_LongInt(P
: Pointer): LongInt;
313 e_Raw_Read_Generic(P
, Result
, 4);
316 function e_Raw_Read_String(P
: Pointer): string;
320 Len
:= e_Raw_Read_Byte(P
);
322 if Len
= 0 then Exit
;
324 SetLength(Result
, Len
);
325 CopyMemory(@Result
[1], Pointer(NativeUInt(P
) + RawPos
), Len
);
327 RawPos
:= RawPos
+ Len
;
330 function e_Raw_Read_MD5(P
: Pointer): TMD5Digest
;
335 Result
[I
] := e_Raw_Read_Byte(P
);
338 procedure e_Raw_Seek(I
: Cardinal);