SRL Archive - SRL Snippets

The stream helper for LaPe.


CynicRus

2014-07-09 13:23:25

Hey. As I notice, almost nobody uses the any streams for the File IO routine. I wrote the helper for the any inheritors of TStream class(TMemoryStream, TFileStream, etc). I spread it as a test script so that everyone can try this by yourself.

Requrements:
Simba 1.0.4 or later;
Lape;

Script:

program StreamHelper;
type
TTestData = record
MyInteger : Integer;
MyString : AnsiString;
MyIntArray : Array of Integer;
end;


Function ReadBoolean(Stream: TStream) : Boolean;
Begin
Stream.Read(Result, 1);
End;

Procedure WriteBoolean(Stream: TStream;v : Boolean);
Begin
Stream.Write(v, 1);
End;

Function ReadByte(Stream: TStream) : Byte;
Begin
Stream.Read(Result, 1);
End;

Procedure WriteByte(Stream: TStream;v : Byte);
Begin
Stream.Write(v, 1);
End;

Function ReadWord(Stream: TStream) : Word;
Begin
Stream.Read(Result, 2);
End;

Procedure WriteWord(Stream: TStream;v : Word);
Begin
Stream.Write(v, 2);
End;

Function ReadInteger(Stream: TStream) : Integer;
Begin
Stream.Read(Result, 4);
End;

Procedure WriteInteger(Stream: TStream;v : Integer);
Begin
Stream.Write(v, 4);
End;

Function ReadCardinal(Stream: TStream) : Cardinal;
Begin
Stream.Read(Result, 4);
End;

Procedure WriteCardinal(Stream: TStream;v : Cardinal);
Begin
Stream.Write(v, 4);
End;

function ReadInt64(Stream: TStream): Int64;
begin
Stream.Read(Result, 8);
end;

procedure WriteInt64(Stream: TStream;v: Int64);
begin
Stream.Write(v, 8);
end;

Function ReadSingle(Stream: TStream) : Single;
Begin
Stream.Read(Result, 4);
End;

Procedure WriteSingle(Stream: TStream;v : Single);
Begin
Stream.Write(v, 4);
End;

function ReadDouble(Stream: TStream): Double;
begin
Stream.Read(Result, 8);
end;

procedure WriteDouble(Stream: TStream;v: Double);
begin
Stream.Write(v, 8);
end;

Procedure WriteString(Stream: TStream; v : String);
Var Len : Integer;
Begin
Len := Length(v);
Stream.Write(Len, SizeOf(Len));
Stream.Write(PChar(v)^, Len);
End;

Function ReadString(Stream: TStream): String;
Var Len : Integer;
Begin
Stream.Read(Len, SizeOf(Len));
SetLength(Result, Len);
Stream.Read(PChar(Result)^, Len);
End;

Procedure TTestData.SaveToStream(Stream: TStream);
var
i: Integer;
begin
WriteInteger(Stream,MyInteger);
WriteString(Stream,MyString);

WriteInteger(Stream,length(MyIntArray));
Stream.Write(MyIntArray[0], length(MyIntArray) * SizeOf(MyIntArray[0]));

end;

procedure TTestData.LoadFromStream(Stream: TStream);
var
i: Integer;
begin
MyInteger := ReadInteger(Stream);
MyString := ReadString(Stream);

SetLength(MyIntArray, ReadInteger(Stream));
Stream.Read(MyIntArray[0], length(MyIntArray) * SizeOf(MyIntArray[0]));

end;

procedure TTestData.Display();
var
i: integer;
begin
WriteLn(ToStr(MyInteger));
WriteLn(ToStr(MyString));
WriteLn(ToStr(MyIntArray));
end;

var
Test,AnotherTest: TTestData;
MS: TMemoryStream;
i: integer;
begin
SetLength(test.MyIntArray,7);
Test.MyIntArray:=[1,2,3,4,5,6,7,8];
test.MyInteger:=11;
test.MyString:='Hi';
test.display;
MS.Init;
Test.SaveToStream(MS);
WriteLn(ToStr(MS.GetSize));
MS.Seek(0,0);
AnotherTest.LoadFromStream(MS);
AnotherTest.display;
MS.Free;
end.

TestOutput:

Compiled successfully in 203 ms.
11
Hi
[1, 2, 3, 4, 5, 6, 7, 8]
46
11
Hi
[1, 2, 3, 4, 5, 6, 7, 8]
Successfully executed.

Cheers,
Cynic.