16,749
社区成员
发帖
与我相关
我的任务
分享
procedure TSegmentBuffer.Add(const aValue: PAnsiChar; aCnt: integer);
var
p: PAnsiChar;
tmp: integer;
begin
p := aValue;
// define size of unused memory in current buffer segment
tmp := FLast^.Size - FLast^.Count;
// if you do not have enough space in the buffer then copy the "unused" bytes
// and reduce current segment
if aCnt > tmp then begin
System.Move(p^, FLast^.Data[FLast^.Count], tmp);
Inc(FLast^.Count, tmp);
Inc(FCount, tmp);
Inc(p, tmp);
Dec(aCnt, tmp);
// add another segment of the larger buffer size
tmp := FLast^.Size;
if tmp < aCnt then tmp := aCnt;
AddSegment(tmp * 2);
end;
if aCnt > 0 then begin
Move(p^, FLast^.Data[FLast^.Count], aCnt);
Inc(FCount, aCnt);
Inc(FLast^.Count, aCnt);
end;
end;
procedure TSegmentBuffer.Add(const aValue: AnsiString);
var len: integer;
begin
len := Length(aValue);
if len > 0 then
Add(@aValue[1], len);
end;
procedure TSegmentBuffer.Add(const aValue: AnsiChar);
begin
Add(@aValue, 1);
end;
procedure TSegmentBuffer.SaveToFile(const FileName: string);
var stream: TStream;
begin
stream := TFileStream.Create(FileName, fmCreate);
try
SaveToStream(stream);
finally
stream.Free;
end;
end;
procedure TSegmentBuffer.SaveToStream(Stream: TStream);
var segment: PSegment;
begin
segment := FFirst;
while segment <> nil do begin
Stream.WriteBuffer(segment^.Data[0], segment^.Count);
segment := segment^.Next;
end;
end;