Browse Source

* Avoid reallocating string when parsing unicode char (bug ID 0037562)

git-svn-id: trunk@46412 -
michael 5 years ago
parent
commit
d6760f0ded
1 changed files with 29 additions and 3 deletions
  1. 29 3
      packages/fcl-json/src/fpjson.pp

+ 29 - 3
packages/fcl-json/src/fpjson.pp

@@ -939,10 +939,35 @@ begin
     Raise EConvertError.Create('Invalid JSON String:'+S);
     Raise EConvertError.Create('Invalid JSON String:'+S);
 end;
 end;
 {$ELSE}
 {$ELSE}
+
+    function BufferHexToInt(P : PAnsiChar): integer;
+    var
+      N, i: integer;
+      ch: char;
+    begin
+      Result:= 0;
+      for i:= 1 to 4 do
+      begin
+        ch:= p^;
+        case ch of
+          '0'..'9':
+            N:= Ord(ch)-Ord('0');
+          'a'..'f':
+            N:= Ord(ch)-(Ord('a')-10);
+          'A'..'F':
+            N:= Ord(ch)-(Ord('A')-10);
+          else
+            exit(-1);
+        end;
+        Inc(P);
+        Result:= Result*16+N;
+      end;
+    end;
+
 Var
 Var
 
 
   I,J,L,U1,U2 : Integer;
   I,J,L,U1,U2 : Integer;
-  App,W : String;
+  App : String;
 
 
   Procedure MaybeAppendUnicode;
   Procedure MaybeAppendUnicode;
 
 
@@ -982,9 +1007,10 @@ begin
           'f' : App:=#12;
           'f' : App:=#12;
           'r' : App:=#13;
           'r' : App:=#13;
           'u' : begin
           'u' : begin
-                W:=Copy(S,I+1,4);
+                U2:=BufferHexToInt(PAnsiChar(@S[I+1]));
+                if U2=-1 then
+                   Raise EJSON.Create('Invalid unicode hex code: '+Copy(S,I+1,4));
                 Inc(I,4);
                 Inc(I,4);
-                u2:=StrToInt('$'+W);
                 if (U1<>0) then
                 if (U1<>0) then
                   begin
                   begin
                   App:={$IFDEF FPC_HAS_CPSTRING}UTF8Encode({$ENDIF}WideChar(U1)+WideChar(U2){$IFDEF FPC_HAS_CPSTRING}){$ENDIF};
                   App:={$IFDEF FPC_HAS_CPSTRING}UTF8Encode({$ENDIF}WideChar(U1)+WideChar(U2){$IFDEF FPC_HAS_CPSTRING}){$ENDIF};