LazUtils: add optional Count parameter to Utf8StringReplace/Utf16StringReplace.

git-svn-id: trunk@60426 -
This commit is contained in:
bart 2019-02-15 13:56:08 +00:00
parent 7c5fdfc1d4
commit c452fc00e6
2 changed files with 26 additions and 2 deletions

View File

@ -45,7 +45,8 @@ function UTF16CharacterToUnicode(p: PWideChar; out CharLen: integer): Cardinal;
function UnicodeToUTF16(u: cardinal): widestring; function UnicodeToUTF16(u: cardinal): widestring;
function IsUTF16CharValid(AChar, ANextChar: WideChar): Boolean; function IsUTF16CharValid(AChar, ANextChar: WideChar): Boolean;
function IsUTF16StringValid(AWideStr: widestring): Boolean; function IsUTF16StringValid(AWideStr: widestring): Boolean;
function Utf16StringReplace(const S, OldPattern, NewPattern: WideString; Flags: TReplaceFlags): WideString; function Utf16StringReplace(const S, OldPattern, NewPattern: WideString; Flags: TReplaceFlags): WideString; Inline;
function Utf16StringReplace(const S, OldPattern, NewPattern: WideString; out Count: Integer; Flags: TReplaceFlags): WideString;
function UnicodeLowercase(u: cardinal): cardinal; function UnicodeLowercase(u: cardinal): cardinal;
{$IFDEF FPC} {$IFDEF FPC}
@ -255,14 +256,24 @@ begin
end; end;
end; end;
function Utf16StringReplace(const S, OldPattern, NewPattern: WideString;
Flags: TReplaceFlags): WideString;
var
DummyCount: Integer;
begin
Result := Utf16StringReplace(S, OldPattern, NewPattern, DummyCount, Flags);
end;
//Same as SysUtil.StringReplace but for WideStrings/UnicodeStrings, since it's not available in fpc yet //Same as SysUtil.StringReplace but for WideStrings/UnicodeStrings, since it's not available in fpc yet
function Utf16StringReplace(const S, OldPattern, NewPattern: WideString; Flags: TReplaceFlags): WideString; function Utf16StringReplace(const S, OldPattern, NewPattern: WideString; out Count: Integer;
Flags: TReplaceFlags): WideString;
var var
Srch, OldP, RemS: WideString; // Srch and OldP can contain WideUpperCase versions of S,OldPattern Srch, OldP, RemS: WideString; // Srch and OldP can contain WideUpperCase versions of S,OldPattern
P: Integer; P: Integer;
begin begin
Srch:=S; Srch:=S;
OldP:=OldPattern; OldP:=OldPattern;
Count := 0;
if rfIgnoreCase in Flags then if rfIgnoreCase in Flags then
begin begin
Srch:=WideUpperCase(Srch); Srch:=WideUpperCase(Srch);
@ -280,6 +291,7 @@ begin
end end
else else
begin begin
Inc(Count);
Result:=Result+Copy(RemS,1,P-1)+NewPattern; Result:=Result+Copy(RemS,1,P-1)+NewPattern;
P:=P+Length(OldP); P:=P+Length(OldP);
RemS:=Copy(RemS,P,Length(RemS)-P+1); RemS:=Copy(RemS,P,Length(RemS)-P+1);

View File

@ -122,6 +122,8 @@ procedure UTF8Insert(const source: Utf8String; var s: Utf8String; StartCharIndex
{$ENDIF} {$ENDIF}
procedure UTF8Insert(const source: String; var s: String; StartCharIndex: PtrInt); procedure UTF8Insert(const source: String; var s: String; StartCharIndex: PtrInt);
function UTF8StringReplace(const S, OldPattern, NewPattern: String; function UTF8StringReplace(const S, OldPattern, NewPattern: String;
Flags: TReplaceFlags; ALanguage: string=''): String; inline;
function UTF8StringReplace(const S, OldPattern, NewPattern: String; out Count: Integer;
Flags: TReplaceFlags; ALanguage: string=''): String; Flags: TReplaceFlags; ALanguage: string=''): String;
function UTF8LowerCase(const AInStr: string; ALanguage: string=''): string; function UTF8LowerCase(const AInStr: string; ALanguage: string=''): string;
@ -1153,6 +1155,14 @@ begin
end; end;
function UTF8StringReplace(const S, OldPattern, NewPattern: String; function UTF8StringReplace(const S, OldPattern, NewPattern: String;
Flags: TReplaceFlags; ALanguage: string): String; inline;
var
DummyCount: Integer;
begin
Result := Utf8StringReplace(S, OldPattern, NewPattern, DummyCount, Flags, ALanguage);
end;
function UTF8StringReplace(const S, OldPattern, NewPattern: String; out Count: Integer;
Flags: TReplaceFlags; ALanguage: string): String; Flags: TReplaceFlags; ALanguage: string): String;
// same algorithm as StringReplace, but using UTF8LowerCase // same algorithm as StringReplace, but using UTF8LowerCase
// for case insensitive search // for case insensitive search
@ -1162,6 +1172,7 @@ var
begin begin
Srch := S; Srch := S;
OldP := OldPattern; OldP := OldPattern;
Count := 0;
if rfIgnoreCase in Flags then if rfIgnoreCase in Flags then
begin begin
Srch := UTF8LowerCase(Srch,ALanguage); Srch := UTF8LowerCase(Srch,ALanguage);
@ -1179,6 +1190,7 @@ begin
end end
else else
begin begin
Inc(Count);
Result := Result + Copy(RemS,1,P-1) + NewPattern; Result := Result + Copy(RemS,1,P-1) + NewPattern;
P := P + Length(OldP); P := P + Length(OldP);
RemS := Copy(RemS, P, Length(RemS)-P+1); RemS := Copy(RemS, P, Length(RemS)-P+1);