index 3a450bbffe1cbdf9540a580619f6a33d531061f6..bc355b1c671884e888ed025927592aec10c88387 100644 (file)
-{$MODE DELPHI}
+(* Copyright (C) DooM 2D:Forever Developers
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *)
+{$INCLUDE e_amodes.inc}
unit e_fixedbuffer;
interface
Data: array [0..BUF_SIZE] of Byte; // îäèí áàéò ñâåðõó íà âñÿêèé ñëó÷àé
ReadPos: Cardinal;
WritePos: Cardinal;
- Len: Cardinal;
+ Cap: Cardinal;
end;
pTBuffer = ^TBuffer;
procedure e_Buffer_Write(B: pTBuffer; V: ShortInt); overload;
procedure e_Buffer_Write(B: pTBuffer; V: SmallInt); overload;
procedure e_Buffer_Write(B: pTBuffer; V: LongInt); overload;
+procedure e_Buffer_Write(B: pTBuffer; V: Int64); overload;
procedure e_Buffer_Write(B: pTBuffer; V: string); overload;
procedure e_Buffer_Write(B: pTBuffer; V: TMD5Digest); overload;
+procedure e_Buffer_Write(B: pTBuffer; V: pTBuffer); overload;
+
function e_Buffer_Read_Char(B: pTBuffer): Char;
begin
B^.WritePos := 0;
B^.ReadPos := 0;
- B^.Len := 0;
+ B^.Cap := 0;
end;
procedure e_Buffer_Write_Generic(B: pTBuffer; var V; N: Cardinal);
begin
if (B^.WritePos + N >= BUF_SIZE) then Exit;
- if (B^.WritePos + N > B^.Len) then
- B^.Len := B^.WritePos + N + 1;
+ if (B^.WritePos + N > B^.Cap) then
+ B^.Cap := B^.WritePos + N + 1;
- CopyMemory(Pointer(Cardinal(Addr(B^.Data)) + B^.WritePos),
+ CopyMemory(Pointer(NativeUInt(Addr(B^.Data)) + B^.WritePos),
@V, N);
B^.WritePos := B^.WritePos + N;
begin
if (B^.ReadPos + N >= BUF_SIZE) then Exit;
- CopyMemory(@V, Pointer(Cardinal(Addr(B^.Data)) + B^.ReadPos), N);
+ CopyMemory(@V, Pointer(NativeUInt(Addr(B^.Data)) + B^.ReadPos), N);
B^.ReadPos := B^.ReadPos + N;
end;
begin
e_Buffer_Write_Generic(B, V, 4);
end;
+procedure e_Buffer_Write(B: pTBuffer; V: Int64); overload;
+begin
+ e_Buffer_Write_Generic(B, V, 8);
+end;
procedure e_Buffer_Write(B: pTBuffer; V: string); overload;
var
P := BUF_SIZE;
end;
- if (P > B^.Len) then B^.Len := P;
+ if (P > B^.Cap) then B^.Cap := P;
- CopyMemory(Pointer(Cardinal(Addr(B^.Data)) + B^.WritePos),
+ CopyMemory(Pointer(NativeUInt(Addr(B^.Data)) + B^.WritePos),
@V[1], Len);
B^.WritePos := P;
e_Buffer_Write(B, V[I]);
end;
+procedure e_Buffer_Write(B: pTBuffer; V: pTBuffer); overload;
+var
+ N: Cardinal;
+begin
+ if V = nil then Exit;
+ N := V^.WritePos;
+ Assert(N <> 0, 'don''t write empty buffers you fuck');
+ if N = 0 then Exit;
+
+ e_Buffer_Write(B, Word(N));
+
+ if (B^.WritePos + N >= BUF_SIZE) then Exit;
+ if (B^.WritePos + N > B^.Cap) then
+ B^.Cap := B^.WritePos + N + 1;
+
+ CopyMemory(Pointer(NativeUInt(Addr(B^.Data)) + B^.WritePos),
+ Addr(V^.Data), N);
+
+ B^.WritePos := B^.WritePos + N;
+end;
+
function e_Buffer_Read_Char(B: pTBuffer): Char;
begin
Result := '';
if Len = 0 then Exit;
- if B^.ReadPos + Len > B^.Len then
- Len := B^.Len - B^.ReadPos;
+ if B^.ReadPos + Len > B^.Cap then
+ Len := B^.Cap - B^.ReadPos;
SetLength(Result, Len);
- CopyMemory(@Result[1], Pointer(Cardinal(Addr(B^.Data)) + B^.ReadPos), Len);
+ CopyMemory(@Result[1], Pointer(NativeUInt(Addr(B^.Data)) + B^.ReadPos), Len);
B^.ReadPos := B^.ReadPos + Len;
end;
procedure e_Raw_Read_Generic(P: Pointer; var V; N: Cardinal);
begin
- CopyMemory(@V, Pointer(Cardinal(P) + RawPos), N);
+ CopyMemory(@V, Pointer(NativeUInt(P) + RawPos), N);
RawPos := RawPos + N;
end;
if Len = 0 then Exit;
SetLength(Result, Len);
- CopyMemory(@Result[1], Pointer(Cardinal(P) + RawPos), Len);
+ CopyMemory(@Result[1], Pointer(NativeUInt(P) + RawPos), Len);
RawPos := RawPos + Len;
end;