diff --git a/packages/rtl-objpas/src/inc/strutils.pp b/packages/rtl-objpas/src/inc/strutils.pp index cc959ba05f..9563ec23fe 100644 --- a/packages/rtl-objpas/src/inc/strutils.pp +++ b/packages/rtl-objpas/src/inc/strutils.pp @@ -175,10 +175,16 @@ function DelChars(const S: string; Chr: Char): string; function DelSpace1(const S: string): string; function Tab2Space(const S: string; Numb: Byte): string; function NPos(const C: string; S: string; N: Integer): SizeInt; + Function RPosEX(C:char;const S : AnsiString;offs:cardinal):SizeInt; overload; Function RPosex (Const Substr : AnsiString; Const Source : AnsiString;offs:cardinal) : SizeInt; overload; Function RPos(c:char;const S : AnsiString):SizeInt; overload; Function RPos (Const Substr : AnsiString; Const Source : AnsiString) : SizeInt; overload; +Function RPosEX(C:Unicodechar;const S : UnicodeString;offs:cardinal):SizeInt; overload; +Function RPosex (Const Substr : UnicodeString; Const Source : UnicodeString;offs:cardinal) : SizeInt; overload; +Function RPos(c:Unicodechar;const S : UnicodeString):SizeInt; overload; +Function RPos (Const Substr : UnicodeString; Const Source : UnicodeString) : SizeInt; overload; + function AddChar(C: Char; const S: string; N: Integer): string; function AddCharR(C: Char; const S: string; N: Integer): string; function PadLeft(const S: string; N: Integer): string;inline; @@ -3091,6 +3097,95 @@ begin end; end; +function RPosEX(C: unicodechar; const S: UnicodeString; offs: cardinal): SizeInt; + +var I : SizeUInt; + p,p2: PUnicodeChar; + +Begin + I:=Length(S); + If (I<>0) and (offs<=i) Then + begin + p:=@s[offs]; + p2:=@s[1]; + while (p2<=p) and (p^<>c) do dec(p); + RPosEx:=(p-p2)+1; + end + else + RPosEX:=0; +End; + +function RPos(c: Unicodechar; const S: UnicodeString): SizeInt; + +var I : SizeInt; + p,p2: pUnicodeChar; + +Begin + I:=Length(S); + If I<>0 Then + begin + p:=@s[i]; + p2:=@s[1]; + while (p2<=p) and (p^<>c) do dec(p); + i:=p-p2+1; + end; + RPos:=i; +End; + +function RPos(const Substr: UnicodeString; const Source: UnicodeString): SizeInt; +var + MaxLen,llen : SizeInt; + c : Unicodechar; + pc,pc2 : PUnicodechar; +begin + rPos:=0; + llen:=Length(SubStr); + maxlen:=length(source); + if (llen>0) and (maxlen>0) and ( llen<=maxlen) then + begin + pc:=@source[maxlen]; + pc2:=@source[llen-1]; + c:=substr[llen]; + while pc>=pc2 do + begin + if (c=pc^) and + (CompareWord(Substr[1],punicodechar(pc-llen+1)^,Length(SubStr))=0) then + begin + rPos:=punicodechar(pc-llen+1)-punicodechar(@source[1])+1; + exit; + end; + dec(pc); + end; + end; +end; + +function RPosex(const Substr: UnicodeString; const Source: UnicodeString; offs: cardinal): SizeInt; +var + MaxLen,llen : SizeInt; + c : unicodechar; + pc,pc2 : punicodechar; +begin + rPosex:=0; + llen:=Length(SubStr); + maxlen:=length(source); + if SizeInt(offs)0) and (maxlen>0) and ( llen<=maxlen) then + begin + pc:=@source[maxlen]; + pc2:=@source[llen-1]; + c:=substr[llen]; + while pc>=pc2 do + begin + if (c=pc^) and + (Compareword(Substr[1],punicodechar(pc-llen+1)^,Length(SubStr))=0) then + begin + rPosex:=punicodechar(pc-llen+1)-punicodechar(@source[1])+1; + exit; + end; + dec(pc); + end; + end; +end; // def from delphi.about.com: procedure BinToHex(BinValue, HexValue: PChar; BinBufSize: Integer);