123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594 |
- {$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.
|