Initial check in rtl
This commit is contained in:
@@ -0,0 +1,156 @@
|
||||
// TODO: jo lenne cache-elni az LA(x) karaktereket...
|
||||
|
||||
unit dpgrtl.charbuffer;
|
||||
|
||||
interface
|
||||
uses
|
||||
System.Classes,
|
||||
dpgrtl.types,
|
||||
dpgrtl.inputbuffer,
|
||||
dpgrtl.charqueue;
|
||||
|
||||
type
|
||||
TCharBuffer = class( TInputBuffer, IInputBuffer, ICharBuffer)
|
||||
protected
|
||||
fStream : TStream;
|
||||
fQueue : TCharQueue;
|
||||
|
||||
protected
|
||||
function GetNext: AnsiChar;
|
||||
procedure Fill( Amount: integer);
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// TInputBuffer overrides
|
||||
// ------------------------------------------------------------
|
||||
protected
|
||||
procedure Remove( ACount: integer); override;
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// ICharBuffer
|
||||
// ------------------------------------------------------------
|
||||
protected
|
||||
function LA( i: integer): AnsiChar;
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// Construction/destruction
|
||||
// ------------------------------------------------------------
|
||||
public
|
||||
constructor Create( AStream: TStream);
|
||||
|
||||
procedure AfterConstruction; override;
|
||||
procedure BeforeDestruction; override;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{ TCharBuffer }
|
||||
|
||||
// @@@: Construction/destruction ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
//
|
||||
// Construction/destruction
|
||||
//
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ================================================================================================
|
||||
// Constructor
|
||||
// ================================================================================================
|
||||
constructor TCharBuffer.Create(AStream: TStream);
|
||||
begin
|
||||
inherited Create;
|
||||
fStream := AStream
|
||||
end;
|
||||
|
||||
// ================================================================================================
|
||||
// After Destruction
|
||||
// ================================================================================================
|
||||
procedure TCharBuffer.AfterConstruction;
|
||||
begin
|
||||
inherited;
|
||||
|
||||
fMarkerCount := 0;
|
||||
fMarkerOffset := 0;
|
||||
fNumToConsume := 0;
|
||||
|
||||
fQueue := TCharQueue.Create
|
||||
end;
|
||||
|
||||
// ================================================================================================
|
||||
// Before Destruction
|
||||
// ================================================================================================
|
||||
procedure TCharBuffer.BeforeDestruction;
|
||||
begin
|
||||
fQueue.Free;
|
||||
inherited
|
||||
end;
|
||||
|
||||
// @@@: Interface +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
//
|
||||
// Interface
|
||||
//
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ================================================================================================
|
||||
// LA
|
||||
//
|
||||
// Ensures that the 'fQueue' object holds sufficient characters, and gets the 'i'th Look Ahead
|
||||
// character from the 'fQueue'.
|
||||
// ================================================================================================
|
||||
function TCharBuffer.LA(i: integer): AnsiChar;
|
||||
begin
|
||||
Fill(i);
|
||||
result := fQueue.Items[fMarkerOffset +i]
|
||||
end;
|
||||
|
||||
// @@@: Internals +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
//
|
||||
// Internals
|
||||
//
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ================================================================================================
|
||||
// Get Next
|
||||
// ================================================================================================
|
||||
function TCharBuffer.GetNext: AnsiChar;
|
||||
begin
|
||||
if fStream.Read( result, 1) <> 1 then
|
||||
result := #0
|
||||
end;
|
||||
|
||||
// ================================================================================================
|
||||
// Fill
|
||||
// ================================================================================================
|
||||
procedure TCharBuffer.Fill(Amount: integer);
|
||||
begin
|
||||
SyncConsume;
|
||||
|
||||
while fQueue.Count < (Amount +fMarkerOffset) do
|
||||
fQueue.Add(GetNext)
|
||||
end;
|
||||
|
||||
// @@@: Overrides +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
//
|
||||
// Overrides
|
||||
//
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
// ================================================================================================
|
||||
// Remove
|
||||
// ================================================================================================
|
||||
procedure TCharBuffer.Remove(ACount: integer);
|
||||
begin
|
||||
fQueue.Remove(ACount)
|
||||
end;
|
||||
|
||||
end.
|
||||
Reference in New Issue
Block a user