fpc/rtl/objpas/strutils.pp
2004-01-10 19:14:18 +00:00

595 lines
15 KiB
ObjectPascal

{$mode objfpc}
{$h+}
{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 1999-2000 by the Free Pascal development team
Delphi/Kylix compatibility unit: String handling routines.
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
unit strutils;
interface
uses
SysUtils{, Types};
{ ---------------------------------------------------------------------
Case sensitive search/replace
---------------------------------------------------------------------}
Function AnsiResemblesText(const AText, AOther: string): Boolean;
Function AnsiContainsText(const AText, ASubText: string): Boolean;
Function AnsiStartsText(const ASubText, AText: string): Boolean;
Function AnsiEndsText(const ASubText, AText: string): Boolean;
Function AnsiReplaceText(const AText, AFromText, AToText: string): string;
Function AnsiMatchText(const AText: string; const AValues: array of string): Boolean;
Function AnsiIndexText(const AText: string; const AValues: array of string): Integer;
{ ---------------------------------------------------------------------
Case insensitive search/replace
---------------------------------------------------------------------}
Function AnsiContainsStr(const AText, ASubText: string): Boolean;
Function AnsiStartsStr(const ASubText, AText: string): Boolean;
Function AnsiEndsStr(const ASubText, AText: string): Boolean;
Function AnsiReplaceStr(const AText, AFromText, AToText: string): string;
Function AnsiMatchStr(const AText: string; const AValues: array of string): Boolean;
Function AnsiIndexStr(const AText: string; const AValues: array of string): Integer;
{ ---------------------------------------------------------------------
Playthingies
---------------------------------------------------------------------}
Function DupeString(const AText: string; ACount: Integer): string;
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): 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 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;
Function AnsiRightStr(const AText: AnsiString; const ACount: Integer): AnsiString;
Function AnsiMidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString;
{$ifndef ver1_0}
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;
{$endif}
{ ---------------------------------------------------------------------
Extended search and replace
---------------------------------------------------------------------}
const
{ Default word delimiters are any character except the core alphanumerics. }
WordDelimiters: set of Char = [#0..#255] - ['a'..'z','A'..'Z','1'..'9','0'];
type
TStringSeachOption = (soDown, soMatchCase, soWholeWord);
TStringSearchOptions = set of TStringSeachOption;
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]
Function PosEx(const SubStr, S: string; Offset: Cardinal): Integer;
Function PosEx(const SubStr, S: string): Integer; // Offset: Cardinal = 1
{ ---------------------------------------------------------------------
Soundex Functions.
---------------------------------------------------------------------}
type
TSoundexLength = 1..MaxInt;
Function Soundex(const AText: string; ALength: TSoundexLength): string;
Function Soundex(const AText: string): string; // ; ALength: TSoundexLength = 4
type
TSoundexIntLength = 1..8;
Function SoundexInt(const AText: string; ALength: TSoundexIntLength): Integer;
Function SoundexInt(const AText: string): Integer; //; ALength: TSoundexIntLength = 4
Function DecodeSoundexInt(AValue: Integer): string;
Function SoundexWord(const AText: string): Word;
Function DecodeSoundexWord(AValue: Word): string;
Function SoundexSimilar(const AText, AOther: string; ALength: TSoundexLength): Boolean;
Function SoundexSimilar(const AText, AOther: string): Boolean; //; ALength: TSoundexLength = 4
Function SoundexCompare(const AText, AOther: string; ALength: TSoundexLength): Integer;
Function SoundexCompare(const AText, AOther: string): Integer; //; ALength: TSoundexLength = 4
Function SoundexProc(const AText, AOther: string): Boolean;
type
TCompareTextProc = Function(const AText, AOther: string): Boolean;
Const
AnsiResemblesProc: TCompareTextProc = @SoundexProc;
implementation
{ ---------------------------------------------------------------------
Auxiliary functions
---------------------------------------------------------------------}
Procedure NotYetImplemented (FN : String);
begin
Raise Exception.CreateFmt('Function "%s" (strutils) is not yet implemented',[FN]);
end;
{ ---------------------------------------------------------------------
Case sensitive search/replace
---------------------------------------------------------------------}
Function AnsiResemblesText(const AText, AOther: string): Boolean;
begin
NotYetImplemented(' AnsiResemblesText');
end;
Function AnsiContainsText(const AText, ASubText: string): Boolean;
begin
NotYetImplemented(' AnsiContainsText');
end;
Function AnsiStartsText(const ASubText, AText: string): Boolean;
begin
NotYetImplemented(' AnsiStartsText');
end;
Function AnsiEndsText(const ASubText, AText: string): Boolean;
begin
NotYetImplemented(' AnsiEndsText');
end;
Function AnsiReplaceText(const AText, AFromText, AToText: string): string;
begin
NotYetImplemented(' AnsiReplaceText');
end;
Function AnsiMatchText(const AText: string; const AValues: array of string): Boolean;
begin
NotYetImplemented(' AnsiMatchText');
end;
Function AnsiIndexText(const AText: string; const AValues: array of string): Integer;
begin
NotYetImplemented(' AnsiIndexText');
end;
{ ---------------------------------------------------------------------
Case insensitive search/replace
---------------------------------------------------------------------}
Function AnsiContainsStr(const AText, ASubText: string): Boolean;
begin
NotYetImplemented(' AnsiContainsStr');
end;
Function AnsiStartsStr(const ASubText, AText: string): Boolean;
begin
NotYetImplemented(' AnsiStartsStr');
end;
Function AnsiEndsStr(const ASubText, AText: string): Boolean;
begin
NotYetImplemented(' AnsiEndsStr');
end;
Function AnsiReplaceStr(const AText, AFromText, AToText: string): string;
begin
NotYetImplemented(' AnsiReplaceStr');
end;
Function AnsiMatchStr(const AText: string; const AValues: array of string): Boolean;
begin
NotYetImplemented(' AnsiMatchStr');
end;
Function AnsiIndexStr(const AText: string; const AValues: array of string): Integer;
begin
NotYetImplemented(' AnsiIndexStr');
end;
{ ---------------------------------------------------------------------
Playthingies
---------------------------------------------------------------------}
Function DupeString(const AText: string; ACount: Integer): string;
begin
NotYetImplemented(' DupeString');
end;
Function ReverseString(const AText: string): string;
begin
NotYetImplemented(' ReverseString');
end;
Function AnsiReverseString(const AText: AnsiString): AnsiString;
begin
NotYetImplemented(' AnsiReverseString');
end;
Function StuffString(const AText: string; AStart, ALength: Cardinal; const ASubText: string): string;
begin
NotYetImplemented(' StuffString');
end;
Function RandomFrom(const AValues: array of string): string; overload;
begin
NotYetImplemented(' RandomFrom');
end;
Function IfThen(AValue: Boolean; const ATrue: string; AFalse: string): string;
begin
NotYetImplemented(' IfThen');
end;
Function IfThen(AValue: Boolean; const ATrue: string): string; // ; AFalse: string = ''
begin
NotYetImplemented(' IfThen');
end;
{ ---------------------------------------------------------------------
VB emulations.
---------------------------------------------------------------------}
Function LeftStr(const AText: AnsiString; const ACount: Integer): AnsiString;
begin
NotYetImplemented(' LeftStr');
end;
Function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString;
begin
NotYetImplemented(' RightStr');
end;
Function MidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString;
begin
NotYetImplemented(' MidStr');
end;
Function LeftBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;
begin
NotYetImplemented(' LeftBStr');
end;
Function RightBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;
begin
NotYetImplemented(' RightBStr');
end;
Function MidBStr(const AText: AnsiString; const AByteStart, AByteCount: Integer): AnsiString;
begin
NotYetImplemented(' MidBStr');
end;
Function AnsiLeftStr(const AText: AnsiString; const ACount: Integer): AnsiString;
begin
NotYetImplemented(' AnsiLeftStr');
end;
Function AnsiRightStr(const AText: AnsiString; const ACount: Integer): AnsiString;
begin
NotYetImplemented(' AnsiRightStr');
end;
Function AnsiMidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString;
begin
NotYetImplemented(' AnsiMidStr');
end;
{$ifndef ver1_0}
Function LeftStr(const AText: WideString; const ACount: Integer): WideString;
begin
NotYetImplemented(' LeftStr');
end;
Function RightStr(const AText: WideString; const ACount: Integer): WideString;
begin
NotYetImplemented(' RightStr');
end;
Function MidStr(const AText: WideString; const AStart, ACount: Integer): WideString;
begin
NotYetImplemented(' MidStr');
end;
{$endif}
{ ---------------------------------------------------------------------
Extended search and replace
---------------------------------------------------------------------}
Function SearchBuf(Buf: PChar; BufLen: Integer; SelStart, SelLength: Integer; SearchString: String; Options: TStringSearchOptions): PChar;
begin
NotYetImplemented(' SearchBuf');
end;
Function SearchBuf(Buf: PChar; BufLen: Integer; SelStart, SelLength: Integer; SearchString: String): PChar; // ; Options: TStringSearchOptions = [soDown]
begin
NotYetImplemented(' SearchBuf');
end;
Function PosEx(const SubStr, S: string; Offset: Cardinal): Integer;
begin
NotYetImplemented(' PosEx');
end;
Function PosEx(const SubStr, S: string): Integer; // Offset: Cardinal = 1
begin
NotYetImplemented(' PosEx');
end;
{ ---------------------------------------------------------------------
Soundex Functions.
---------------------------------------------------------------------}
Const
SScore : array[1..255] of Char =
('0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', // 1..32
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', // 33..64
'0','1','2','3','0','1','2','i','0','2','2','4','5','5','0','1','2','6','2','3','0','1','i','2','i','2', // 64..90
'0','0','0','0','0','0', // 91..95
'0','1','2','3','0','1','2','i','0','2','2','4','5','5','0','1','2','6','2','3','0','1','i','2','i','2', // 96..122
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', // 123..154
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', // 155..186
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', // 187..218
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', // 219..250
'0','0','0','0','0'); // 251..255
Function Soundex(const AText: string; ALength: TSoundexLength): string;
Var
S,PS : Char;
I,L : integer;
begin
Result:='';
PS:=#0;
If Length(AText)>0 then
begin
Result:=Upcase(AText[1]);
I:=2;
L:=Length(AText);
While (I<=L) and (Length(Result)<ALength) do
begin
S:=SScore[Ord(AText[i])];
If Not (S in ['0','i',PS]) then
Result:=Result+S;
If (S<>'i') then
PS:=S;
Inc(I);
end;
end;
L:=Length(Result);
If (L<ALength) then
Result:=Result+StringOfChar('0',Alength-L);
end;
Function Soundex(const AText: string): string; // ; ALength: TSoundexLength = 4
begin
Result:=Soundex(AText,4);
end;
Function SoundexInt(const AText: string; ALength: TSoundexIntLength): Integer;
begin
NotYetImplemented(' SoundexInt');
end;
Function SoundexInt(const AText: string): Integer; //; ALength: TSoundexIntLength = 4
begin
NotYetImplemented(' SoundexInt');
end;
Function DecodeSoundexInt(AValue: Integer): string;
begin
NotYetImplemented(' DecodeSoundexInt');
end;
Function SoundexWord(const AText: string): Word;
Var
S : String;
begin
S:=SoundEx(Atext,4);
Writeln('Soundex result : "',S,'"');
Result:=Ord(S[1])-Ord('A');
Result:=Result*26+StrToInt(S[2]);
Result:=Result*7+StrToInt(S[3]);
Result:=Result*7+StrToInt(S[4]);
end;
Function DecodeSoundexWord(AValue: Word): string;
begin
NotYetImplemented(' DecodeSoundexWord');
end;
Function SoundexSimilar(const AText, AOther: string; ALength: TSoundexLength): Boolean;
begin
NotYetImplemented(' SoundexSimilar');
end;
Function SoundexSimilar(const AText, AOther: string): Boolean; //; ALength: TSoundexLength = 4
begin
NotYetImplemented(' SoundexSimilar');
end;
Function SoundexCompare(const AText, AOther: string; ALength: TSoundexLength): Integer;
begin
NotYetImplemented(' SoundexCompare');
end;
Function SoundexCompare(const AText, AOther: string): Integer; //; ALength: TSoundexLength = 4
begin
NotYetImplemented(' SoundexCompare');
end;
Function SoundexProc(const AText, AOther: string): Boolean;
begin
NotYetImplemented(' SoundexProc');
end;
end.