Browse Source

* PChar -> PAnsiChar

Michaël Van Canneyt 2 years ago
parent
commit
940016034c

+ 1 - 1
packages/fcl-json/examples/simpledemo.pp

@@ -220,7 +220,7 @@ Procedure DoTestObject;
 
 Var
   J : TJSONObject;
-  I : Char;
+  I : AnsiChar;
   k : Integer;
   
 begin

+ 28 - 15
packages/fcl-json/src/fpjson.pp

@@ -56,7 +56,7 @@ type
   TFPJSStream = TMemoryStream;
   TJSONLargeInt = Int64;
   {$else}
-  TJSONCharType = char;
+  TJSONCharType = AnsiChar;
   TJSONVariant = jsvalue;
   TFPJSStream = TJSArray;
   TJSONLargeInt = NativeInt;
@@ -547,7 +547,7 @@ Type
     {$ELSE}
     function Add(I : NativeInt): Integer;
     {$ENDIF}
-    function Add(const S : String): Integer;
+    function Add(const S : AnsiString): Integer;
     function Add: Integer;
     function Add(F : TJSONFloat): Integer;
     function Add(B : Boolean): Integer;
@@ -567,7 +567,7 @@ Type
     {$ELSE}
     procedure Insert(Index: Integer; I : NativeInt);
     {$ENDIF}
-    procedure Insert(Index: Integer; const S : String);
+    procedure Insert(Index: Integer; const S : AnsiString);
     procedure Insert(Index: Integer; F : TJSONFloat);
     procedure Insert(Index: Integer; B : Boolean);
     procedure Insert(Index: Integer; AnArray : TJSONArray);
@@ -767,7 +767,9 @@ Function SetJSONInstanceType(AType : TJSONInstanceType; AClass : TJSONDataClass)
 Function GetJSONInstanceType(AType : TJSONInstanceType) : TJSONDataClass;
 
 Function StringToJSONString(const S : TJSONStringType; Strict : Boolean = False) : TJSONStringType;
+Function StringToJSONString(const S : UnicodeString; Strict : Boolean = False) : TJSONStringType;
 Function JSONStringToString(const S : TJSONStringType) : TJSONStringType;
+Function JSONStringToString(const S : UnicodeString) : TJSONStringType;
 Function JSONTypeName(JSONType : TJSONType) : String;
 
 // These functions create JSONData structures, taking into account the instance types
@@ -805,7 +807,7 @@ Uses typinfo;
 
 {$IFNDEF Pas2js}
 const
-  HexDigits: array[0..15] of char = '0123456789ABCDEF';
+  HexDigits: array[0..15] of AnsiChar = '0123456789ABCDEF';
 {$ENDIF}
 
 Resourcestring
@@ -892,19 +894,19 @@ begin
 end;
 {$ELSE}
 var
-  ResultPos: PChar;
+  ResultPos: PAnsiChar;
 
-  procedure W(p: PChar; Count: SizeInt);
+  procedure W(p: PAnsiChar; Count: SizeInt);
   begin
     Move(p^,ResultPos^,Count);
     inc(ResultPos,Count);
   end;
 
 var
-  hex : array[0..5] of char;
-  C : Char;
+  hex : array[0..5] of AnsiChar;
+  C : AnsiChar;
   i, ResultLen, SLen: SizeInt;
-  SPos, SEnd, SLastPos: PChar;
+  SPos, SEnd, SLastPos: PAnsiChar;
 
 begin
   SLen:=length(S);
@@ -934,10 +936,10 @@ begin
     exit(S);
 
   SetLength(Result,ResultLen);
-  ResultPos:=PChar(Result);
+  ResultPos:=PAnsiChar(Result);
 
   hex:='\u00';
-  SPos:=PChar(S);
+  SPos:=PAnsiChar(S);
   SEnd:=SPos+SLen;
   SLastPos:=SPos;
   While SPos<SEnd do
@@ -975,6 +977,12 @@ begin
 end;
 {$ENDIF}
 
+function StringToJSONString(const S: UnicodeString; Strict: Boolean
+  ): TJSONStringType;
+begin
+  Result:=StringToJSONString(UTF8Encode(S),Strict);
+end;
+
 function JSONStringToString(const S: TJSONStringType): TJSONStringType;
 
 {$IFDEF PAS2JS}
@@ -1001,7 +1009,7 @@ end;
     function BufferHexToInt(P : PAnsiChar): integer;
     var
       N, i: integer;
-      ch: char;
+      ch: AnsiChar;
     begin
       Result:= 0;
       for i:= 1 to 4 do
@@ -1106,6 +1114,11 @@ begin
 end;
 {$ENDIF}
 
+function JSONStringToString(const S: UnicodeString): TJSONStringType;
+begin
+  Result:=JSONStringToString(UTF8Encode(S));
+end;
+
 function JSONTypeName(JSONType: TJSONType): String;
 begin
   Result:=GetEnumName(TypeInfo(TJSONType),Ord(JSONType));
@@ -1481,7 +1494,7 @@ procedure TJSONData.DumpJSON(S: TFPJSStream);
     {$IFDEF PAS2JS}
     S.push(T);
     {$else}
-    S.WriteBuffer(T[1],Length(T)*SizeOf(Char));
+    S.WriteBuffer(T[1],Length(T)*SizeOf(AnsiChar));
     {$ENDIF}
   end;
 
@@ -3027,7 +3040,7 @@ end;
 
 {$ENDIF}
 
-function TJSONArray.Add(const S: String): Integer;
+function TJSONArray.Add(const S: AnsiString): Integer;
 begin
   Result:=Add(CreateJSON(S));
 end;
@@ -3097,7 +3110,7 @@ begin
 end;
 
 
-procedure TJSONArray.Insert(Index: Integer; const S: String);
+procedure TJSONArray.Insert(Index: Integer; const S: AnsiString);
 begin
   FList.Insert(Index, CreateJSON(S));
 end;

+ 1 - 1
packages/fcl-json/src/fpjsonrtti.pp

@@ -1177,7 +1177,7 @@ begin
         end;
         end;
     tkChar:
-      Result:=TJSONString.Create(Char(GetOrdProp(AObject,PI)));
+      Result:=TJSONString.Create(AnsiChar(GetOrdProp(AObject,PI)));
     tkSString,
     tkLString,
     tkAString:

+ 11 - 3
packages/fcl-json/src/jsonreader.pp

@@ -63,6 +63,7 @@ Type
     Constructor Create(Const Source : RawByteString; AUseUTF8 : Boolean = True); overload;deprecated 'use options form instead';
     constructor Create(Source: TStream; AOptions: TJSONOptions); overload;
     constructor Create(const Source: RawByteString; AOptions: TJSONOptions); overload;
+    constructor Create(const Source: UnicodeString; AOptions: TJSONOptions); overload;
     destructor Destroy();override;
     // Parsing options
     Property Options : TJSONOptions Read GetOptions Write SetOptions;
@@ -184,7 +185,7 @@ Resourcestring
 { TBaseJSONReader }
 
 
-Procedure TBaseJSONReader.DoExecute;
+procedure TBaseJSONReader.DoExecute;
 
 begin
   if (FScanner=Nil) then
@@ -338,7 +339,7 @@ end;
 
 
 // Current token is {, on exit current token is }
-Procedure TBaseJSONReader.ParseObject;
+procedure TBaseJSONReader.ParseObject;
 
 Var
   T : TJSONtoken;
@@ -375,7 +376,7 @@ begin
 end;
 
 // Current token is [, on exit current token is ]
-Procedure TBaseJSONReader.ParseArray;
+procedure TBaseJSONReader.ParseArray;
 
 Var
   T : TJSONtoken;
@@ -448,6 +449,13 @@ begin
   FScanner:=TJSONScanner.Create(Source,AOptions);
 end;
 
+constructor TBaseJSONReader.Create(const Source: UnicodeString;
+  AOptions: TJSONOptions);
+begin
+  Include(aOptions,joUTF8);
+  Create(UTF8Encode(Source),aOptions);
+end;
+
 destructor TBaseJSONReader.Destroy();
 begin
   FreeAndNil(FScanner);

+ 10 - 10
packages/fcl-json/src/jsonscanner.pp

@@ -67,13 +67,13 @@ Type
     FCurPos : PAnsiChar; // Position inside total string
     FCurRow: Integer;
     FCurToken: TJSONToken;
-    FCurTokenString: string;
-    FCurLine: PChar;
+    FCurTokenString: AnsiString;
+    FCurLine: PAnsiChar;
     FTokenStr:  PAnsiChar; // position inside FCurLine
     FEOL : PAnsiChar; // EOL
     FOptions : TJSONOptions;
     function GetCurColumn: Integer; inline;
-    function GetCurLine: string;
+    function GetCurLine: AnsiString;
     function GetO(AIndex: TJSONOption): Boolean;
     procedure SetO(AIndex: TJSONOption; AValue: Boolean);
   protected
@@ -88,12 +88,12 @@ Type
 
     function FetchToken: TJSONToken;
 
-    property CurLine: string read GetCurLine;
+    property CurLine: Ansistring read GetCurLine;
     property CurRow: Integer read FCurRow;
     property CurColumn: Integer read GetCurColumn;
 
     property CurToken: TJSONToken read FCurToken;
-    property CurTokenString: string read FCurTokenString;
+    property CurTokenString: Ansistring read FCurTokenString;
     // Use strict JSON: " for strings, object members are strings, not identifiers
     Property Strict : Boolean Index joStrict Read GetO Write SetO ; deprecated 'use options instead';
     // if set to TRUE, then strings will be converted to UTF8 ansistrings, not system codepage ansistrings.
@@ -249,11 +249,11 @@ function TJSONScanner.FetchToken: TJSONToken;
   end;
 
 var
-  TokenStart: PChar;
+  TokenStart: PAnsiChar;
   it : TJSONToken;
   I : Integer;
   OldLength, SectionLength,  tstart,tcol, u1,u2: Integer;
-  C , c2: char;
+  C , c2: AnsiChar;
   S : String[8];
   Line : String;
   IsStar,EOC: Boolean;
@@ -402,7 +402,7 @@ begin
                 Move(S[1],FCurTokenString[OldLength + SectionLength+1],i);
               Inc(OldLength, SectionLength+I);
               end;
-            // Next char
+            // Next AnsiChar
             TokenStart := FTokenStr+1;
             end
           else if u1<>0 then
@@ -522,7 +522,7 @@ begin
               FCurTokenString:='';
               Inc(FTokenStr);
               TokenStart:=FTokenStr;
-              SectionLength := PChar(FEOL)-TokenStart;
+              SectionLength := PAnsiChar(FEOL)-TokenStart;
               SetString(FCurTokenString, TokenStart, SectionLength);
               FetchLine;
               end;
@@ -605,7 +605,7 @@ begin
   Result:=DoFetchToken;
 end;}
 
-function TJSONScanner.GetCurLine: string;
+function TJSONScanner.GetCurLine: Ansistring;
 begin
   Result:='';
   if FCurLine<>Nil then

+ 5 - 7
packages/fcl-json/tests/testjson.lpi

@@ -21,24 +21,19 @@
     </PublishOptions>
     <RunParams>
       <local>
-        <CommandLineParams Value="--suite=TTestJSONString.TestJSONStringToString"/>
+        <CommandLineParams Value="--suite=TTestJSONDeStreamer.TestDateTime"/>
         <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T &apos;Lazarus Run Output&apos; -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
       </local>
       <FormatVersion Value="2"/>
       <Modes Count="1">
         <Mode0 Name="default">
           <local>
-            <CommandLineParams Value="--suite=TTestJSONString.TestJSONStringToString"/>
+            <CommandLineParams Value="--suite=TTestJSONDeStreamer.TestDateTime"/>
             <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T &apos;Lazarus Run Output&apos; -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
           </local>
         </Mode0>
       </Modes>
     </RunParams>
-    <RequiredPackages Count="1">
-      <Item1>
-        <PackageName Value="FCL"/>
-      </Item1>
-    </RequiredPackages>
     <Units Count="6">
       <Unit0>
         <Filename Value="testjson.pp"/>
@@ -77,6 +72,9 @@
         <TrashVariables Value="True"/>
       </Debugging>
     </Linking>
+    <Other>
+      <CustomOptions Value="-tunicodertl"/>
+    </Other>
   </CompilerOptions>
   <Debugging>
     <Exceptions Count="2">

+ 7 - 5
packages/fcl-json/tests/testjsondata.pas

@@ -14,6 +14,7 @@
  **********************************************************************}
 {$mode objfpc}
 {$h+}
+{$codepage utf8}
 unit testjsondata; 
 
 interface
@@ -1519,7 +1520,7 @@ begin
   try
     For I:=0 to 31 do
       begin
-      J.AsString:='-->'+Char(I)+'<--';
+      J.AsString:='-->'+AnsiChar(I)+'<--';
       Case I of
        8  : T:='\b';
        9  : T:='\t';
@@ -1529,7 +1530,7 @@ begin
       else
         T:='\u'+HexStr(I,4);
       end;
-      AssertEquals('Control char','"-->'+T+'<--"',J.AsJSON);
+      AssertEquals('Control AnsiChar','"-->'+T+'<--"',J.AsJSON);
       end;
   finally
     FreeAndNil(J);
@@ -2222,7 +2223,7 @@ Var
   J : TJSONArray;
 
 begin
-  J:=TJSonArray.Create([Pchar(S)]);
+  J:=TJSonArray.Create([PAnsiChar(S)]);
   try
     TestJSONType(J,jtArray);
     TestItemCount(J,1);
@@ -3573,7 +3574,7 @@ Var
   O : TJSONObject;
 
 begin
-  O:=TJSONObject.Create([A,Pchar(S)]);
+  O:=TJSONObject.Create([A,PAnsiChar(S)]);
   try
     TestJSONType(O,jtObject);
     TestItemCount(O,1);
@@ -3596,7 +3597,7 @@ Var
 
 begin
   TJSONObject.UnQuotedMemberNames:=True;
-  O:=TJSONObject.Create([A,Pchar(S)]);
+  O:=TJSONObject.Create([A,PAnsiChar(S)]);
   try
     TestJSONType(O,jtObject);
     TestItemCount(O,1);
@@ -4104,6 +4105,7 @@ Var
 
 begin
   S:='JSONStringToString('''+Src+''')='''+Dest+'''';
+  Flush(output);
   AssertEquals(S,Dest,JSONStringToString(Src));
 end;
 

+ 7 - 1
packages/fcl-json/tests/testjsonparser.pas

@@ -14,6 +14,8 @@
  **********************************************************************}
 {$mode objfpc}
 {$h+}
+{$codepage UTF8}
+
 unit testjsonparser;
 
 interface
@@ -534,9 +536,13 @@ Var
   S : TStream;
 
 begin
+{$IF SIZEOF(Char)=2}
+  S:=TStringStream.Create(UTF8Encode('"123"'));
+{$else}
   S:=TStringStream.Create('"123"');
+{$ENDIF}
   try
-    D:=GetJSON(S);
+    D:=GetJSON(S,False);
     try
       AssertEquals('Have correct string','123',D.AsString);
     finally

+ 10 - 2
packages/fcl-json/tests/testjsonrtti.pas

@@ -257,12 +257,14 @@ end;
 procedure TTestJSONDeStreamer.TestVariantString;
 Var
   V : Variant;
+  S : String;
 
 begin
   JD:=TJSONString.Create('A string');
   V:=DS.JSONToVariant(JD);
   AssertVarType('String data',varOleStr,V);
-  AssertEquals('String data','A string',V);
+  S:=V;
+  AssertEquals('String data','A string',S);
 end;
 
 procedure TTestJSONDeStreamer.TestVariantArray;
@@ -548,11 +550,13 @@ end;
 procedure TTestJSONDeStreamer.TestVariantProp;
 Var
   V : TVariantComponent;
+  S : String;
 
 begin
   V:=TVariantComponent.Create(Nil);
   DeStream('{ "VariantProp" : "A string" }',V);
-  AssertEquals('Variant property value','A string',V.VariantProp);
+  S:=V.VariantProp;
+  AssertEquals('Variant property value','A string',S);
 end;
 
 procedure TTestJSONDeStreamer.TestCollection;
@@ -1684,7 +1688,11 @@ begin
   i:='3.14';
   C:=CreateVariantComp;
   C.VariantProp:=i;
+{$IF SIZEOF(CHAR)=2}
+  AssertEquals('Variant type',VarTypeAsText(varOleStr),VarTypeAsText(VarType(C.VariantProp)));
+{$ELSE}
   AssertEquals('Variant type',VarTypeAsText(varString),VarTypeAsText(VarType(C.VariantProp)));
+{$ENDIF}
   StreamObject(FTofree);
   AssertPropCount(1);
   AssertProp('VariantProp','3.14');