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

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

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

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

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

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

@@ -393,7 +393,7 @@ const
     'None',
     'Enum',
     'Int',
-    'Char',
+    'AnsiChar',
     'Bool'
     );
 
@@ -643,7 +643,7 @@ type
   TPCUSourceFileArray = array of TPCUSourceFile;
 
   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 }
 
@@ -1083,7 +1083,8 @@ type
     function CheckJSONArray(Data: TJSONData; El: TPasElement; const PropName: string): TJSONArray;
     function CheckJSONObject(Data: TJSONData; Id: int64): TJSONObject;
     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 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;
@@ -1318,7 +1319,7 @@ function EncodeVLQ(i: TMaxPrecUInt): string; overload;
 function DecodeVLQ(const s: string): 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 ModeSwitchToInt(ms: TModeSwitch): byte;
@@ -1329,7 +1330,7 @@ procedure WriteJSON(aData: TJSONData; TargetStream: TStream; Compressed: boolean
 procedure GrowIdToRefsArray(var IdToRefsArray: TPCUFilerElementRefArray; Id: integer);
 
 function dbgmem(const s: string): string; overload;
-function dbgmem(p: PChar; Cnt: integer): string; overload;
+function dbgmem(p: PAnsiChar; Cnt: integer): string; overload;
 
 implementation
 
@@ -1477,9 +1478,9 @@ begin
     Result:=-Result;
 end;
 
-function ComputeChecksum(p: PChar; Cnt: integer): TPCUSourceFileChecksum;
+function ComputeChecksum(p: PAnsiChar; Cnt: integer): TPCUSourceFileChecksum;
 var
-  SrcP, SrcEndP, SrcLineEndP, SrcLineStartP: PChar;
+  SrcP, SrcEndP, SrcLineEndP, SrcLineStartP: PAnsiChar;
   l: PtrInt;
   CheckSum, CurLen: Cardinal;
 begin
@@ -1688,7 +1689,7 @@ var
     TargetStream.Write(s[1],length(s));
   end;
 
-  procedure WriteChar(const c: char);
+  procedure WriteChar(const c: AnsiChar);
   begin
     TargetStream.Write(c,1);
   end;
@@ -1829,10 +1830,10 @@ end;
 function dbgmem(const s: string): string;
 begin
   if s='' then exit('');
-  Result:=dbgmem(PChar(s),length(s));
+  Result:=dbgmem(PAnsiChar(s),length(s));
 end;
 
-function dbgmem(p: PChar; Cnt: integer): string;
+function dbgmem(p: PAnsiChar; Cnt: integer): string;
 
   procedure AddLine(const Line: string);
   begin
@@ -1842,7 +1843,7 @@ function dbgmem(p: PChar; Cnt: integer): string;
   end;
 
 var
-  c: Char;
+  c: AnsiChar;
   IsTxt: boolean;
   Line: String;
   i: Integer;
@@ -2103,7 +2104,7 @@ end;
 
 function TPCUFiler.GetSrcCheckSum(aFilename: string): TPCUSourceFileChecksum;
 var
-  p: PChar;
+  p: PAnsiChar;
   Cnt: integer;
 begin
   OnGetSrc(Self,aFilename,p,Cnt);
@@ -5836,7 +5837,7 @@ begin
 end;
 
 function TPCUReader.ReadString(Obj: TJSONObject; const PropName: string; out
-  s: string; El: TPasElement): boolean;
+  s: AnsiString; El: TPasElement): boolean;
 var
   Data: TJSONData;
 begin
@@ -5852,6 +5853,23 @@ begin
   Result:=false;
 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
   i: integer; El: TPasElement): boolean;
 var

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

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

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

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

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

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

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

@@ -64,7 +64,7 @@ Type
   public
     Constructor Create(Const aFileName, aSource: String); overload;
     function IsEOF: Boolean; override;
-    function ReadLine: string; override;
+    function ReadLine: TPasScannerString; override;
     property LineNumber: integer read FLineNumber;
   end;
 
@@ -124,7 +124,7 @@ Type
     function CreateResolver: TPas2jsFSResolver; virtual;
     // On success, return '', On error, return error message.
     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
     Constructor Create; virtual;
     Procedure Reset; virtual;
@@ -306,7 +306,7 @@ begin
   if (aValue='') or FromCmdLine then ;
 end;
 
-function TPas2JSFS.HandleOptionPaths(C: Char; aValue: String; FromCmdLine: Boolean): String;
+function TPas2JSFS.HandleOptionPaths(C: AnsiChar; aValue: String; FromCmdLine: Boolean): String;
 begin
   Result:='Invalid parameter: -F'+C+aValue;
   if FromCmdLine then ;
@@ -376,7 +376,7 @@ begin
   Result:=FIsEOF;
 end;
 
-function TSourceLineReader.ReadLine: string;
+function TSourceLineReader.ReadLine: tpasscannerstring;
 var
   S: string;
   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 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: TJSElement): string; overload;
 function DbgString(Element: TJSElement; Indent: integer): string; overload;
@@ -244,12 +244,12 @@ begin
   Result:=Msg1.Number-Msg2.Number;
 end;
 
-function QuoteStr(const s: string; Quote: char): string;
+function QuoteStr(const s: string; Quote: AnsiChar): string;
 begin
   Result:={$IFDEF Pas2JS}SysUtils.QuotedStr{$ELSE}AnsiQuotedStr{$ENDIF}(S,Quote);
 end;
 
-function DeQuoteStr(const s: string; Quote: char): string;
+function DeQuoteStr(const s: string; Quote: AnsiChar): string;
 begin
   Result:={$IFDEF Pas2JS}SysUtils.DeQuoteString{$ELSE}AnsiDequotedStr{$ENDIF}(S,Quote);
 end;
@@ -494,14 +494,14 @@ var
 begin
   Result:='';
   for i:=0 to Count-1 do
-    Result:=Result+HexStr(ord(PChar(p)[i]),2);
+    Result:=Result+HexStr(ord(PAnsiChar(p)[i]),2);
 end;
 {$ENDIF}
 
 function DbgStr(const s: string): string;
 var
   i: Integer;
-  c: Char;
+  c: AnsiChar;
 begin
   Result:='';
   for i:=1 to length(s) do begin
@@ -679,7 +679,7 @@ end;
 
 procedure TPas2jsLogger.DoLogRaw(const Msg: string; SkipEncoding : Boolean);
 var
-  S: String;
+  S: ansiString;
 begin
   if SkipEncoding then
     S:=Msg

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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