X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=blobdiff_plain;f=src%2Fengine%2Fe_fixedbuffer.pas;h=3b6dbf801b28d8208d13ce71236afde048b5bd3e;hp=c59302102436e38a1ad715ec74df08c7e908d315;hb=94c8854f0ba3a87de3928f587e66d5d0e43d8f9b;hpb=9e08e52b1845570063f7491ac5eda3e9470a01c9 diff --git a/src/engine/e_fixedbuffer.pas b/src/engine/e_fixedbuffer.pas index c593021..3b6dbf8 100644 --- a/src/engine/e_fixedbuffer.pas +++ b/src/engine/e_fixedbuffer.pas @@ -28,7 +28,7 @@ type Data: array [0..BUF_SIZE] of Byte; // îäèí áàéò ñâåðõó íà âñÿêèé ñëó÷àé ReadPos: Cardinal; WritePos: Cardinal; - Len: Cardinal; + Cap: Cardinal; end; pTBuffer = ^TBuffer; @@ -57,6 +57,8 @@ 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; @@ -100,15 +102,15 @@ 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(NativeUInt(Addr(B^.Data)) + B^.WritePos), @V, N); @@ -177,7 +179,7 @@ begin P := BUF_SIZE; end; - if (P > B^.Len) then B^.Len := P; + if (P > B^.Cap) then B^.Cap := P; CopyMemory(Pointer(NativeUInt(Addr(B^.Data)) + B^.WritePos), @V[1], Len); @@ -193,6 +195,25 @@ 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; + + 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 @@ -237,8 +258,8 @@ 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(NativeUInt(Addr(B^.Data)) + B^.ReadPos), Len);