X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fengine%2Fe_fixedbuffer.pas;h=bc355b1c671884e888ed025927592aec10c88387;hb=907f02bbf5d1e65c2ce052d883d522e30e7c7a8f;hp=63570f7ec541a652724ba2421c59114b9986a6ec;hpb=88ce644db1b40111bdb380f4357fa59bdb5173be;p=d2df-sdl.git diff --git a/src/engine/e_fixedbuffer.pas b/src/engine/e_fixedbuffer.pas index 63570f7..bc355b1 100644 --- a/src/engine/e_fixedbuffer.pas +++ b/src/engine/e_fixedbuffer.pas @@ -1,3 +1,19 @@ +(* 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 . + *) +{$INCLUDE e_amodes.inc} unit e_fixedbuffer; interface @@ -12,7 +28,7 @@ type Data: array [0..BUF_SIZE] of Byte; // îäèí áàéò ñâåðõó íà âñÿêèé ñëó÷àé ReadPos: Cardinal; WritePos: Cardinal; - Len: Cardinal; + Cap: Cardinal; end; pTBuffer = ^TBuffer; @@ -35,11 +51,14 @@ procedure e_Buffer_Write(B: pTBuffer; V: LongWord); overload; 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; @@ -50,6 +69,7 @@ function e_Buffer_Read_LongWord(B: pTBuffer): LongWord; function e_Buffer_Read_ShortInt(B: pTBuffer): ShortInt; function e_Buffer_Read_SmallInt(B: pTBuffer): SmallInt; function e_Buffer_Read_LongInt(B: pTBuffer): LongInt; +function e_Buffer_Read_Int64(B: pTBuffer): Int64; function e_Buffer_Read_String(B: pTBuffer): string; @@ -82,17 +102,17 @@ procedure e_Buffer_Clear(B: pTBuffer); 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; @@ -101,7 +121,7 @@ procedure e_Buffer_Read_Generic(B: pTBuffer; var V; N: Cardinal); 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; @@ -137,6 +157,10 @@ procedure e_Buffer_Write(B: pTBuffer; V: LongInt); overload; 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 @@ -155,9 +179,9 @@ begin 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; @@ -171,6 +195,27 @@ begin 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 @@ -202,6 +247,10 @@ function e_Buffer_Read_LongInt(B: pTBuffer): LongInt; begin e_Buffer_Read_Generic(B, Result, 4); end; +function e_Buffer_Read_Int64(B: pTBuffer): Int64; +begin + e_Buffer_Read_Generic(B, Result, 8); +end; function e_Buffer_Read_String(B: pTBuffer): string; var @@ -211,11 +260,11 @@ 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; @@ -230,7 +279,7 @@ 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; @@ -275,7 +324,7 @@ begin 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;