| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502 | {    This file is part of the Free Pascal Integrated Development Environment    Copyright (c) 1998 by Berczi Gabor    Utilility routines used by the IDE    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 FPUtils;interfaceuses  Sysutils,  Objects;const  dirsep = System.DirectorySeparator;{$ifdef Unix}  listsep = [';',':'];  exeext = '';  pasext = '.pas';  ppext  = '.pp';{$else}  listsep = [';'];  exeext = '.exe';  pasext = '.pas';  ppext  = '.pp';{$endif}function SmartPath(Path: string): string;Function FixPath(s:string;allowdot:boolean):string;function FixFileName(const s:string):string;function MakeExeName(const fn:string):string;function Center(const S: string; Len: byte): string;function FitStr(const S: string; Len: byte): string;function KillTilde(S: string): string;function LowercaseStr(const S: string): string;{function DirOf(const S: string): string;function ExtOf(const S: string): string;function NameOf(const S: string): string;function NameAndExtOf(const S: string): string;}function StrToExtended(S: string): Extended;function Power(const A,B: double): double;function MatchesMask(What, Mask: string): boolean;function MatchesMaskList(What, MaskList: string): boolean;function MatchesFileList(What, FileList: string): boolean;function EatIO: integer;function RenameFile(const OldFileName,NewFileName: string): boolean;function LocateFile(FileList: string): string;function LocatePasFile(const FileName:string):string;function LocateExeFile(var FileName:string): boolean;function EraseFile(FileName: string): boolean;function GetStr(const P: PString): string;procedure ReplaceStr(var S: string; const What,NewS: string);procedure ReplaceStrI(var S: string; What: string; const NewS: string);const ListSeparator      : char = ';';implementationuses Dos,     WUtils,     FPVars,FPSwitch;function IntToStr(L: longint): string;var S: string;begin  Str(L,S);  IntToStr:=S;end;function IntToStrZ(L: longint; MinLen: byte): string;var S: string;begin  S:=IntToStr(L);  if length(S)<MinLen then S:=CharStr('0',MinLen-length(S))+S;  IntToStrZ:=S;end;function IntToStrL(L: longint; MinLen: byte): string;var S: string;begin  S:=IntToStr(L);  if length(S)<MinLen then S:=CharStr(' ',MinLen-length(S))+S;  IntToStrL:=S;end;function SmartPath(Path: string): string;var S: string;begin  GetDir(0,S);  if copy(S,length(S),1)<>DirSep then S:=S+DirSep;{$ifdef FSCaseInsensitive}  if (LowerCaseStr(copy(Path,1,length(S)))=LowerCaseStr(S)) {and (Pos('\',copy(Path,length(S)+1,High(S)))=0)} then{$else}  if (copy(Path,1,length(S))=S) {and (Pos('\',copy(Path,length(S)+1,High(S)))=0)} then{$endif}     system.Delete(Path,1,length(S));  SmartPath:=Path;end;Function FixPath(s:string;allowdot:boolean):string;var  i : longint;begin  for i:=1 to length(s) do   if s[i] in ['/','\'] then    s[i]:=DirSep;  if (length(s)>0) and (s[length(s)]<>DirSep) and     (s[length(s)]<>':') then   s:=s+DirSep;  if (not allowdot) and (s='.'+DirSep) then   s:='';  FixPath:=s;end;function FixFileName(const s:string):string;var  i      : longint;{$ifdef Unix}  NoPath : boolean;{$endif}begin  {$ifdef Unix}NoPath:=true;{$endif}  for i:=length(s) downto 1 do   begin     case s[i] of {$ifdef Unix}  '/','\' : begin              FixFileName[i]:='/';              NoPath:=false; {Skip lowercasing path: 'X11'<>'x11' }            end; 'A'..'Z' : if NoPath then             FixFileName[i]:=char(byte(s[i])+ord('a')-ord('A'))            else             FixFileName[i]:=s[i]; {$else}      '/' : FixFileName[i]:='\'; 'A'..'Z' : FixFileName[i]:=char(byte(s[i])+32); {$endif}     else      FixFileName[i]:=s[i];     end;   end;  FixFileName[0]:=s[0];end;function MakeExeName(const fn:string):string;var  d : DirStr;  n : NameStr;  e : ExtStr;begin  FSplit(fn,d,n,e);  MakeExeName:=d+n+ExeExt;end;function Center(const S: string; Len: byte): string;begin  Center:=LExpand(S+CharStr(' ',Max(0,(Len-length(S)) div 2)),Len);end;function FitStr(const S: string; Len: byte): string;begin  FitStr:=RExpand(copy(S,1,Len),Len);end;function KillTilde(S: string): string;var P: longint;begin  repeat    P:=Pos('~',S);    if P>0 then      Delete(S,P,1);  until P=0;  KillTilde:=S;end;function LowerCaseStr(const S: string): string;var  I: Longint;begin  for I:=1 to length(S) do    if S[I] in ['A'..'Z'] then      LowerCaseStr[I]:=chr(ord(S[I])+32)    else      LowerCaseStr[I]:=S[I];  LowercaseStr[0]:=S[0];end;{function DirOf(const S: string): string;var D: DirStr; E: ExtStr; N: NameStr;begin  FSplit(S,D,N,E);  if (D<>'') and (D[Length(D)]<>DirSep) then   DirOf:=D+DirSep  else   DirOf:=D;end;function ExtOf(const S: string): string;var D: DirStr; E: ExtStr; N: NameStr;begin  FSplit(S,D,N,E);  ExtOf:=E;end;function NameOf(const S: string): string;var D: DirStr; E: ExtStr; N: NameStr;begin  FSplit(S,D,N,E);  NameOf:=N;end;function NameAndExtOf(const S: string): string;var D: DirStr; E: ExtStr; N: NameStr;begin  FSplit(S,D,N,E);  NameAndExtOf:=N+E;end; }function StrToExtended(S: string): Extended;var R : Extended;    C : integer;begin  Val(S,R,C);  StrToExtended:=R;end;function Power(const A,B: double): double;begin  if A=0 then Power:=0         else Power:=exp(B*ln(A));end;function MatchesMask(What, Mask: string): boolean;  function upper(const s : string) : string;  var    i  : Sw_integer;  begin     for i:=1 to length(s) do      if s[i] in ['a'..'z'] then       upper[i]:=char(byte(s[i])-32)      else       upper[i]:=s[i];     upper[0]:=s[0];  end;  Function CmpStr(const hstr1,hstr2:string):boolean;  var    found : boolean;    i1,i2 : Sw_integer;  begin    i1:=0;    i2:=0;    found:=true;    while found and (i1<length(hstr1)) and (i2<=length(hstr2)) do     begin       if found then        inc(i2);       inc(i1);       case hstr1[i1] of         '?' :           found:=true;         '*' :           begin             found:=true;             if (i1=length(hstr1)) then              i2:=length(hstr2)             else              if (i1<length(hstr1)) and (hstr1[i1+1]<>hstr2[i2]) then               begin                 if i2<length(hstr2) then                  dec(i1)               end             else              if i2>1 then               dec(i2);           end;         else           found:=(hstr1[i1]=hstr2[i2]) or (hstr2[i2]='?');       end;     end;    if found then      found:=(i1>=length(hstr1)) and (i2>=length(hstr2));    CmpStr:=found;  end;var  D1,D2 : DirStr;  N1,N2 : NameStr;  E1,E2 : Extstr;begin{$ifdef Unix}  FSplit(What,D1,N1,E1);  FSplit(Mask,D2,N2,E2);{$else}  FSplit(Upper(What),D1,N1,E1);  FSplit(Upper(Mask),D2,N2,E2);{$endif}  MatchesMask:=CmpStr(N2,N1) and CmpStr(E2,E1);end;function MatchesMaskList(What, MaskList: string): boolean;var P: integer;    Match: boolean;begin  Match:=false;  if What<>'' then  repeat    P:=Pos(ListSeparator, MaskList);    if P=0 then      P:=length(MaskList)+1;    Match:=MatchesMask(What,copy(MaskList,1,P-1));    Delete(MaskList,1,P);  until Match or (MaskList='');  MatchesMaskList:=Match;end;function MatchesFileList(What, FileList: string): boolean;var P: integer;    Match: boolean;    WD,FD : record D: DirStr; N: NameStr; E: ExtStr; end;    F: string;begin  Match:=false;  FSplit(What,WD.D,WD.N,WD.E);  if What<>'' then  repeat    P:=Pos(ListSeparator, FileList);    if P=0 then P:=length(FileList)+1;    F:=copy(FileList,1,P-1);    FSplit(F,FD.D,FD.N,FD.E);    Match:=MatchesMask(WD.D+WD.N,FD.D+FD.N) and           MatchesMask(WD.E,FD.E);    Delete(FileList,1,P);  until Match or (FileList='');  MatchesFileList:=Match;end;function EatIO: integer;begin  EatIO:=IOResult;end;function RenameFile(const OldFileName,NewFileName: string): boolean;var f: file;begin  Assign(f,OldFileName);  Rename(f,NewFileName);  RenameFile:=(EatIO=0);end;function LocateFile(FileList: string): string;var FilePath: string;function CheckFile(Path,Name: string): boolean;var OK: boolean;begin  Path:=CompleteDir(Path);  Path:=Path+Name;  OK:=ExistsFile(Path);  if OK then FilePath:=Path;  CheckFile:=OK;end;function LocateSingleFile(FileName: string): boolean;var OK: boolean;begin  OK:=CheckFile(FExpand('.'),FileName);  if OK=false then OK:=CheckFile(StartupDir,FileName);  if OK=false then OK:=CheckFile(IDEDir,FileName);  LocateSingleFile:=OK;end;var P: integer;begin  FilePath:='';  if FileList<>'' then  repeat    P:=Pos(ListSeparator,FileList); if P=0 then P:=length(FileList)+1;    LocateSingleFile(copy(FileList,1,P-1));    Delete(FileList,1,P);  until (FilePath<>'') or (FileList='');  LocateFile:=FilePath;end;function LocatePasFile(const FileName:string):string;var  s : string;begin  LocatePasFile:=FileName;  if ExistsFile(FileName) or (ExtOf(FileName)<>'') then   exit;  S:=FileName+PPExt;  if ExistsFile(S) then   begin     LocatePasFile:=S;     exit;   end;  S:=FileName+PasExt;  if ExistsFile(S) then   begin     LocatePasFile:=S;     exit;   end;end;function LocateExeFile(var FileName:string): boolean;var  dir : string;  s : ansistring;  i : longint;begin  LocateExeFile:=False;  if ExistsFile(FileName) then    begin      LocateExeFile:=true;      Exit;    end;  S:=sysutils.GetEnvironmentVariable('PATH');  While Length(S)>0 do    begin      i:=1;      While (i<=Length(S)) and not (S[i] in ListSep) do        Inc(i);      Dir:=CompleteDir(Copy(S,1,i-1));      if i<Length(S) then        Delete(S,1,i)      else        S:='';      if ExistsFile(Dir+FileName) then        Begin           FileName:=Dir+FileName;           LocateExeFile:=true;           Exit;        End;   end;end;function GetStr(const P: PString): string;begin  if P=nil then GetStr:='' else GetStr:=P^;end;function EraseFile(FileName: string): boolean;var f: file;begin  if FileName='' then Exit;  {$I-}  Assign(f,FileName);  Erase(f);  {$I+}  EraseFile:=(EatIO=0);end;procedure ReplaceStr(var S: string; const What,NewS: string);var I : Sw_integer;begin  repeat    I:=Pos(What,S);    if I>0 then    begin      Delete(S,I,length(What));      Insert(NewS,S,I);    end;  until I=0;end;procedure ReplaceStrI(var S: string; What: string; const NewS: string);var I : integer;    UpcaseS: string;begin  UpcaseS:=UpcaseStr(S); What:=UpcaseStr(What);  repeat    I:=Pos(What,UpcaseS);    if I>0 then    begin      Delete(S,I,length(What));      Insert(NewS,S,I);      Delete(UpcaseS,I,length(What));      Insert(NewS,UpcaseS,I);    end;  until I=0;end;END.
 |