Fix 34119: factor out IsDigit function

git-svn-id: trunk@39609 -
This commit is contained in:
michael 2018-08-12 09:14:27 +00:00
parent 2d2ba5f0cd
commit a3f756013d

View File

@ -269,6 +269,7 @@ type
{$ENDIF} {$ENDIF}
function IsWordChar(AChar : REChar) : Boolean; inline; function IsWordChar(AChar : REChar) : Boolean; inline;
function IsSpaceChar(AChar : PRegExprChar) : Boolean; inline; function IsSpaceChar(AChar : PRegExprChar) : Boolean; inline;
function IsDigit(AChar : PRegExprChar) : Boolean; inline;
// Mark programm as having to be [re]compiled // Mark programm as having to be [re]compiled
procedure InvalidateProgramm; procedure InvalidateProgramm;
@ -1391,6 +1392,12 @@ begin
Result:=Pos(AChar^,fSpaceChars)>0; Result:=Pos(AChar^,fSpaceChars)>0;
end; end;
function TRegExpr.IsDigit(AChar: PRegExprChar): Boolean;
begin
// Avoid Unicode char-> ansi char conversion in case of unicode regexp.
Result:=Ord(AChar^) in [Ord('0')..Ord('9')]
end;
procedure TRegExpr.InvalidateProgramm; procedure TRegExpr.InvalidateProgramm;
begin begin
if programm <> nil then begin if programm <> nil then begin
@ -2684,17 +2691,17 @@ function TRegExpr.regrepeat (p : PRegExprChar; AMax : PtrInt) : PtrInt;
UNTIL Result >= AMax; UNTIL Result >= AMax;
end; end;
ANYDIGIT: ANYDIGIT:
while (Result < TheMax) and while (Result < TheMax) and isDigit(Scan) do
(scan^ >= '0') and (scan^ <= '9') do begin begin
inc (Result); inc (Result);
inc (scan); inc (scan);
end; end;
NOTDIGIT: NOTDIGIT:
while (Result < TheMax) and while (Result < TheMax) and not IsDigit(Scan) do
((scan^ < '0') or (scan^ > '9')) do begin begin
inc (Result); inc (Result);
inc (scan); inc (scan);
end; end;
{$IFNDEF UseSetOfChar} //###0.929 {$IFNDEF UseSetOfChar} //###0.929
ANYLETTER: ANYLETTER:
while (Result < TheMax) and IsWordChar(scan^) do //###0.940 while (Result < TheMax) and IsWordChar(scan^) do //###0.940
@ -2895,13 +2902,13 @@ function TRegExpr.MatchPrim (prog : PRegExprChar) : boolean;
inc (reginput); inc (reginput);
end; end;
ANYDIGIT: begin ANYDIGIT: begin
if (reginput^ = #0) or (reginput^ < '0') or (reginput^ > '9') if (reginput^ = #0) or Not IsDigit(reginput) then
then EXIT; EXIT;
inc (reginput); inc (reginput);
end; end;
NOTDIGIT: begin NOTDIGIT: begin
if (reginput^ = #0) or ((reginput^ >= '0') and (reginput^ <= '9')) if (reginput^ = #0) or IsDigit(reginput) then
then EXIT; EXIT;
inc (reginput); inc (reginput);
end; end;
{$IFNDEF UseSetOfChar} //###0.929 {$IFNDEF UseSetOfChar} //###0.929
@ -3563,6 +3570,7 @@ function TRegExpr.ExecPrim (AOffset: PtrInt) : boolean;
--------------------------------------------------------------} --------------------------------------------------------------}
function TRegExpr.ExecNext : boolean; function TRegExpr.ExecNext : boolean;
var offset : PtrInt; var offset : PtrInt;
begin begin