Forráskód Böngészése

* Adapt classes to Unicode RTL : Give string/char correct type depending on case

Michael VAN CANNEYT 2 éve
szülő
commit
68db04d89e

+ 19 - 18
rtl/objpas/classes/classes.inc

@@ -1737,13 +1737,13 @@ procedure ObjectBinaryToText(Input, Output: TStream; Encoding: TObjectTextEncodi
 var
   Version: TBinaryObjectReader.TBOVersion;
 
-  procedure OutStr(s: String);
+  procedure OutStr(s: RawByteString);
   begin
     if Length(s) > 0 then
       Output.Write(s[1], Length(s));
   end;
 
-  procedure OutLn(s: String);
+  procedure OutLn(s: RawByteString);
   begin
     OutStr(s + LineEnding);
   end;
@@ -1752,7 +1752,7 @@ var
     UseBytes: boolean = false);
 
   var
-    res, NewStr: String;
+    res, NewStr: RawByteString;
     w: Cardinal;
     InString, NewInString: Boolean;
   begin
@@ -1798,7 +1798,7 @@ var
    OutStr(res);
   end;
 
-  procedure OutString(s: String);
+  procedure OutString(s: RawByteString);
   begin
     OutChars(Pointer(S),PAnsiChar(S)+Length(S),@CharToOrd,Encoding=oteLFM);
   end;
@@ -1813,7 +1813,7 @@ var
     OutChars(Pointer(W),pwidechar(W)+Length(W),@WideCharToOrd);
   end;
 
-  procedure OutUtf8Str(s: String);
+  procedure OutUtf8Str(s: RawByteString);
   begin
     if Encoding=oteLFM then
       OutChars(Pointer(S),PAnsiChar(S)+Length(S),@CharToOrd)
@@ -1916,7 +1916,7 @@ var
   end;
 {$endif}
 
-  function ReadSStr: String;
+  function ReadSStr: RawByteString;
   var
     len: Byte;
   begin
@@ -1926,7 +1926,7 @@ var
       Input.ReadBuffer(Result[1], len);
   end;
 
-  function ReadLStr: String;
+  function ReadLStr: RawByteString;
   var
     len: DWord;
   begin
@@ -1974,15 +1974,15 @@ var
     end;
   end;
 
-  procedure ReadPropList(indent: String);
+  procedure ReadPropList(indent: RawByteString);
 
-    procedure ProcessValue(ValueType: TValueType; Indent: String);
+    procedure ProcessValue(ValueType: TValueType; Indent: RawByteString);
 
       procedure ProcessBinary;
       var
         ToDo, DoNow, i: LongInt;
         lbuf: array[0..31] of Byte;
-        s: String;
+        s: RawByteString;
       begin
         ToDo := ReadDWord;
         OutLn('{');
@@ -2000,7 +2000,7 @@ var
       end;
 
     var
-      s: String;
+      s: RawByteString;
 {      len: LongInt; }
       IsFirst: Boolean;
 {$ifndef FPUNONE}
@@ -2107,10 +2107,10 @@ var
     end;
   end;
 
-  procedure ReadObject(indent: String);
+  procedure ReadObject(indent: RawByteString);
   var
     b: Byte;
-    ObjUnitName, ObjClassName, ObjName: String;
+    ObjUnitName, ObjClassName, ObjName: RawByteString;
     ChildPos: LongInt;
     ValueType: TValueType;
     p: SizeInt;
@@ -2266,7 +2266,8 @@ var
   end;
 {$endif}
 
-  procedure WriteSString(const s: String);
+  procedure WriteSString(const s: RawByteString);
+
   var size : byte;
   begin
     if length(s)>255 then size:=255
@@ -2276,7 +2277,7 @@ var
       Output.WriteBuffer(s[1], size);
   end;
 
-  procedure WriteLString(Const s: String);
+  procedure WriteLString(Const s: RawByteString);
   begin
     WriteDWord(Length(s));
     if Length(s) > 0 then
@@ -2356,7 +2357,7 @@ var
 {$ifndef FPUNONE}
     flt: Extended;
 {$endif}
-    s: String;
+    s: RawByteString;
     stream: TMemoryStream;
   begin
     case parser.Token of
@@ -2486,7 +2487,7 @@ var
 
   procedure ProcessProperty;
   var
-    name: String;
+    name: RawByteString;
   begin
     // Get name of property
     parser.CheckToken(toSymbol);
@@ -2507,7 +2508,7 @@ var
   procedure ProcessObject(Root: boolean);
   var
     Flags: Byte;
-    ObjectName, ObjUnitName, ObjClassName: String;
+    ObjectName, ObjUnitName, ObjClassName: RawByteString;
     ChildPos: Integer;
   begin
     if parser.TokenSymbolIs('OBJECT') then

+ 50 - 52
rtl/objpas/classes/classesh.inc

@@ -13,16 +13,13 @@
 
  **********************************************************************}
 
-{$H+}
-
-
 {$ifdef CLASSESINLINE}{$inline on}{$endif}
 
 
 type
    { extra types to compile with FPC }
    HRSRC =  TFPResourceHandle deprecated;
-   TComponentName = string;
+   TComponentName = type string;
    THandle = System.THandle;
 
    TPoint=Types.TPoint;
@@ -77,12 +74,12 @@ const
 
 { TParser special tokens }
 
-  toEOF     = AnsiChar(0);
-  toSymbol  = AnsiChar(1);
-  toString  = AnsiChar(2);
-  toInteger = AnsiChar(3);
-  toFloat   = AnsiChar(4);
-  toWString = AnsiChar(5);
+  toEOF     = Char(0);
+  toSymbol  = Char(1);
+  toString  = Char(2);
+  toInteger = Char(3);
+  toFloat   = Char(4);
+  toWString = Char(5);
 
 Const
   FilerSignature : Array[1..4] of Ansichar = 'TPF0';
@@ -624,9 +621,9 @@ type
     FMissingNameValueSeparatorAction: TMissingNameValueSeparatorAction;
     FSpecialCharsInited : boolean;
     FAlwaysQuote: Boolean;
-    FQuoteChar : AnsiChar;
-    FDelimiter : AnsiChar;
-    FNameValueSeparator : AnsiChar;
+    FQuoteChar : Char;
+    FDelimiter : Char;
+    FNameValueSeparator : Char;
     FUpdateCount: Integer;
     FAdapter: IStringsAdapter;
     FLBS : TTextLineBreakStyle;
@@ -654,19 +651,19 @@ type
     procedure SetUseLocale(AValue: Boolean);
     procedure SetWriteBOM(AValue: Boolean);
     procedure SetValue(const Name, Value: string);
-    procedure SetDelimiter(c:AnsiChar);
-    procedure SetQuoteChar(c:AnsiChar);
-    procedure SetNameValueSeparator(c:AnsiChar);
+    procedure SetDelimiter(c:Char);
+    procedure SetQuoteChar(c:Char);
+    procedure SetNameValueSeparator(c:Char);
     procedure WriteData(Writer: TWriter);
     procedure DoSetTextStr(const Value: string; DoClear : Boolean);
-    Function GetDelimiter : AnsiChar;
-    Function GetNameValueSeparator : AnsiChar;
-    Function GetQuoteChar: AnsiChar;
+    Function GetDelimiter : Char;
+    Function GetNameValueSeparator : Char;
+    Function GetQuoteChar: Char;
     Function GetLineBreak : String;
     procedure SetLineBreak(const S : String);
     Function GetSkipLastLineBreak : Boolean;
     procedure SetSkipLastLineBreak(const AValue : Boolean);
-    Procedure DoSetDelimitedText(const AValue: string; DoClear,aStrictDelimiter : Boolean; aQuoteChar,aDelimiter : AnsiChar);
+    Procedure DoSetDelimitedText(const AValue: string; DoClear,aStrictDelimiter : Boolean; aQuoteChar,aDelimiter : Char);
   protected
     function CompareStrings(const s1,s2 : string) : Integer; virtual;
     procedure DefineProperties(Filer: TFiler); override;
@@ -716,7 +713,7 @@ type
     procedure SetStrings(TheStrings: array of string); overload; virtual;
     Procedure AddText(Const S : String); virtual;
     procedure AddCommaText(const S: String);
-    procedure AddDelimitedText(const S: String; ADelimiter: AnsiChar; AStrictDelimiter: Boolean); overload;
+    procedure AddDelimitedText(const S: String; ADelimiter: Char; AStrictDelimiter: Boolean); overload;
     procedure AddDelimitedtext(const S: String); overload;
     procedure Append(const S: string);
     procedure Assign(Source: TPersistent); override;
@@ -736,7 +733,7 @@ type
     procedure ForEach(aCallback: TStringsForeachMethodExObj);
     function GetEnumerator: TStringsEnumerator;
     procedure GetNameValue(Index : Integer; Out AName,AValue : String);
-    function GetText: PAnsiChar; virtual;
+    function GetText: PChar; virtual;
     function IndexOf(const S: string): Integer; virtual;
     function IndexOf(const S: string; aStart : Integer): Integer; virtual;
     function IndexOfName(const Name: string): Integer; virtual;
@@ -767,22 +764,22 @@ type
     function Shift : String;
     Procedure Slice(fromIndex: integer; aList : TStrings);
     Function Slice(fromIndex: integer) : TStrings;
-    procedure SetText(TheText: PAnsiChar); virtual;
+    procedure SetText(TheText: PChar); virtual;
     property AlwaysQuote: Boolean read FAlwaysQuote write FAlwaysQuote;
     property Capacity: Integer read GetCapacity write SetCapacity;
     property CommaText: string read GetCommaText write SetCommaText;
     property Count: Integer read GetCount;
     property DefaultEncoding: TEncoding read FDefaultEncoding write SetDefaultEncoding;
     property DelimitedText: string read GetDelimitedText write SetDelimitedText;
-    property Delimiter: AnsiChar read GetDelimiter write SetDelimiter;
+    property Delimiter: Char read GetDelimiter write SetDelimiter;
     property Encoding: TEncoding read FEncoding;
     property LineBreak : string Read GetLineBreak write SetLineBreak;
     Property MissingNameValueSeparatorAction : TMissingNameValueSeparatorAction Read GetMissingNameValueSeparatorAction Write SetMissingNameValueSeparatorAction;
     property Names[Index: Integer]: string read GetName;
-    Property NameValueSeparator : AnsiChar Read GetNameValueSeparator Write SetNameValueSeparator;
+    Property NameValueSeparator : Char Read GetNameValueSeparator Write SetNameValueSeparator;
     property Objects[Index: Integer]: TObject read GetObject write PutObject;
     property Options: TStringsOptions read FOptions write FOptions;
-    property QuoteChar: AnsiChar read GetQuoteChar write SetQuoteChar;
+    property QuoteChar: Char read GetQuoteChar write SetQuoteChar;
     Property SkipLastLineBreak : Boolean Read GetSkipLastLineBreak Write SetSkipLastLineBreak;
     // Same as SkipLastLineBreak but for Delphi compatibility. Note it has opposite meaning.
     Property TrailingLineBreak : Boolean Read GetTrailingLineBreak Write SetTrailingLineBreak;
@@ -1265,10 +1262,11 @@ type
   protected
   public
     constructor Create(const ABytes: TBytes); override; overload;
-    constructor Create(const AString: string = ''); overload;
+    constructor Create; overload;
+    constructor Create(const AString: AnsiString); overload;
     constructor CreateRaw(const AString: RawByteString); overload;
-    constructor Create(const AString: string; AEncoding: TEncoding; AOwnsEncoding: Boolean = True); overload;
-    constructor Create(const AString: string; ACodePage: Integer); overload;
+    constructor Create(const AString: Ansistring; AEncoding: TEncoding; AOwnsEncoding: Boolean = True); overload;
+    constructor Create(const AString: Ansistring; ACodePage: Integer); overload;
     // UnicodeString versions
     constructor Create(const AString: UnicodeString); overload;
     constructor Create(const AString: UnicodeString; AEncoding: TEncoding; AOwnsEncoding: Boolean = True); overload;
@@ -1420,15 +1418,15 @@ type
     function ReadDate: TDateTime; virtual; abstract;
 {$endif}
     function ReadCurrency: Currency; virtual; abstract;
-    function ReadIdent(ValueType: TValueType): String; virtual; abstract;
+    function ReadIdent(ValueType: TValueType): RawByteString; virtual; abstract;
     function ReadInt8: ShortInt; virtual; abstract;
     function ReadInt16: SmallInt; virtual; abstract;
     function ReadInt32: LongInt; virtual; abstract;
     function ReadInt64: Int64; virtual; abstract;
     function ReadSet(EnumType: Pointer): Integer; virtual; abstract;
     procedure ReadSignature; virtual; abstract;
-    function ReadStr: String; virtual; abstract;
-    function ReadString(StringType: TValueType): String; virtual; abstract;
+    function ReadStr: RawByteString; virtual; abstract;
+    function ReadString(StringType: TValueType): RawByteString; virtual; abstract;
     function ReadWideString: WideString;virtual;abstract;
     function ReadUnicodeString: UnicodeString;virtual;abstract;
     procedure SkipComponent(SkipComponentInfos: Boolean); virtual; abstract;
@@ -1485,15 +1483,15 @@ type
     function ReadDate: TDateTime; override;
 {$endif}
     function ReadCurrency: Currency; override;
-    function ReadIdent(ValueType: TValueType): String; override;
+    function ReadIdent(ValueType: TValueType): RawByteString; override;
     function ReadInt8: ShortInt; override;
     function ReadInt16: SmallInt; override;
     function ReadInt32: LongInt; override;
     function ReadInt64: Int64; override;
     function ReadSet(EnumType: Pointer): Integer; override;
     procedure ReadSignature; override;
-    function ReadStr: String; override;
-    function ReadString(StringType: TValueType): String; override;
+    function ReadStr: RawByteString; override;
+    function ReadString(StringType: TValueType): RawByteString; override;
     function ReadWideString: WideString;override;
     function ReadUnicodeString: UnicodeString;override;
     procedure SkipComponent(SkipComponentInfos: Boolean); override;
@@ -1550,21 +1548,21 @@ type
     FOnPropertyNotFound: TPropertyNotFoundEvent;
     FOnFindComponentClass: TFindComponentClassEvent;
     FOnCreateComponent: TCreateComponentEvent;
-    FPropName: string;
+    FPropName: rawbytestring;
     FCanHandleExcepts: Boolean;
     FOnReadStringProperty:TReadWriteStringPropertyEvent;
     procedure DoFixupReferences;
-    function FindComponentClass(const AName, anUnitName, AClassName: string): TComponentClass;
+    function FindComponentClass(const AName, anUnitName, AClassName: rawbytestring): TComponentClass;
     procedure Lock;
     procedure Unlock;
   protected
     function Error(const Message: string): Boolean; virtual;
-    function FindMethod(ARoot: TComponent; const AMethodName: string): CodePointer; virtual;
+    function FindMethod(ARoot: TComponent; const AMethodName: rawbytestring): CodePointer; virtual;
     procedure ReadProperty(AInstance: TPersistent);
     procedure ReadPropValue(Instance: TPersistent; PropInfo: Pointer);
     procedure PropertyError;
     procedure ReadData(Instance: TComponent);
-    property PropName: string read FPropName;
+    property PropName: rawbytestring read FPropName;
     property CanHandleExceptions: Boolean read FCanHandleExcepts;
     function CreateDriver(Stream: TStream; BufSize: Integer): TAbstractObjectReader; virtual;
   public
@@ -1601,7 +1599,7 @@ type
     function ReadDate: TDateTime;
 {$endif}
     function ReadCurrency: Currency;
-    function ReadIdent: string;
+    function ReadIdent: rawbytestring;
     function ReadInteger: Longint;
     function ReadInt64: Int64;
     function ReadSet(EnumType: Pointer): Integer;
@@ -1610,7 +1608,7 @@ type
     function ReadRootComponent(ARoot: TComponent): TComponent;
     function ReadVariant: Variant;
     procedure ReadSignature;
-    function ReadString: string;
+    function ReadString: RawBytestring;
     function ReadWideString: WideString;
     function ReadUnicodeString: UnicodeString;
     function ReadValue: TValueType;
@@ -1669,7 +1667,7 @@ type
     procedure WriteVariant(const Value: Variant); virtual; abstract;
     procedure WriteMethodName(const Name: String); virtual; abstract;
     procedure WriteSet(Value: LongInt; SetType: Pointer); virtual; abstract;
-    procedure WriteString(const Value: String); virtual; abstract;
+    procedure WriteString(const Value: RawByteString); virtual; abstract;
     procedure WriteWideString(const Value: WideString);virtual;abstract;
     procedure WriteUnicodeString(const Value: UnicodeString);virtual;abstract;
   end;
@@ -1719,8 +1717,8 @@ type
     procedure WriteUInt64(Value: QWord); override;
     procedure WriteMethodName(const Name: String); override;
     procedure WriteSet(Value: LongInt; SetType: Pointer); override;
-    procedure WriteStr(const Value: String); // write shortstring
-    procedure WriteString(const Value: String); override;
+    procedure WriteStr(const Value: RawByteString); // write shortstring
+    procedure WriteString(const Value: RawByteString); override;
     procedure WriteWideString(const Value: WideString); override;
     procedure WriteUnicodeString(const Value: UnicodeString); override;
     procedure WriteVariant(const VarValue: Variant);override;
@@ -1815,17 +1813,17 @@ type
   TParser = class(TObject)
   private
     fStream : TStream;
-    fBuf : PAnsiChar;
+    fBuf : PChar;
     fBufLen : integer;
     fPos : integer;
     fDeltaPos : integer;
-    fFloatType : AnsiChar;
+    fFloatType : Char;
     fSourceLine : integer;
-    fToken : AnsiChar;
+    fToken : Char;
     fEofReached : boolean;
     fLastTokenStr : string;
     fLastTokenWStr : widestring;
-    function GetTokenName(aTok : AnsiChar) : string;
+    function GetTokenName(aTok : Char) : string;
     procedure LoadBuffer;
     procedure CheckLoadBuffer; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
     procedure ProcessChar; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
@@ -1852,13 +1850,13 @@ type
   public
     constructor Create(Stream: TStream);
     destructor Destroy; override;
-    procedure CheckToken(T: AnsiChar);
+    procedure CheckToken(T: Char);
     procedure CheckTokenSymbol(const S: string);
     procedure Error(const Ident: string);
     procedure ErrorFmt(const Ident: string; const Args: array of const);
     procedure ErrorStr(const Message: string);
     procedure HexToBinary(Stream: TStream);
-    function NextToken: AnsiChar;
+    function NextToken: Char;
     function SourcePos: Longint;
     function TokenComponentIdent: string;
 {$ifndef FPUNONE}
@@ -1868,9 +1866,9 @@ type
     function TokenString: string;
     function TokenWideString: WideString;
     function TokenSymbolIs(const S: string): Boolean;
-    property FloatType: AnsiChar read fFloatType;
+    property FloatType: Char read fFloatType;
     property SourceLine: Integer read fSourceLine;
-    property Token: AnsiChar read fToken;
+    property Token: Char read fToken;
   end;
 
 { TThread }

+ 3 - 3
rtl/objpas/classes/parser.inc

@@ -37,7 +37,7 @@ const
     'WideString'
   );
 
-function TParser.GetTokenName(aTok: AnsiChar): string;
+function TParser.GetTokenName(aTok: Char): string;
 begin
   if ord(aTok) <= LastSpecialToken then
     Result:=TokNames[ord(aTok)]
@@ -375,7 +375,7 @@ begin
   FreeMem(fBuf);
 end;
 
-procedure TParser.CheckToken(T: AnsiChar);
+procedure TParser.CheckToken(T: Char);
 begin
   if fToken<>T then
     ErrorFmt(SParWrongTokenType,[GetTokenName(T),GetTokenName(fToken)]);
@@ -434,7 +434,7 @@ begin
   NextToken;
 end;
 
-function TParser.NextToken: AnsiChar;
+function TParser.NextToken: Char;
 
 begin
   SkipWhiteSpace;

+ 35 - 17
rtl/objpas/classes/reader.inc

@@ -272,7 +272,7 @@ begin
 end;
 {$endif}
 
-function TBinaryObjectReader.ReadIdent(ValueType: TValueType): String;
+function TBinaryObjectReader.ReadIdent(ValueType: TValueType): RawByteString;
 var
   i: Byte;
 begin
@@ -354,7 +354,7 @@ begin
     raise EReadError.Create(SInvalidImage);
 end;
 
-function TBinaryObjectReader.ReadStr: String;
+function TBinaryObjectReader.ReadStr: RawByteString;
 var
   i: Byte;
 begin
@@ -364,7 +364,7 @@ begin
     Read(Pointer(@Result[1])^, i);
 end;
 
-function TBinaryObjectReader.ReadString(StringType: TValueType): String;
+function TBinaryObjectReader.ReadString(StringType: TValueType): RawByteString;
 var
   b: Byte;
   i: Integer;
@@ -755,7 +755,7 @@ begin
     FOnError(Self, Message, Result);
 end;
 
-function TReader.FindMethod(ARoot: TComponent; const AMethodName: string
+function TReader.FindMethod(ARoot: TComponent; const AMethodName: RawBytestring
   ): CodePointer;
 var
   ErrorResult: Boolean;
@@ -1151,7 +1151,7 @@ begin
 end;
 {$endif}
 
-function TReader.ReadIdent: string;
+function TReader.ReadIdent: rawbytestring;
 var
   ValueType: TValueType;
 begin
@@ -1285,7 +1285,7 @@ end;
 
 procedure TReader.ReadProperty(AInstance: TPersistent);
 var
-  Path: String;
+  Path: RawByteString;
   Instance: TPersistent;
   DotPos, NextPos: PAnsiChar;
   PropInfo: PPropInfo;
@@ -1296,17 +1296,25 @@ var
   OldPropName: String;
 
   function HandleMissingProperty(IsPath: Boolean): boolean;
+
+  Var
+    lPropName : String;
+
   begin
     Result:=true;
     if Assigned(OnPropertyNotFound) then begin
       // user defined property error handling
       OldPropName:=FPropName;
+      lPropName:=FPropName;
       Handled:=false;
       Skip:=false;
-      OnPropertyNotFound(Self,Instance,FPropName,IsPath,Handled,Skip);
-      if Handled and (not Skip) and (OldPropName<>FPropName) then
+      OnPropertyNotFound(Self,Instance,lPropName,IsPath,Handled,Skip);
+      if Handled and (not Skip) and (OldPropName<>lPropName) then
         // try alias property
+        begin
+        FPropName:=lPropName;
         PropInfo := GetPropInfo(Instance.ClassInfo, FPropName);
+        end;
       if Skip then begin
         FDriver.SkipValue;
         Result:=false;
@@ -1397,10 +1405,12 @@ var
   PropType: PTypeInfo;
   Value: LongInt;
 {  IdentToIntFn: TIdentToInt; }
-  Ident: String;
+  Ident: RawByteString;
   Method: TMethod;
   Handled: Boolean;
   TmpStr: String;
+  uTmpStr : UnicodeString;
+
 begin
   if not Assigned(PPropInfo(PropInfo)^.SetProc) then
     raise EReadError.Create(SReadOnlyProperty);
@@ -1467,7 +1477,14 @@ begin
         SetStrProp(Instance, PropInfo, TmpStr);
       end;
     tkUstring:
-      SetUnicodeStrProp(Instance,PropInfo,ReadUnicodeString);
+      begin
+        uTmpStr:=ReadUnicodeString;
+{$IFDEF UNICODERTL}
+        if Assigned(FOnReadStringProperty) then
+          FOnReadStringProperty(Self,Instance,PropInfo,uTmpStr);
+{$ENDIF}
+        SetUnicodeStrProp(Instance,PropInfo,uTmpStr);
+      end;
     tkWString:
       SetWideStrProp(Instance,PropInfo,ReadWideString);
     tkVariant:
@@ -1611,7 +1628,8 @@ begin
 end;
 
 
-function TReader.ReadString: string;
+function TReader.ReadString: rawbytestring;
+
 var
   StringType: TValueType;
 begin
@@ -1620,12 +1638,12 @@ begin
     begin
       Result := FDriver.ReadString(StringType);
       if (StringType=vaUTF8String) then
-        Result:=string(utf8Decode(Result));
+        Result:=rawbytestring(utf8Decode(Result));
     end
   else if StringType in [vaWString] then
-    Result:= string(FDriver.ReadWidestring)
+    Result:= rawbytestring(FDriver.ReadWidestring)
   else if StringType in [vaUString] then
-    Result:= string(FDriver.ReadUnicodeString)
+    Result:= rawbytestring(FDriver.ReadUnicodeString)
   else
     raise EReadError.Create(SInvalidPropertyValue);
 end;
@@ -1633,7 +1651,7 @@ end;
 
 function TReader.ReadWideString: WideString;
 var
- s: String;
+ s: RawByteString;
  i: Integer;
  vt:TValueType;
 begin
@@ -1660,7 +1678,7 @@ end;
 
 function TReader.ReadUnicodeString: UnicodeString;
 var
- s: String;
+ s: RawByteString;
  i: Integer;
  vt:TValueType;
 begin
@@ -1764,7 +1782,7 @@ begin
   end;
 end;
 
-function TReader.FindComponentClass(const AName, anUnitName, AClassName: string
+function TReader.FindComponentClass(const AName, anUnitName, AClassName: rawbytestring
   ): TComponentClass;
 
 var

+ 16 - 5
rtl/objpas/classes/streams.inc

@@ -1646,12 +1646,17 @@ begin
   Result:=FEncoding.GetString(Bytes, 0, Size);
 end;
 
-constructor TStringStream.Create(const AString: string = '');
+constructor TStringStream.Create(const AString: AnsiString);
 
 begin
   Create(AString,TEncoding.Default, False);
 end;
 
+constructor TStringStream.Create();
+begin
+  Create([]);
+end;
+
 constructor TStringStream.Create(const ABytes: TBytes);
 begin
   inherited Create(ABytes);
@@ -1875,10 +1880,16 @@ procedure TResourceStream.Initialize(Instance: TFPResourceHMODULE; Name, ResType
   end;
 
 constructor TResourceStream.Create(Instance: TFPResourceHMODULE; const ResName: string; ResType: PAnsiChar);
-  begin
-    inherited create;
-    Initialize(Instance,PAnsiChar(ResName),ResType,False);
-  end;
+
+Var
+  S : AnsiString {$IF SIZEOF(CHAR)=1} absolute Resname {$endif} ;
+
+begin
+  inherited create;
+  // fpcres seems to use default translations...
+  {$IF SIZEOF(CHAR)=2}S:=ResName;{$endif}
+  Initialize(Instance,PAnsiChar(S),ResType,False);
+end;
 constructor TResourceStream.CreateFromID(Instance: TFPResourceHMODULE; ResID: Integer; ResType: PAnsiChar);
   begin
     inherited create;

+ 40 - 28
rtl/objpas/classes/stringl.inc

@@ -105,7 +105,7 @@ begin
   FLBS:=AValue;
 end;
 
-procedure TStrings.SetDelimiter(c:AnsiChar);
+procedure TStrings.SetDelimiter(c:Char);
 begin
   CheckSpecialChars;
   FDelimiter:=c;
@@ -124,7 +124,7 @@ begin
     FEncoding:=nil;
 end;
 
-Function TStrings.GetDelimiter : AnsiChar;
+Function TStrings.GetDelimiter : Char;
 begin
   CheckSpecialChars;
   Result:=FDelimiter;
@@ -143,19 +143,19 @@ begin
 end;
 
 
-procedure TStrings.SetQuoteChar(c:AnsiChar);
+procedure TStrings.SetQuoteChar(c:Char);
 begin
   CheckSpecialChars;
   FQuoteChar:=c;
 end;
 
-Function TStrings.GetQuoteChar :AnsiChar;
+Function TStrings.GetQuoteChar : Char;
 begin
   CheckSpecialChars;
   Result:=FQuoteChar;
 end;
 
-procedure TStrings.SetNameValueSeparator(c:AnsiChar);
+procedure TStrings.SetNameValueSeparator(c:Char);
 begin
   CheckSpecialChars;
   FNameValueSeparator:=c;
@@ -163,7 +163,7 @@ end;
 
 
 
-Function TStrings.GetNameValueSeparator :AnsiChar;
+Function TStrings.GetNameValueSeparator : Char;
 begin
   CheckSpecialChars;
   Result:=FNameValueSeparator;
@@ -173,7 +173,7 @@ end;
 function TStrings.GetCommaText: string;
 
 Var
-  C1,C2 : AnsiChar;
+  C1,C2 : Char;
   FSD : Boolean;
 
 begin
@@ -217,30 +217,34 @@ Function TStrings.GetDelimitedText: string;
 
 Var
   I : integer;
-  p : PAnsiChar;
-  BreakChars : set of AnsiChar;
+  Pend,P : PChar;
   S : String;
   doQuote : Boolean;
-    
+
+  Function IsBreakChar(C : Char) : Boolean;
+
+  begin
+    Result:=(C=QuoteChar) or (C=Delimiter) or (C=#0);
+    if Not StrictDelimiter then
+      Result:=Result or (Ord(C)<=Ord(' '));
+  end;
+
 begin
   CheckSpecialChars;
   result:='';
-  if StrictDelimiter then
-    BreakChars:=[#0,QuoteChar,Delimiter]
-  else  
-    BreakChars:=[#0..' ',QuoteChar,Delimiter];
   // Check for break characters and quote if required.
   For i:=0 to count-1 do
     begin
     S:=Strings[i];
+    PEnd:=PChar(S)+length(S)*SizeOf(Char);
     doQuote:=FAlwaysQuote;
     If not DoQuote then
       begin
-      p:=PAnsiChar(S);
+      p:=PChar(S);
       //Quote strings that include BreakChars:
-      while not(p^ in BreakChars) do
+      while not IsBreakChar(p^) do
         inc(p);
-      DoQuote:=(p<>PAnsiChar(S)+length(S));  
+      DoQuote:=(p^<>#0);
       end;
     if DoQuote and (QuoteChar<>#0) then
       Result:=Result+QuoteString(S,QuoteChar)
@@ -535,7 +539,7 @@ begin
   DoSetDelimitedText(aValue,True,StrictDelimiter,FQuoteChar,FDelimiter);
 end;
 
-Procedure TStrings.DoSetDelimitedText(const AValue: string; DoClear,aStrictDelimiter : Boolean; aQuoteChar,aDelimiter : AnsiChar);
+Procedure TStrings.DoSetDelimitedText(const AValue: string; DoClear,aStrictDelimiter : Boolean; aQuoteChar,aDelimiter : Char);
 
 var
   len,i,j: SizeInt;
@@ -773,7 +777,7 @@ end;
 
 Function TStrings.GetTextStr: string;
 
-Var P : PAnsiChar;
+Var P : PChar;
     I,L,NLS : SizeInt;
     S,NL : String;
 
@@ -793,8 +797,8 @@ begin
     S:=Strings[I];
     L:=Length(S);
     if L<>0 then
-      System.Move(Pointer(S)^,P^,L);
-    P:=P+L;
+      System.Move(Pointer(S)^,P^,L*SizeOf(Char));
+    Inc(P,L);
     if (I<Count-1) or Not SkipLastLineBreak then
       For L:=1 to NLS do
         begin
@@ -858,7 +862,7 @@ begin
     System.Delete(S, FuturePos, High(FuturePos))
   else
     begin
-    SetString(S, @Value[StartPos], FuturePos - StartPos);
+    SetString(S, PChar(@Value[StartPos]), FuturePos - StartPos);
     if (FuturePos <= LengthOfValue) and (Value[FuturePos] = #13) then
       Inc(FuturePos);
     if (FuturePos <= LengthOfValue) and (Value[FuturePos] = #10) then
@@ -967,7 +971,7 @@ begin
   DoSetDelimitedText(S,False,StrictDelimiter,'"',',');
 end;
 
-procedure TStrings.AddDelimitedText(const S: String; ADelimiter: AnsiChar; AStrictDelimiter: Boolean);
+procedure TStrings.AddDelimitedText(const S: String; ADelimiter: Char; AStrictDelimiter: Boolean);
 
 begin
   CheckSpecialChars;
@@ -1253,9 +1257,9 @@ begin
 end;
 
 
-Function TStrings.GetText: PAnsiChar;
+Function TStrings.GetText: PChar;
 begin
-  Result:=StrNew(PAnsiChar(Self.Text));
+  Result:=StrNew(PChar(Self.Text));
 end;
 
 
@@ -1581,13 +1585,13 @@ begin
     Exit;
     end;
   NL:=GetLineBreakCharLBS;
-  NLS:=Length(NL)*SizeOf(AnsiChar);
+  NLS:=Length(NL)*SizeOf(Char);
   For i:=0 To count-1 do
     begin
     S:=Strings[I];
     L:=Length(S);
     if L<>0 then
-      Stream.WriteBuffer(S[1], L*SizeOf(AnsiChar));
+      Stream.WriteBuffer(S[1], L*SizeOf(Char));
     if (I<Count-1) or Not SkipLastLineBreak then
       Stream.WriteBuffer(NL[1], NLS);
     end;
@@ -1613,14 +1617,22 @@ begin
     end;
 
   NL := GetLineBreakCharLBS;
+{$if sizeof(char)=1}
   BNL:=AEncoding.GetAnsiBytes(NL);
+{$else}
+  BNL:=AEncoding.GetBytes(NL);
+{$endif}
   BNLS:=Length(BNL);
   For i:=0 To count-1 do
     begin
     S:=Strings[I];
     if S<>'' then
       begin
+      {$if sizeof(char)=1}
       B:=AEncoding.GetAnsiBytes(S);
+      {$else}
+      B:=AEncoding.GetBytes(S);
+      {$endif}
       Stream.WriteBuffer(B[0],Length(B));
       end;
     if (I<Count-1) or Not SkipLastLineBreak then
@@ -1631,7 +1643,7 @@ end;
 
 
 
-Procedure TStrings.SetText(TheText: PAnsiChar);
+Procedure TStrings.SetText(TheText: PChar);
 
 Var S : String;
 

+ 2 - 2
rtl/objpas/classes/writer.inc

@@ -310,7 +310,7 @@ begin
   WriteStr('');
 end;
 
-procedure TBinaryObjectWriter.WriteString(const Value: String);
+procedure TBinaryObjectWriter.WriteString(const Value: RawByteString);
 var
   i: Integer;
   b: byte;
@@ -464,7 +464,7 @@ begin
   Write(b, 1);
 end;
 
-procedure TBinaryObjectWriter.WriteStr(const Value: String);
+procedure TBinaryObjectWriter.WriteStr(const Value: RawByteString);
 var
   i: integer;
   b: byte;