index c59302102436e38a1ad715ec74df08c7e908d315..bc355b1c671884e888ed025927592aec10c88387 100644 (file)
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: 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(NativeUInt(Addr(B^.Data)) + B^.WritePos),
@V, N);
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);
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(NativeUInt(Addr(B^.Data)) + B^.ReadPos), Len);