2
0

strutils.pp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. {$mode objfpc}
  2. {$h+}
  3. {
  4. $Id$
  5. This file is part of the Free Pascal run time library.
  6. Copyright (c) 1999-2000 by the Free Pascal development team
  7. Delphi/Kylix compatibility unit: String handling routines.
  8. See the file COPYING.FPC, included in this distribution,
  9. for details about the copyright.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. **********************************************************************}
  14. unit strutils;
  15. interface
  16. uses
  17. SysUtils{, Types};
  18. { ---------------------------------------------------------------------
  19. Case sensitive search/replace
  20. ---------------------------------------------------------------------}
  21. Function AnsiResemblesText(const AText, AOther: string): Boolean;
  22. Function AnsiContainsText(const AText, ASubText: string): Boolean;
  23. Function AnsiStartsText(const ASubText, AText: string): Boolean;
  24. Function AnsiEndsText(const ASubText, AText: string): Boolean;
  25. Function AnsiReplaceText(const AText, AFromText, AToText: string): string;
  26. Function AnsiMatchText(const AText: string; const AValues: array of string): Boolean;
  27. Function AnsiIndexText(const AText: string; const AValues: array of string): Integer;
  28. { ---------------------------------------------------------------------
  29. Case insensitive search/replace
  30. ---------------------------------------------------------------------}
  31. Function AnsiContainsStr(const AText, ASubText: string): Boolean;
  32. Function AnsiStartsStr(const ASubText, AText: string): Boolean;
  33. Function AnsiEndsStr(const ASubText, AText: string): Boolean;
  34. Function AnsiReplaceStr(const AText, AFromText, AToText: string): string;
  35. Function AnsiMatchStr(const AText: string; const AValues: array of string): Boolean;
  36. Function AnsiIndexStr(const AText: string; const AValues: array of string): Integer;
  37. { ---------------------------------------------------------------------
  38. Playthingies
  39. ---------------------------------------------------------------------}
  40. Function DupeString(const AText: string; ACount: Integer): string;
  41. Function ReverseString(const AText: string): string;
  42. Function AnsiReverseString(const AText: AnsiString): AnsiString;
  43. Function StuffString(const AText: string; AStart, ALength: Cardinal; const ASubText: string): string;
  44. Function RandomFrom(const AValues: array of string): string; overload;
  45. Function IfThen(AValue: Boolean; const ATrue: string; AFalse: string): string;
  46. Function IfThen(AValue: Boolean; const ATrue: string): string; // ; AFalse: string = ''
  47. { ---------------------------------------------------------------------
  48. VB emulations.
  49. ---------------------------------------------------------------------}
  50. Function LeftStr(const AText: AnsiString; const ACount: Integer): AnsiString;
  51. Function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString;
  52. Function MidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString;
  53. Function RightBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;
  54. Function MidBStr(const AText: AnsiString; const AByteStart, AByteCount: Integer): AnsiString;
  55. Function AnsiLeftStr(const AText: AnsiString; const ACount: Integer): AnsiString;
  56. Function AnsiRightStr(const AText: AnsiString; const ACount: Integer): AnsiString;
  57. Function AnsiMidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString;
  58. {$ifndef ver1_0}
  59. Function LeftBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;
  60. Function LeftStr(const AText: WideString; const ACount: Integer): WideString;
  61. Function RightStr(const AText: WideString; const ACount: Integer): WideString;
  62. Function MidStr(const AText: WideString; const AStart, ACount: Integer): WideString;
  63. {$endif}
  64. { ---------------------------------------------------------------------
  65. Extended search and replace
  66. ---------------------------------------------------------------------}
  67. const
  68. { Default word delimiters are any character except the core alphanumerics. }
  69. WordDelimiters: set of Char = [#0..#255] - ['a'..'z','A'..'Z','1'..'9','0'];
  70. type
  71. TStringSeachOption = (soDown, soMatchCase, soWholeWord);
  72. TStringSearchOptions = set of TStringSeachOption;
  73. Function SearchBuf(Buf: PChar; BufLen: Integer; SelStart, SelLength: Integer; SearchString: String; Options: TStringSearchOptions): PChar;
  74. Function SearchBuf(Buf: PChar; BufLen: Integer; SelStart, SelLength: Integer; SearchString: String): PChar; // ; Options: TStringSearchOptions = [soDown]
  75. Function PosEx(const SubStr, S: string; Offset: Cardinal): Integer;
  76. Function PosEx(const SubStr, S: string): Integer; // Offset: Cardinal = 1
  77. { ---------------------------------------------------------------------
  78. Soundex Functions.
  79. ---------------------------------------------------------------------}
  80. type
  81. TSoundexLength = 1..MaxInt;
  82. Function Soundex(const AText: string; ALength: TSoundexLength): string;
  83. Function Soundex(const AText: string): string; // ; ALength: TSoundexLength = 4
  84. type
  85. TSoundexIntLength = 1..8;
  86. Function SoundexInt(const AText: string; ALength: TSoundexIntLength): Integer;
  87. Function SoundexInt(const AText: string): Integer; //; ALength: TSoundexIntLength = 4
  88. Function DecodeSoundexInt(AValue: Integer): string;
  89. Function SoundexWord(const AText: string): Word;
  90. Function DecodeSoundexWord(AValue: Word): string;
  91. Function SoundexSimilar(const AText, AOther: string; ALength: TSoundexLength): Boolean;
  92. Function SoundexSimilar(const AText, AOther: string): Boolean; //; ALength: TSoundexLength = 4
  93. Function SoundexCompare(const AText, AOther: string; ALength: TSoundexLength): Integer;
  94. Function SoundexCompare(const AText, AOther: string): Integer; //; ALength: TSoundexLength = 4
  95. Function SoundexProc(const AText, AOther: string): Boolean;
  96. type
  97. TCompareTextProc = Function(const AText, AOther: string): Boolean;
  98. Const
  99. AnsiResemblesProc: TCompareTextProc = @SoundexProc;
  100. implementation
  101. { ---------------------------------------------------------------------
  102. Auxiliary functions
  103. ---------------------------------------------------------------------}
  104. Procedure NotYetImplemented (FN : String);
  105. begin
  106. Raise Exception.CreateFmt('Function "%s" (strutils) is not yet implemented',[FN]);
  107. end;
  108. { ---------------------------------------------------------------------
  109. Case sensitive search/replace
  110. ---------------------------------------------------------------------}
  111. Function AnsiResemblesText(const AText, AOther: string): Boolean;
  112. begin
  113. NotYetImplemented(' AnsiResemblesText');
  114. end;
  115. Function AnsiContainsText(const AText, ASubText: string): Boolean;
  116. begin
  117. NotYetImplemented(' AnsiContainsText');
  118. end;
  119. Function AnsiStartsText(const ASubText, AText: string): Boolean;
  120. begin
  121. NotYetImplemented(' AnsiStartsText');
  122. end;
  123. Function AnsiEndsText(const ASubText, AText: string): Boolean;
  124. begin
  125. NotYetImplemented(' AnsiEndsText');
  126. end;
  127. Function AnsiReplaceText(const AText, AFromText, AToText: string): string;
  128. begin
  129. NotYetImplemented(' AnsiReplaceText');
  130. end;
  131. Function AnsiMatchText(const AText: string; const AValues: array of string): Boolean;
  132. begin
  133. NotYetImplemented(' AnsiMatchText');
  134. end;
  135. Function AnsiIndexText(const AText: string; const AValues: array of string): Integer;
  136. begin
  137. NotYetImplemented(' AnsiIndexText');
  138. end;
  139. { ---------------------------------------------------------------------
  140. Case insensitive search/replace
  141. ---------------------------------------------------------------------}
  142. Function AnsiContainsStr(const AText, ASubText: string): Boolean;
  143. begin
  144. NotYetImplemented(' AnsiContainsStr');
  145. end;
  146. Function AnsiStartsStr(const ASubText, AText: string): Boolean;
  147. begin
  148. NotYetImplemented(' AnsiStartsStr');
  149. end;
  150. Function AnsiEndsStr(const ASubText, AText: string): Boolean;
  151. begin
  152. NotYetImplemented(' AnsiEndsStr');
  153. end;
  154. Function AnsiReplaceStr(const AText, AFromText, AToText: string): string;
  155. begin
  156. NotYetImplemented(' AnsiReplaceStr');
  157. end;
  158. Function AnsiMatchStr(const AText: string; const AValues: array of string): Boolean;
  159. begin
  160. NotYetImplemented(' AnsiMatchStr');
  161. end;
  162. Function AnsiIndexStr(const AText: string; const AValues: array of string): Integer;
  163. begin
  164. NotYetImplemented(' AnsiIndexStr');
  165. end;
  166. { ---------------------------------------------------------------------
  167. Playthingies
  168. ---------------------------------------------------------------------}
  169. Function DupeString(const AText: string; ACount: Integer): string;
  170. begin
  171. NotYetImplemented(' DupeString');
  172. end;
  173. Function ReverseString(const AText: string): string;
  174. begin
  175. NotYetImplemented(' ReverseString');
  176. end;
  177. Function AnsiReverseString(const AText: AnsiString): AnsiString;
  178. begin
  179. NotYetImplemented(' AnsiReverseString');
  180. end;
  181. Function StuffString(const AText: string; AStart, ALength: Cardinal; const ASubText: string): string;
  182. begin
  183. NotYetImplemented(' StuffString');
  184. end;
  185. Function RandomFrom(const AValues: array of string): string; overload;
  186. begin
  187. NotYetImplemented(' RandomFrom');
  188. end;
  189. Function IfThen(AValue: Boolean; const ATrue: string; AFalse: string): string;
  190. begin
  191. NotYetImplemented(' IfThen');
  192. end;
  193. Function IfThen(AValue: Boolean; const ATrue: string): string; // ; AFalse: string = ''
  194. begin
  195. NotYetImplemented(' IfThen');
  196. end;
  197. { ---------------------------------------------------------------------
  198. VB emulations.
  199. ---------------------------------------------------------------------}
  200. Function LeftStr(const AText: AnsiString; const ACount: Integer): AnsiString;
  201. begin
  202. NotYetImplemented(' LeftStr');
  203. end;
  204. Function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString;
  205. begin
  206. NotYetImplemented(' RightStr');
  207. end;
  208. Function MidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString;
  209. begin
  210. NotYetImplemented(' MidStr');
  211. end;
  212. Function LeftBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;
  213. begin
  214. NotYetImplemented(' LeftBStr');
  215. end;
  216. Function RightBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;
  217. begin
  218. NotYetImplemented(' RightBStr');
  219. end;
  220. Function MidBStr(const AText: AnsiString; const AByteStart, AByteCount: Integer): AnsiString;
  221. begin
  222. NotYetImplemented(' MidBStr');
  223. end;
  224. Function AnsiLeftStr(const AText: AnsiString; const ACount: Integer): AnsiString;
  225. begin
  226. NotYetImplemented(' AnsiLeftStr');
  227. end;
  228. Function AnsiRightStr(const AText: AnsiString; const ACount: Integer): AnsiString;
  229. begin
  230. NotYetImplemented(' AnsiRightStr');
  231. end;
  232. Function AnsiMidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString;
  233. begin
  234. NotYetImplemented(' AnsiMidStr');
  235. end;
  236. {$ifndef ver1_0}
  237. Function LeftStr(const AText: WideString; const ACount: Integer): WideString;
  238. begin
  239. NotYetImplemented(' LeftStr');
  240. end;
  241. Function RightStr(const AText: WideString; const ACount: Integer): WideString;
  242. begin
  243. NotYetImplemented(' RightStr');
  244. end;
  245. Function MidStr(const AText: WideString; const AStart, ACount: Integer): WideString;
  246. begin
  247. NotYetImplemented(' MidStr');
  248. end;
  249. {$endif}
  250. { ---------------------------------------------------------------------
  251. Extended search and replace
  252. ---------------------------------------------------------------------}
  253. Function SearchBuf(Buf: PChar; BufLen: Integer; SelStart, SelLength: Integer; SearchString: String; Options: TStringSearchOptions): PChar;
  254. begin
  255. NotYetImplemented(' SearchBuf');
  256. end;
  257. Function SearchBuf(Buf: PChar; BufLen: Integer; SelStart, SelLength: Integer; SearchString: String): PChar; // ; Options: TStringSearchOptions = [soDown]
  258. begin
  259. NotYetImplemented(' SearchBuf');
  260. end;
  261. Function PosEx(const SubStr, S: string; Offset: Cardinal): Integer;
  262. begin
  263. NotYetImplemented(' PosEx');
  264. end;
  265. Function PosEx(const SubStr, S: string): Integer; // Offset: Cardinal = 1
  266. begin
  267. NotYetImplemented(' PosEx');
  268. end;
  269. { ---------------------------------------------------------------------
  270. Soundex Functions.
  271. ---------------------------------------------------------------------}
  272. Const
  273. SScore : array[1..255] of Char =
  274. ('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
  275. '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
  276. '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
  277. '0','0','0','0','0','0', // 91..95
  278. '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
  279. '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
  280. '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
  281. '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
  282. '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
  283. '0','0','0','0','0'); // 251..255
  284. Function Soundex(const AText: string; ALength: TSoundexLength): string;
  285. Var
  286. S,PS : Char;
  287. I,L : integer;
  288. begin
  289. Result:='';
  290. PS:=#0;
  291. If Length(AText)>0 then
  292. begin
  293. Result:=Upcase(AText[1]);
  294. I:=2;
  295. L:=Length(AText);
  296. While (I<=L) and (Length(Result)<ALength) do
  297. begin
  298. S:=SScore[Ord(AText[i])];
  299. If Not (S in ['0','i',PS]) then
  300. Result:=Result+S;
  301. If (S<>'i') then
  302. PS:=S;
  303. Inc(I);
  304. end;
  305. end;
  306. L:=Length(Result);
  307. If (L<ALength) then
  308. Result:=Result+StringOfChar('0',Alength-L);
  309. end;
  310. Function Soundex(const AText: string): string; // ; ALength: TSoundexLength = 4
  311. begin
  312. Result:=Soundex(AText,4);
  313. end;
  314. Function SoundexInt(const AText: string; ALength: TSoundexIntLength): Integer;
  315. begin
  316. NotYetImplemented(' SoundexInt');
  317. end;
  318. Function SoundexInt(const AText: string): Integer; //; ALength: TSoundexIntLength = 4
  319. begin
  320. NotYetImplemented(' SoundexInt');
  321. end;
  322. Function DecodeSoundexInt(AValue: Integer): string;
  323. begin
  324. NotYetImplemented(' DecodeSoundexInt');
  325. end;
  326. Function SoundexWord(const AText: string): Word;
  327. Var
  328. S : String;
  329. begin
  330. S:=SoundEx(Atext,4);
  331. Writeln('Soundex result : "',S,'"');
  332. Result:=Ord(S[1])-Ord('A');
  333. Result:=Result*26+StrToInt(S[2]);
  334. Result:=Result*7+StrToInt(S[3]);
  335. Result:=Result*7+StrToInt(S[4]);
  336. end;
  337. Function DecodeSoundexWord(AValue: Word): string;
  338. begin
  339. NotYetImplemented(' DecodeSoundexWord');
  340. end;
  341. Function SoundexSimilar(const AText, AOther: string; ALength: TSoundexLength): Boolean;
  342. begin
  343. NotYetImplemented(' SoundexSimilar');
  344. end;
  345. Function SoundexSimilar(const AText, AOther: string): Boolean; //; ALength: TSoundexLength = 4
  346. begin
  347. NotYetImplemented(' SoundexSimilar');
  348. end;
  349. Function SoundexCompare(const AText, AOther: string; ALength: TSoundexLength): Integer;
  350. begin
  351. NotYetImplemented(' SoundexCompare');
  352. end;
  353. Function SoundexCompare(const AText, AOther: string): Integer; //; ALength: TSoundexLength = 4
  354. begin
  355. NotYetImplemented(' SoundexCompare');
  356. end;
  357. Function SoundexProc(const AText, AOther: string): Boolean;
  358. begin
  359. NotYetImplemented(' SoundexProc');
  360. end;
  361. end.