فهرست منبع

* rpos(ex) unicodestring variants. mantis #35093

git-svn-id: trunk@44024 -
marco 5 سال پیش
والد
کامیت
517a7aa80d
1فایلهای تغییر یافته به همراه95 افزوده شده و 0 حذف شده
  1. 95 0
      packages/rtl-objpas/src/inc/strutils.pp

+ 95 - 0
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)<maxlen then maxlen:=offs;
+  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
+           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);