lazarus/components/lazreport/source/addons/addfunction/frFuncStr.pas
jesus d0a347df28 Added LazReport components
git-svn-id: trunk@11950 -
2007-09-06 19:47:34 +00:00

339 lines
10 KiB
ObjectPascal

{*******************************************************}
{ }
{ Add FastReport String Lbrary }
{ }
{ Copyright (c) 1995, 1996 AO ROSNO }
{ Copyright (c) 1997, 1998 Master-Bank }
{ }
{ Copyright (c) 2001 by Stalker SoftWare }
{ }
{*******************************************************}
unit frFuncStr;
interface
{$A+,B-,E-,R-}
{.$I FR.inc}
uses
SysUtils;
type
TfrCharSet = set of Char;
// RxLib
function frWordPosition(const N: Integer; const S: string; const WordDelims: TfrCharSet): Integer;
function frExtractWord(N: Integer; const S: string; const WordDelims: TfrCharSet): string;
function frWordCount(const S: string; const WordDelims: TfrCharSet): Integer;
function frIsWordPresent(const W, S: string; const WordDelims: TfrCharSet): Boolean;
function frNPos(const C: string; S: string; N: Integer): Integer;
function frReplaceStr(const S, Srch, Replace: string): string;
// StLib
function frReplicate(cStr: String; nLen :Integer) :String;
function frPadRight(cStr: String; nLen: Integer; cChar :String) :String;
function frPadLeft(cStr: String; nLen: Integer; cChar :String) :String;
function frPadCenter( cStr: String; nWidth: Integer; cChar: String): String;
function frEndPos(cStr, cSubStr: String) :Integer;
function frCompareStr(cStr1, cStr2: String) :Integer;
function frLeftCopy(cStr: String; nNum: Integer): String;
function frRightCopy(cStr: String; nNum: Integer): String;
// Delphi
function frDelete(cStr: String; nIndex, nCount:Integer) :String;
function frInsert(cStr1, cStr2: String; nIndex:Integer) :String;
implementation
{--------------------------------------------------------------------}
{ Return position first character N words in string S, use }
{ const WordDelims (type TCharSet) as delimiter between words }
{--------------------------------------------------------------------}
function frWordPosition(const N: Integer; const S: string; const WordDelims: TfrCharSet): Integer;
var
Count, I: Integer;
begin
Count := 0;
I := 1;
Result := 0;
while (I <= Length(S)) and (Count <> N) do begin
{ skip over delimiters }
while (I <= Length(S)) and (S[I] in WordDelims) do Inc(I);
{ if we're not beyond end of S, we're at the start of a word }
if I <= Length(S) then Inc(Count);
{ if not finished, find the end of the current word }
if Count <> N then
while (I <= Length(S)) and not (S[I] in WordDelims) do Inc(I)
else Result := I;
end; { while }
end; { frWordPosition }
{--------------------------------------------------------------------}
{ Extract N word from string S, use WordDelims as }
{ delimiter between words }
{--------------------------------------------------------------------}
function frExtractWord(N: Integer; const S: string; const WordDelims: TfrCharSet): string;
var
I: Integer;
Len: Integer;
begin
Len := 0;
I := frWordPosition(N, S, WordDelims);
if I <> 0 then
{ find the end of the current word }
while (I <= Length(S)) and not(S[I] in WordDelims) do begin
{ add the I'th character to result }
Inc(Len);
SetLength(Result, Len);
Result[Len] := S[I];
Inc(I);
end; { while }
SetLength(Result, Len);
end; { frExtractWord }
{--------------------------------------------------------------------}
{ Count words in string S, use WordDelims as delimiter }
{ between words }
{--------------------------------------------------------------------}
function frWordCount(const S: string; const WordDelims: TfrCharSet): Integer;
var
SLen, I: Cardinal;
begin
Result := 0;
I := 1;
SLen := Length(S);
while I <= SLen do begin
while (I <= SLen) and (S[I] in WordDelims) do Inc(I);
if I <= SLen then Inc(Result);
while (I <= SLen) and not(S[I] in WordDelims) do Inc(I);
end; { while }
end; { frWordCount }
{--------------------------------------------------------------------}
{ Check existing word W in string S, use }
{ WordDelims as possible delimiters between words }
{--------------------------------------------------------------------}
function frIsWordPresent(const W, S: string; const WordDelims: TfrCharSet): Boolean;
var
Count, I: Integer;
begin
Result := False;
Count := frWordCount(S, WordDelims);
for I := 1 to Count do
if frExtractWord(I, S, WordDelims) = W then begin
Result := True;
Exit;
end; { if }
end; { frIsWordPresent }
{--------------------------------------------------------------------}
{ Find position N substring C in string S }
{--------------------------------------------------------------------}
function frNPos(const C: string; S: string; N: Integer): Integer;
var
I, P, K: Integer;
begin
Result := 0;
K := 0;
for I := 1 to N do begin
P := Pos(C, S);
Inc(K, P);
if (I = N) and (P > 0) then begin
Result := K;
Exit;
end; { if }
if P > 0 then Delete(S, 1, P)
else Exit;
end; { for }
end; { frNPos }
{--------------------------------------------------------------------}
{ Function exchange in string S all substrings Srch on }
{ other substring, delivered as Replace. }
{--------------------------------------------------------------------}
function frReplaceStr(const S, Srch, Replace: string): string;
var
I: Integer;
Source: string;
begin
Source := S;
Result := '';
repeat
I := Pos(Srch, Source);
if I > 0 then begin
Result := Result + Copy(Source, 1, I - 1) + Replace;
Source := Copy(Source, I + Length(Srch), MaxInt);
end
else Result := Result + Source;
until I <= 0;
end; { frReplaceStr }
{--------------------------------------------------------------------}
{ Return nLen chars as cStr }
{--------------------------------------------------------------------}
function frReplicate(cStr: String; nLen :Integer) :String;
var
nCou :Integer;
begin
Result := '';
for nCou := 1 to nLen do
Result := Result + cStr;
end; { Replicate }
{--------------------------------------------------------------------}
{ Return string filled chars cChar from left to nLen }
{--------------------------------------------------------------------}
function frPadLeft(cStr: String; nLen: Integer; cChar :String) :String;
var
S :String;
begin
S := Trim(cStr);
Result := frReplicate(cChar, nLen-Length(S))+S;
end ; { frPadLeft }
{--------------------------------------------------------------------}
{ Return string filled chars cChar from right to nLen }
{--------------------------------------------------------------------}
function frPadRight(cStr: String; nLen: Integer; cChar :String) :String ;
var
S :String;
begin
S := Trim(cStr);
Result := S+frReplicate(cChar, nLen-Length(S));
end; { frPadRight }
{--------------------------------------------------------------------}
{ Return centered string filled chars cChar with both side }
{--------------------------------------------------------------------}
function frPadCenter( cStr: String; nWidth: Integer; cChar: String): String;
var
nPerSide :Integer;
cResult :String;
begin
nPerSide := (nWidth - Length(cStr)) div 2;
cResult := frPadLeft(cStr, (Length(cStr) + nPerSide), cChar);
Result := frPadRight(cResult, nWidth, cChar);
end; { frPadCenter }
{----------------------------------------------------------------}
{ Find in string substring from end }
{ Return position substing if found, else return 0 }
{----------------------------------------------------------------}
function frEndPos(cStr, cSubStr: String) :Integer;
var
nCou :Integer;
nLenSS :Integer;
nLenS :Integer;
begin
nLenSS := Length(cSubStr);
nLenS := Length(cStr);
Result := 0 ;
if nLenSS > nLenS then Exit;
for nCou := nLenS downto 1 do
if Copy( cStr, nCou, nLenSS ) = cSubStr then begin
Result := nCou;
Exit;
end; { if }
end; { frEndPos }
{--------------------------------------------------------------------}
{ Return substring from first char to nNum }
{--------------------------------------------------------------------}
function frLeftCopy( cStr: String; nNum: Integer ): String;
begin
Result := Copy( cStr, 1, nNum );
end; { frLeftCopy }
{--------------------------------------------------------------------}
{ Return substring from last char to position nNum }
{--------------------------------------------------------------------}
function frRightCopy( cStr: String; nNum: Integer ): String;
begin
Result := '';
if nNum > Length( cStr ) then Exit;
Result := Copy( cStr, (Length(cStr) - nNum + 1), Length(cStr) );
end; { frRightCopy }
{--------------------------------------------------------------------}
{ Delete nCount chars in string cStr from position nIndex }
{--------------------------------------------------------------------}
function frDelete(cStr: String; nIndex, nCount:Integer) :String;
begin
Delete(cStr,nIndex,nCount);
Result := cStr;
end; { frDelete }
{--------------------------------------------------------------------}
{ Insert string cStr2 into string cStr1, from position nIndex }
{--------------------------------------------------------------------}
function frInsert(cStr1, cStr2: String; nIndex:Integer) :String;
begin
Insert(cStr1,cStr2,nIndex);
Result := cStr2;
end; { frDelete }
{----------------------------------------------------------------}
{ Compare cStr1 and cStr2 and return number of the position }
{ difference strings }
{----------------------------------------------------------------}
function frCompareStr(cStr1, cStr2: String) :Integer;
var
nLenMax :Integer;
nCou :Integer;
begin
Result := 0;
if Length( cStr1 ) > Length( cStr2 ) then
nLenMax := Length( cStr1 )
else
nLenMax := Length( cStr2 );
for nCou := 1 to nLenMax do
if Copy( cStr1, nCou, 1) <> Copy( cStr2, nCou, 1) then begin
Result := nCou;
Exit;
end; { if }
end; { frCompareStr }
end.