Browse Source

* PChar -> PAnsiChar

Michaël Van Canneyt 2 years ago
parent
commit
945446b06a

+ 45 - 45
packages/pastojs/src/fppas2js.pp

@@ -1,4 +1,5 @@
-{
+{ **********************************************************************
+
     This file is part of the Free Component Library (FCL)
     This file is part of the Free Component Library (FCL)
     Copyright (c) 2020 by Michael Van Canneyt
     Copyright (c) 2020 by Michael Van Canneyt
 
 
@@ -46,17 +47,17 @@ Works:
   - FuncName:=, auto rename lower lvl Result variables
   - FuncName:=, auto rename lower lvl Result variables
   - var modifier 'absolute' for local vars
   - var modifier 'absolute' for local vars
 - assign statements
 - assign statements
-- char
+- AnsiChar
   - literals
   - literals
-  - ord(char)  ->  char.charCodeAt()
+  - ord(AnsiChar)  ->  AnsiChar.charCodeAt()
   - chr(integer)  -> String.fromCharCode(integer)
   - chr(integer)  -> String.fromCharCode(integer)
 - string
 - string
   - literals
   - literals
   - setlength(s,newlen) -> s = rtl.strSetLength(s,newlen)
   - setlength(s,newlen) -> s = rtl.strSetLength(s,newlen)
-  - read and write char aString[]
+  - read and write AnsiChar aString[]
   - allow only String, no ShortString, AnsiString, UnicodeString,...
   - allow only String, no ShortString, AnsiString, UnicodeString,...
   - allow type casting string to external class name 'String'
   - allow type casting string to external class name 'String'
-- for int/enum do, for char do, for bool do
+- for int/enum do, for AnsiChar do, for bool do
 - repeat..until
 - repeat..until
 - while..do
 - while..do
 - try..finally
 - try..finally
@@ -158,7 +159,7 @@ Works:
   - a := Concat([1,2,3],[4,5,6]);
   - a := Concat([1,2,3],[4,5,6]);
   - copy, concat for static arrays, creating dynamic arrays
   - copy, concat for static arrays, creating dynamic arrays
 - static arrays
 - static arrays
-  - range: enumtype, boolean, int, char, custom int
+  - range: enumtype, boolean, int, AnsiChar, custom int
   - init as arr = rtl.arraySetLength(null,value,dim1,dim2,...)
   - init as arr = rtl.arraySetLength(null,value,dim1,dim2,...)
   - init with expression
   - init with expression
   - length(1-dim array)
   - length(1-dim array)
@@ -184,7 +185,7 @@ Works:
   - low(), high()
   - low(), high()
   - when passing as argument set state referenced
   - when passing as argument set state referenced
   - set of (enum,enum2)  - anonymous enumtype
   - set of (enum,enum2)  - anonymous enumtype
-  - set of char, boolean, integer range, char range, enum range
+  - set of AnsiChar, boolean, integer range, AnsiChar range, enum range
 - with-do  using local var
 - with-do  using local var
   - with record do i:=v;
   - with record do i:=v;
   - with classinstance do begin create; i:=v; f(); i:=a[]; end;
   - with classinstance do begin create; i:=v; f(); i:=a[]; end;
@@ -244,14 +245,14 @@ Works:
   - nested classes
   - nested classes
 - jsvalue
 - jsvalue
   - init as undefined
   - init as undefined
-  - assign to jsvalue := integer, string, boolean, double, char
+  - assign to jsvalue := integer, string, boolean, double, AnsiChar
   - type cast base types to jsvalue
   - type cast base types to jsvalue
   - type cast jsvalue to base type
   - type cast jsvalue to base type
      integer: Math.floor(jsvalue)   may return NaN
      integer: Math.floor(jsvalue)   may return NaN
      boolean: !(jsvalue == false)   works for numbers too 0==false
      boolean: !(jsvalue == false)   works for numbers too 0==false
      double: rtl.getNumber(jsvalue)    typeof(n)=="number"?n:NaN;
      double: rtl.getNumber(jsvalue)    typeof(n)=="number"?n:NaN;
      string: ""+jsvalue
      string: ""+jsvalue
-     char: rtl.getChar(jsvalue)   ((typeof(c)!="string") && (c.length==1)) ? c : ""
+     AnsiChar: rtl.getChar(jsvalue)   ((typeof(c)!="string") && (c.length==1)) ? c : ""
   - enums: assign to jsvalue, typecast jsvalue to enum
   - enums: assign to jsvalue, typecast jsvalue to enum
   - class instance: assign to jsvalue, typecast jsvalue to a class
   - class instance: assign to jsvalue, typecast jsvalue to a class
   - class of: assign to jsvalue, typecast jsvalue to a class-of
   - class of: assign to jsvalue, typecast jsvalue to a class-of
@@ -294,16 +295,16 @@ Works:
 - dotted unit names, namespaces
 - dotted unit names, namespaces
 - resourcestring
 - resourcestring
 - custom ranges
 - custom ranges
-  - enum, int, char
+  - enum, int, AnsiChar
   - low(), high(), pred(), succ(), ord(),
   - low(), high(), pred(), succ(), ord(),
   - rg(int), int(rg), enum:=rg,
   - rg(int), int(rg), enum:=rg,
   - rg:=rg, rg1:=rg2, rg:=enum, =, <>,
   - rg:=rg, rg1:=rg2, rg:=enum, =, <>,
-  - set of int/enum/char range, in
+  - set of int/enum/AnsiChar range, in
   - array[rg], low(array), high(array), length(array)
   - array[rg], low(array), high(array), length(array)
 - enumeration  for..in..do
 - enumeration  for..in..do
   - enum, enum range, set of enum, set of enum range
   - enum, enum range, set of enum, set of enum range
   - int, int range, set of int, set of int range
   - int, int range, set of int, set of int range
-  - char, char range, set of char, set of char range
+  - AnsiChar, AnsiChar range, set of AnsiChar, set of AnsiChar range
   - array
   - array
   - class
   - class
   - for key in JSObject do
   - for key in JSObject do
@@ -317,8 +318,8 @@ Works:
 - Range checks:
 - Range checks:
   - compile time: warnings to errors
   - compile time: warnings to errors
   - assign int:=, int+=, enum:=, enum+=, intrange:=, intrange+=,
   - assign int:=, int+=, enum:=, enum+=, intrange:=, intrange+=,
-      enumrange:=, enumrange+=, char:=, char+=, charrange:=, charrange+=
-  - procedure argument int, enum, intrange, enumrange, char, charrange
+      enumrange:=, enumrange+=, AnsiChar:=, AnsiChar+=, charrange:=, charrange+=
+  - procedure argument int, enum, intrange, enumrange, AnsiChar, charrange
   - array[index1,index2,...]  read and assign
   - array[index1,index2,...]  read and assign
   - string[index]  read and assign
   - string[index]  read and assign
 - Interfaces:
 - Interfaces:
@@ -1447,8 +1448,8 @@ type
     FTargetPlatform: TPasToJsPlatform;
     FTargetPlatform: TPasToJsPlatform;
     FTargetProcessor: TPasToJsProcessor;
     FTargetProcessor: TPasToJsProcessor;
   protected
   protected
-    function HandleInclude(const Param: String): TToken; override;
-    procedure DoHandleOptimization(OptName, OptValue: string); override;
+    function HandleInclude(const Param: TPasScannerString): TToken; override;
+    procedure DoHandleOptimization(OptName, OptValue: TPasScannerString); override;
   public
   public
     GlobalConvOptsEnabled: TPasToJsConverterOptions;
     GlobalConvOptsEnabled: TPasToJsConverterOptions;
     GlobalConvOptsDisabled: TPasToJsConverterOptions;
     GlobalConvOptsDisabled: TPasToJsConverterOptions;
@@ -1568,8 +1569,7 @@ type
       ); override;
       ); override;
     procedure FinishExportSymbol(El: TPasExportSymbol); override;
     procedure FinishExportSymbol(El: TPasExportSymbol); override;
     procedure ComputeArgumentExpr(const ArgResolved: TPasResolverResult;
     procedure ComputeArgumentExpr(const ArgResolved: TPasResolverResult;
-      Access: TArgumentAccess; Expr: TPasExpr; out
-      ExprResolved: TPasResolverResult; SetReferenceFlags: boolean); override;
+      Access: TArgumentAccess; Expr: TPasExpr; out ExprResolved: TPasResolverResult; SetReferenceFlags: boolean); override;
     procedure FindCreatorArrayOfConst(Args: TFPList; ErrorEl: TPasElement);
     procedure FindCreatorArrayOfConst(Args: TFPList; ErrorEl: TPasElement);
     function FindProc_ArrLitToArrayOfConst(ErrorEl: TPasElement): TPasFunction; virtual;
     function FindProc_ArrLitToArrayOfConst(ErrorEl: TPasElement): TPasFunction; virtual;
     function FindSystemExternalClassType(const aClassName, JSName: string;
     function FindSystemExternalClassType(const aClassName, JSName: string;
@@ -2432,7 +2432,7 @@ var
     );
     );
 
 
 function CodePointToJSString(u: longword): TJSString;
 function CodePointToJSString(u: longword): TJSString;
-function PosLast(c: char; const s: string): integer;
+function PosLast(c: AnsiChar; const s: string): integer;
 
 
 function JSEquals(A, B: TJSElement): boolean;
 function JSEquals(A, B: TJSElement): boolean;
 
 
@@ -2459,7 +2459,7 @@ begin
     Result:=WideChar($D800+((u - $10000) shr 10))+WideChar($DC00+((u - $10000) and $3ff));
     Result:=WideChar($D800+((u - $10000) shr 10))+WideChar($DC00+((u - $10000) and $3ff));
 end;
 end;
 
 
-function PosLast(c: char; const s: string): integer;
+function PosLast(c: AnsiChar; const s: string): integer;
 begin
 begin
   Result:=length(s);
   Result:=length(s);
   while (Result>0) and (s[Result]<>c) do dec(Result);
   while (Result>0) and (s[Result]<>c) do dec(Result);
@@ -2849,7 +2849,7 @@ end;
 
 
 { TPas2jsPasScanner }
 { TPas2jsPasScanner }
 
 
-function TPas2jsPasScanner.HandleInclude(const Param: String): TToken;
+function TPas2jsPasScanner.HandleInclude(const Param: TPasScannerString): TToken;
 
 
   procedure SetStr(s: string);
   procedure SetStr(s: string);
   var
   var
@@ -2989,7 +2989,7 @@ begin
   Result:=inherited HandleInclude(Param);
   Result:=inherited HandleInclude(Param);
 end;
 end;
 
 
-procedure TPas2jsPasScanner.DoHandleOptimization(OptName, OptValue: string);
+procedure TPas2jsPasScanner.DoHandleOptimization(OptName, OptValue: TPasScannerString);
 
 
   procedure HandleBoolean(o: TPasToJsConverterOption; IsGlobalSwitch: boolean);
   procedure HandleBoolean(o: TPasToJsConverterOption; IsGlobalSwitch: boolean);
   var
   var
@@ -3046,7 +3046,7 @@ var
     {$IFDEF Pas2js}
     {$IFDEF Pas2js}
     TokenPos:=MyTokenPos;
     TokenPos:=MyTokenPos;
     {$ELSE}
     {$ELSE}
-    TokenPos:=PChar(s)+MyTokenPos-1;
+    TokenPos:=PAnsiChar(s)+MyTokenPos-1;
     {$ENDIF}
     {$ENDIF}
   end;
   end;
 
 
@@ -3103,10 +3103,10 @@ begin
   MyTokenPos:=TokenPos;
   MyTokenPos:=TokenPos;
   {$ELSE}
   {$ELSE}
   {$IFDEF VerbosePas2JS}
   {$IFDEF VerbosePas2JS}
-  if (TokenPos<PChar(s)) or (TokenPos>PChar(s)+length(s)) then
+  if (TokenPos<PAnsiChar(s)) or (TokenPos>PAnsiChar(s)+length(s)) then
     Error(nErrRangeCheck,'[20181109104812]');
     Error(nErrRangeCheck,'[20181109104812]');
   {$ENDIF}
   {$ENDIF}
-  MyTokenPos:=TokenPos-PChar(s)+1;
+  MyTokenPos:=TokenPos-PAnsiChar(s)+1;
   {$ENDIF}
   {$ENDIF}
   StartPos:=MyTokenPos;
   StartPos:=MyTokenPos;
   repeat
   repeat
@@ -6742,7 +6742,7 @@ function TPas2JSResolver.ExtractPasStringLiteral(El: TPasElement;
 }
 }
 var
 var
   p, StartP, i, l: integer;
   p, StartP, i, l: integer;
-  c: Char;
+  c: AnsiChar;
 begin
 begin
   Result:='';
   Result:='';
   {$IFDEF VerbosePas2JS}
   {$IFDEF VerbosePas2JS}
@@ -10761,13 +10761,13 @@ function TPasToJSConverter.ConvertCharToInt(Arg: TJSElement;
 begin
 begin
   if (Arg is TJSLiteral) and (TJSLiteral(Arg).Value.ValueType=jstString) then
   if (Arg is TJSLiteral) and (TJSLiteral(Arg).Value.ValueType=jstString) then
     begin
     begin
-    // convert char literal to int
+    // convert AnsiChar literal to int
     ConvertCharLiteralToInt(TJSLiteral(Arg),PosEl,ArgContext);
     ConvertCharLiteralToInt(TJSLiteral(Arg),PosEl,ArgContext);
     Result:=Arg;
     Result:=Arg;
     end
     end
   else
   else
     begin
     begin
-    // convert char to int  ->  Arg.charCodeAt(0)
+    // convert AnsiChar to int  ->  Arg.charCodeAt(0)
     Result:=CreateCallCharCodeAt(Arg,0,PosEl);
     Result:=CreateCallCharCodeAt(Arg,0,PosEl);
     end;
     end;
 end;
 end;
@@ -11369,7 +11369,7 @@ var
                   if ArgContext.Resolver.ExprEvaluator.GetWideChar(TResEvalString(LowRg).S,w) then
                   if ArgContext.Resolver.ExprEvaluator.GetWideChar(TResEvalString(LowRg).S,w) then
                     Int:=ord(w)
                     Int:=ord(w)
                   else
                   else
-                    ArgContext.Resolver.RaiseXExpectedButYFound(20170910213203,'char','string',Param);
+                    ArgContext.Resolver.RaiseXExpectedButYFound(20170910213203,'AnsiChar','string',Param);
                   end
                   end
                 else
                 else
                   Int:=ord(TResEvalString(LowRg).S[1]);
                   Int:=ord(TResEvalString(LowRg).S[1]);
@@ -11379,7 +11379,7 @@ var
               revkUnicodeString:
               revkUnicodeString:
                 begin
                 begin
                 if length(TResEvalUTF16(LowRg).S)<>1 then
                 if length(TResEvalUTF16(LowRg).S)<>1 then
-                  ArgContext.Resolver.RaiseXExpectedButYFound(20170910213247,'char','string',Param)
+                  ArgContext.Resolver.RaiseXExpectedButYFound(20170910213247,'AnsiChar','string',Param)
                 else
                 else
                   Int:=ord(TResEvalUTF16(LowRg).S[1]);
                   Int:=ord(TResEvalUTF16(LowRg).S[1]);
                 Arg:=ConvertCharToInt(Arg,Param,ArgContext);
                 Arg:=ConvertCharToInt(Arg,Param,ArgContext);
@@ -12784,7 +12784,7 @@ begin
       end
       end
     else if from_bt in btAllJSChars then
     else if from_bt in btAllJSChars then
       begin
       begin
-      // char to integer
+      // AnsiChar to integer
       Result:=ConvertExpression(Param,AContext);
       Result:=ConvertExpression(Param,AContext);
       Result:=ConvertCharToInt(Result,El,AContext);
       Result:=ConvertCharToInt(Result,El,AContext);
       Result:=ConvertIntToInt(Result,btWord,to_bt,El,AContext);
       Result:=ConvertIntToInt(Result,btWord,to_bt,El,AContext);
@@ -12889,7 +12889,7 @@ begin
     begin
     begin
     if from_bt in btAllJSStringAndChars then
     if from_bt in btAllJSStringAndChars then
       begin
       begin
-      // string or char to string -> value
+      // string or AnsiChar to string -> value
       Result:=ConvertExpression(Param,AContext);
       Result:=ConvertExpression(Param,AContext);
       exit;
       exit;
       end
       end
@@ -12918,7 +12918,7 @@ begin
     begin
     begin
     if from_bt in [btChar,btWideChar] then
     if from_bt in [btChar,btWideChar] then
       begin
       begin
-      // char to char
+      // AnsiChar to AnsiChar
       Result:=ConvertExpression(Param,AContext);
       Result:=ConvertExpression(Param,AContext);
       exit;
       exit;
       end
       end
@@ -12937,7 +12937,7 @@ begin
         end
         end
       else
       else
         begin
         begin
-        // char(integer) -> String.fromCharCode(integer)
+        // AnsiChar(integer) -> String.fromCharCode(integer)
         Result:=CreateCallFromCharCode(Result,El);
         Result:=CreateCallFromCharCode(Result,El);
         end;
         end;
       exit;
       exit;
@@ -12945,7 +12945,7 @@ begin
     else if (from_bt in (btArrayRangeTypes+[btRange]))
     else if (from_bt in (btArrayRangeTypes+[btRange]))
         or (IsParamPas2JSBaseType and (JSBaseType=pbtJSValue)) then
         or (IsParamPas2JSBaseType and (JSBaseType=pbtJSValue)) then
       begin
       begin
-      // convert value to char -> rtl.getChar(value)
+      // convert value to AnsiChar -> rtl.getChar(value)
       // Note: convert value first in case it raises an exception
       // Note: convert value first in case it raises an exception
       Result:=ConvertExpression(Param,AContext);
       Result:=ConvertExpression(Param,AContext);
       if IsLiteralInteger(Result,Int) then
       if IsLiteralInteger(Result,Int) then
@@ -12957,13 +12957,13 @@ begin
           end
           end
         else
         else
           begin
           begin
-          // char(integer) -> String.fromCharCode(integer)
+          // AnsiChar(integer) -> String.fromCharCode(integer)
           Result:=CreateCallFromCharCode(Result,El);
           Result:=CreateCallFromCharCode(Result,El);
           end;
           end;
         end
         end
       else
       else
         begin
         begin
-        // convert value to char -> rtl.getChar(value)
+        // convert value to AnsiChar -> rtl.getChar(value)
         Call:=CreateCallExpression(El);
         Call:=CreateCallExpression(El);
         Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnGetChar)]);
         Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnGetChar)]);
         Call.AddArg(Result);
         Call.AddArg(Result);
@@ -22518,7 +22518,7 @@ var
   ReturnSt, RetSt: TJSReturnStatement;
   ReturnSt, RetSt: TJSReturnStatement;
   Obj: TJSObjectLiteral;
   Obj: TJSObjectLiteral;
   ObjLit: TJSObjectLiteralElement;
   ObjLit: TJSObjectLiteralElement;
-  SetterArgName: Char;
+  SetterArgName: AnsiChar;
 begin
 begin
   if El.HelperForType=nil then exit;
   if El.HelperForType=nil then exit;
   aResolver:=AContext.Resolver;
   aResolver:=AContext.Resolver;
@@ -23500,7 +23500,7 @@ var
         exit;
         exit;
       jstString:
       jstString:
         begin
         begin
-        // convert char literal to int
+        // convert AnsiChar literal to int
         ConvertCharLiteralToInt(TJSLiteral(Result),Expr,AContext);
         ConvertCharLiteralToInt(TJSLiteral(Result),Expr,AContext);
         exit;
         exit;
         end;
         end;
@@ -23514,7 +23514,7 @@ var
       if (ResolvedEl.BaseType in btAllChars)
       if (ResolvedEl.BaseType in btAllChars)
           or ((ResolvedEl.BaseType=btRange) and (ResolvedEl.SubType in btAllChars)) then
           or ((ResolvedEl.BaseType=btRange) and (ResolvedEl.SubType in btAllChars)) then
         begin
         begin
-        // convert char variable to int: append  .charCodeAt()
+        // convert AnsiChar variable to int: append  .charCodeAt()
         Result:=CreateCallCharCodeAt(Result,0,Expr);
         Result:=CreateCallCharCodeAt(Result,0,Expr);
         end
         end
       else if (ResolvedEl.BaseType in btAllJSBooleans)
       else if (ResolvedEl.BaseType in btAllJSBooleans)
@@ -24084,7 +24084,7 @@ begin
         else if (VarResolved.BaseType in btAllChars)
         else if (VarResolved.BaseType in btAllChars)
             or ((VarResolved.BaseType=btRange) and (VarResolved.SubType in btAllChars)) then
             or ((VarResolved.BaseType=btRange) and (VarResolved.SubType in btAllChars)) then
           begin
           begin
-          // convert int to char
+          // convert int to AnsiChar
           SimpleAss.Expr:=CreateCallFromCharCode(SimpleAss.Expr,PosEl);
           SimpleAss.Expr:=CreateCallFromCharCode(SimpleAss.Expr,PosEl);
           end
           end
         else if (VarResolved.BaseType in btAllJSBooleans)
         else if (VarResolved.BaseType in btAllJSBooleans)
@@ -24992,7 +24992,7 @@ begin
       else if (CompareText(T.Name,'boolean')=0) then
       else if (CompareText(T.Name,'boolean')=0) then
         Lit.Value.AsBoolean:=false
         Lit.Value.AsBoolean:=false
       else if (CompareText(T.Name,'string')=0)
       else if (CompareText(T.Name,'string')=0)
-           or (CompareText(T.Name,'char')=0)
+           or (CompareText(T.Name,'AnsiChar')=0)
       then
       then
         Lit.Value.AsString:=''
         Lit.Value.AsString:=''
       else
       else
@@ -25158,7 +25158,7 @@ begin
         WS:=LitVal.AsString;
         WS:=LitVal.AsString;
         Result.Free;
         Result.Free;
         if length(WS)<>1 then
         if length(WS)<>1 then
-          DoError(20170415193254,nXExpectedButYFound,sXExpectedButYFound,['char','string'],Expr);
+          DoError(20170415193254,nXExpectedButYFound,sXExpectedButYFound,['AnsiChar','string'],Expr);
         Result:=CreateLiteralNumber(Expr,ord(WS[1]));
         Result:=CreateLiteralNumber(Expr,ord(WS[1]));
         exit;
         exit;
         end;
         end;
@@ -27807,7 +27807,7 @@ function TPasToJSConverter.TransformToJSName(ErrorEl: TPasElement;
 // CheckGlobal: check name clashes with global identifiers too
 // CheckGlobal: check name clashes with global identifiers too
 var
 var
   i: Integer;
   i: Integer;
-  c: Char;
+  c: AnsiChar;
 begin
 begin
   if AContext=nil then ;
   if AContext=nil then ;
   if Pos('.',AName)>0 then
   if Pos('.',AName)>0 then
@@ -28094,7 +28094,7 @@ begin
         begin
         begin
         // anonymous type -> prepend '$a'
         // anonymous type -> prepend '$a'
         // for example:
         // for example:
-        //   "var AnArray: array of array of char;" becomes AnArray$a$a
+        //   "var AnArray: array of array of AnsiChar;" becomes AnArray$a$a
         Result:=GetBIName(pbitnAnonymousPostfix)+Result;
         Result:=GetBIName(pbitnAnonymousPostfix)+Result;
         end;
         end;
       CurEl:=CurEl.Parent;
       CurEl:=CurEl.Parent;

+ 10 - 10
packages/pastojs/src/pas2jscompiler.pp

@@ -619,12 +619,12 @@ type
     function CreateCompilerFile(const PasFileName, PCUFilename: String): TPas2jsCompilerFile; virtual;
     function CreateCompilerFile(const PasFileName, PCUFilename: String): TPas2jsCompilerFile; virtual;
     // Command-line option handling
     // Command-line option handling
     procedure HandleOptionPCUFormat(aValue: String); virtual;
     procedure HandleOptionPCUFormat(aValue: String); virtual;
-    function HandleOptionPaths(C: Char; aValue: String; FromCmdLine: Boolean): Boolean; virtual;
-    function HandleOptionJ(C: Char; aValue: String; Quick,FromCmdLine: Boolean): Boolean; virtual;
+    function HandleOptionPaths(C: AnsiChar; aValue: String; FromCmdLine: Boolean): Boolean; virtual;
+    function HandleOptionJ(C: AnsiChar; aValue: String; Quick,FromCmdLine: Boolean): Boolean; virtual;
     function HandleOptionM(aValue: String; Quick: Boolean): Boolean; virtual;
     function HandleOptionM(aValue: String; Quick: Boolean): Boolean; virtual;
     procedure HandleOptionConfigFile(aPos: Integer; const aFileName: string); virtual;
     procedure HandleOptionConfigFile(aPos: Integer; const aFileName: string); virtual;
     procedure HandleOptionInfo(aValue: string);
     procedure HandleOptionInfo(aValue: string);
-    function HandleOptionOptimization(C: Char; aValue: String): Boolean;
+    function HandleOptionOptimization(C: AnsiChar; aValue: String): Boolean;
     // DoWriteJSFile: return false to use the default write function.
     // DoWriteJSFile: return false to use the default write function.
     function DoWriteJSFile(const DestFilename, MapFilename: String; aWriter: TPas2JSMapper): Boolean; virtual;
     function DoWriteJSFile(const DestFilename, MapFilename: String; aWriter: TPas2JSMapper): Boolean; virtual;
     procedure Compile(StartTime: TDateTime);
     procedure Compile(StartTime: TDateTime);
@@ -3400,7 +3400,7 @@ begin
   ParamFatal('No support in this compiler for precompiled format '+aValue);
   ParamFatal('No support in this compiler for precompiled format '+aValue);
 end;
 end;
 
 
-function TPas2jsCompiler.HandleOptionPaths(C: Char; aValue: String;
+function TPas2jsCompiler.HandleOptionPaths(C: AnsiChar; aValue: String;
   FromCmdLine: Boolean): Boolean;
   FromCmdLine: Boolean): Boolean;
 Var
 Var
   ErrorMsg: String;
   ErrorMsg: String;
@@ -3417,7 +3417,7 @@ begin
   end;
   end;
 end;
 end;
 
 
-function TPas2jsCompiler.HandleOptionJ(C: Char; aValue: String;
+function TPas2jsCompiler.HandleOptionJ(C: AnsiChar; aValue: String;
   Quick, FromCmdLine: Boolean): Boolean;
   Quick, FromCmdLine: Boolean): Boolean;
 
 
 Var
 Var
@@ -3702,7 +3702,7 @@ Var
 
 
 Var
 Var
   P,L: integer;
   P,L: integer;
-  C,c2: Char;
+  C,c2: AnsiChar;
   pr: TPasToJsProcessor;
   pr: TPasToJsProcessor;
   pl: TPasToJsPlatform;
   pl: TPasToJsPlatform;
   s: string;
   s: string;
@@ -3801,7 +3801,7 @@ begin
     Log.LogPlain(InfoMsg);
     Log.LogPlain(InfoMsg);
 end;
 end;
 
 
-function TPas2jsCompiler.HandleOptionOptimization(C: Char; aValue: String): Boolean;
+function TPas2jsCompiler.HandleOptionOptimization(C: AnsiChar; aValue: String): Boolean;
 Var
 Var
   Enable: Boolean;
   Enable: Boolean;
 begin
 begin
@@ -3850,7 +3850,7 @@ procedure TPas2jsCompiler.ReadParam(Param: string; Quick, FromCmdLine: boolean);
 var
 var
   EnabledFlags, DisabledFlags, Identifier, aValue: string;
   EnabledFlags, DisabledFlags, Identifier, aValue: string;
   p, l, i: Integer;
   p, l, i: Integer;
-  c: Char;
+  c: AnsiChar;
   aProc: TPasToJsProcessor;
   aProc: TPasToJsProcessor;
   aPlatform: TPasToJsPlatform;
   aPlatform: TPasToJsPlatform;
 
 
@@ -4065,7 +4065,7 @@ procedure TPas2jsCompiler.ReadSingleLetterOptions(const Param: string;
   p: integer; const Allowed: string; out Enabled, Disabled: string);
   p: integer; const Allowed: string; out Enabled, Disabled: string);
 // e.g. 'B' 'lB' 'l-' 'l+B-'
 // e.g. 'B' 'lB' 'l-' 'l+B-'
 var
 var
-  Letter: Char;
+  Letter: AnsiChar;
   i, l: Integer;
   i, l: Integer;
 begin
 begin
   l:=length(Param);
   l:=length(Param);
@@ -4679,7 +4679,7 @@ begin
   begin
   begin
     case s[p] of
     case s[p] of
     'a'..'z','A'..'Z','0'..'9','_','-','.',',','"','''','`',
     'a'..'z','A'..'Z','0'..'9','_','-','.',',','"','''','`',
-    #128..high(char) :
+    #128..high(AnsiChar) :
       begin
       begin
       LastCharStart:=p;
       LastCharStart:=p;
       {$IFDEF FPC_HAS_CPSTRING}
       {$IFDEF FPC_HAS_CPSTRING}

+ 11 - 11
packages/pastojs/src/pas2jsfilecache.pp

@@ -288,7 +288,7 @@ type
     function ExpandDirectory(const Filename: string): string; override;
     function ExpandDirectory(const Filename: string): string; override;
     function ExpandFileName(const Filename: string): string; override;
     function ExpandFileName(const Filename: string): string; override;
     function ExpandExecutable(const Filename: string): string; override;
     function ExpandExecutable(const Filename: string): string; override;
-    function HandleOptionPaths(C: Char; aValue: String; FromCmdLine: Boolean): String; override;
+    function HandleOptionPaths(C: AnsiChar; aValue: String; FromCmdLine: Boolean): String; override;
     Function AddForeignUnitPath(const aValue: String; FromCmdLine: Boolean): String; override;
     Function AddForeignUnitPath(const aValue: String; FromCmdLine: Boolean): String; override;
     function TryCreateRelativePath(const Filename, BaseDirectory: String;
     function TryCreateRelativePath(const Filename, BaseDirectory: String;
       UsePointDirectory, AlwaysRequireSharedBaseFolder: boolean; out RelPath: String): Boolean; override;
       UsePointDirectory, AlwaysRequireSharedBaseFolder: boolean; out RelPath: String): Boolean; override;
@@ -414,7 +414,7 @@ end;
 {$IFDEF FPC_HAS_CPSTRING}
 {$IFDEF FPC_HAS_CPSTRING}
 function ConvertTextToUTF8(const Src: string; var SrcEncoding: string): string;
 function ConvertTextToUTF8(const Src: string; var SrcEncoding: string): string;
 var
 var
-  p: PChar;
+  p: PAnsiChar;
   NormSrcEncoding: String;
   NormSrcEncoding: String;
 begin
 begin
   Result:=Src;
   Result:=Src;
@@ -424,7 +424,7 @@ begin
   NormSrcEncoding:=NormalizeEncoding(SrcEncoding);
   NormSrcEncoding:=NormalizeEncoding(SrcEncoding);
   if NormSrcEncoding=NormalizeEncoding(EncodingUTF8) then
   if NormSrcEncoding=NormalizeEncoding(EncodingUTF8) then
   begin
   begin
-    p:=PChar(Result);
+    p:=PAnsiChar(Result);
     if (p^=#$EF) and (p[1]=#$BB) and (p[2]=#$BF) then
     if (p^=#$EF) and (p[1]=#$BB) and (p[2]=#$BF) then
     begin
     begin
       // cut out UTF-8 BOM
       // cut out UTF-8 BOM
@@ -440,7 +440,7 @@ end;
 
 
 function GuessEncoding(const Src: string): string;
 function GuessEncoding(const Src: string): string;
 var
 var
-  p: PChar;
+  p: PAnsiChar;
   l: SizeInt;
   l: SizeInt;
   i: Integer;
   i: Integer;
 begin
 begin
@@ -452,12 +452,12 @@ begin
 
 
   // try UTF-8 (this includes ASCII)
   // try UTF-8 (this includes ASCII)
   l:=length(Src);
   l:=length(Src);
-  p:=PChar(Src);
+  p:=PAnsiChar(Src);
   repeat
   repeat
     if ord(p^)<128 then
     if ord(p^)<128 then
     begin
     begin
       // ASCII
       // ASCII
-      if (p^=#0) and (p-PChar(Src)>=l) then
+      if (p^=#0) and (p-PAnsiChar(Src)>=l) then
         exit(EncodingUTF8);
         exit(EncodingUTF8);
       inc(p);
       inc(p);
     end else begin
     end else begin
@@ -469,11 +469,11 @@ begin
   until false;
   until false;
 
 
   // check binary
   // check binary
-  p:=PChar(Src);
+  p:=PAnsiChar(Src);
   repeat
   repeat
     case p^ of
     case p^ of
     #0:
     #0:
-      if (p-PChar(Src)>=l) then
+      if (p-PAnsiChar(Src)>=l) then
         break
         break
       else
       else
         exit(EncodingBinary);
         exit(EncodingBinary);
@@ -489,10 +489,10 @@ end;
 
 
 function HasUTF8BOM(const s: string): boolean;
 function HasUTF8BOM(const s: string): boolean;
 var
 var
-  p: PChar;
+  p: PAnsiChar;
 begin
 begin
   if s='' then exit(false);
   if s='' then exit(false);
-  p:=PChar(s);
+  p:=PAnsiChar(s);
   Result:=(p^=#$EF) and (p[1]=#$BB) and (p[2]=#$BF);
   Result:=(p^=#$EF) and (p[1]=#$BB) and (p[2]=#$BF);
 end;
 end;
 
 
@@ -1843,7 +1843,7 @@ begin
     Result:=ExpandFileName(Filename);
     Result:=ExpandFileName(Filename);
 end;
 end;
 
 
-function TPas2jsFilesCache.HandleOptionPaths(C: Char; aValue: String; FromCmdLine: Boolean): String;
+function TPas2jsFilesCache.HandleOptionPaths(C: AnsiChar; aValue: String; FromCmdLine: Boolean): String;
 
 
 Var
 Var
   ErrorMsg : String;
   ErrorMsg : String;

+ 31 - 13
packages/pastojs/src/pas2jsfiler.pp

@@ -393,7 +393,7 @@ const
     'None',
     'None',
     'Enum',
     'Enum',
     'Int',
     'Int',
-    'Char',
+    'AnsiChar',
     'Bool'
     'Bool'
     );
     );
 
 
@@ -643,7 +643,7 @@ type
   TPCUSourceFileArray = array of TPCUSourceFile;
   TPCUSourceFileArray = array of TPCUSourceFile;
 
 
   TPCUGetSrcEvent = procedure(Sender: TObject; aFilename: string;
   TPCUGetSrcEvent = procedure(Sender: TObject; aFilename: string;
-    out p: PChar; out Count: integer) of object;
+    out p: PAnsiChar; out Count: integer) of object;
 
 
   { TPCUFilerContext - base class TPCUWriterContext/TPCUReaderContext }
   { TPCUFilerContext - base class TPCUWriterContext/TPCUReaderContext }
 
 
@@ -1083,7 +1083,8 @@ type
     function CheckJSONArray(Data: TJSONData; El: TPasElement; const PropName: string): TJSONArray;
     function CheckJSONArray(Data: TJSONData; El: TPasElement; const PropName: string): TJSONArray;
     function CheckJSONObject(Data: TJSONData; Id: int64): TJSONObject;
     function CheckJSONObject(Data: TJSONData; Id: int64): TJSONObject;
     function CheckJSONString(Data: TJSONData; Id: int64): String;
     function CheckJSONString(Data: TJSONData; Id: int64): String;
-    function ReadString(Obj: TJSONObject; const PropName: string; out s: string; El: TPasElement): boolean;
+    function ReadString(Obj: TJSONObject; const PropName: string; out s: AnsiString; El: TPasElement): boolean;
+    function ReadString(Obj: TJSONObject; const PropName: string; out s: UnicodeString; El: TPasElement): boolean;
     function ReadInteger(Obj: TJSONObject; const PropName: string; out i: integer; El: TPasElement): boolean;
     function ReadInteger(Obj: TJSONObject; const PropName: string; out i: integer; El: TPasElement): boolean;
     function ReadBoolean(Obj: TJSONObject; const PropName: string; out b: boolean; El: TPasElement): boolean;
     function ReadBoolean(Obj: TJSONObject; const PropName: string; out b: boolean; El: TPasElement): boolean;
     function ReadArray(Obj: TJSONObject; const PropName: string; out Arr: TJSONArray; El: TPasElement): boolean;
     function ReadArray(Obj: TJSONObject; const PropName: string; out Arr: TJSONArray; El: TPasElement): boolean;
@@ -1318,7 +1319,7 @@ function EncodeVLQ(i: TMaxPrecUInt): string; overload;
 function DecodeVLQ(const s: string): TMaxPrecInt; // base256 Variable Length Quantity
 function DecodeVLQ(const s: string): TMaxPrecInt; // base256 Variable Length Quantity
 function DecodeVLQ(var p: PByte): TMaxPrecInt; // base256 Variable Length Quantity
 function DecodeVLQ(var p: PByte): TMaxPrecInt; // base256 Variable Length Quantity
 
 
-function ComputeChecksum(p: PChar; Cnt: integer): TPCUSourceFileChecksum;
+function ComputeChecksum(p: PAnsiChar; Cnt: integer): TPCUSourceFileChecksum;
 function crc32(crc: cardinal; buf: Pbyte; len: cardinal): cardinal;
 function crc32(crc: cardinal; buf: Pbyte; len: cardinal): cardinal;
 
 
 function ModeSwitchToInt(ms: TModeSwitch): byte;
 function ModeSwitchToInt(ms: TModeSwitch): byte;
@@ -1329,7 +1330,7 @@ procedure WriteJSON(aData: TJSONData; TargetStream: TStream; Compressed: boolean
 procedure GrowIdToRefsArray(var IdToRefsArray: TPCUFilerElementRefArray; Id: integer);
 procedure GrowIdToRefsArray(var IdToRefsArray: TPCUFilerElementRefArray; Id: integer);
 
 
 function dbgmem(const s: string): string; overload;
 function dbgmem(const s: string): string; overload;
-function dbgmem(p: PChar; Cnt: integer): string; overload;
+function dbgmem(p: PAnsiChar; Cnt: integer): string; overload;
 
 
 implementation
 implementation
 
 
@@ -1477,9 +1478,9 @@ begin
     Result:=-Result;
     Result:=-Result;
 end;
 end;
 
 
-function ComputeChecksum(p: PChar; Cnt: integer): TPCUSourceFileChecksum;
+function ComputeChecksum(p: PAnsiChar; Cnt: integer): TPCUSourceFileChecksum;
 var
 var
-  SrcP, SrcEndP, SrcLineEndP, SrcLineStartP: PChar;
+  SrcP, SrcEndP, SrcLineEndP, SrcLineStartP: PAnsiChar;
   l: PtrInt;
   l: PtrInt;
   CheckSum, CurLen: Cardinal;
   CheckSum, CurLen: Cardinal;
 begin
 begin
@@ -1688,7 +1689,7 @@ var
     TargetStream.Write(s[1],length(s));
     TargetStream.Write(s[1],length(s));
   end;
   end;
 
 
-  procedure WriteChar(const c: char);
+  procedure WriteChar(const c: AnsiChar);
   begin
   begin
     TargetStream.Write(c,1);
     TargetStream.Write(c,1);
   end;
   end;
@@ -1829,10 +1830,10 @@ end;
 function dbgmem(const s: string): string;
 function dbgmem(const s: string): string;
 begin
 begin
   if s='' then exit('');
   if s='' then exit('');
-  Result:=dbgmem(PChar(s),length(s));
+  Result:=dbgmem(PAnsiChar(s),length(s));
 end;
 end;
 
 
-function dbgmem(p: PChar; Cnt: integer): string;
+function dbgmem(p: PAnsiChar; Cnt: integer): string;
 
 
   procedure AddLine(const Line: string);
   procedure AddLine(const Line: string);
   begin
   begin
@@ -1842,7 +1843,7 @@ function dbgmem(p: PChar; Cnt: integer): string;
   end;
   end;
 
 
 var
 var
-  c: Char;
+  c: AnsiChar;
   IsTxt: boolean;
   IsTxt: boolean;
   Line: String;
   Line: String;
   i: Integer;
   i: Integer;
@@ -2103,7 +2104,7 @@ end;
 
 
 function TPCUFiler.GetSrcCheckSum(aFilename: string): TPCUSourceFileChecksum;
 function TPCUFiler.GetSrcCheckSum(aFilename: string): TPCUSourceFileChecksum;
 var
 var
-  p: PChar;
+  p: PAnsiChar;
   Cnt: integer;
   Cnt: integer;
 begin
 begin
   OnGetSrc(Self,aFilename,p,Cnt);
   OnGetSrc(Self,aFilename,p,Cnt);
@@ -5836,7 +5837,7 @@ begin
 end;
 end;
 
 
 function TPCUReader.ReadString(Obj: TJSONObject; const PropName: string; out
 function TPCUReader.ReadString(Obj: TJSONObject; const PropName: string; out
-  s: string; El: TPasElement): boolean;
+  s: AnsiString; El: TPasElement): boolean;
 var
 var
   Data: TJSONData;
   Data: TJSONData;
 begin
 begin
@@ -5852,6 +5853,23 @@ begin
   Result:=false;
   Result:=false;
 end;
 end;
 
 
+function TPCUReader.ReadString(Obj: TJSONObject; const PropName: string; out
+  s: UnicodeString; El: TPasElement): boolean;
+var
+  Data: TJSONData;
+begin
+  s:='';
+  Data:=Obj.Find(PropName);
+  if Data=nil then exit(false);
+  if Data.ClassType=TJSONString then
+    begin
+    s:=Data.AsUnicodeString;
+    exit(true);
+    end;
+  RaiseMsg(20180205133227,El,PropName+':'+Data.ClassName);
+  Result:=false;
+end;
+
 function TPCUReader.ReadInteger(Obj: TJSONObject; const PropName: string; out
 function TPCUReader.ReadInteger(Obj: TJSONObject; const PropName: string; out
   i: integer; El: TPasElement): boolean;
   i: integer; El: TPasElement): boolean;
 var
 var

+ 17 - 17
packages/pastojs/src/pas2jsfileutils.pp

@@ -71,7 +71,7 @@ function GetEnvironmentVariableCountPJ: Integer;
 function GetEnvironmentStringPJ(Index: Integer): string;
 function GetEnvironmentStringPJ(Index: Integer): string;
 function GetEnvironmentVariablePJ(const EnvVar: string): String;
 function GetEnvironmentVariablePJ(const EnvVar: string): String;
 
 
-function GetNextDelimitedItem(const List: string; Delimiter: char;
+function GetNextDelimitedItem(const List: string; Delimiter: AnsiChar;
                               var Position: integer): string;
                               var Position: integer): string;
 
 
 type TChangeStamp = SizeInt;
 type TChangeStamp = SizeInt;
@@ -96,12 +96,12 @@ function GetUnixEncoding: string;
 function IsASCII(const s: string): boolean; inline;
 function IsASCII(const s: string): boolean; inline;
 
 
 {$IFDEF FPC_HAS_CPSTRING}
 {$IFDEF FPC_HAS_CPSTRING}
-function UTF8ToSystemCP(const s: string): string;
-function SystemCPToUTF8(const s: string): string;
+function UTF8ToSystemCP(const s: ansistring): ansistring;
+function SystemCPToUTF8(const s: ansistring): ansistring;
 
 
-function ConsoleToUTF8(const s: string): string;
+function ConsoleToUTF8(const s: ansistring): ansistring;
 // converts UTF8 string to console encoding (used by Write, WriteLn)
 // converts UTF8 string to console encoding (used by Write, WriteLn)
-function UTF8ToConsole(const s: string): string;
+function UTF8ToConsole(const s: ansistring): ansistring;
 {$ENDIF FPC_HAS_CPSTRING}
 {$ENDIF FPC_HAS_CPSTRING}
 
 
 implementation
 implementation
@@ -451,7 +451,7 @@ end;
   end;
   end;
 
 
 var SrcPos, DestPos, Len, DirStart: integer;
 var SrcPos, DestPos, Len, DirStart: integer;
-  c: char;
+  c: AnsiChar;
   MacroPos: LongInt;
   MacroPos: LongInt;
 begin
 begin
   Len:=length(AFilename);
   Len:=length(AFilename);
@@ -653,7 +653,7 @@ end;
 function GetForcedPathDelims(const FileName: string): String;
 function GetForcedPathDelims(const FileName: string): String;
 var
 var
   i: Integer;
   i: Integer;
-  c: Char;
+  c: AnsiChar;
 begin
 begin
   Result:=Filename;
   Result:=Filename;
   {$IFDEF Pas2js}
   {$IFDEF Pas2js}
@@ -757,12 +757,12 @@ begin
 end;
 end;
 {$ELSE}
 {$ELSE}
 
 
-  function IsNameEnd(NameP: PChar): boolean; inline;
+  function IsNameEnd(NameP: PAnsiChar): boolean; inline;
   begin
   begin
-    Result:=(NameP^=#0) and (NameP-PChar(Name)=length(Name));
+    Result:=(NameP^=#0) and (NameP-PAnsiChar(Name)=length(Name));
   end;
   end;
 
 
-  function Check(MaskP, NameP: PChar): boolean;
+  function Check(MaskP, NameP: PAnsiChar): boolean;
   var
   var
     c: Integer;
     c: Integer;
   begin
   begin
@@ -804,24 +804,24 @@ end;
   end;
   end;
 
 
 var
 var
-  MaskP: PChar;
+  MaskP: PAnsiChar;
 begin
 begin
   if Mask='' then exit(Name='');
   if Mask='' then exit(Name='');
   {$IFDEF CaseInsensitiveFilenames}
   {$IFDEF CaseInsensitiveFilenames}
   Mask:=AnsiLowerCase(Mask);
   Mask:=AnsiLowerCase(Mask);
   Name:=AnsiLowerCase(Name);
   Name:=AnsiLowerCase(Name);
   {$ENDIF}
   {$ENDIF}
-  MaskP:=PChar(Mask);
+  MaskP:=PAnsiChar(Mask);
   while (MaskP^='*') and (MaskP[1]='*') do inc(MaskP);
   while (MaskP^='*') and (MaskP[1]='*') do inc(MaskP);
   if (MaskP^='*') and (MaskP[1]=#0) then
   if (MaskP^='*') and (MaskP[1]=#0) then
     exit(true); // the * mask fits all, even the empty string
     exit(true); // the * mask fits all, even the empty string
   if Name='' then
   if Name='' then
     exit(false);
     exit(false);
-  Result:=Check(MaskP,PChar(Name));
+  Result:=Check(MaskP,PAnsiChar(Name));
 end;
 end;
 {$ENDIF}
 {$ENDIF}
 
 
-function GetNextDelimitedItem(const List: string; Delimiter: char;
+function GetNextDelimitedItem(const List: string; Delimiter: AnsiChar;
   var Position: integer): string;
   var Position: integer): string;
 var
 var
   StartPos: Integer;
   StartPos: Integer;
@@ -902,13 +902,13 @@ begin
 end;
 end;
 {$ELSE}
 {$ELSE}
 var
 var
-  p: PChar;
+  p: PAnsiChar;
 begin
 begin
   if s='' then exit(true);
   if s='' then exit(true);
-  p:=PChar(s);
+  p:=PAnsiChar(s);
   repeat
   repeat
     case p^ of
     case p^ of
-    #0: if p-PChar(s)=length(s) then exit(true);
+    #0: if p-PAnsiChar(s)=length(s) then exit(true);
     #128..#255: exit(false);
     #128..#255: exit(false);
     end;
     end;
     inc(p);
     inc(p);

+ 8 - 8
packages/pastojs/src/pas2jsfileutilsunix.inc

@@ -67,10 +67,10 @@ function GetPhysicalFilename(const Filename: string; ExceptionOnError: boolean
 var
 var
   OldPath: String;
   OldPath: String;
   NewPath: String;
   NewPath: String;
-  p: PChar;
+  p: PAnsiChar;
 begin
 begin
   Result:=Filename;
   Result:=Filename;
-  p:=PChar(Result);
+  p:=PAnsiChar(Result);
   repeat
   repeat
     while p^='/' do
     while p^='/' do
       inc(p);
       inc(p);
@@ -80,13 +80,13 @@ begin
       repeat
       repeat
         inc(p);
         inc(p);
       until p^ in [#0,'/'];
       until p^ in [#0,'/'];
-      OldPath:=LeftStr(Result,p-PChar(Result));
+      OldPath:=LeftStr(Result,p-PAnsiChar(Result));
       NewPath:=ResolveSymLinks(OldPath,ExceptionOnError);
       NewPath:=ResolveSymLinks(OldPath,ExceptionOnError);
       if NewPath='' then exit('');
       if NewPath='' then exit('');
       if OldPath<>NewPath then
       if OldPath<>NewPath then
       begin
       begin
         Result:=NewPath+copy(Result,length(OldPath)+1,length(Result));
         Result:=NewPath+copy(Result,length(OldPath)+1,length(Result));
-        p:=PChar(Result)+length(NewPath);
+        p:=PAnsiChar(Result)+length(NewPath);
       end;
       end;
     end;
     end;
   until false;
   until false;
@@ -201,7 +201,7 @@ begin
   Result:=GetDefaultTextEncoding;
   Result:=GetDefaultTextEncoding;
 end;
 end;
 
 
-function UTF8ToSystemCP(const s: string): string;
+function UTF8ToSystemCP(const s: Ansistring): Ansistring;
 begin
 begin
   if NonUTF8System and not IsASCII(s) then
   if NonUTF8System and not IsASCII(s) then
   begin
   begin
@@ -214,7 +214,7 @@ begin
     Result:=s;
     Result:=s;
 end;
 end;
 
 
-function SystemCPToUTF8(const s: string): string;
+function SystemCPToUTF8(const s: ansistring): ansistring;
 begin
 begin
   if NonUTF8System and not IsASCII(s) then
   if NonUTF8System and not IsASCII(s) then
   begin
   begin
@@ -227,12 +227,12 @@ begin
     Result:=s;
     Result:=s;
 end;
 end;
 
 
-function ConsoleToUTF8(const s: string): string;
+function ConsoleToUTF8(const s: ansistring): ansistring;
 begin
 begin
   Result:=SystemCPToUTF8(s);
   Result:=SystemCPToUTF8(s);
 end;
 end;
 
 
-function UTF8ToConsole(const s: string): string;
+function UTF8ToConsole(const s: ansistring): ansistring;
 begin
 begin
   Result:=UTF8ToSystemCP(s);
   Result:=UTF8ToSystemCP(s);
 end;
 end;

+ 19 - 19
packages/pastojs/src/pas2jsfileutilswin.inc

@@ -28,7 +28,7 @@ var
   ArgsWCount: Integer; // length(ArgsW)+1
   ArgsWCount: Integer; // length(ArgsW)+1
   {$IFDEF ArgsWAsUTF8}
   {$IFDEF ArgsWAsUTF8}
   ArgsUTF8: Array of String; // the ArgsW array as UTF8
   ArgsUTF8: Array of String; // the ArgsW array as UTF8
-  OldArgV: PPChar = nil;
+  OldArgV: PPAnsiChar = nil;
   {$IFEND}
   {$IFEND}
 
 
 {$ifndef wince}
 {$ifndef wince}
@@ -73,7 +73,7 @@ begin
   for i:=0 to length(ArgsW)-1 do
   for i:=0 to length(ArgsW)-1 do
   begin
   begin
     ArgsUTF8[i]:=ArgsW{%H-}[i];
     ArgsUTF8[i]:=ArgsW{%H-}[i];
-    argv[i]:=PChar(ArgsUTF8[i]);
+    argv[i]:=PAnsiChar(ArgsUTF8[i]);
   end;
   end;
 end;
 end;
 {$endif}
 {$endif}
@@ -253,7 +253,7 @@ begin
     D := WideChar(64 + DriveNr) + ':';
     D := WideChar(64 + DriveNr) + ':';
     if not SetCurrentDirectoryW(@D[1]) then
     if not SetCurrentDirectoryW(@D[1]) then
     begin
     begin
-      Dir := Char(64 + DriveNr) + ':\';
+      Dir := AnsiChar(64 + DriveNr) + ':\';
       SetCurrentDirectoryW(@SavedDir[1]);
       SetCurrentDirectoryW(@SavedDir[1]);
       Exit;
       Exit;
     end;
     end;
@@ -273,7 +273,7 @@ var
   IsAbs, StartsWithRoot, CanUseBaseDir : Boolean;
   IsAbs, StartsWithRoot, CanUseBaseDir : Boolean;
   {$ifndef WinCE}
   {$ifndef WinCE}
   HasDrive: Boolean;
   HasDrive: Boolean;
-  FnDrive, CurDrive, BaseDirDrive: Char;
+  FnDrive, CurDrive, BaseDirDrive: AnsiChar;
   {$endif}
   {$endif}
   CurDir, Fn: String;
   CurDir, Fn: String;
 begin
 begin
@@ -542,12 +542,12 @@ begin
 end;
 end;
 
 
 {$ifdef WinCe}
 {$ifdef WinCe}
-function UTF8ToSystemCP(const s: string): string; inline;
+function UTF8ToSystemCP(const s: ansistring): ansistring; inline;
 begin
 begin
   Result := s;
   Result := s;
 end;
 end;
 {$else}
 {$else}
-function UTF8ToSystemCP(const s: string): string;
+function UTF8ToSystemCP(const s: ansistring): ansistring;
 // result has codepage CP_ACP
 // result has codepage CP_ACP
 var
 var
   src: UnicodeString;
   src: UnicodeString;
@@ -575,13 +575,13 @@ end;
 {$endif not wince}
 {$endif not wince}
 
 
 {$ifdef WinCE}
 {$ifdef WinCE}
-function SystemCPToUTF8(const s: string): string; inline;
+function SystemCPToUTF8(const s: ansistring): ansistring; inline;
 begin
 begin
   Result := SysToUtf8(s);
   Result := SysToUtf8(s);
 end;
 end;
 {$else}
 {$else}
 // for all Windows supporting 8bit codepages (e.g. not WinCE)
 // for all Windows supporting 8bit codepages (e.g. not WinCE)
-function SystemCPToUTF8(const s: string): string;
+function SystemCPToUTF8(const s: ansistring): ansistring;
 // result has codepage CP_ACP
 // result has codepage CP_ACP
 var
 var
   UTF16WordCnt: SizeInt;
   UTF16WordCnt: SizeInt;
@@ -606,22 +606,22 @@ end;
 {$endif not wince}
 {$endif not wince}
 
 
 {$ifdef WinCe}
 {$ifdef WinCe}
-function UTF8ToConsole(const s: string): string; // converts UTF8 to console string (used by Write, WriteLn)
+function UTF8ToConsole(const s: ansistring): ansistring; // converts UTF8 to console string (used by Write, WriteLn)
 begin
 begin
   Result := UTF8ToSystemCP(s);
   Result := UTF8ToSystemCP(s);
 end;
 end;
 {$else}
 {$else}
-function UTF8ToConsole(const s: string): string; // converts UTF8 to console string (used by Write, WriteLn)
+function UTF8ToConsole(const s: ansistring): ansistring; // converts UTF8 to console string (used by Write, WriteLn)
 var
 var
-  Dst: PChar;
+  Dst: PAnsiChar;
 begin
 begin
   {$ifndef NO_CP_RTL}
   {$ifndef NO_CP_RTL}
   Result := UTF8ToSystemCP(s);
   Result := UTF8ToSystemCP(s);
   {$else NO_CP_RTL}
   {$else NO_CP_RTL}
   Result := s; // Kept for compatibility
   Result := s; // Kept for compatibility
   {$endif NO_CP_RTL}
   {$endif NO_CP_RTL}
-  Dst := AllocMem((Length(Result) + 1) * SizeOf(Char));
-  if CharToOEM(PChar(Result), Dst) then
+  Dst := AllocMem((Length(Result) + 1) * SizeOf(AnsiChar));
+  if CharToOEM(PAnsiChar(Result), Dst) then
     Result := StrPas(Dst);
     Result := StrPas(Dst);
   FreeMem(Dst);
   FreeMem(Dst);
   {$ifndef NO_CP_RTL}
   {$ifndef NO_CP_RTL}
@@ -631,17 +631,17 @@ end;
 {$endif not WinCE}
 {$endif not WinCE}
 
 
 {$ifdef WinCE}
 {$ifdef WinCE}
-function ConsoleToUTF8(const s: string): string;// converts console encoding to UTF8
+function ConsoleToUTF8(const s: ansistring): ansistring;// converts console encoding to UTF8
 begin
 begin
   Result := SysToUTF8(s);
   Result := SysToUTF8(s);
 end;
 end;
 {$else}
 {$else}
-function ConsoleToUTF8(const s: string): string;// converts console encoding to UTF8
+function ConsoleToUTF8(const s: ansistring): ansistring;// converts console encoding to UTF8
 var
 var
-  Dst: PChar;
+  Dst: PAnsiChar;
 begin
 begin
-  Dst := AllocMem((Length(s) + 1) * SizeOf(Char));
-  if OemToChar(PChar(s), Dst) then
+  Dst := AllocMem((Length(s) + 1) * SizeOf(AnsiChar));
+  if OemToChar(PAnsiChar(s), Dst) then
     Result := StrPas(Dst)
     Result := StrPas(Dst)
   else
   else
     Result := s;
     Result := s;
@@ -673,7 +673,7 @@ end;
 procedure FinalizePlatform;
 procedure FinalizePlatform;
 {$IFDEF ArgsWAsUTF8}
 {$IFDEF ArgsWAsUTF8}
 var
 var
-  p: PPChar;
+  p: PPAnsiChar;
 {$ENDIF}
 {$ENDIF}
 begin
 begin
   {$IFDEF ArgsWAsUTF8}
   {$IFDEF ArgsWAsUTF8}

+ 4 - 4
packages/pastojs/src/pas2jsfs.pp

@@ -64,7 +64,7 @@ Type
   public
   public
     Constructor Create(Const aFileName, aSource: String); overload;
     Constructor Create(Const aFileName, aSource: String); overload;
     function IsEOF: Boolean; override;
     function IsEOF: Boolean; override;
-    function ReadLine: string; override;
+    function ReadLine: TPasScannerString; override;
     property LineNumber: integer read FLineNumber;
     property LineNumber: integer read FLineNumber;
   end;
   end;
 
 
@@ -124,7 +124,7 @@ Type
     function CreateResolver: TPas2jsFSResolver; virtual;
     function CreateResolver: TPas2jsFSResolver; virtual;
     // On success, return '', On error, return error message.
     // On success, return '', On error, return error message.
     Function AddForeignUnitPath(Const aValue: String; FromCmdLine: Boolean): String; virtual;
     Function AddForeignUnitPath(Const aValue: String; FromCmdLine: Boolean): String; virtual;
-    Function HandleOptionPaths(C: Char; aValue: String; FromCmdLine: Boolean): String; virtual;
+    Function HandleOptionPaths(C: AnsiChar; aValue: String; FromCmdLine: Boolean): String; virtual;
   Public
   Public
     Constructor Create; virtual;
     Constructor Create; virtual;
     Procedure Reset; virtual;
     Procedure Reset; virtual;
@@ -306,7 +306,7 @@ begin
   if (aValue='') or FromCmdLine then ;
   if (aValue='') or FromCmdLine then ;
 end;
 end;
 
 
-function TPas2JSFS.HandleOptionPaths(C: Char; aValue: String; FromCmdLine: Boolean): String;
+function TPas2JSFS.HandleOptionPaths(C: AnsiChar; aValue: String; FromCmdLine: Boolean): String;
 begin
 begin
   Result:='Invalid parameter: -F'+C+aValue;
   Result:='Invalid parameter: -F'+C+aValue;
   if FromCmdLine then ;
   if FromCmdLine then ;
@@ -376,7 +376,7 @@ begin
   Result:=FIsEOF;
   Result:=FIsEOF;
 end;
 end;
 
 
-function TSourceLineReader.ReadLine: string;
+function TSourceLineReader.ReadLine: tpasscannerstring;
 var
 var
   S: string;
   S: string;
   p, SrcLen: integer;
   p, SrcLen: integer;

+ 7 - 7
packages/pastojs/src/pas2jslogger.pp

@@ -220,8 +220,8 @@ type
 
 
 function CompareP2JMessage(Item1, Item2: {$IFDEF Pas2JS}JSValue{$ELSE}Pointer{$ENDIF}): Integer;
 function CompareP2JMessage(Item1, Item2: {$IFDEF Pas2JS}JSValue{$ELSE}Pointer{$ENDIF}): Integer;
 
 
-function QuoteStr(const s: string; Quote: char = '"'): string;
-function DeQuoteStr(const s: string; Quote: char = '"'): string;
+function QuoteStr(const s: string; Quote: AnsiChar = '"'): string;
+function DeQuoteStr(const s: string; Quote: AnsiChar = '"'): string;
 function AsString(Element: TPasElement; Full: boolean = true): string; overload;
 function AsString(Element: TPasElement; Full: boolean = true): string; overload;
 function AsString(Element: TJSElement): string; overload;
 function AsString(Element: TJSElement): string; overload;
 function DbgString(Element: TJSElement; Indent: integer): string; overload;
 function DbgString(Element: TJSElement; Indent: integer): string; overload;
@@ -244,12 +244,12 @@ begin
   Result:=Msg1.Number-Msg2.Number;
   Result:=Msg1.Number-Msg2.Number;
 end;
 end;
 
 
-function QuoteStr(const s: string; Quote: char): string;
+function QuoteStr(const s: string; Quote: AnsiChar): string;
 begin
 begin
   Result:={$IFDEF Pas2JS}SysUtils.QuotedStr{$ELSE}AnsiQuotedStr{$ENDIF}(S,Quote);
   Result:={$IFDEF Pas2JS}SysUtils.QuotedStr{$ELSE}AnsiQuotedStr{$ENDIF}(S,Quote);
 end;
 end;
 
 
-function DeQuoteStr(const s: string; Quote: char): string;
+function DeQuoteStr(const s: string; Quote: AnsiChar): string;
 begin
 begin
   Result:={$IFDEF Pas2JS}SysUtils.DeQuoteString{$ELSE}AnsiDequotedStr{$ENDIF}(S,Quote);
   Result:={$IFDEF Pas2JS}SysUtils.DeQuoteString{$ELSE}AnsiDequotedStr{$ENDIF}(S,Quote);
 end;
 end;
@@ -494,14 +494,14 @@ var
 begin
 begin
   Result:='';
   Result:='';
   for i:=0 to Count-1 do
   for i:=0 to Count-1 do
-    Result:=Result+HexStr(ord(PChar(p)[i]),2);
+    Result:=Result+HexStr(ord(PAnsiChar(p)[i]),2);
 end;
 end;
 {$ENDIF}
 {$ENDIF}
 
 
 function DbgStr(const s: string): string;
 function DbgStr(const s: string): string;
 var
 var
   i: Integer;
   i: Integer;
-  c: Char;
+  c: AnsiChar;
 begin
 begin
   Result:='';
   Result:='';
   for i:=1 to length(s) do begin
   for i:=1 to length(s) do begin
@@ -679,7 +679,7 @@ end;
 
 
 procedure TPas2jsLogger.DoLogRaw(const Msg: string; SkipEncoding : Boolean);
 procedure TPas2jsLogger.DoLogRaw(const Msg: string; SkipEncoding : Boolean);
 var
 var
-  S: String;
+  S: ansiString;
 begin
 begin
   if SkipEncoding then
   if SkipEncoding then
     S:=Msg
     S:=Msg

+ 3 - 3
packages/pastojs/src/pas2jspcucompiler.pp

@@ -49,7 +49,7 @@ Type
     function OnPCUConverterIsElementUsed(Sender: TObject; El: TPasElement): boolean;
     function OnPCUConverterIsElementUsed(Sender: TObject; El: TPasElement): boolean;
     function OnPCUConverterIsTypeInfoUsed(Sender: TObject; El: TPasElement): boolean;
     function OnPCUConverterIsTypeInfoUsed(Sender: TObject; El: TPasElement): boolean;
     function OnWriterIsElementUsed(Sender: TObject; El: TPasElement): boolean;
     function OnWriterIsElementUsed(Sender: TObject; El: TPasElement): boolean;
-    procedure OnFilerGetSrc(Sender: TObject; aFilename: string; out p: PChar; out Count: integer);
+    procedure OnFilerGetSrc(Sender: TObject; aFilename: string; out p: PAnsiChar; out Count: integer);
   Public
   Public
     constructor Create(aCompilerFile: TPas2JSCompilerFile; aFormat: TPas2JSPrecompileFormat); reintroduce;
     constructor Create(aCompilerFile: TPas2JSCompilerFile; aFormat: TPas2JSPrecompileFormat); reintroduce;
     destructor Destroy; override;
     destructor Destroy; override;
@@ -365,7 +365,7 @@ begin
 end;
 end;
 
 
 procedure TFilerPCUSupport.OnFilerGetSrc(Sender: TObject; aFilename: string;
 procedure TFilerPCUSupport.OnFilerGetSrc(Sender: TObject; aFilename: string;
-  out p: PChar; out Count: integer);
+  out p: PAnsiChar; out Count: integer);
 var
 var
   SrcFile: TPas2jsFile;
   SrcFile: TPas2jsFile;
 begin
 begin
@@ -374,7 +374,7 @@ begin
   SrcFile:=MyFile.Compiler.FS.LoadFile(aFilename);
   SrcFile:=MyFile.Compiler.FS.LoadFile(aFilename);
   if SrcFile=nil then
   if SrcFile=nil then
     RaiseInternalError(20180311135329,aFilename);
     RaiseInternalError(20180311135329,aFilename);
-  p:=PChar(SrcFile.Source);
+  p:=PAnsiChar(SrcFile.Source);
   Count:=length(SrcFile.Source);
   Count:=length(SrcFile.Source);
 end;
 end;
 
 

+ 11 - 11
packages/pastojs/src/pas2jsutils.pp

@@ -26,7 +26,7 @@ uses
   Classes, SysUtils;
   Classes, SysUtils;
 
 
 function ChompPathDelim(const Path: string): string;
 function ChompPathDelim(const Path: string): string;
-function GetNextDelimitedItem(const List: string; Delimiter: char;
+function GetNextDelimitedItem(const List: string; Delimiter: Char;
                               var Position: integer): string;
                               var Position: integer): string;
 type
 type
    TChangeStamp = SizeInt;
    TChangeStamp = SizeInt;
@@ -44,10 +44,10 @@ function IsASCII(const s: string): boolean; inline;
 {$IFDEF FPC_HAS_CPSTRING}
 {$IFDEF FPC_HAS_CPSTRING}
 const
 const
   UTF8BOM = #$EF#$BB#$BF;
   UTF8BOM = #$EF#$BB#$BF;
-function UTF8CharacterStrictLength(P: PChar): integer;
+function UTF8CharacterStrictLength(P: PAnsiChar): integer;
 
 
-function UTF8ToUTF16(const s: string): UnicodeString;
-function UTF16ToUTF8(const s: UnicodeString): string;
+function UTF8ToUTF16(const s: AnsiString): UnicodeString;
+function UTF16ToUTF8(const s: UnicodeString): AnsiString;
 
 
 {$ENDIF FPC_HAS_CPSTRING}
 {$ENDIF FPC_HAS_CPSTRING}
 
 
@@ -89,7 +89,7 @@ begin
   Result:=gNonUTF8System;
   Result:=gNonUTF8System;
 end;
 end;
 
 
-function GetNextDelimitedItem(const List: string; Delimiter: char;
+function GetNextDelimitedItem(const List: string; Delimiter: Char;
   var Position: integer): string;
   var Position: integer): string;
 var
 var
   StartPos: Integer;
   StartPos: Integer;
@@ -192,13 +192,13 @@ begin
 end;
 end;
 {$ELSE}
 {$ELSE}
 var
 var
-  p: PChar;
+  p: PAnsiChar;
 begin
 begin
   if s='' then exit(true);
   if s='' then exit(true);
-  p:=PChar(s);
+  p:=PAnsiChar(s);
   repeat
   repeat
     case p^ of
     case p^ of
-    #0: if p-PChar(s)=length(s) then exit(true);
+    #0: if p-PAnsiChar(s)=length(s) then exit(true);
     #128..#255: exit(false);
     #128..#255: exit(false);
     end;
     end;
     inc(p);
     inc(p);
@@ -207,7 +207,7 @@ end;
 {$ENDIF}
 {$ENDIF}
 
 
 {$IFDEF FPC_HAS_CPSTRING}
 {$IFDEF FPC_HAS_CPSTRING}
-function UTF8CharacterStrictLength(P: PChar): integer;
+function UTF8CharacterStrictLength(P: PAnsiChar): integer;
 begin
 begin
   if p=nil then exit(0);
   if p=nil then exit(0);
   if ord(p^)<%10000000 then
   if ord(p^)<%10000000 then
@@ -250,12 +250,12 @@ begin
     exit(0);
     exit(0);
 end;
 end;
 
 
-function UTF8ToUTF16(const s: string): UnicodeString;
+function UTF8ToUTF16(const s: AnsiString): UnicodeString;
 begin
 begin
   Result:=UTF8Decode(s);
   Result:=UTF8Decode(s);
 end;
 end;
 
 
-function UTF16ToUTF8(const s: UnicodeString): string;
+function UTF16ToUTF8(const s: UnicodeString): ansistring;
 begin
 begin
   if s='' then exit('');
   if s='' then exit('');
   Result:=UTF8Encode(s);
   Result:=UTF8Encode(s);

+ 8 - 8
packages/pastojs/tests/tcfiler.pas

@@ -50,7 +50,7 @@ type
     FPCUWriter: TPCUWriter;
     FPCUWriter: TPCUWriter;
     FRestAnalyzer: TPas2JSAnalyzer;
     FRestAnalyzer: TPas2JSAnalyzer;
     FCheckedElements: TPasAnalyzerKeySet; // keyset of TPCCheckedElementPair, key is Orig
     FCheckedElements: TPasAnalyzerKeySet; // keyset of TPCCheckedElementPair, key is Orig
-    procedure OnFilerGetSrc(Sender: TObject; aFilename: string; out p: PChar;
+    procedure OnFilerGetSrc(Sender: TObject; aFilename: string; out p: PAnsiChar;
       out Count: integer);
       out Count: integer);
     function OnConverterIsElementUsed(Sender: TObject; El: TPasElement): boolean;
     function OnConverterIsElementUsed(Sender: TObject; El: TPasElement): boolean;
     function OnConverterIsTypeInfoUsed(Sender: TObject; El: TPasElement): boolean;
     function OnConverterIsTypeInfoUsed(Sender: TObject; El: TPasElement): boolean;
@@ -275,7 +275,7 @@ end;
 { TCustomTestPrecompile }
 { TCustomTestPrecompile }
 
 
 procedure TCustomTestPrecompile.OnFilerGetSrc(Sender: TObject;
 procedure TCustomTestPrecompile.OnFilerGetSrc(Sender: TObject;
-  aFilename: string; out p: PChar; out Count: integer);
+  aFilename: string; out p: PAnsiChar; out Count: integer);
 var
 var
   i: Integer;
   i: Integer;
   aModule: TTestEnginePasResolver;
   aModule: TTestEnginePasResolver;
@@ -286,7 +286,7 @@ begin
     aModule:=Resolvers[i];
     aModule:=Resolvers[i];
     if aModule.Filename<>aFilename then continue;
     if aModule.Filename<>aFilename then continue;
     Src:=aModule.Source;
     Src:=aModule.Source;
-    p:=PChar(Src);
+    p:=PAnsiChar(Src);
     Count:=length(Src);
     Count:=length(Src);
     end;
     end;
 end;
 end;
@@ -2269,7 +2269,7 @@ begin
   '  FloatA = -31.678E-012;', // float lit
   '  FloatA = -31.678E-012;', // float lit
   '  HighInt = High(longint);', // func params, built-in function
   '  HighInt = High(longint);', // func params, built-in function
   '  s = ''abc'';', // string lit
   '  s = ''abc'';', // string lit
-  '  c: char = s[1];', // array params
+  '  c: AnsiChar = s[1];', // array params
   '  a: array[1..2] of longint = (3,4);', // anonymous array, range, array values
   '  a: array[1..2] of longint = (3,4);', // anonymous array, range, array values
   '  PI: Double; external name ''Math.PI'';',
   '  PI: Double; external name ''Math.PI'';',
   'resourcestring',
   'resourcestring',
@@ -2506,7 +2506,7 @@ begin
   'interface',
   'interface',
   '  function Abs(d: double): double; external name ''Math.Abs'';',
   '  function Abs(d: double): double; external name ''Math.Abs'';',
   '  function GetIt(d: double): double;',
   '  function GetIt(d: double): double;',
-  '  procedure DoArgs(const a; var b: array of char; out c: jsvalue); inline;',
+  '  procedure DoArgs(const a; var b: array of AnsiChar; out c: jsvalue); inline;',
   '  procedure DoMulti(a,b: byte);',
   '  procedure DoMulti(a,b: byte);',
   'implementation',
   'implementation',
   'var k: double;',
   'var k: double;',
@@ -2516,7 +2516,7 @@ begin
   '  j:=Abs(d+k);',
   '  j:=Abs(d+k);',
   '  Result:=j;',
   '  Result:=j;',
   'end;',
   'end;',
-  'procedure DoArgs(const a; var b: array of char; out c: jsvalue); inline;',
+  'procedure DoArgs(const a; var b: array of AnsiChar; out c: jsvalue); inline;',
   'begin',
   'begin',
   'end;',
   'end;',
   'procedure DoMulti(a,b: byte);',
   'procedure DoMulti(a,b: byte);',
@@ -3108,12 +3108,12 @@ begin
   'implementation',
   'implementation',
   'generic function Run<T>(a: T): T;',
   'generic function Run<T>(a: T): T;',
   'var i,j,k,l: word;',
   'var i,j,k,l: word;',
-  '  c: char;',
+  '  c: AnsiChar;',
   'begin',
   'begin',
   '  for i:=1 to 3 do ;',
   '  for i:=1 to 3 do ;',
   '  for j:=1+4 to 3*7 do ;',
   '  for j:=1+4 to 3*7 do ;',
   '  for k:=-1 to 2 do l:=l;',
   '  for k:=-1 to 2 do l:=l;',
-  '  for c in char do ;',
+  '  for c in AnsiChar do ;',
   'end;',
   'end;',
   '']);
   '']);
   WriteReadUnit;
   WriteReadUnit;

+ 7 - 7
packages/pastojs/tests/tcgenerics.pas

@@ -928,7 +928,7 @@ begin
   '  TObject = class end;',
   '  TObject = class end;',
   '  TBird<T> = class F: T; end;',
   '  TBird<T> = class F: T; end;',
   '  TBirdWord = TBird<Word>;',
   '  TBirdWord = TBird<Word>;',
-  '  TBirdChar = TBird<Char>;',
+  '  TBirdChar = TBird<AnsiChar>;',
   'var',
   'var',
   '  w: TBirdWord;',
   '  w: TBirdWord;',
   '  c: TBirdChar;',
   '  c: TBirdChar;',
@@ -955,14 +955,14 @@ begin
     '    $mod.TObject.$init.call(this);',
     '    $mod.TObject.$init.call(this);',
     '    this.F = "";',
     '    this.F = "";',
     '  };',
     '  };',
-    '}, "TBird<System.Char>");',
+    '}, "TBird<System.AnsiChar>");',
     'this.w = null;',
     'this.w = null;',
     'this.c = null;',
     'this.c = null;',
     '']),
     '']),
     LinesToStr([ // $mod.$main
     LinesToStr([ // $mod.$main
     '$mod.w = $mod.c;',
     '$mod.w = $mod.c;',
     '']));
     '']));
-  CheckHint(mtWarning,nClassTypesAreNotRelatedXY,'Class types "TBird<System.Char>" and "TBird<System.Word>" are not related');
+  CheckHint(mtWarning,nClassTypesAreNotRelatedXY,'Class types "TBird<System.AnsiChar>" and "TBird<System.Word>" are not related');
   CheckResolverUnexpectedHints();
   CheckResolverUnexpectedHints();
 end;
 end;
 
 
@@ -2942,11 +2942,11 @@ begin
   '  TProc<S,T> = procedure(a: S; b: T);',
   '  TProc<S,T> = procedure(a: S; b: T);',
   'var',
   'var',
   '  p: TProc<word>;',
   '  p: TProc<word>;',
-  '  q: TProc<char,boolean>;',
+  '  q: TProc<AnsiChar,boolean>;',
   'procedure Run(x,y: word);',
   'procedure Run(x,y: word);',
   'begin',
   'begin',
   'end;',
   'end;',
-  'procedure Fly(x: char; y: boolean);',
+  'procedure Fly(x: AnsiChar; y: boolean);',
   'begin',
   'begin',
   'end;',
   'end;',
   'begin',
   'begin',
@@ -2960,8 +2960,8 @@ begin
     '  procsig: rtl.newTIProcSig([["a", rtl.word], ["b", rtl.word]])',
     '  procsig: rtl.newTIProcSig([["a", rtl.word], ["b", rtl.word]])',
     '});',
     '});',
     'this.p = null;',
     'this.p = null;',
-    'this.$rtti.$ProcVar("TProc<System.Char,System.Boolean>", {',
-    '  procsig: rtl.newTIProcSig([["a", rtl.char], ["b", rtl.boolean]])',
+    'this.$rtti.$ProcVar("TProc<System.AnsiChar,System.Boolean>", {',
+    '  procsig: rtl.newTIProcSig([["a", rtl.AnsiChar], ["b", rtl.boolean]])',
     '});',
     '});',
     'this.q = null;',
     'this.q = null;',
     'this.Run = function (x, y) {',
     'this.Run = function (x, y) {',

+ 109 - 103
packages/pastojs/tests/tcmodules.pas

@@ -40,7 +40,7 @@ type
     mkDirectReference
     mkDirectReference
     );
     );
 const
 const
-  SrcMarker: array[TSrcMarkerKind] of char = (
+  SrcMarker: array[TSrcMarkerKind] of AnsiChar = (
     '#', // mkLabel
     '#', // mkLabel
     '@', // mkResolverReference
     '@', // mkResolverReference
     '='  // mkDirectReference
     '='  // mkDirectReference
@@ -1041,21 +1041,21 @@ function CheckSrcDiff(Expected, Actual: string; out Msg: string): boolean;
 const
 const
   SpaceChars = [#9,#10,#13,' '];
   SpaceChars = [#9,#10,#13,' '];
 var
 var
-  ExpectedP, ActualP: PChar;
+  ExpectedP, ActualP: PAnsiChar;
 
 
-  function FindLineEnd(p: PChar): PChar;
+  function FindLineEnd(p: PAnsiChar): PAnsiChar;
   begin
   begin
     Result:=p;
     Result:=p;
     while not (Result^ in [#0,#10,#13]) do inc(Result);
     while not (Result^ in [#0,#10,#13]) do inc(Result);
   end;
   end;
 
 
-  function FindLineStart(p, MinP: PChar): PChar;
+  function FindLineStart(p, MinP: PAnsiChar): PAnsiChar;
   begin
   begin
     while (p>MinP) and not (p[-1] in [#10,#13]) do dec(p);
     while (p>MinP) and not (p[-1] in [#10,#13]) do dec(p);
     Result:=p;
     Result:=p;
   end;
   end;
 
 
-  procedure SkipLineEnd(var p: PChar);
+  procedure SkipLineEnd(var p: PAnsiChar);
   begin
   begin
     if p^ in [#10,#13] then
     if p^ in [#10,#13] then
     begin
     begin
@@ -1090,19 +1090,19 @@ var
 
 
   procedure DiffFound;
   procedure DiffFound;
   var
   var
-    ActLineStartP, ActLineEndP, p, StartPos: PChar;
+    ActLineStartP, ActLineEndP, p, StartPos: PAnsiChar;
     ExpLine, ActLine: String;
     ExpLine, ActLine: String;
     i, LineNo, DiffLineNo: Integer;
     i, LineNo, DiffLineNo: Integer;
   begin
   begin
     writeln('Diff found "',Msg,'". Lines:');
     writeln('Diff found "',Msg,'". Lines:');
     // write correct lines
     // write correct lines
-    p:=PChar(Expected);
+    p:=PAnsiChar(Expected);
     LineNo:=0;
     LineNo:=0;
     DiffLineNo:=0;
     DiffLineNo:=0;
     repeat
     repeat
       StartPos:=p;
       StartPos:=p;
       while not (p^ in [#0,#10,#13]) do inc(p);
       while not (p^ in [#0,#10,#13]) do inc(p);
-      ExpLine:=copy(Expected,StartPos-PChar(Expected)+1,p-StartPos);
+      ExpLine:=copy(Expected,StartPos-PAnsiChar(Expected)+1,p-StartPos);
       SkipLineEnd(p);
       SkipLineEnd(p);
       inc(LineNo);
       inc(LineNo);
       if (p<=ExpectedP) and (p^<>#0) then
       if (p<=ExpectedP) and (p^<>#0) then
@@ -1112,9 +1112,9 @@ var
         // diff line
         // diff line
         if DiffLineNo=0 then DiffLineNo:=LineNo;
         if DiffLineNo=0 then DiffLineNo:=LineNo;
         // write actual line
         // write actual line
-        ActLineStartP:=FindLineStart(ActualP,PChar(Actual));
+        ActLineStartP:=FindLineStart(ActualP,PAnsiChar(Actual));
         ActLineEndP:=FindLineEnd(ActualP);
         ActLineEndP:=FindLineEnd(ActualP);
-        ActLine:=copy(Actual,ActLineStartP-PChar(Actual)+1,ActLineEndP-ActLineStartP);
+        ActLine:=copy(Actual,ActLineStartP-PAnsiChar(Actual)+1,ActLineEndP-ActLineStartP);
         writeln('- ',ActLine);
         writeln('- ',ActLine);
         if HasSpecialChar(ActLine) then
         if HasSpecialChar(ActLine) then
           writeln('- ',HashSpecialChars(ActLine));
           writeln('- ',HashSpecialChars(ActLine));
@@ -1133,7 +1133,7 @@ var
           SkipLineEnd(ActLineStartP);
           SkipLineEnd(ActLineStartP);
           if ActLineStartP^=#0 then break;
           if ActLineStartP^=#0 then break;
           ActLineEndP:=FindLineEnd(ActLineStartP);
           ActLineEndP:=FindLineEnd(ActLineStartP);
-          ActLine:=copy(Actual,ActLineStartP-PChar(Actual)+1,ActLineEndP-ActLineStartP);
+          ActLine:=copy(Actual,ActLineStartP-PAnsiChar(Actual)+1,ActLineEndP-ActLineStartP);
           writeln('~ ',ActLine);
           writeln('~ ',ActLine);
         end;
         end;
         exit;
         exit;
@@ -1151,14 +1151,14 @@ var
 
 
 var
 var
   IsSpaceNeeded: Boolean;
   IsSpaceNeeded: Boolean;
-  LastChar, Quote: Char;
+  LastChar, Quote: AnsiChar;
 begin
 begin
   Result:=true;
   Result:=true;
   Msg:='';
   Msg:='';
   if Expected='' then Expected:=' ';
   if Expected='' then Expected:=' ';
   if Actual='' then Actual:=' ';
   if Actual='' then Actual:=' ';
-  ExpectedP:=PChar(Expected);
-  ActualP:=PChar(Actual);
+  ExpectedP:=PAnsiChar(Expected);
+  ActualP:=PAnsiChar(Actual);
   repeat
   repeat
     //writeln('TTestModule.CheckDiff Exp="',ExpectedP^,'" Act="',ActualP^,'"');
     //writeln('TTestModule.CheckDiff Exp="',ExpectedP^,'" Act="',ActualP^,'"');
     case ExpectedP^ of
     case ExpectedP^ of
@@ -1177,7 +1177,7 @@ begin
       begin
       begin
       // skip space in Expected
       // skip space in Expected
       IsSpaceNeeded:=false;
       IsSpaceNeeded:=false;
-      if ExpectedP>PChar(Expected) then
+      if ExpectedP>PAnsiChar(Expected) then
         LastChar:=ExpectedP[-1]
         LastChar:=ExpectedP[-1]
       else
       else
         LastChar:=#0;
         LastChar:=#0;
@@ -1881,8 +1881,8 @@ begin
     //'  LineEnding = #10;',
     //'  LineEnding = #10;',
     //'  DirectorySeparator = ''/'';',
     //'  DirectorySeparator = ''/'';',
     //'  DriveSeparator = '''';',
     //'  DriveSeparator = '''';',
-    //'  AllowDirectorySeparators : set of char = [''\'',''/''];',
-    //'  AllowDriveSeparators : set of char = [];',
+    //'  AllowDirectorySeparators : set of AnsiChar = [''\'',''/''];',
+    //'  AllowDriveSeparators : set of AnsiChar = [];',
   if supTObject in Parts then
   if supTObject in Parts then
     Intf.AddStrings([
     Intf.AddStrings([
     'type',
     'type',
@@ -2475,7 +2475,7 @@ var
     while p^ in ['a'..'z','A'..'Z','_','0'..'9'] do inc(p);
     while p^ in ['a'..'z','A'..'Z','_','0'..'9'] do inc(p);
     Result:='';
     Result:='';
     SetLength(Result,p-StartP);
     SetLength(Result,p-StartP);
-    Move(StartP^,Result[1],length(Result));
+    Move(StartP^,Result[1],length(Result)*sizeof(char));
   end;
   end;
 
 
   procedure AddLabel;
   procedure AddLabel;
@@ -2515,7 +2515,7 @@ var
 
 
   procedure ParseCode(SrcLines: TStringList; aFilename: string);
   procedure ParseCode(SrcLines: TStringList; aFilename: string);
   var
   var
-    p: PChar;
+    p,pstart,pend: PChar;
     IsDirective: Boolean;
     IsDirective: Boolean;
   begin
   begin
     //writeln('TCustomTestModule.CheckReferenceDirectives.ParseCode File=',aFilename);
     //writeln('TCustomTestModule.CheckReferenceDirectives.ParseCode File=',aFilename);
@@ -2528,10 +2528,13 @@ var
       SrcLine:=SrcLines[LineNumber-1];
       SrcLine:=SrcLines[LineNumber-1];
       if SrcLine='' then continue;
       if SrcLine='' then continue;
       //writeln('TCustomTestModule.CheckReferenceDirectives Line=',SrcLine);
       //writeln('TCustomTestModule.CheckReferenceDirectives Line=',SrcLine);
-      p:=PChar(SrcLine);
+      pstart:=PChar(SrcLine);
+      pend:=pstart;
+      inc(PEnd,length(SrcLine));
+      p:=pstart;
       repeat
       repeat
         case p^ of
         case p^ of
-          #0: if (p-PChar(SrcLine)=length(SrcLine)) then break;
+          #0: if (p>=pend) then break;
           '{':
           '{':
             begin
             begin
             CommentStartP:=p;
             CommentStartP:=p;
@@ -2542,7 +2545,7 @@ var
             repeat
             repeat
               case p^ of
               case p^ of
               #0:
               #0:
-                if (p-PChar(SrcLine)=length(SrcLine)) then
+                if (p>=pend) then
                   begin
                   begin
                   // multi line comment
                   // multi line comment
                   if IsDirective then
                   if IsDirective then
@@ -2553,7 +2556,10 @@ var
                     SrcLine:=SrcLines[LineNumber-1];
                     SrcLine:=SrcLines[LineNumber-1];
                     //writeln('TCustomTestModule.CheckReferenceDirectives Comment Line=',SrcLine);
                     //writeln('TCustomTestModule.CheckReferenceDirectives Comment Line=',SrcLine);
                   until SrcLine<>'';
                   until SrcLine<>'';
-                  p:=PChar(SrcLine);
+                  pstart:=PChar(SrcLine);
+                  pend:=pstart;
+                  inc(PEnd,length(SrcLine));
+                  p:=pstart;
                   continue;
                   continue;
                   end;
                   end;
               '}':
               '}':
@@ -3446,12 +3452,12 @@ begin
   Add('var');
   Add('var');
   Add('  i: longint;');
   Add('  i: longint;');
   Add('  s: string;');
   Add('  s: string;');
-  Add('  c: char;');
+  Add('  c: AnsiChar;');
   Add('  b: boolean;');
   Add('  b: boolean;');
   Add('  d: double;');
   Add('  d: double;');
   Add('  i2: longint = 3;');
   Add('  i2: longint = 3;');
   Add('  s2: string = ''foo'';');
   Add('  s2: string = ''foo'';');
-  Add('  c2: char = ''4'';');
+  Add('  c2: AnsiChar = ''4'';');
   Add('  b2: boolean = true;');
   Add('  b2: boolean = true;');
   Add('  d2: double = 5.6;');
   Add('  d2: double = 5.6;');
   Add('  i3: longint = $707;');
   Add('  i3: longint = $707;');
@@ -3512,7 +3518,7 @@ begin
   Add('const');
   Add('const');
   Add('  i: longint = 3;');
   Add('  i: longint = 3;');
   Add('  s: string = ''foo'';');
   Add('  s: string = ''foo'';');
-  Add('  c: char = ''4'';');
+  Add('  c: AnsiChar = ''4'';');
   Add('  b: boolean = true;');
   Add('  b: boolean = true;');
   Add('  d: double = 5.6;');
   Add('  d: double = 5.6;');
   Add('  e = low(word);');
   Add('  e = low(word);');
@@ -3562,7 +3568,7 @@ begin
   '  b: boolean;',
   '  b: boolean;',
   '  d: double;',
   '  d: double;',
   '  s: string;',
   '  s: string;',
-  '  c: char;',
+  '  c: AnsiChar;',
   'begin',
   'begin',
   '  i:=longint(i);',
   '  i:=longint(i);',
   '  i:=longint(b);',
   '  i:=longint(b);',
@@ -3572,11 +3578,11 @@ begin
   '  d:=double(i);',
   '  d:=double(i);',
   '  s:=string(s);',
   '  s:=string(s);',
   '  s:=string(c);',
   '  s:=string(c);',
-  '  c:=char(c);',
-  '  c:=char(i);',
-  '  c:=char(65);',
-  '  c:=char(#10);',
-  '  c:=char(#$E000);',
+  '  c:=AnsiChar(c);',
+  '  c:=AnsiChar(i);',
+  '  c:=AnsiChar(65);',
+  '  c:=AnsiChar(#10);',
+  '  c:=AnsiChar(#$E000);',
   '']);
   '']);
   ConvertProgram;
   ConvertProgram;
   CheckSource('TestAliasTypeRef',
   CheckSource('TestAliasTypeRef',
@@ -3612,7 +3618,7 @@ begin
   Add('  TYesNo = boolean;');
   Add('  TYesNo = boolean;');
   Add('  TFloat = double;');
   Add('  TFloat = double;');
   Add('  TCaption = string;');
   Add('  TCaption = string;');
-  Add('  TChar = char;');
+  Add('  TChar = AnsiChar;');
   Add('var');
   Add('var');
   Add('  i: integer;');
   Add('  i: integer;');
   Add('  b: TYesNo;');
   Add('  b: TYesNo;');
@@ -5005,7 +5011,7 @@ begin
   StartProgram(false);
   StartProgram(false);
   Add(['type TCaption = string;',
   Add(['type TCaption = string;',
   'procedure DoIt(vA: TCaption; var vB: TCaption; out vC: TCaption);',
   'procedure DoIt(vA: TCaption; var vB: TCaption; out vC: TCaption);',
-  'var c: char;',
+  'var c: AnsiChar;',
   'begin',
   'begin',
   '  va[1]:=c;',
   '  va[1]:=c;',
   '  vb[2]:=c;',
   '  vb[2]:=c;',
@@ -7315,7 +7321,7 @@ begin
   '  TAtoZ = ''A''..''Z'';',
   '  TAtoZ = ''A''..''Z'';',
   '  TSetOfAZ = set of TAtoZ;',
   '  TSetOfAZ = set of TAtoZ;',
   'var',
   'var',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  a: TAtoZ;',
   '  a: TAtoZ;',
   '  s: TSetOfAZ = [''P'',''A''];',
   '  s: TSetOfAZ = [''P'',''A''];',
   '  i: longint;',
   '  i: longint;',
@@ -7399,7 +7405,7 @@ begin
   '  Chars = LowChars+[''A''..''Z''];',
   '  Chars = LowChars+[''A''..''Z''];',
   '  sc = [''А'', ''Я''];',
   '  sc = [''А'', ''Я''];',
   'var',
   'var',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  s: string;',
   '  s: string;',
   'begin',
   'begin',
   '  if c in lowchars then ;',
   '  if c in lowchars then ;',
@@ -8589,7 +8595,7 @@ begin
   Add([
   Add([
   'const',
   'const',
   '  a = #$00F3;',
   '  a = #$00F3;',
-  '  c: char = ''1'';',
+  '  c: AnsiChar = ''1'';',
   '  wc: widechar = ''ä'';',
   '  wc: widechar = ''ä'';',
   'begin',
   'begin',
   '  c:=#0;',
   '  c:=#0;',
@@ -8605,7 +8611,7 @@ begin
   '  c:=#$0b;',
   '  c:=#$0b;',
   '  c:=^A;',
   '  c:=^A;',
   '  c:=''"'';',
   '  c:=''"'';',
-  '  c:=default(char);',
+  '  c:=default(AnsiChar);',
   '  c:=#$00E4;', // ä
   '  c:=#$00E4;', // ä
   '  c:=''ä'';',
   '  c:=''ä'';',
   '  c:=#$E4;', // ä
   '  c:=#$E4;', // ä
@@ -8652,7 +8658,7 @@ procedure TTestModule.TestChar_Compare;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
   Add('var');
   Add('var');
-  Add('  c: char;');
+  Add('  c: AnsiChar;');
   Add('  b: boolean;');
   Add('  b: boolean;');
   Add('begin');
   Add('begin');
   Add('  b:=c=''1'';');
   Add('  b:=c=''1'';');
@@ -8696,7 +8702,7 @@ begin
   StartProgram(false);
   StartProgram(false);
   Add([
   Add([
   'var',
   'var',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  i: longint;',
   '  i: longint;',
   '  s: string;',
   '  s: string;',
   'begin',
   'begin',
@@ -8811,7 +8817,7 @@ begin
   StartProgram(false);
   StartProgram(false);
   Add([
   Add([
   'const',
   'const',
-  '  a: char = #$D87E;',
+  '  a: AnsiChar = #$D87E;',
   '  b: string = #$D87E;',
   '  b: string = #$D87E;',
   '  c: string = #$D87E#43;',
   '  c: string = #$D87E#43;',
   'begin',
   'begin',
@@ -8987,7 +8993,7 @@ begin
   Add([
   Add([
   'var',
   'var',
   '  s: string;',
   '  s: string;',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  b: boolean;',
   '  b: boolean;',
   'begin',
   'begin',
   '  b:= s[1] = c;',
   '  b:= s[1] = c;',
@@ -9140,7 +9146,7 @@ begin
   'const',
   'const',
   '  crg: TCharRg = ''b'';',
   '  crg: TCharRg = ''b'';',
   'var',
   'var',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  crg2: TCharRg2;',
   '  crg2: TCharRg2;',
   '  s: TSetOfCharRg;',
   '  s: TSetOfCharRg;',
   'begin',
   'begin',
@@ -9179,14 +9185,14 @@ procedure TTestModule.TestWideChar;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
   Add([
   Add([
-  'procedure Fly(var c: char);',
+  'procedure Fly(var c: AnsiChar);',
   'begin',
   'begin',
   'end;',
   'end;',
   'procedure Run(var c: widechar);',
   'procedure Run(var c: widechar);',
   'begin',
   'begin',
   'end;',
   'end;',
   'var',
   'var',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  wc: widechar;',
   '  wc: widechar;',
   '  w: word;',
   '  w: word;',
   'begin',
   'begin',
@@ -9235,7 +9241,7 @@ procedure TTestModule.TestForCharDo;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
   Add([
   Add([
-  'var c: char;',
+  'var c: AnsiChar;',
   'begin',
   'begin',
   '  for c:=''a'' to ''c'' do ;',
   '  for c:=''a'' to ''c'' do ;',
   '  for c:=c downto ''a'' do ;',
   '  for c:=c downto ''a'' do ;',
@@ -9257,22 +9263,22 @@ begin
   StartProgram(false);
   StartProgram(false);
   Add([
   Add([
   'type',
   'type',
-  '  TSetOfChar = set of char;',
+  '  TSetOfChar = set of AnsiChar;',
   '  TCharRg = ''a''..''z'';',
   '  TCharRg = ''a''..''z'';',
   '  TSetOfCharRg = set of TCharRg;',
   '  TSetOfCharRg = set of TCharRg;',
   'const Foo = ''foo'';',
   'const Foo = ''foo'';',
   'var',
   'var',
-  '  c,c2: char;',
+  '  c,c2: AnsiChar;',
   '  s: string;',
   '  s: string;',
-  '  a1: array of char;',
-  '  a2: array[1..3] of char;',
+  '  a1: array of AnsiChar;',
+  '  a2: array[1..3] of AnsiChar;',
   '  soc: TSetOfChar;',
   '  soc: TSetOfChar;',
   '  socr: TSetOfCharRg;',
   '  socr: TSetOfCharRg;',
   '  cr: TCharRg;',
   '  cr: TCharRg;',
   'begin',
   'begin',
   '  for c in foo do ;',
   '  for c in foo do ;',
   '  for c in s do ;',
   '  for c in s do ;',
-  '  for c in char do ;',
+  '  for c in AnsiChar do ;',
   '  for c in a1 do ;',
   '  for c in a1 do ;',
   '  for c in a2 do ;',
   '  for c in a2 do ;',
   '  for c in [''1''..''3''] do ;',
   '  for c in [''1''..''3''] do ;',
@@ -9343,7 +9349,7 @@ begin
   Add('procedure p1(i: longint = 1);');
   Add('procedure p1(i: longint = 1);');
   Add('begin');
   Add('begin');
   Add('end;');
   Add('end;');
-  Add('procedure p2(i: longint = 1; c: char = ''a'');');
+  Add('procedure p2(i: longint = 1; c: AnsiChar = ''a'');');
   Add('begin');
   Add('begin');
   Add('end;');
   Add('end;');
   Add('procedure p3(d: double = 1.0; b: boolean = false; s: string = ''abc'');');
   Add('procedure p3(d: double = 1.0; b: boolean = false; s: string = ''abc'');');
@@ -10035,7 +10041,7 @@ procedure TTestModule.TestCaseOfChar;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
   Add([
   Add([
-  'var s,h: char;',
+  'var s,h: AnsiChar;',
   'begin',
   'begin',
   '  case s of',
   '  case s of',
   '  ''a''..''z'': h:=s;',
   '  ''a''..''z'': h:=s;',
@@ -10392,16 +10398,16 @@ begin
   StartProgram(false);
   StartProgram(false);
   Add([
   Add([
   'type',
   'type',
-  '  TChars = array[char] of char;',
-  '  TChars2 = array[''a''..''z''] of char;',
+  '  TChars = array[AnsiChar] of AnsiChar;',
+  '  TChars2 = array[''a''..''z''] of AnsiChar;',
   'var',
   'var',
   '  Arr: TChars;',
   '  Arr: TChars;',
   '  Arr2: TChars2;',
   '  Arr2: TChars2;',
-  '  Arr3: array[2..4] of char = (''p'',''a'',''s'');',
-  '  Arr4: array[11..13] of char = ''pas'';',
-  '  Arr5: array[21..22] of char = ''äö'';',
-  '  Arr6: array[31..32] of char = ''ä''+''ö'';',
-  '  c: char;',
+  '  Arr3: array[2..4] of AnsiChar = (''p'',''a'',''s'');',
+  '  Arr4: array[11..13] of AnsiChar = ''pas'';',
+  '  Arr5: array[21..22] of AnsiChar = ''äö'';',
+  '  Arr6: array[31..32] of AnsiChar = ''ä''+''ö'';',
+  '  c: AnsiChar;',
   '  b: boolean;',
   '  b: boolean;',
   'begin',
   'begin',
   '  c:=low(arr);',
   '  c:=low(arr);',
@@ -11256,12 +11262,12 @@ procedure TTestModule.TestArray_ArrayOfCharAssignString;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
   Add([
   Add([
-  'type TArr = array of char;',
+  'type TArr = array of AnsiChar;',
   'var',
   'var',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  s: string;',
   '  s: string;',
   '  a: TArr;',
   '  a: TArr;',
-  'procedure Run(const a: array of char);',
+  'procedure Run(const a: array of AnsiChar);',
   'begin',
   'begin',
   '  Run(c);',
   '  Run(c);',
   '  Run(s);',
   '  Run(s);',
@@ -11796,7 +11802,7 @@ begin
   '  Aliases: TarrStr = (''foo'',''b'');',
   '  Aliases: TarrStr = (''foo'',''b'');',
   '  OneInt: TArrInt = (7);',
   '  OneInt: TArrInt = (7);',
   '  OneStr: array of integer = (7);',
   '  OneStr: array of integer = (7);',
-  '  Chars: array of char = ''aoc'';',
+  '  Chars: array of AnsiChar = ''aoc'';',
   '  Names: array of string = (''a'',''foo'');',
   '  Names: array of string = (''a'',''foo'');',
   '  NameCount = low(Names)+high(Names)+length(Names);',
   '  NameCount = low(Names)+high(Names)+length(Names);',
   'var i: integer;',
   'var i: integer;',
@@ -11853,7 +11859,7 @@ begin
   '  Aliases: TarrStr = [''foo'',''b''];',
   '  Aliases: TarrStr = [''foo'',''b''];',
   '  OneInt: TArrInt = [7];',
   '  OneInt: TArrInt = [7];',
   '  OneStr: array of integer = [7]+[8];',
   '  OneStr: array of integer = [7]+[8];',
-  '  Chars: array of char = ''aoc'';',
+  '  Chars: array of AnsiChar = ''aoc'';',
   '  Names: array of string = [''a'',''a''];',
   '  Names: array of string = [''a'',''a''];',
   '  NameCount = low(Names)+high(Names)+length(Names);',
   '  NameCount = low(Names)+high(Names)+length(Names);',
   'begin',
   'begin',
@@ -14773,7 +14779,7 @@ begin
   Add('  end;');
   Add('  end;');
   Add('  TA = class');
   Add('  TA = class');
   Add('    constructor Create; override;');
   Add('    constructor Create; override;');
-  Add('    constructor CreateWithC(c: char);');
+  Add('    constructor CreateWithC(c: AnsiChar);');
   Add('    procedure DoIt;');
   Add('    procedure DoIt;');
   Add('    class function DoSome: TObject;');
   Add('    class function DoSome: TObject;');
   Add('  end;');
   Add('  end;');
@@ -14792,7 +14798,7 @@ begin
   Add('  inherited create; // normal call TObject.Create');
   Add('  inherited create; // normal call TObject.Create');
   Add('  inherited createwithb(false); // normal call TObject.CreateWithB');
   Add('  inherited createwithb(false); // normal call TObject.CreateWithB');
   Add('end;');
   Add('end;');
-  Add('constructor ta.createwithc(c: char);');
+  Add('constructor ta.createwithc(c: AnsiChar);');
   Add('begin');
   Add('begin');
   Add('  inherited create; // call TObject.Create');
   Add('  inherited create; // call TObject.Create');
   Add('  inherited createwithb(true); // call TObject.CreateWithB');
   Add('  inherited createwithb(true); // call TObject.CreateWithB');
@@ -27291,7 +27297,7 @@ begin
   '  TStringHelper = type helper for string',
   '  TStringHelper = type helper for string',
   '    procedure DoIt(e: byte = 123);',
   '    procedure DoIt(e: byte = 123);',
   '  end;',
   '  end;',
-  '  TCharHelper = type helper for char',
+  '  TCharHelper = type helper for AnsiChar',
   '    procedure Fly;',
   '    procedure Fly;',
   '  end;',
   '  end;',
   'procedure TStringHelper.DoIt(e: byte);',
   'procedure TStringHelper.DoIt(e: byte);',
@@ -29841,14 +29847,14 @@ begin
   Add('  TYesNo = boolean;');
   Add('  TYesNo = boolean;');
   Add('  TFloat = double;');
   Add('  TFloat = double;');
   Add('  TCaption = string;');
   Add('  TCaption = string;');
-  Add('  TChar = char;');
+  Add('  TChar = AnsiChar;');
   Add('var');
   Add('var');
   Add('  v: jsvalue;');
   Add('  v: jsvalue;');
   Add('  i: integer;');
   Add('  i: integer;');
   Add('  s: TCaption;');
   Add('  s: TCaption;');
   Add('  b: TYesNo;');
   Add('  b: TYesNo;');
   Add('  d: TFloat;');
   Add('  d: TFloat;');
-  Add('  c: char;');
+  Add('  c: AnsiChar;');
   Add('begin');
   Add('begin');
   Add('  i:=longint(v);');
   Add('  i:=longint(v);');
   Add('  i:=integer(v);');
   Add('  i:=integer(v);');
@@ -29858,7 +29864,7 @@ begin
   Add('  b:=TYesNo(v);');
   Add('  b:=TYesNo(v);');
   Add('  d:=double(v);');
   Add('  d:=double(v);');
   Add('  d:=TFloat(v);');
   Add('  d:=TFloat(v);');
-  Add('  c:=char(v);');
+  Add('  c:=AnsiChar(v);');
   Add('  c:=TChar(v);');
   Add('  c:=TChar(v);');
   ConvertProgram;
   ConvertProgram;
   CheckSource('TestJSValue_TypeCastToBaseType',
   CheckSource('TestJSValue_TypeCastToBaseType',
@@ -29936,7 +29942,7 @@ begin
   Add('  TYesNo = boolean;');
   Add('  TYesNo = boolean;');
   Add('  TFloat = double;');
   Add('  TFloat = double;');
   Add('  TCaption = string;');
   Add('  TCaption = string;');
-  Add('  TChar = char;');
+  Add('  TChar = AnsiChar;');
   Add('  TMulti = JSValue;');
   Add('  TMulti = JSValue;');
   Add('var');
   Add('var');
   Add('  v: jsvalue;');
   Add('  v: jsvalue;');
@@ -29944,7 +29950,7 @@ begin
   Add('  s: TCaption;');
   Add('  s: TCaption;');
   Add('  b: TYesNo;');
   Add('  b: TYesNo;');
   Add('  d: TFloat;');
   Add('  d: TFloat;');
-  Add('  c: char;');
+  Add('  c: AnsiChar;');
   Add('  m: TMulti;');
   Add('  m: TMulti;');
   Add('begin');
   Add('begin');
   Add('  b:=v=v;');
   Add('  b:=v=v;');
@@ -30319,7 +30325,7 @@ begin
   Add('  TYesNo = boolean;');
   Add('  TYesNo = boolean;');
   Add('  TFloat = double;');
   Add('  TFloat = double;');
   Add('  TCaption = string;');
   Add('  TCaption = string;');
-  Add('  TChar = char;');
+  Add('  TChar = AnsiChar;');
   Add('function DoIt(a: jsvalue; const b: jsvalue; var c: jsvalue; out d: jsvalue): jsvalue;');
   Add('function DoIt(a: jsvalue; const b: jsvalue; var c: jsvalue; out d: jsvalue): jsvalue;');
   Add('var');
   Add('var');
   Add('  l: jsvalue;');
   Add('  l: jsvalue;');
@@ -30913,12 +30919,12 @@ begin
   Add([
   Add([
   'type',
   'type',
   '  uni = string;',
   '  uni = string;',
-  '  WChar = char;',
+  '  WChar = AnsiChar;',
   'procedure DoIt(s: string); begin end;',
   'procedure DoIt(s: string); begin end;',
   'procedure DoIt(v: jsvalue); begin end;',
   'procedure DoIt(v: jsvalue); begin end;',
   'var',
   'var',
   '  s: string;',
   '  s: string;',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  u: uni;',
   '  u: uni;',
   'begin',
   'begin',
   '  DoIt(s);',
   '  DoIt(s);',
@@ -30949,12 +30955,12 @@ begin
   Add([
   Add([
   'type',
   'type',
   '  uni = string;',
   '  uni = string;',
-  '  WChar = char;',
-  'procedure DoIt(c: char); begin end;',
+  '  WChar = AnsiChar;',
+  'procedure DoIt(c: AnsiChar); begin end;',
   'procedure DoIt(v: jsvalue); begin end;',
   'procedure DoIt(v: jsvalue); begin end;',
   'var',
   'var',
   '  s: string;',
   '  s: string;',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  u: uni;',
   '  u: uni;',
   'begin',
   'begin',
   '  DoIt(s);',
   '  DoIt(s);',
@@ -31109,7 +31115,7 @@ begin
   Add('  TProcA = procedure;');
   Add('  TProcA = procedure;');
   Add('  TMethodB = procedure of object;');
   Add('  TMethodB = procedure of object;');
   Add('  TProcC = procedure; varargs;');
   Add('  TProcC = procedure; varargs;');
-  Add('  TProcD = procedure(i: longint; const j: string; var c: char; out d: double);');
+  Add('  TProcD = procedure(i: longint; const j: string; var c: AnsiChar; out d: double);');
   Add('  TProcE = function: nativeint;');
   Add('  TProcE = function: nativeint;');
   Add('  TProcF = function(const p: TProcA): nativeuint;');
   Add('  TProcF = function(const p: TProcA): nativeuint;');
   Add('var p: pointer;');
   Add('var p: pointer;');
@@ -31129,7 +31135,7 @@ begin
     '  procsig: rtl.newTIProcSig([], null, 2)',
     '  procsig: rtl.newTIProcSig([], null, 2)',
     '});',
     '});',
     'this.$rtti.$ProcVar("TProcD", {',
     'this.$rtti.$ProcVar("TProcD", {',
-    '  procsig: rtl.newTIProcSig([["i", rtl.longint], ["j", rtl.string, 2], ["c", rtl.char, 1], ["d", rtl.double, 4]])',
+    '  procsig: rtl.newTIProcSig([["i", rtl.longint], ["j", rtl.string, 2], ["c", rtl.AnsiChar, 1], ["d", rtl.double, 4]])',
     '});',
     '});',
     'this.$rtti.$ProcVar("TProcE", {',
     'this.$rtti.$ProcVar("TProcE", {',
     '  procsig: rtl.newTIProcSig([], rtl.nativeint)',
     '  procsig: rtl.newTIProcSig([], rtl.nativeint)',
@@ -31194,7 +31200,7 @@ begin
   '  ProcA: procedure;',
   '  ProcA: procedure;',
   '  MethodB: procedure of object;',
   '  MethodB: procedure of object;',
   '  ProcC: procedure; varargs;',
   '  ProcC: procedure; varargs;',
-  '  ProcD: procedure(i: longint; const j: string; var c: char; out d: double);',
+  '  ProcD: procedure(i: longint; const j: string; var c: AnsiChar; out d: double);',
   '  ProcE: function: nativeint;',
   '  ProcE: function: nativeint;',
   '  p: pointer;',
   '  p: pointer;',
   'begin',
   'begin',
@@ -31216,7 +31222,7 @@ begin
     '});',
     '});',
     'this.ProcC = null;',
     'this.ProcC = null;',
     'this.$rtti.$ProcVar("ProcD$a", {',
     'this.$rtti.$ProcVar("ProcD$a", {',
-    '  procsig: rtl.newTIProcSig([["i", rtl.longint], ["j", rtl.string, 2], ["c", rtl.char, 1], ["d", rtl.double, 4]])',
+    '  procsig: rtl.newTIProcSig([["i", rtl.longint], ["j", rtl.string, 2], ["c", rtl.AnsiChar, 1], ["d", rtl.double, 4]])',
     '});',
     '});',
     'this.ProcD = null;',
     'this.ProcD = null;',
     'this.$rtti.$ProcVar("ProcE$a", {',
     'this.$rtti.$ProcVar("ProcE$a", {',
@@ -31572,7 +31578,7 @@ begin
   Add('    FPropA: string;');
   Add('    FPropA: string;');
   Add('  published');
   Add('  published');
   Add('    VarLI: longint;');
   Add('    VarLI: longint;');
-  Add('    VarC: char;');
+  Add('    VarC: AnsiChar;');
   Add('    VarS: string;');
   Add('    VarS: string;');
   Add('    VarD: double;');
   Add('    VarD: double;');
   Add('    VarB: boolean;');
   Add('    VarB: boolean;');
@@ -31615,7 +31621,7 @@ begin
     '  };',
     '  };',
     '  var $r = this.$rtti;',
     '  var $r = this.$rtti;',
     '  $r.addField("VarLI", rtl.longint);',
     '  $r.addField("VarLI", rtl.longint);',
-    '  $r.addField("VarC", rtl.char);',
+    '  $r.addField("VarC", rtl.AnsiChar);',
     '  $r.addField("VarS", rtl.string);',
     '  $r.addField("VarS", rtl.string);',
     '  $r.addField("VarD", rtl.double);',
     '  $r.addField("VarD", rtl.double);',
     '  $r.addField("VarB", rtl.boolean);',
     '  $r.addField("VarB", rtl.boolean);',
@@ -31798,11 +31804,11 @@ begin
   Add('  private');
   Add('  private');
   Add('    function GetItems(i: integer): tobject; virtual; abstract;');
   Add('    function GetItems(i: integer): tobject; virtual; abstract;');
   Add('    procedure SetItems(i: integer; value: tobject); virtual; abstract;');
   Add('    procedure SetItems(i: integer; value: tobject); virtual; abstract;');
-  Add('    function GetValues(const i: integer; var b: boolean): char; virtual; abstract;');
-  Add('    procedure SetValues(const i: integer; var b: boolean; value: char); virtual; abstract;');
+  Add('    function GetValues(const i: integer; var b: boolean): AnsiChar; virtual; abstract;');
+  Add('    procedure SetValues(const i: integer; var b: boolean; value: AnsiChar); virtual; abstract;');
   Add('  published');
   Add('  published');
   Add('    property Items[Index: integer]: tobject read getitems write setitems;');
   Add('    property Items[Index: integer]: tobject read getitems write setitems;');
-  Add('    property Values[const keya: integer; var keyb: boolean]: char read getvalues write setvalues;');
+  Add('    property Values[const keya: integer; var keyb: boolean]: AnsiChar read getvalues write setvalues;');
   Add('  end;');
   Add('  end;');
   Add('begin');
   Add('begin');
   ConvertProgram;
   ConvertProgram;
@@ -31815,7 +31821,7 @@ begin
     '  };',
     '  };',
     '  var $r = this.$rtti;',
     '  var $r = this.$rtti;',
     '  $r.addProperty("Items", 3, $r, "GetItems", "SetItems");',
     '  $r.addProperty("Items", 3, $r, "GetItems", "SetItems");',
-    '  $r.addProperty("Values", 3, rtl.char, "GetValues", "SetValues");',
+    '  $r.addProperty("Values", 3, rtl.AnsiChar, "GetValues", "SetValues");',
     '});',
     '});',
     '']),
     '']),
     LinesToStr([ // $mod.$main
     LinesToStr([ // $mod.$main
@@ -32687,7 +32693,7 @@ begin
   StartProgram(false);
   StartProgram(false);
   Add('type');
   Add('type');
   Add('  TFloatRec = record');
   Add('  TFloatRec = record');
-  Add('    c,d: array of char;');
+  Add('    c,d: array of AnsiChar;');
   // Add('    i: array of array of longint;');
   // Add('    i: array of array of longint;');
   Add('  end;');
   Add('  end;');
   Add('var p: pointer;');
   Add('var p: pointer;');
@@ -32716,7 +32722,7 @@ begin
     '  };',
     '  };',
     '  var $r = $mod.$rtti.$Record("TFloatRec", {});',
     '  var $r = $mod.$rtti.$Record("TFloatRec", {});',
     '  $mod.$rtti.$DynArray("TFloatRec.d$a", {',
     '  $mod.$rtti.$DynArray("TFloatRec.d$a", {',
-    '    eltype: rtl.char',
+    '    eltype: rtl.AnsiChar',
     '  });',
     '  });',
     '  $r.addField("c", $mod.$rtti["TFloatRec.d$a"]);',
     '  $r.addField("c", $mod.$rtti["TFloatRec.d$a"]);',
     '  $r.addField("d", $mod.$rtti["TFloatRec.d$a"]);',
     '  $r.addField("d", $mod.$rtti["TFloatRec.d$a"]);',
@@ -32812,7 +32818,7 @@ begin
   'type',
   'type',
   '  TCaption = string;',
   '  TCaption = string;',
   '  TYesNo = boolean;',
   '  TYesNo = boolean;',
-  '  TLetter = char;',
+  '  TLetter = AnsiChar;',
   '  TFloat = double;',
   '  TFloat = double;',
   '  TPtr = pointer;',
   '  TPtr = pointer;',
   '  TShortInt = shortint;',
   '  TShortInt = shortint;',
@@ -32828,7 +32834,7 @@ begin
   '  p:=typeinfo(tcaption);',
   '  p:=typeinfo(tcaption);',
   '  p:=typeinfo(boolean);',
   '  p:=typeinfo(boolean);',
   '  p:=typeinfo(tyesno);',
   '  p:=typeinfo(tyesno);',
-  '  p:=typeinfo(char);',
+  '  p:=typeinfo(AnsiChar);',
   '  p:=typeinfo(tletter);',
   '  p:=typeinfo(tletter);',
   '  p:=typeinfo(double);',
   '  p:=typeinfo(double);',
   '  p:=typeinfo(tfloat);',
   '  p:=typeinfo(tfloat);',
@@ -32857,8 +32863,8 @@ begin
     '$mod.p = rtl.string;',
     '$mod.p = rtl.string;',
     '$mod.p = rtl.boolean;',
     '$mod.p = rtl.boolean;',
     '$mod.p = rtl.boolean;',
     '$mod.p = rtl.boolean;',
-    '$mod.p = rtl.char;',
-    '$mod.p = rtl.char;',
+    '$mod.p = rtl.AnsiChar;',
+    '$mod.p = rtl.AnsiChar;',
     '$mod.p = rtl.double;',
     '$mod.p = rtl.double;',
     '$mod.p = rtl.double;',
     '$mod.p = rtl.double;',
     '$mod.p = rtl.pointer;',
     '$mod.p = rtl.pointer;',
@@ -32886,7 +32892,7 @@ begin
   'type',
   'type',
   '  TCaption = type string;',
   '  TCaption = type string;',
   '  TYesNo = type boolean;',
   '  TYesNo = type boolean;',
-  '  TLetter = type char;',
+  '  TLetter = type AnsiChar;',
   '  TFloat = type double;',
   '  TFloat = type double;',
   '  TPtr = type pointer;',
   '  TPtr = type pointer;',
   '  TShortInt = type shortint;',
   '  TShortInt = type shortint;',
@@ -32920,7 +32926,7 @@ begin
     LinesToStr([ // statements
     LinesToStr([ // statements
     'this.$rtti.$inherited("TCaption", rtl.string, {});',
     'this.$rtti.$inherited("TCaption", rtl.string, {});',
     'this.$rtti.$inherited("TYesNo", rtl.boolean, {});',
     'this.$rtti.$inherited("TYesNo", rtl.boolean, {});',
-    'this.$rtti.$inherited("TLetter", rtl.char, {});',
+    'this.$rtti.$inherited("TLetter", rtl.AnsiChar, {});',
     'this.$rtti.$inherited("TFloat", rtl.double, {});',
     'this.$rtti.$inherited("TFloat", rtl.double, {});',
     'this.$rtti.$inherited("TPtr", rtl.pointer, {});',
     'this.$rtti.$inherited("TPtr", rtl.pointer, {});',
     'this.$rtti.$inherited("TShortInt", rtl.shortint, {});',
     'this.$rtti.$inherited("TShortInt", rtl.shortint, {});',
@@ -32987,7 +32993,7 @@ begin
   'begin',
   'begin',
   '  ti:=typeinfo(string);',
   '  ti:=typeinfo(string);',
   '  ti:=typeinfo(boolean);',
   '  ti:=typeinfo(boolean);',
-  '  ti:=typeinfo(char);',
+  '  ti:=typeinfo(AnsiChar);',
   '  ti:=typeinfo(double);',
   '  ti:=typeinfo(double);',
   '  tiInt:=typeinfo(shortint);',
   '  tiInt:=typeinfo(shortint);',
   '  tiInt:=typeinfo(byte);',
   '  tiInt:=typeinfo(byte);',
@@ -33024,7 +33030,7 @@ begin
     LinesToStr([ // $mod.$main
     LinesToStr([ // $mod.$main
     '$mod.ti = rtl.string;',
     '$mod.ti = rtl.string;',
     '$mod.ti = rtl.boolean;',
     '$mod.ti = rtl.boolean;',
-    '$mod.ti = rtl.char;',
+    '$mod.ti = rtl.AnsiChar;',
     '$mod.ti = rtl.double;',
     '$mod.ti = rtl.double;',
     '$mod.tiInt = rtl.shortint;',
     '$mod.tiInt = rtl.shortint;',
     '$mod.tiInt = rtl.byte;',
     '$mod.tiInt = rtl.byte;',
@@ -33615,7 +33621,7 @@ begin
   '  Red = ''red'';',
   '  Red = ''red'';',
   '  Foobar = ''fOo''+bar;',
   '  Foobar = ''fOo''+bar;',
   'var s: string;',
   'var s: string;',
-  '  c: char;',
+  '  c: AnsiChar;',
   'begin',
   'begin',
   '  s:=red;',
   '  s:=red;',
   '  s:=test1.red;',
   '  s:=test1.red;',
@@ -34397,7 +34403,7 @@ begin
   Add([
   Add([
   '{$R+}',
   '{$R+}',
   'type',
   'type',
-  '  TLetter = char;',
+  '  TLetter = AnsiChar;',
   'var',
   'var',
   '  b: TLetter = ''2'';',
   '  b: TLetter = ''2'';',
   '  w: TLetter = ''3'';',
   '  w: TLetter = ''3'';',
@@ -34503,7 +34509,7 @@ begin
   '  ArrChar: TArrChar;',
   '  ArrChar: TArrChar;',
   '  ArrByteChar: TArrByteChar;',
   '  ArrByteChar: TArrByteChar;',
   '  i: Ten;',
   '  i: Ten;',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  o: tobject;',
   '  o: tobject;',
   'begin',
   'begin',
   '  i:=Arr[1];',
   '  i:=Arr[1];',
@@ -34637,7 +34643,7 @@ begin
   'var',
   'var',
   '  s: string;',
   '  s: string;',
   '  i: longint;',
   '  i: longint;',
-  '  c: char;',
+  '  c: AnsiChar;',
   '  o: tobject;',
   '  o: tobject;',
   'begin',
   'begin',
   '  c:=s[1];',
   '  c:=s[1];',

+ 2 - 2
packages/pastojs/tests/tcoptimizations.pas

@@ -2535,7 +2535,7 @@ begin
   StartProgram(true);
   StartProgram(true);
   Add([
   Add([
   'type',
   'type',
-  '  TArrA = array of char;',
+  '  TArrA = array of AnsiChar;',
   '  TArrB = array of string;',
   '  TArrB = array of string;',
   '  TObject = class',
   '  TObject = class',
   '  public',
   '  public',
@@ -2586,7 +2586,7 @@ begin
   WithTypeInfo:=true;
   WithTypeInfo:=true;
   StartProgram(true);
   StartProgram(true);
   Add('type');
   Add('type');
-  Add('  TArrA = array of char;');
+  Add('  TArrA = array of AnsiChar;');
   Add('  TArrB = array of string;');
   Add('  TArrB = array of string;');
   Add('var');
   Add('var');
   Add('  A: TArrA;');
   Add('  A: TArrA;');

+ 11 - 11
packages/pastojs/tests/tcsrcmap.pas

@@ -153,7 +153,7 @@ var
 var
 var
   i, j, ColMin, ColMax: integer;
   i, j, ColMin, ColMax: integer;
   Line, aName, SegFile, ActLine: String;
   Line, aName, SegFile, ActLine: String;
-  p, StartP, ActP: PChar;
+  p, StartP, ActP: PAnsiChar;
   m: PMarker;
   m: PMarker;
   aSeg: TSourceMapSegment;
   aSeg: TSourceMapSegment;
 begin
 begin
@@ -184,26 +184,26 @@ begin
     for i:=1 to PasSrc.Count do
     for i:=1 to PasSrc.Count do
       begin
       begin
       Line:=PasSrc[i-1];
       Line:=PasSrc[i-1];
-      p:=PChar(Line);
+      p:=PAnsiChar(Line);
       repeat
       repeat
         case p^ of
         case p^ of
         #0: break;
         #0: break;
         '(':
         '(':
           if (p[1]='*') and (p[2] in ['a'..'z','A'..'Z','_']) then
           if (p[1]='*') and (p[2] in ['a'..'z','A'..'Z','_']) then
             begin
             begin
-            ColMin:=p-PChar(Line);
+            ColMin:=p-PAnsiChar(Line);
             inc(p,2);
             inc(p,2);
             StartP:=p;
             StartP:=p;
             while p^ in ['a'..'z','A'..'Z','0'..'9','_'] do inc(p);
             while p^ in ['a'..'z','A'..'Z','0'..'9','_'] do inc(p);
-            aName:=copy(Line,StartP-PChar(Line)+1,p-StartP);
+            aName:=copy(Line,StartP-PAnsiChar(Line)+1,p-StartP);
             if (p^<>'*') or (p[1]<>')') then
             if (p^<>'*') or (p[1]<>')') then
               begin
               begin
               for j:=1 to i do
               for j:=1 to i do
                 writeln(PasSrc[j-1]);
                 writeln(PasSrc[j-1]);
-              Fail('missing closing bracket of Pascal marker at '+IntToStr(i)+','+IntToStr(p-PChar(Line)));
+              Fail('missing closing bracket of Pascal marker at '+IntToStr(i)+','+IntToStr(p-PAnsiChar(Line)));
               end;
               end;
             inc(p,2);
             inc(p,2);
-            ColMax:=p-PChar(Line);
+            ColMax:=p-PAnsiChar(Line);
             AddMarker(aName,i,ColMin,ColMax);
             AddMarker(aName,i,ColMin,ColMax);
             continue;
             continue;
             end;
             end;
@@ -221,20 +221,20 @@ begin
         writeln('TCustomTestSrcMap.CheckSrcMap unexpected JS line ',i,': ',ActLine);
         writeln('TCustomTestSrcMap.CheckSrcMap unexpected JS line ',i,': ',ActLine);
         Fail('created JS has more lines than expected JS');
         Fail('created JS has more lines than expected JS');
         end;
         end;
-      ActP:=PChar(ActLine);
+      ActP:=PAnsiChar(ActLine);
       Line:=JSLines[i-1];
       Line:=JSLines[i-1];
-      p:=PChar(Line);
+      p:=PAnsiChar(Line);
       repeat
       repeat
         case p^ of
         case p^ of
         #0: break;
         #0: break;
         '(':
         '(':
           if (p[1]='*') and (p[2] in ['a'..'z','A'..'Z','_']) then
           if (p[1]='*') and (p[2] in ['a'..'z','A'..'Z','_']) then
             begin
             begin
-            ColMin:=ActP-PChar(ActLine);
+            ColMin:=ActP-PAnsiChar(ActLine);
             inc(p,2);
             inc(p,2);
             StartP:=p;
             StartP:=p;
             while p^ in ['a'..'z','A'..'Z','0'..'9','_'] do inc(p);
             while p^ in ['a'..'z','A'..'Z','0'..'9','_'] do inc(p);
-            aName:=copy(Line,StartP-PChar(Line)+1,p-StartP);
+            aName:=copy(Line,StartP-PAnsiChar(Line)+1,p-StartP);
             if (p^<>'*') or (p[1]<>')') then
             if (p^<>'*') or (p[1]<>')') then
               begin
               begin
               for j:=1 to i do
               for j:=1 to i do
@@ -265,7 +265,7 @@ begin
           writeln('JavaScript: ');
           writeln('JavaScript: ');
           for j:=0 to i-1 do
           for j:=0 to i-1 do
             writeln(JSSource[j]);
             writeln(JSSource[j]);
-          for j:=1 to P-PChar(Line) do write('-');
+          for j:=1 to P-PAnsiChar(Line) do write('-');
           writeln('^');
           writeln('^');
           writeln('Expected JS:<',Line,'>');
           writeln('Expected JS:<',Line,'>');
           AssertEquals('Expected JavaScript differs',p^,ActP^);
           AssertEquals('Expected JavaScript differs',p^,ActP^);

+ 2 - 12
packages/pastojs/tests/testpas2js.lpi

@@ -29,14 +29,6 @@
         <Mode0 Name="default"/>
         <Mode0 Name="default"/>
       </Modes>
       </Modes>
     </RunParams>
     </RunParams>
-    <RequiredPackages Count="2">
-      <Item1>
-        <PackageName Value="FPCUnitConsoleRunner"/>
-      </Item1>
-      <Item2>
-        <PackageName Value="FCL"/>
-      </Item2>
-    </RequiredPackages>
     <Units Count="14">
     <Units Count="14">
       <Unit0>
       <Unit0>
         <Filename Value="testpas2js.pp"/>
         <Filename Value="testpas2js.pp"/>
@@ -128,10 +120,8 @@
       <VerifyObjMethodCallValidity Value="True"/>
       <VerifyObjMethodCallValidity Value="True"/>
     </CodeGeneration>
     </CodeGeneration>
     <Other>
     <Other>
-      <CustomOptions Value="-dVerbosePas2JS"/>
-      <OtherDefines Count="1">
-        <Define0 Value="VerbosePas2JS"/>
-      </OtherDefines>
+      <CustomOptions Value="-dVerbosePas2JS 
+-tunicodertl"/>
     </Other>
     </Other>
   </CompilerOptions>
   </CompilerOptions>
   <Debugging>
   <Debugging>

+ 3 - 0
packages/pastojs/tests/testpas2js.pp

@@ -18,6 +18,9 @@ program testpas2js;
 {$mode objfpc}{$H+}
 {$mode objfpc}{$H+}
 
 
 uses
 uses
+  {$ifdef unix}
+  cwstring,
+  {$endif}
   {$IFDEF EnableMemCheck}
   {$IFDEF EnableMemCheck}
   MemCheck,
   MemCheck,
   {$ENDIF}
   {$ENDIF}