improved DefineProperties to read/write endian independent

git-svn-id: trunk@5790 -
This commit is contained in:
mattias 2004-08-15 17:00:58 +00:00
parent 05cae27203
commit 2d80b0247f
7 changed files with 390 additions and 53 deletions

View File

@ -37,9 +37,10 @@ unit ComCtrls;
interface interface
uses uses
SysUtils, Classes, Math, FPCAdds, LCLStrConsts, LCLIntf, LCLType, LCLProc, SysUtils, Classes, Math, FPCAdds, LCLStrConsts, LResources, LCLIntf, LCLType,
AvgLvlTree, vclGlobals, LMessages, ImgList, ActnList, GraphType, Graphics, LCLProc, AvgLvlTree, vclGlobals, LMessages, ImgList, ActnList, GraphType,
Menus, Controls, Forms, StdCtrls, ExtCtrls, ToolWin, CommCtrl, Buttons; Graphics, Menus, Controls, Forms, StdCtrls, ExtCtrls, ToolWin, CommCtrl,
Buttons;
type type
TStatusPanelStyle = (psText, psOwnerDraw); TStatusPanelStyle = (psText, psOwnerDraw);
@ -2306,6 +2307,9 @@ end.
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.142 2004/08/15 17:00:58 mattias
improved DefineProperties to read/write endian independent
Revision 1.141 2004/08/04 09:35:38 mattias Revision 1.141 2004/08/04 09:35:38 mattias
implemented setting TTabSheet.TabIndex implemented setting TTabSheet.TabIndex

View File

@ -45,8 +45,8 @@ interface
{$endif} {$endif}
uses uses
SysUtils, Classes, LCLStrConsts, LCLProc, Controls, Forms, StdCtrls, SysUtils, Classes, LCLStrConsts, LCLProc, LResources, Controls, Forms,
vclGlobals, lMessages, GraphType, Graphics, LCLIntf, CustomTimer; StdCtrls, vclGlobals, lMessages, GraphType, Graphics, LCLIntf, CustomTimer;
type type
{ workaround problem with fcl } { workaround problem with fcl }
@ -967,6 +967,9 @@ end.
{ {
$Log$ $Log$
Revision 1.114 2004/08/15 17:00:58 mattias
improved DefineProperties to read/write endian independent
Revision 1.113 2004/08/04 09:57:17 mattias Revision 1.113 2004/08/04 09:57:17 mattias
TStaticText.CanTab=false TStaticText.CanTab=false

View File

@ -35,7 +35,7 @@ History
- Add TCustomImageList.Assign() - Add TCustomImageList.Assign()
- Add TCustomImageList.WriteData() - Add TCustomImageList.WriteData()
- Add TCustomImageList.ReadData() - Add TCustomImageList.ReadData()
- Add overrite TCustomImageList.DefineProperties() - Add override TCustomImageList.DefineProperties()
Warning : the delphi or kylix format of datas is not compatible. Warning : the delphi or kylix format of datas is not compatible.
- Modify Delete and Clear for preserve memory - Modify Delete and Clear for preserve memory
} }
@ -219,6 +219,9 @@ end.
{ {
$Log$ $Log$
Revision 1.23 2004/08/15 17:00:58 mattias
improved DefineProperties to read/write endian independent
Revision 1.22 2004/04/29 18:08:17 mattias Revision 1.22 2004/04/29 18:08:17 mattias
fixed 1.0.10 compilation fixed 1.0.10 compilation

View File

@ -221,7 +221,7 @@ var
i: Integer; i: Integer;
v: Integer; v: Integer;
begin begin
Stream.ReadBuffer(ChecksCount, SizeOf(Integer)); ChecksCount:=ReadLRSInteger(Stream);
if ChecksCount>0 then begin if ChecksCount>0 then begin
SetLength(Checks,ChecksCount); SetLength(Checks,ChecksCount);
Stream.ReadBuffer(Checks[1], ChecksCount); Stream.ReadBuffer(Checks[1], ChecksCount);
@ -241,7 +241,7 @@ var
v: Integer; v: Integer;
begin begin
ChecksCount:=FItems.Count; ChecksCount:=FItems.Count;
Stream.WriteBuffer(ChecksCount, SizeOf(Integer)); WriteLRSInteger(Stream,ChecksCount);
if ChecksCount>0 then begin if ChecksCount>0 then begin
SetLength(Checks,ChecksCount); SetLength(Checks,ChecksCount);
for i:=0 to ChecksCount-1 do begin for i:=0 to ChecksCount-1 do begin
@ -278,6 +278,9 @@ end;
{ {
$Log$ $Log$
Revision 1.9 2004/08/15 17:00:58 mattias
improved DefineProperties to read/write endian independent
Revision 1.8 2004/07/16 21:49:00 mattias Revision 1.8 2004/07/16 21:49:00 mattias
added RTTI controls added RTTI controls

View File

@ -792,7 +792,7 @@ begin
AStream.Write(Signature,SizeOf(Signature)); AStream.Write(Signature,SizeOf(Signature));
//Count of image //Count of image
AStream.WriteWord(Count); WriteLRSWord(AStream,Count);
for i:=0 to Count-1 do for i:=0 to Count-1 do
begin begin
@ -805,9 +805,9 @@ begin
AStream.Write(Signature,SizeOf(Signature)); AStream.Write(Signature,SizeOf(Signature));
//Count of image //Count of image
AStream.WriteDWord(Count); WriteLRSInteger(AStream,Count);
AStream.WriteDWord(Width); WriteLRSInteger(AStream,Width);
AStream.WriteDWord(Height); WriteLRSInteger(AStream,Height);
for i:=0 to Count-1 do for i:=0 to Count-1 do
begin begin
@ -842,7 +842,7 @@ var
for i := 0 to NewCount - 1 do for i := 0 to NewCount - 1 do
begin begin
bmp := TBitMap.Create; bmp := TBitMap.Create;
AStream.Read(Size, SizeOf(Size)); Size:=ReadLRSInteger(AStream);
bmp.ReadStream(AStream, True, Size); bmp.ReadStream(AStream, True, Size);
bmp.Transparent := True; bmp.Transparent := True;
AddDirect(bmp, nil); AddDirect(bmp, nil);
@ -855,15 +855,15 @@ var
bmp: TBitmap; bmp: TBitmap;
begin begin
//DebugLn('TCustomImageList.ReadData DoReadLaz2'); //DebugLn('TCustomImageList.ReadData DoReadLaz2');
NewCount := AStream.ReadDWord; NewCount := ReadLRSCardinal(AStream);
Width := AStream.ReadDWord; Width := ReadLRSCardinal(AStream);
Height := AStream.ReadDWord; Height := ReadLRSCardinal(AStream);
//DebugLn('TCustomImageList.ReadData DoReadLaz2 NewCount=',NewCount,' Width=',Width,' Height=',Height); //DebugLn('TCustomImageList.ReadData DoReadLaz2 NewCount=',NewCount,' Width=',Width,' Height=',Height);
for i := 0 to NewCount - 1 do for i := 0 to NewCount - 1 do
begin begin
bmp := TBitMap.Create; bmp := TBitMap.Create;
//DebugLn('TCustomImageList.ReadData DoReadLaz2 i=',i,' ',AStream.Position); //DebugLn('TCustomImageList.ReadData DoReadLaz2 i=',i,' ',AStream.Position);
AStream.Read(Size, SizeOf(Size)); Size:=ReadLRSCardinal(AStream);
//DebugLn('TCustomImageList.ReadData DoReadLaz2 Size=',Size,' ',AStream.Position); //DebugLn('TCustomImageList.ReadData DoReadLaz2 Size=',Size,' ',AStream.Position);
bmp.ReadStream(AStream, True, Size); bmp.ReadStream(AStream, True, Size);
AddDirect(bmp, nil); AddDirect(bmp, nil);
@ -1004,17 +1004,17 @@ begin
if Signature = SIG_D3 if Signature = SIG_D3
then begin then begin
AStream.ReadWord; //Skip ? AStream.ReadWord; //Skip ?
NewCount := AStream.ReadWord; NewCount := ReadLRSWord(AStream);
//DebugLn('NewCount=',NewCount); //DebugLn('NewCount=',NewCount);
AStream.ReadWord; //Skip Capacity AStream.ReadWord; //Skip Capacity
AStream.ReadWord; //Skip Grow AStream.ReadWord; //Skip Grow
FWidth := AStream.ReadWord; FWidth := ReadLRSWord(AStream);
//DebugLn('NewWidth=',FWidth); //DebugLn('NewWidth=',FWidth);
FHeight := AStream.ReadWord; FHeight := ReadLRSWord(AStream);
//DebugLn('NewHeight=',FHeight); //DebugLn('NewHeight=',FHeight);
FBKColor := TColor(AStream.ReadDWord); FBKColor := TColor(ReadLRSInteger(AStream));
{$IFNDEF DisableFPImage} {$IFNDEF DisableFPImage}
HasMask := (AStream.ReadWord and 1) = 1; HasMask := (ReadLRSWord(AStream) and 1) = 1;
AStream.ReadDWord; //Skip ? AStream.ReadDWord; //Skip ?
AStream.ReadDWord; //Skip ? AStream.ReadDWord; //Skip ?
@ -1024,12 +1024,13 @@ begin
else begin else begin
// D2 has no signature, so restore original position // D2 has no signature, so restore original position
AStream.Position := StreamPos; AStream.Position := StreamPos;
AStream.ReadBuffer(Size, SizeOf(Size)); Size:=ReadLRSInteger(AStream);
AStream.ReadBuffer(NewCount, SizeOf(NewCount)); NewCount:=ReadLRSInteger(AStream);
{$IFNDEF DisableFPImage} {$IFNDEF DisableFPImage}
ReadDelphiImageAndMask(false,NewCount); ReadDelphiImageAndMask(false,NewCount);
{$ENDIF} {$ENDIF}
AStream.Position := StreamPos+Size;
end; end;
end; end;
@ -1261,6 +1262,9 @@ end;
{ {
$Log$ $Log$
Revision 1.40 2004/08/15 17:00:58 mattias
improved DefineProperties to read/write endian independent
Revision 1.39 2004/05/11 11:42:27 mattias Revision 1.39 2004/05/11 11:42:27 mattias
replaced writeln by debugln replaced writeln by debugln

View File

@ -278,17 +278,25 @@ var
begin begin
Clear; Clear;
//Flag:=False; //Flag:=False;
Stream.ReadBuffer(Size, SizeOf(Integer)); Size:=ReadLRSInteger(Stream);
ItemHeader := AllocMem(Size); ItemHeader := AllocMem(Size);
Owner.BeginUpdate; Owner.BeginUpdate;
try try
Stream.ReadBuffer(ItemHeader^.Count, Size - SizeOf(Integer)); ItemHeader^.Count:=ReadLRSInteger(Stream);
Stream.ReadBuffer(ItemHeader^.Items, Size - 8);
ItemInfo := @ItemHeader^.Items; ItemInfo := @ItemHeader^.Items;
PStr := nil; PStr := nil;
for I := 0 to ItemHeader^.Count - 1 do for I := 0 to ItemHeader^.Count - 1 do
begin begin
with Add do with Add do
begin begin
{$IFDEF Endian_BIG}
ReverseBytes(@ItemInfo^.ImageIndex,4);
ReverseBytes(@ItemInfo^.StateIndex,4);
ReverseBytes(@ItemInfo^.OverlayIndex,4);
ReverseBytes(@ItemInfo^.SubItemCount,4);
ReverseBytes(@ItemInfo^.Data,4);
{$ENDIF}
//Flag:=True; //Flag:=True;
Caption := ItemInfo^.Caption; Caption := ItemInfo^.Caption;
ImageIndex := ItemInfo^.ImageIndex; ImageIndex := ItemInfo^.ImageIndex;
@ -317,6 +325,9 @@ begin
then begin then begin
for J := 0 to Item[I].SubItems.Count - 1 do for J := 0 to Item[I].SubItems.Count - 1 do
begin begin
{$ifdef Endian_Little}
ReverseBytes(@PInt,4);
{$endif}
Item[I].SubItemImages[J] := PInt^; Item[I].SubItemImages[J] := PInt^;
Inc(PInt); Inc(PInt);
end; end;
@ -364,6 +375,10 @@ begin
try try
ItemHeader^.Size := Size; ItemHeader^.Size := Size;
ItemHeader^.Count := Count; ItemHeader^.Count := Count;
{$ifdef Endian_Little}
ReverseBytes(@ItemHeader^.Size,4);
ReverseBytes(@ItemHeader^.Count,4);
{$endif}
ItemInfo := @ItemHeader^.Items; ItemInfo := @ItemHeader^.Items;
PStr := nil; PStr := nil;
for I := 0 to Count - 1 do for I := 0 to Count - 1 do
@ -372,10 +387,17 @@ begin
begin begin
ItemInfo^.Caption := Caption; ItemInfo^.Caption := Caption;
ItemInfo^.ImageIndex := ImageIndex; ItemInfo^.ImageIndex := ImageIndex;
ItemInfo^.OverlayIndex := -1 {OverlayIndex};
ItemInfo^.StateIndex := -1 {StateIndex}; ItemInfo^.StateIndex := -1 {StateIndex};
ItemInfo^.Data := Data; ItemInfo^.OverlayIndex := -1 {OverlayIndex};
ItemInfo^.SubItemCount := SubItems.Count; ItemInfo^.SubItemCount := SubItems.Count;
ItemInfo^.Data := Data;
{$IFDEF Endian_BIG}
ReverseBytes(@ItemInfo^.ImageIndex,4);
ReverseBytes(@ItemInfo^.StateIndex,4);
ReverseBytes(@ItemInfo^.OverlayIndex,4);
ReverseBytes(@ItemInfo^.SubItemCount,4);
ReverseBytes(@ItemInfo^.Data,4);
{$ENDIF}
PStr := @ItemInfo^.Caption; PStr := @ItemInfo^.Caption;
Inc(Integer(PStr), Length(ItemInfo^.Caption) + 1); Inc(Integer(PStr), Length(ItemInfo^.Caption) + 1);
Len := 0; Len := 0;
@ -397,8 +419,11 @@ begin
begin begin
for J := 0 to Item[I].SubItems.Count - 1 do for J := 0 to Item[I].SubItems.Count - 1 do
begin begin
PInt^ := Item[I].SubItemImages[J]; PInt^ := Item[I].SubItemImages[J];
Inc(PInt); {$ifdef Endian_Little}
ReverseBytes(@PInt,4);
{$endif}
Inc(PInt);
end; end;
end; end;
@ -411,6 +436,9 @@ end;
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.24 2004/08/15 17:00:58 mattias
improved DefineProperties to read/write endian independent
Revision 1.23 2004/07/11 17:20:47 marc Revision 1.23 2004/07/11 17:20:47 marc
* Implemented most of TListColoum/Item in the Ws for gtk and win32 * Implemented most of TListColoum/Item in the Ws for gtk and win32

View File

@ -192,22 +192,59 @@ function FindLFMClassName(LFMStream: TStream):AnsiString;
function CreateLFMFile(AComponent: TComponent; LFMStream: TStream): integer; function CreateLFMFile(AComponent: TComponent; LFMStream: TStream): integer;
type type
TDelphiStreamOriginalFormat = (sofUnknown, sofBinary, sofText); TLRSStreamOriginalFormat = (sofUnknown, sofBinary, sofText);
procedure DelphiObjectBinaryToText(Input, Output: TStream); procedure LRSObjectBinaryToText(Input, Output: TStream);
procedure DelphiObjectToText(Input, Output: TStream; procedure LRSObjectToText(Input, Output: TStream;
var OriginalFormat: TDelphiStreamOriginalFormat); var OriginalFormat: TLRSStreamOriginalFormat);
procedure DelphiObjectResourceToText(Input, Output: TStream); procedure LRSObjectResourceToText(Input, Output: TStream);
procedure DelphiObjectResToText(Input, Output: TStream; procedure LRSObjectResToText(Input, Output: TStream;
var OriginalFormat: TDelphiStreamOriginalFormat); var OriginalFormat: TLRSStreamOriginalFormat);
function TestFormStreamFormat(Stream: TStream): TDelphiStreamOriginalFormat; function TestFormStreamFormat(Stream: TStream): TLRSStreamOriginalFormat;
procedure FormDataToText(FormStream, TextStream: TStream); procedure FormDataToText(FormStream, TextStream: TStream);
procedure ReverseBytes(p: Pointer; Count: integer); procedure ReverseBytes(p: Pointer; Count: integer);
procedure ReverseByteOrderInWords(p: PWord; Count: integer); procedure ReverseByteOrderInWords(p: PWord; Count: integer);
function ReadLRSWord(s: TStream): word;
function ReadLRSInteger(s: TStream): integer;
function ReadLRSCardinal(s: TStream): cardinal;
function ReadLRSInt64(s: TStream): int64;
function ReadLRSSingle(s: TStream): Single;
function ReadLRSDouble(s: TStream): Double;
function ReadLRSExtended(s: TStream): Extended;
{$ifdef HASCURRENCY}
function ReadLRSCurrency(s: TStream): Currency;
{$endif HASCURRENCY}
{$ifdef HASWIDESTRING}
function ReadLRSWideString(s: TStream): WideString;
{$endif HASWIDESTRING}
procedure WriteLRSWord(s: TStream; const w: word);
procedure WriteLRSInteger(s: TStream; const i: integer);
procedure WriteLRSCardinal(s: TStream; const c: cardinal);
procedure WriteLRSSingle(s: TStream; const si: Single);
procedure WriteLRSDouble(s: TStream; const d: Double);
procedure WriteLRSExtended(s: TStream; const e: extended);
procedure WriteLRSInt64(s: TStream; const i: int64);
{$ifdef HASCURRENCY}
procedure WriteLRSCurrency(s: TStream; const c: Currency);
{$endif HASCURRENCY}
{$ifdef HASWIDESTRING}
procedure WriteLRSWideStringContent(s: TStream; const w: WideString);
{$endif HASWIDESTRING}
procedure WriteLRSReversedWord(s: TStream; w: word);
procedure WriteLRS4BytesReversed(s: TStream; p: Pointer);
procedure WriteLRS8BytesReversed(s: TStream; p: Pointer);
procedure WriteLRS10BytesReversed(s: TStream; p: Pointer);
procedure WriteLRSNull(s: TStream; Count: integer);
procedure WriteLRSEndianBigDoubleAsEndianLittleExtended(s: TStream;
PPCDouble: PByte);
implementation implementation
@ -1114,7 +1151,7 @@ begin
end; end;
end; end;
procedure DelphiObjectBinaryToText(Input, Output: TStream); procedure LRSObjectBinaryToText(Input, Output: TStream);
var var
NestingLevel: Integer; NestingLevel: Integer;
SaveSeparator: Char; SaveSeparator: Char;
@ -1449,7 +1486,7 @@ begin
end; end;
end; end;
function TestFormStreamFormat(Stream: TStream): TDelphiStreamOriginalFormat; function TestFormStreamFormat(Stream: TStream): TLRSStreamOriginalFormat;
var var
Pos: TStreamSeekType; Pos: TStreamSeekType;
Signature: Integer; Signature: Integer;
@ -1470,8 +1507,8 @@ end;
type type
TObjectTextConvertProc = procedure (Input, Output: TStream); TObjectTextConvertProc = procedure (Input, Output: TStream);
procedure InternalDelphiBinaryToText(Input, Output: TStream; procedure InternalLRSBinaryToText(Input, Output: TStream;
var OriginalFormat: TDelphiStreamOriginalFormat; var OriginalFormat: TLRSStreamOriginalFormat;
ConvertProc: TObjectTextConvertProc; ConvertProc: TObjectTextConvertProc;
BinarySignature: Integer; SignatureLength: Byte); BinarySignature: Integer; SignatureLength: Byte);
var var
@ -1517,31 +1554,31 @@ begin
end; end;
end; end;
procedure DelphiObjectToText(Input, Output: TStream; procedure LRSObjectToText(Input, Output: TStream;
var OriginalFormat: TDelphiStreamOriginalFormat); var OriginalFormat: TLRSStreamOriginalFormat);
begin begin
InternalDelphiBinaryToText(Input, Output, OriginalFormat, InternalLRSBinaryToText(Input, Output, OriginalFormat,
@DelphiObjectBinaryToText, Integer(FilerSignature), sizeof(Integer)); @LRSObjectBinaryToText, Integer(FilerSignature), sizeof(Integer));
end; end;
procedure DelphiObjectResToText(Input, Output: TStream; procedure LRSObjectResToText(Input, Output: TStream;
var OriginalFormat: TDelphiStreamOriginalFormat); var OriginalFormat: TLRSStreamOriginalFormat);
begin begin
InternalDelphiBinaryToText(Input, Output, OriginalFormat, InternalLRSBinaryToText(Input, Output, OriginalFormat,
@DelphiObjectResourceToText, $FF, 1); @LRSObjectResourceToText, $FF, 1);
end; end;
procedure DelphiObjectResourceToText(Input, Output: TStream); procedure LRSObjectResourceToText(Input, Output: TStream);
begin begin
Input.ReadResHeader; Input.ReadResHeader;
DelphiObjectBinaryToText(Input, Output); LRSObjectBinaryToText(Input, Output);
end; end;
procedure FormDataToText(FormStream, TextStream: TStream); procedure FormDataToText(FormStream, TextStream: TStream);
begin begin
case TestFormStreamFormat(FormStream) of case TestFormStreamFormat(FormStream) of
sofBinary: sofBinary:
DelphiObjectResourceToText(FormStream, TextStream); LRSObjectResourceToText(FormStream, TextStream);
sofText: sofText:
TextStream.CopyFrom(FormStream,FormStream.Size); TextStream.CopyFrom(FormStream,FormStream.Size);
@ -1663,6 +1700,261 @@ begin
Result:=TWriter.Create(Driver); Result:=TWriter.Create(Driver);
end; end;
function ReadLRSWord(s: TStream): word;
begin
s.Read(Result,2);
{$IFDEF Endian_BIG}
Result:=((Result and $ff) shl 8) or (Result shr 8);
{$ENDIF}
end;
function ReadLRSInteger(s: TStream): integer;
begin
s.Read(Result,4);
{$IFDEF Endian_BIG}
ReverseBytes(@Result,4);
{$ENDIF}
end;
function ReadLRSCardinal(s: TStream): cardinal;
begin
s.Read(Result,4);
{$IFDEF Endian_BIG}
ReverseBytes(@Result,4);
{$ENDIF}
end;
function ReadLRSInt64(s: TStream): int64;
begin
s.Read(Result,8);
{$IFDEF Endian_BIG}
ReverseBytes(@Result,8);
{$ENDIF}
end;
function ReadLRSSingle(s: TStream): Single;
begin
s.Read(Result,4);
{$IFDEF Endian_BIG}
ReverseBytes(@Result,4);
{$ENDIF}
end;
function ReadLRSDouble(s: TStream): Double;
begin
s.Read(Result,8);
{$IFDEF Endian_BIG}
ReverseBytes(@Result,8);
{$ENDIF}
end;
{$IFDEF CPUPowerPC}
function ReadLRSExtentedAndConvertToExtended(s: TStream): Extended;
// TODO - does not work
const
F: extended = 1.0/65536.0 ;
var
le: array [1..5] of word;
begin { Ignores NaN & Inf }
s.Read(le[1],10);
ReverseBytes(@le[1],10);
Result := 2.0 * (((le[2]*F+le[3])*F+le[4])*F+le[5])*F;
if le[1]>32767 then Result := -Result ;
Result:=intpower(2,integer(le[1] and $7fff)-$4000);
end;
{$ENDIF}
function ReadLRSExtended(s: TStream): Extended;
begin
{$IFDEF CPUi386}
s.Read(Result,10);
{$ENDIF}
{$IFDEF CPUPowerPC}
Result:=ReadLRSExtentedAndConvertToExtended(s);
{$ENDIF}
end;
{$ifdef HASCURRENCY}
function ReadLRSCurrency(s: TStream): Currency;
begin
s.Read(Result,8);
{$IFDEF Endian_BIG}
ReverseBytes(@Result,8);
{$ENDIF}
end;
{$endif HASCURRENCY}
{$ifdef HASWIDESTRING}
function ReadLRSWideString(s: TStream): WideString;
var
Len: LongInt;
begin
Len:=ReadLRSInteger(s);
SetLength(Result,Len);
if Len>0 then begin
s.Read(Result[1],Len*2);
{$IFDEF Endian_BIG}
ReverseByteOrderInWords(PWord(@Result[1]),Len);
{$ENDIF}
end;
end;
{$endif HASWIDESTRING}
procedure WriteLRSReversedWord(s: TStream; w: word);
begin
w:=(w shr 8) or ((w and $ff) shl 8);
s.Write(w,2);
end;
procedure WriteLRS4BytesReversed(s: TStream; p: Pointer);
var
a: array[0..3] of char;
i: Integer;
begin
for i:=0 to 3 do
a[i]:=PChar(p)[3-i];
s.Write(a[0],4);
end;
procedure WriteLRS8BytesReversed(s: TStream; p: Pointer);
var
a: array[0..7] of char;
i: Integer;
begin
for i:=0 to 7 do
a[i]:=PChar(p)[7-i];
s.Write(a[0],8);
end;
procedure WriteLRS10BytesReversed(s: TStream; p: Pointer);
var
a: array[0..9] of char;
i: Integer;
begin
for i:=0 to 9 do
a[i]:=PChar(p)[9-i];
s.Write(a[0],10);
end;
procedure WriteLRSNull(s: TStream; Count: integer);
var
c: char;
i: Integer;
begin
c:=#0;
for i:=0 to Count-1 do
s.Write(c,1);
end;
procedure WriteLRSEndianBigDoubleAsEndianLittleExtended(s: TStream;
PPCDouble: PByte);
// TODO
var
i: Integer;
begin
i:=0;
s.Write(i,4);
s.Write(i,4);
s.Write(i,2);
end;
procedure WriteLRSWord(s: TStream; const w: word);
begin
{$IFDEF Endian_Little}
s.Write(w,2);
{$ELSE}
WriteLRSReversedWord(s,w);
{$ENDIF}
end;
procedure WriteLRSInteger(s: TStream; const i: integer);
begin
{$IFDEF Endian_Little}
s.Write(i,4);
{$ELSE}
WriteLRS4BytesReversed(s,@i);
{$ENDIF}
end;
procedure WriteLRSCardinal(s: TStream; const c: cardinal);
begin
{$IFDEF Endian_Little}
s.Write(c,4);
{$ELSE}
WriteLRS4BytesReversed(s,@c);
{$ENDIF}
end;
procedure WriteLRSSingle(s: TStream; const si: Single);
begin
{$IFDEF Endian_Little}
s.Write(si,4);
{$ELSE}
WriteLRS4BytesReversed(s,@si);
{$ENDIF}
end;
procedure WriteLRSDouble(s: TStream; const d: Double);
begin
{$IFDEF Endian_Little}
s.Write(d,8);
{$ELSE}
WriteLRS8BytesReversed(s,@d);
{$ENDIF}
end;
procedure WriteLRSExtended(s: TStream; const e: extended);
begin
{$IFDEF CPUi386}
s.Write(e,10);
{$ENDIF}
{$IFDEF CPUPowerPC}
if SizeOf(e)=10 then
WriteLRS10BytesReversed(s,@e)
else if SizeOf(e)=8 then
WriteLRSEndianBigDoubleAsEndianLittleExtended(s,@e)
else begin
debugln('WARNING: WriteLRSExtended not implemented yet for PowerPC');
WriteLRSNull(s,10);
end;
{$ENDIF}
end;
procedure WriteLRSInt64(s: TStream; const i: int64);
begin
{$IFDEF Endian_Little}
s.Write(i,8);
{$ELSE}
WriteLRS8BytesReversed(s,@i);
{$ENDIF}
end;
{$ifdef HASCURRENCY}
procedure WriteLRSCurrency(s: TStream; const c: Currency);
begin
{$IFDEF Endian_Little}
s.Write(c,8);
{$ELSE}
WriteLRS8BytesReversed(s,@c);
{$ENDIF}
end;
{$endif HASCURRENCY}
{$ifdef HASWIDESTRING}
procedure WriteLRSWideStringContent(s: TStream; const w: WideString);
var
Size: Integer;
begin
Size:=length(w);
if Size=0 then exit;
{$IFDEF Endian_Little}
s.Write(w[1], Size * 2);
{$ELSE}
WriteLRSReversedWords(s,@w[1],Size);
{$ENDIF}
end;
{$endif HASWIDESTRING}
{ TLRSObjectReader } { TLRSObjectReader }
procedure TLRSObjectReader.Read(var Buf; Count: LongInt); procedure TLRSObjectReader.Read(var Buf; Count: LongInt);