mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-28 11:10:33 +02:00
* Better Ansi/WideString support for TStream. Fix StringStream with unicode to be delphi compatible
This commit is contained in:
parent
885a265edb
commit
ec65ed9e64
@ -1131,12 +1131,14 @@ type
|
||||
function ReadWord : Word;
|
||||
function ReadDWord : Cardinal;
|
||||
function ReadQWord : QWord;
|
||||
function ReadAnsiString : String;
|
||||
function ReadAnsiString : AnsiString;
|
||||
function ReadUnicodeString : WideString;
|
||||
procedure WriteByte(b : Byte);
|
||||
procedure WriteWord(w : Word);
|
||||
procedure WriteDWord(d : Cardinal);
|
||||
procedure WriteQWord(q : QWord);
|
||||
Procedure WriteAnsiString (const S : String); virtual;
|
||||
Procedure WriteAnsiString (const S : AnsiString); virtual;
|
||||
Procedure WriteUnicodeString (const S : UnicodeString); virtual;
|
||||
property Position: Int64 read GetPosition write SetPosition;
|
||||
property Size: Int64 read GetSize write SetSize64;
|
||||
end;
|
||||
@ -1257,7 +1259,8 @@ type
|
||||
private
|
||||
FEncoding: TEncoding;
|
||||
FOwnsEncoding : Boolean;
|
||||
function GetDataString: string;
|
||||
function GetAnsiDataString: AnsiString;
|
||||
function GetDataString: RTLString;
|
||||
function GetUnicodeDataString: UnicodeString;
|
||||
protected
|
||||
public
|
||||
@ -1277,7 +1280,8 @@ type
|
||||
procedure WriteAnsiString(const AString: AnsiString); override;
|
||||
function ReadString(Count: Longint): string;
|
||||
procedure WriteString(const AString: string);
|
||||
property DataString: string read GetDataString;
|
||||
property DataString: RTLString read GetDataString;
|
||||
Property AnsiDataString : AnsiString Read GetAnsiDataString;
|
||||
Property UnicodeDataString : UnicodeString Read GetUnicodeDataString;
|
||||
Property OwnsEncoding : Boolean Read FOwnsEncoding;
|
||||
Property Encoding : TEncoding Read FEncoding;
|
||||
|
@ -1218,7 +1218,7 @@ end;
|
||||
|
||||
end;
|
||||
|
||||
function TStream.ReadAnsiString: String;
|
||||
function TStream.ReadAnsiString: AnsiString;
|
||||
|
||||
Var
|
||||
TheSize : Longint;
|
||||
@ -1236,7 +1236,24 @@ end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TStream.WriteAnsiString(const S: String);
|
||||
function TStream.ReadUnicodeString: WideString;
|
||||
Var
|
||||
TheSize : Longint;
|
||||
P : PByte ;
|
||||
begin
|
||||
Result:='';
|
||||
ReadBuffer (TheSize,SizeOf(TheSize));
|
||||
SetLength(Result,TheSize);
|
||||
// Illegal typecast if no AnsiStrings defined.
|
||||
if TheSize>0 then
|
||||
begin
|
||||
ReadBuffer (Pointer(Result)^,TheSize*SizeOf(unicodeChar));
|
||||
P:=Pointer(Result)+TheSize*SizeOf(UnicodeChar);
|
||||
PWord(p)^:=0;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TStream.WriteAnsiString(const S: AnsiString);
|
||||
|
||||
Var L : Longint;
|
||||
|
||||
@ -1246,6 +1263,15 @@ end;
|
||||
WriteBuffer (Pointer(S)^,L);
|
||||
end;
|
||||
|
||||
procedure TStream.WriteUnicodeString(const S: UnicodeString);
|
||||
Var L : Longint;
|
||||
|
||||
begin
|
||||
L:=Length(S);
|
||||
WriteBuffer (L,SizeOf(L));
|
||||
WriteBuffer (Pointer(S)^,L*SizeOf(UnicodeChar));
|
||||
end;
|
||||
|
||||
procedure TStream.WriteByte(b : Byte);
|
||||
|
||||
begin
|
||||
@ -1601,7 +1627,16 @@ end;
|
||||
{* TStringStream *}
|
||||
{****************************************************************************}
|
||||
|
||||
function TStringStream.GetDataString: string;
|
||||
function TStringStream.GetDataString: RTLString;
|
||||
begin
|
||||
{$IF SIZEOF(CHAR)=1}
|
||||
Result:=GetAnsiDataString;
|
||||
{$ELSE}
|
||||
Result:=GetUnicodeDataString;
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
function TStringStream.GetAnsiDataString: AnsiString;
|
||||
begin
|
||||
Result:=FEncoding.GetAnsiString(Bytes,0,Size);
|
||||
end;
|
||||
@ -1644,21 +1679,30 @@ begin
|
||||
inherited Create(BytesOf(AString));
|
||||
end;
|
||||
|
||||
<<<<<<< HEAD
|
||||
constructor TStringStream.Create(const AString: string; AEncoding: TEncoding; AOwnsEncoding: Boolean);
|
||||
=======
|
||||
constructor TStringStream.Create(const AString: Ansistring;
|
||||
AEncoding: TEncoding; AOwnsEncoding: Boolean);
|
||||
>>>>>>> be8e86f382 (* Better Ansi/WideString support for TStream. Fix StringStream with unicode to be delphi compatible)
|
||||
begin
|
||||
FOwnsEncoding:=AOwnsEncoding and not TEncoding.IsStandardEncoding(AEncoding);
|
||||
FEncoding:=AEncoding;
|
||||
Inherited Create(AEncoding.GetAnsiBytes(AString));
|
||||
end;
|
||||
|
||||
<<<<<<< HEAD
|
||||
constructor TStringStream.Create(const AString: string; ACodePage: Integer);
|
||||
=======
|
||||
constructor TStringStream.Create(const AString: Ansistring; ACodePage: Integer);
|
||||
>>>>>>> be8e86f382 (* Better Ansi/WideString support for TStream. Fix StringStream with unicode to be delphi compatible)
|
||||
begin
|
||||
Create(AString,TEncoding.GetEncoding(ACodePage),true);
|
||||
end;
|
||||
|
||||
constructor TStringStream.Create(const AString: UnicodeString);
|
||||
begin
|
||||
Create(AString,TEncoding.Unicode,false);
|
||||
Create(AString,TEncoding.Default,false);
|
||||
end;
|
||||
|
||||
constructor TStringStream.Create(const AString: UnicodeString; AEncoding: TEncoding; AOwnsEncoding: Boolean);
|
||||
|
Loading…
Reference in New Issue
Block a user