From a750039f7c67363e6e7a780244758a8c90cdff61 Mon Sep 17 00:00:00 2001 From: michael Date: Sat, 16 Feb 2019 07:55:26 +0000 Subject: [PATCH] * Add overloaded version of stringreplace with replacement count (ID 23987) git-svn-id: trunk@41330 - --- rtl/objpas/sysutils/syssr.inc | 12 +++++++----- rtl/objpas/sysutils/sysstr.inc | 10 ++++++++++ rtl/objpas/sysutils/sysstrh.inc | 1 + rtl/objpas/sysutils/sysuni.inc | 11 ++++++++++- rtl/objpas/sysutils/sysunih.inc | 2 ++ rtl/objpas/sysutils/syswide.inc | 14 ++++++++++++-- rtl/objpas/sysutils/syswideh.inc | 2 +- 7 files changed, 43 insertions(+), 9 deletions(-) diff --git a/rtl/objpas/sysutils/syssr.inc b/rtl/objpas/sysutils/syssr.inc index d7c78fb8a2..424d77cf59 100644 --- a/rtl/objpas/sysutils/syssr.inc +++ b/rtl/objpas/sysutils/syssr.inc @@ -1,9 +1,10 @@ var OldPat,Srch: SRstring; // Srch and Oldp can contain uppercase versions of S,OldPattern - PatLength,NewPatLength,P,Cnt,PatCount,PrevP: Integer; + PatLength,NewPatLength,P,Cnt,PrevP: Integer; c,d: SRPChar ; begin + aCount:=0; Result:=''; c:= NIL; d:=NIL; OldPat:=''; @@ -31,6 +32,7 @@ begin repeat P:=Pos(OldPat,Srch,P); if P>0 then begin + inc(aCount); move(NewPattern[1],Result[P],PatLength*SizeOf(SRChar)); if not (rfReplaceAll in Flags) then exit; inc(P,PatLength); @@ -40,21 +42,21 @@ begin //Different pattern length -> Result length will change //To avoid creating a lot of temporary strings, we count how many //replacements we're going to make. - P:=1; PatCount:=0; + P:=1; repeat P:=Pos(OldPat,Srch,P); if P>0 then begin inc(P,PatLength); - inc(PatCount); + inc(aCount); if not (rfReplaceAll in Flags) then break; end; until p=0; - if PatCount=0 then begin + if aCount=0 then begin Result:=S; exit; end; NewPatLength:=Length(NewPattern); - SetLength(Result,Length(S)+PatCount*(NewPatLength-PatLength)); + SetLength(Result,Length(S)+aCount*(NewPatLength-PatLength)); P:=1; PrevP:=0; c:=SRPChar(Result); d:=SRPChar(S); repeat diff --git a/rtl/objpas/sysutils/sysstr.inc b/rtl/objpas/sysutils/sysstr.inc index 7aaabbada2..431a63b466 100644 --- a/rtl/objpas/sysutils/sysstr.inc +++ b/rtl/objpas/sysutils/sysstr.inc @@ -2294,6 +2294,16 @@ end; {$define SRCHAR:=Char} Function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string; + +Var + C : Integer; + +begin + Result:=StringReplace(S,OldPattern,NewPattern,Flags,C); +end; + +function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags; Out aCount : Integer): string; + {$i syssr.inc} {$undef INSTRINGREPLACE} diff --git a/rtl/objpas/sysutils/sysstrh.inc b/rtl/objpas/sysutils/sysstrh.inc index 51c7f507a9..8c96d472fa 100644 --- a/rtl/objpas/sysutils/sysstrh.inc +++ b/rtl/objpas/sysutils/sysstrh.inc @@ -234,6 +234,7 @@ function TryStrToBool(const S: string; out Value: Boolean): Boolean; function TryStrToBool(const S: string; out Value: Boolean; Const FormatSettings: TFormatSettings): Boolean; function LastDelimiter(const Delimiters, S: string): SizeInt; +function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags; Out aCount : Integer): string; function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string; Function IsDelimiter(const Delimiters, S: string; Index: SizeInt): Boolean; diff --git a/rtl/objpas/sysutils/sysuni.inc b/rtl/objpas/sysutils/sysuni.inc index 59d491fd96..6cadcb4aff 100644 --- a/rtl/objpas/sysutils/sysuni.inc +++ b/rtl/objpas/sysutils/sysuni.inc @@ -540,7 +540,16 @@ end; {$define SRPCHAR:=PUnicodeChar} {$define SRCHAR:=UnicodeChar} -function UnicodeStringReplace(const S, OldPattern, NewPattern: UnicodeString; Flags: TReplaceFlags): UnicodeString; +Function UnicodeStringReplace(const S, OldPattern, NewPattern: Unicodestring; Flags: TReplaceFlags): Unicodestring; + +Var + C : Integer; + +begin + Result:=UnicodeStringReplace(S,OldPattern,NewPattern,Flags,C); +end; + +function UnicodeStringReplace(const S, OldPattern, NewPattern: UnicodeString; Flags: TReplaceFlags; Out aCount : Integer): UnicodeString; {$i syssr.inc} {$undef INUNICODESTRINGREPLACE} diff --git a/rtl/objpas/sysutils/sysunih.inc b/rtl/objpas/sysutils/sysunih.inc index 25f3e613a5..32da4108c8 100644 --- a/rtl/objpas/sysutils/sysunih.inc +++ b/rtl/objpas/sysutils/sysunih.inc @@ -68,3 +68,5 @@ function WideBytesOf(const Value: UnicodeString): TBytes; function WideStringOf(const Value: TBytes): UnicodeString; function ByteLength(const S: UnicodeString): Integer; function UnicodeStringReplace(const S, OldPattern, NewPattern: UnicodeString; Flags: TReplaceFlags): UnicodeString; +function UnicodeStringReplace(const S, OldPattern, NewPattern: UnicodeString; Flags: TReplaceFlags; Out aCount : Integer): UnicodeString; + diff --git a/rtl/objpas/sysutils/syswide.inc b/rtl/objpas/sysutils/syswide.inc index 0b60f3a3a0..211b1f7a97 100644 --- a/rtl/objpas/sysutils/syswide.inc +++ b/rtl/objpas/sysutils/syswide.inc @@ -193,11 +193,21 @@ end; {$define SRPChar:=PWideChar} {$define SRChar:=WideChar} -function WideStringReplace(const S, OldPattern, NewPattern: WideString; Flags: TReplaceFlags): WideString; + +Function WideStringReplace(const S, OldPattern, NewPattern: Widestring; Flags: TReplaceFlags): Widestring; + +Var + C : Integer; + +begin + Result:=WideStringReplace(S,OldPattern,NewPattern,Flags,C); +end; + +function WideStringReplace(const S, OldPattern, NewPattern: WideString; Flags: TReplaceFlags; Out aCount : Integer): WideString; {$i syssr.inc} {$undef INWIDESTRINGREPLACE} {$undef SRString} {$undef SRUpperCase} {$undef SRPChar} -{$undef SRChar} \ No newline at end of file +{$undef SRChar} diff --git a/rtl/objpas/sysutils/syswideh.inc b/rtl/objpas/sysutils/syswideh.inc index 2ad6ce00a0..31e2e1d0ba 100644 --- a/rtl/objpas/sysutils/syswideh.inc +++ b/rtl/objpas/sysutils/syswideh.inc @@ -35,6 +35,6 @@ function StrCopy(Dest, Source: PWideChar): PWideChar; overload; function StrLCopy(Dest,Source: PWideChar; MaxLen: SizeInt): PWideChar; overload; Function CharInSet(Ch:WideChar;Const CSet : TSysCharSet) : Boolean; function WideStringReplace(const S, OldPattern, NewPattern: WideString; Flags: TReplaceFlags): WideString; - +function WideStringReplace(const S, OldPattern, NewPattern: WideString; Flags: TReplaceFlags; Out aCount : Integer): WideString; function IsLeadChar(Ch: WideChar): Boolean; inline; overload;