2
0
Эх сурвалжийг харах

+ Implemented all functions

michael 21 жил өмнө
parent
commit
ebead1b5ee
1 өөрчлөгдсөн 257 нэмэгдсэн , 130 устгасан
  1. 257 130
      rtl/objpas/strutils.pp

+ 257 - 130
rtl/objpas/strutils.pp

@@ -54,16 +54,16 @@ Function ReverseString(const AText: string): string;
 Function AnsiReverseString(const AText: AnsiString): AnsiString;
 Function StuffString(const AText: string; AStart, ALength: Cardinal;  const ASubText: string): string;
 Function RandomFrom(const AValues: array of string): string; overload;
-Function IfThen(AValue: Boolean; const ATrue: string; AFalse: string): string; 
+Function IfThen(AValue: Boolean; const ATrue: string; AFalse: string): string;
 Function IfThen(AValue: Boolean; const ATrue: string): string; // ; AFalse: string = ''
 
 { ---------------------------------------------------------------------
     VB emulations.
   ---------------------------------------------------------------------}
 
-Function LeftStr(const AText: AnsiString; const ACount: Integer): AnsiString; 
-Function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString; 
-Function MidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString; 
+Function LeftStr(const AText: AnsiString; const ACount: Integer): AnsiString;
+Function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString;
+Function MidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString;
 Function RightBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;
 Function MidBStr(const AText: AnsiString; const AByteStart, AByteCount: Integer): AnsiString;
 Function AnsiLeftStr(const AText: AnsiString; const ACount: Integer): AnsiString;
@@ -73,7 +73,7 @@ Function AnsiMidStr(const AText: AnsiString; const AStart, ACount: Integer): Ans
 Function LeftBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;
 Function LeftStr(const AText: WideString; const ACount: Integer): WideString; 
 Function RightStr(const AText: WideString; const ACount: Integer): WideString; 
-Function MidStr(const AText: WideString; const AStart, ACount: Integer): WideString; 
+Function MidStr(const AText: WideString; const AStart, ACount: Integer): WideString;
 {$endif}
 
 { ---------------------------------------------------------------------
@@ -85,8 +85,9 @@ const
   WordDelimiters: set of Char = [#0..#255] - ['a'..'z','A'..'Z','1'..'9','0'];
 
 type
-  TStringSeachOption = (soDown, soMatchCase, soWholeWord);
-  TStringSearchOptions = set of TStringSeachOption;
+  TStringSearchOption = (soDown, soMatchCase, soWholeWord);
+  TStringSearchOptions = set of TStringSearchOption;
+  TStringSeachOption = TStringSearchOption;
 
 Function SearchBuf(Buf: PChar; BufLen: Integer; SelStart, SelLength: Integer; SearchString: String; Options: TStringSearchOptions): PChar;
 Function SearchBuf(Buf: PChar; BufLen: Integer; SelStart, SelLength: Integer; SearchString: String): PChar; // ; Options: TStringSearchOptions = [soDown]
@@ -180,7 +181,7 @@ Procedure NotYetImplemented (FN : String);
 
 begin
   Raise Exception.CreateFmt('Function "%s" (strutils) is not yet implemented',[FN]);
-end;  
+end;
 
 { ---------------------------------------------------------------------
     Case sensitive search/replace
@@ -189,7 +190,10 @@ end;
 Function AnsiResemblesText(const AText, AOther: string): Boolean;
 
 begin
-  NotYetImplemented(' AnsiResemblesText');
+  if Assigned(AnsiResemblesProc) then
+    Result:=AnsiResemblesProc(AText,AOther)
+  else
+    Result:=False;
 end;
 
 Function AnsiContainsText(const AText, ASubText: string): Boolean;
@@ -233,14 +237,8 @@ end;
 
 Function AnsiMatchText(const AText: string; const AValues: array of string): Boolean;
 
-var i : longint;
-
 begin
-  result:=false;
-  if high(AValues)=-1 Then exit;
-  for i:=low(AValues) to High(Avalues) do
-     if avalues[i]=atext Then
-       result:=true;
+  Result:=(AnsiIndexText(AText,AValues)<>-1)
 end;
 
 
@@ -251,10 +249,11 @@ var i : longint;
 
 begin
   result:=-1;
-  if high(AValues)=-1 Then exit;
+  if high(AValues)=-1 Then
+    Exit;
   for i:=low(AValues) to High(Avalues) do
-     if avalues[i]=atext Then
-       exit(i);					// make sure it is the first val.
+     if CompareText(avalues[i],atext)=0 Then
+       exit(i);  // make sure it is the first val.
 end;
 
 
@@ -295,47 +294,22 @@ end;
 
 Function AnsiMatchStr(const AText: string; const AValues: array of string): Boolean;
 
-var
-  counter: integer;
 begin
-  counter := 0;
-{$ifdef INTERNLENGTH}
-  while(counter < length(AValues)) do
-{$else}
-  while(counter < high(AValues)+1) do
-{$endif}
-  begin
-    if(AText = AValues[counter]) then
-    begin
-      Result := true;
-      exit;
-    end;
-    inc(counter);
-  end;
-  Result := false;
+  Result:=AnsiIndexStr(AText,Avalues)<>-1;
 end;
 
 
 Function AnsiIndexStr(const AText: string; const AValues: array of string): Integer;
 
-var
-  counter: integer;
+var i : longint;
+
 begin
-  counter := 0;
-{$ifdef INTERNLENGTH}
-  while(counter < length(AValues)) do
-{$else}
-  while(counter < high(AValues)+1) do
-{$endif}
-  begin
-    if(AText = AValues[counter]) then
-    begin
-      Result := counter;
-      exit;
-    end;
-    inc(counter);
-  end;
-  Result := -1;
+  result:=-1;
+  if high(AValues)=-1 Then
+    Exit;
+  for i:=low(AValues) to High(Avalues) do
+     if (avalues[i]=AText) Then
+       exit(i);					// make sure it is the first val.
 end;
 
 
@@ -379,7 +353,7 @@ end;
 Function AnsiReverseString(const AText: AnsiString): AnsiString;
 
 begin
-  NotYetImplemented(' AnsiReverseString');
+  Result:=ReverseString(AText);
 end;
 
 
@@ -411,7 +385,10 @@ end;
 Function IfThen(AValue: Boolean; const ATrue: string; AFalse: string): string; 
 
 begin
-  if avalue then result:=atrue else result:=afalse;
+  if avalue then
+    result:=atrue
+  else
+    result:=afalse;
 end;
 
 
@@ -419,7 +396,10 @@ end;
 Function IfThen(AValue: Boolean; const ATrue: string): string; // ; AFalse: string = ''
 
 begin
-  if avalue then result:=atrue else result:='';
+  if avalue then
+    result:=atrue
+  else
+    result:='';
 end;
 
 
@@ -428,13 +408,13 @@ end;
     VB emulations.
   ---------------------------------------------------------------------}
 
-Function LeftStr(const AText: AnsiString; const ACount: Integer): AnsiString; 
+Function LeftStr(const AText: AnsiString; const ACount: Integer): AnsiString;
 
 begin
   Result:=Copy(AText,1,ACount);
 end;
 
-Function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString; 
+Function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString;
 
 var j,l:integer;
 
@@ -445,12 +425,12 @@ begin
   Result:=Copy(AText,l-j+1,j);
 end;
 
-Function MidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString; 
+Function MidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString;
 
 begin
   if (ACount=0) or (AStart>length(atext)) then
     exit('');
-  Result:=Copy(AText,AStart,ACount);  
+  Result:=Copy(AText,AStart,ACount);
 end;
 
 
@@ -458,7 +438,7 @@ end;
 Function LeftBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;
 
 begin
-  NotYetImplemented(' LeftBStr');
+  Result:=LeftStr(AText,AByteCount);
 end;
 
 
@@ -466,7 +446,7 @@ end;
 Function RightBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;
 
 begin
-  NotYetImplemented(' RightBStr');
+  Result:=RightStr(Atext,AByteCount);
 end;
 
 
@@ -474,7 +454,7 @@ end;
 Function MidBStr(const AText: AnsiString; const AByteStart, AByteCount: Integer): AnsiString;
 
 begin
-  NotYetImplemented(' MidBStr');
+  Result:=MidStr(AText,AByteStart,AByteCount);
 end;
 
 
@@ -498,30 +478,36 @@ end;
 Function AnsiMidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString;
 
 begin
-  NotYetImplemented(' AnsiMidStr');
+  Result:=Copy(AText,AStart,ACount);
 end;
 
 {$ifndef ver1_0}
-Function LeftStr(const AText: WideString; const ACount: Integer): WideString; 
+Function LeftStr(const AText: WideString; const ACount: Integer): WideString;
 
 begin
-  NotYetImplemented(' LeftStr');
+  Result:=Copy(AText,1,ACount);
 end;
 
 
 
-Function RightStr(const AText: WideString; const ACount: Integer): WideString; 
+Function RightStr(const AText: WideString; const ACount: Integer): WideString;
+
+var
+  j,l:integer;
 
 begin
-  NotYetImplemented(' RightStr');
+  l:=length(atext);
+  j:=ACount;
+  if j>l then j:=l;
+  Result:=Copy(AText,l-j+1,j);
 end;
 
 
 
-Function MidStr(const AText: WideString; const AStart, ACount: Integer): WideString; 
+Function MidStr(const AText: WideString; const AStart, ACount: Integer): WideString;
 
 begin
-  NotYetImplemented(' MidStr');
+  Result:=Copy(AText,AStart,ACount);
 end;
 {$endif}
 
@@ -534,8 +520,109 @@ end;
 
 Function SearchBuf(Buf: PChar; BufLen: Integer; SelStart, SelLength: Integer; SearchString: String; Options: TStringSearchOptions): PChar;
 
+var
+  Len,I,SLen: Integer;
+  C: Char;
+  Found : Boolean;
+  Direction: Shortint;
+  CharMap: array[Char] of Char;
+
+  Function GotoNextWord(var P : PChar): Boolean;
+
+  begin
+    if (Direction=1) then
+      begin
+      // Skip characters
+      While (Len>0) and not (P^ in WordDelimiters) do
+        begin
+        Inc(P);
+        Dec(Len);
+        end;
+     // skip delimiters
+      While (Len>0) and (P^ in WordDelimiters) do
+        begin
+        Inc(P);
+        Dec(Len);
+        end;
+      Result:=Len>0;
+      end
+    else
+      begin
+      // Skip Delimiters
+      While (Len>0) and (P^ in WordDelimiters) do
+        begin
+        Dec(P);
+        Dec(Len);
+        end;
+     // skip characters
+      While (Len>0) and not (P^ in WordDelimiters) do
+        begin
+        Dec(P);
+        Dec(Len);
+        end;
+      Result:=Len>0;
+      // We're on the first delimiter. Pos back on char.
+      Inc(P);
+      Inc(Len);
+      end;
+  end;
+
 begin
-  NotYetImplemented(' SearchBuf');
+  Result:=nil;
+  Slen:=Length(SearchString);
+  if (BufLen<=0) or (Slen=0) then
+    Exit;
+  if soDown in Options then
+    begin
+    Direction:=1;
+    Inc(SelStart,SelLength);
+    Len:=BufLen-SelStart-SLen+1;
+    if (Len<=0) then
+      Exit;
+    end
+  else
+    begin
+    Direction:=-1;
+    Dec(SelStart,Length(SearchString));
+    Len:=SelStart+1;
+    end;
+  if (SelStart<0) or (SelStart>BufLen) then
+    Exit;
+  Result:=@Buf[SelStart];
+  for C:=Low(Char) to High(Char) do
+    if (soMatchCase in Options) then
+      CharMap[C]:=C
+    else
+      CharMap[C]:=Upcase(C);
+  if Not (soMatchCase in Options) then
+    SearchString:=UpCase(SearchString);
+  Found:=False;
+  while (Result<>Nil) and (Not Found) do
+    begin
+    if ((soWholeWord in Options) and
+        (Result<>@Buf[SelStart]) and
+        not GotoNextWord(Result)) then
+        Result:=Nil
+    else
+      begin
+        // try to match whole searchstring
+      I:=0;
+      while (I<Slen) and (CharMap[Result[I]]=SearchString[I+1]) do
+      Inc(I);
+      // Whole searchstring matched ?
+      if (I=SLen) then
+      Found:=(Len=0) or
+              (not (soWholeWord in Options)) or
+              (Result[SLen] in WordDelimiters);
+      if not Found then
+        begin
+        Inc(Result,Direction);
+        Dec(Len);
+        If (Len=0) then
+          Result:=Nil;
+        end;
+      end;  
+    end;
 end;
 
 
@@ -543,7 +630,7 @@ end;
 Function SearchBuf(Buf: PChar; BufLen: Integer; SelStart, SelLength: Integer; SearchString: String): PChar; // ; Options: TStringSearchOptions = [soDown]
 
 begin
-  NotYetImplemented(' SearchBuf');
+  Result:=SearchBuf(Buf,BufLen,SelStart,SelLength,SearchString,[soDown]);
 end;
 
 
@@ -642,12 +729,30 @@ begin
   Result:=Soundex(AText,4);
 end;
 
-
+Const
+  Ord0 = Ord('0');
+  OrdA = Ord('A');
 
 Function SoundexInt(const AText: string; ALength: TSoundexIntLength): Integer;
 
+var
+  SE: string;
+  I: Integer;
+
 begin
-  NotYetImplemented(' SoundexInt');
+  Result:=-1;
+  SE:=Soundex(AText,ALength);
+  If Length(SE)>0 then
+    begin
+    Result:=Ord(SE[1])-OrdA;
+    if ALength > 1 then
+      begin
+      Result:=Result*26+(Ord(SE[2])-Ord0);
+      for I:=3 to ALength do
+        Result:=(Ord(SE[I])-Ord0)+Result*7;
+      end;
+    Result:=ALength+Result*9;
+    end;
 end;
 
 
@@ -655,28 +760,41 @@ end;
 Function SoundexInt(const AText: string): Integer; //; ALength: TSoundexIntLength = 4
 
 begin
-  NotYetImplemented(' SoundexInt');
+  Result:=SoundexInt(AText,4);
 end;
 
 
 
 Function DecodeSoundexInt(AValue: Integer): string;
 
+var
+  I, Len: Integer;
+
 begin
-  NotYetImplemented(' DecodeSoundexInt');
+  Result := '';
+  Len := AValue mod 9;
+  AValue := AValue div 9;
+  for I:=Len downto 3 do
+    begin
+    Result:=Chr(Ord0+(AValue mod 7))+Result;
+    AValue:=AValue div 7;
+    end;
+  if Len>2 then
+    Result:=IntToStr(AValue mod 26)+Result;
+  AValue:=AValue div 26;
+  Result:=Chr(OrdA+AValue)+Result;
 end;
 
 
 
 Function SoundexWord(const AText: string): Word;
 
-Var  
+Var
   S : String;
 
 begin
   S:=SoundEx(Atext,4);
-  Writeln('Soundex result : "',S,'"');
-  Result:=Ord(S[1])-Ord('A');
+  Result:=Ord(S[1])-OrdA;
   Result:=Result*26+StrToInt(S[2]);
   Result:=Result*7+StrToInt(S[3]);
   Result:=Result*7+StrToInt(S[4]);
@@ -687,7 +805,13 @@ end;
 Function DecodeSoundexWord(AValue: Word): string;
 
 begin
-  NotYetImplemented(' DecodeSoundexWord');
+  Result := Chr(Ord0+ (AValue mod 7)) + Result;
+  AValue := AValue div 7;
+  Result := Chr(Ord0+ (AValue mod 7)) + Result;
+  AValue := AValue div 7;
+  Result := IntToStr(AValue mod 26) + Result;
+  AValue := AValue div 26;
+  Result := Chr(OrdA+AValue) + Result;
 end;
 
 
@@ -695,7 +819,7 @@ end;
 Function SoundexSimilar(const AText, AOther: string; ALength: TSoundexLength): Boolean;
 
 begin
-  NotYetImplemented(' SoundexSimilar');
+  Result:=Soundex(AText,ALength)=Soundex(AOther,ALength);
 end;
 
 
@@ -703,7 +827,7 @@ end;
 Function SoundexSimilar(const AText, AOther: string): Boolean; //; ALength: TSoundexLength = 4
 
 begin
-  NotYetImplemented(' SoundexSimilar');
+  Result:=SoundexSimilar(AText,AOther,4);
 end;
 
 
@@ -711,7 +835,7 @@ end;
 Function SoundexCompare(const AText, AOther: string; ALength: TSoundexLength): Integer;
 
 begin
-  NotYetImplemented(' SoundexCompare');
+  Result:=AnsiCompareStr(Soundex(AText,ALength),Soundex(AOther,ALength));
 end;
 
 
@@ -719,7 +843,7 @@ end;
 Function SoundexCompare(const AText, AOther: string): Integer; //; ALength: TSoundexLength = 4
 
 begin
-  NotYetImplemented(' SoundexCompare');
+  Result:=SoundexCompare(AText,AOther,4);
 end;
 
 
@@ -727,13 +851,13 @@ end;
 Function SoundexProc(const AText, AOther: string): Boolean;
 
 begin
-  NotYetImplemented(' SoundexProc');
+  Result:=SoundexSimilar(AText,AOther);
 end;
 
 { ---------------------------------------------------------------------
     RxStrUtils-like functions.
   ---------------------------------------------------------------------}
-  
+
 
 function IsEmptyStr(const S: string; const EmptyChars: TSysCharSet): Boolean;
 
@@ -744,7 +868,7 @@ begin
   l:=Length(S);
   i:=1;
   Result:=True;
-  while Result and (i<=l) do 
+  while Result and (i<=l) do
     begin
     Result:=Not (S[i] in EmptyChars);
     Inc(i);
@@ -767,7 +891,7 @@ begin
   I:=Length(Result);
   While I>0 do
     begin
-    if Result[I]=Chr then 
+    if Result[I]=Chr then
       begin
       J:=I-1;
       While (J>0) and (Result[J]=Chr) do
@@ -776,8 +900,8 @@ begin
       I:=J+1;
       end;
     dec(I);
-    end;  
-end;      
+    end;
+end;
 
 function DelSpace1(const S: string): string;
 
@@ -815,22 +939,22 @@ function NPos(const C: string; S: string; N: Integer): Integer;
 
 var
   i,p,k: Integer;
-  
+
 begin
   Result:=0;
   if N<1 then
     Exit;
   k:=0;
   i:=1;
-  Repeat 
+  Repeat
     p:=pos(C,S);
     Inc(k,p);
-    if p>0 then 
+    if p>0 then
       delete(S,1,p);
     Inc(i);
-  Until (i>n) or (p=0);  
+  Until (i>n) or (p=0);
   If (P>0) then
-    Result:=K; 
+    Result:=K;
 end;
 
 function AddChar(C: Char; const S: string; N: Integer): string;
@@ -871,7 +995,7 @@ function Copy2Symb(const S: string; Symb: Char): string;
 
 var
   p: Integer;
-  
+
 begin
   p:=Pos(Symb,S);
   if p=0 then 
@@ -983,9 +1107,9 @@ begin
     begin
     j:=i;
     l:=Length(S);
-    while (j<=L) and not (S[j] in WordDelims) do 
+    while (j<=L) and not (S[j] in WordDelims) do
       inc(j);
-    end;  
+    end;
   SetLength(Result,j-i);
   If ((j-i)>0) then
     Move(S[i],Result[1],j-i);
@@ -1000,13 +1124,13 @@ begin
   l:=0;
   len:=Length(S);
   SetLength(Result, 0);
-  while (i<=len) and (w<>N) do 
+  while (i<=len) and (w<>N) do
     begin
-    if s[i] in Delims then 
+    if s[i] in Delims then
       inc(w)
-    else 
+    else
       begin
-      if (N-1)=w then 
+      if (N-1)=w then
         begin
         inc(l);
         SetLength(Result,l);
@@ -1025,10 +1149,10 @@ var
 begin
   i:=Pos;
   l:=Length(S);
-  while (i<=l) and not (S[i] in Delims) do 
+  while (i<=l) and not (S[i] in Delims) do
     inc(i);
   Result:=Copy(S,Pos,i-Pos);
-  if (i<=l) and (S[i] in Delims) then 
+  if (i<=l) and (S[i] in Delims) then
     inc(i);
   Pos:=i;
 end;
@@ -1066,12 +1190,12 @@ end;
 
 function PadCenter(const S: string; Len: Integer): string;
 begin
-  if Length(S)<Len then 
+  if Length(S)<Len then
     begin
     Result:=StringOfChar(' ',(Len div 2) -(Length(S) div 2))+S;
     Result:=Result+StringOfChar(' ',Len-Length(Result));
     end
-  else 
+  else
     Result:=S;
 end;
 
@@ -1079,9 +1203,9 @@ function Hex2Dec(const S: string): Longint;
 var
   HexStr: string;
 begin
-  if Pos('$',S)=0 then 
+  if Pos('$',S)=0 then
     HexStr:='$'+ S
-  else 
+  else
     HexStr:=S;
   Result:=StrTointDef(HexStr,0);
 end;
@@ -1118,17 +1242,17 @@ function Numb2Dec(S: string; Base: Byte): Longint;
 
 var
   i, P: Longint;
-  
+
 begin
   i:=Length(S);
   Result:=0;
   S:=UpperCase(S);
   P:=1;
-  while (i>=1) do 
+  while (i>=1) do
     begin
-    if (S[i]>'@') then 
+    if (S[i]>'@') then
       Result:=Result+(Ord(S[i])-55)*P
-    else 
+    else
       Result:=Result+(Ord(S[i])-48)*P;
     Dec(i);
     P:=P*Base;
@@ -1158,11 +1282,11 @@ begin
     begin
     inc(i);
     index:=UpCase(S[i]);
-    if index in RomanChars then 
+    if index in RomanChars then
       begin
       if Succ(i)<=l then 
         Next:=UpCase(S[i+1])
-      else 
+      else
         Next:=#0;
       if (Next in RomanChars) and (RomanValues[index]<RomanValues[Next]) then
         begin
@@ -1173,7 +1297,7 @@ begin
       else 
         inc(Result, RomanValues[index]);
       end
-    else 
+    else
       begin
       Result:=0;
       Exit;
@@ -1190,7 +1314,7 @@ const
           = (1,4,5,9,10,40,50,90,100,400,500,900,1000);
   Romans  :  Array[1..13] of String 
           = ('i','iV','V','iX','X','XL','L','XC','C','CD','D','CM','M');
-          
+
 var
   i: Integer;
   
@@ -1206,11 +1330,11 @@ end;
 function intToBin(Value: Longint; Digits, Spaces: Integer): string;
 begin
   Result:='';
-  if (Digits>32) then 
+  if (Digits>32) then
     Digits:=32;
-  while (Digits>0) do 
+  while (Digits>0) do
     begin
-    if (Digits mod Spaces)=0 then 
+    if (Digits mod Spaces)=0 then
       Result:=Result+' ';
     Dec(Digits);
     Result:=Result+intToStr((Value shr Digits) and 1);
@@ -1224,25 +1348,25 @@ var
 begin
   Result:=0;
   i:=Pos('?',HelpWilds);
-  if (i=0) then 
+  if (i=0) then
     Result:=Pos(HelpWilds, inputStr)
   else
-    begin  
+    begin
     Diff:=Length(inputStr) - Length(HelpWilds);
-    for i:=0 to Diff do 
+    for i:=0 to Diff do
       begin
-      for J:=1 to Length(HelpWilds) do 
+      for J:=1 to Length(HelpWilds) do
         if (inputStr[i + J] = HelpWilds[J]) or (HelpWilds[J] = '?') then
           begin
-          if (J=Length(HelpWilds)) then 
+          if (J=Length(HelpWilds)) then
             begin
             Result:=i+1;
             Exit;
             end;
           end
-        else 
+        else
           Break;
-      end;    
+      end;
     end;
 end;
 
@@ -1252,7 +1376,7 @@ function isWild(inputStr, Wilds: string; ignoreCase: Boolean): Boolean;
 
  begin
    Result:=Pos('*', Wilds);
-   if Result>0 then 
+   if Result>0 then
      Wilds:=Copy(Wilds,1,Result - 1);
  end;
 
@@ -1352,7 +1476,7 @@ function XorEncode(const Key, Source: string): string;
 var
   i: Integer;
   C: Byte;
-  
+
 begin
   Result:='';
   for i:=1 to Length(Source) do 
@@ -1405,7 +1529,10 @@ end.
 
 {
   $Log$
-  Revision 1.8  2004-07-13 18:42:39  michael
+  Revision 1.9  2004-07-21 20:37:03  michael
+  + Implemented all functions
+
+  Revision 1.8  2004/07/13 18:42:39  michael
   + Added some RxStrUtils functions for Rx compatibility
 
   Revision 1.7  2004/07/01 15:42:18  peter
@@ -1423,4 +1550,4 @@ end.
   Revision 1.3  2004/03/18 16:55:47  marco
    * more simple implementations done, based on copy() Largely untested
 
-}
+}