fputils.pas 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. {
  2. $Id$
  3. This file is part of the Free Pascal Integrated Development Environment
  4. Copyright (c) 1998 by Berczi Gabor
  5. Utilility routines used by the IDE
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. unit FPUtils;
  13. interface
  14. uses Objects;
  15. const
  16. {$ifdef linux}
  17. dirsep = '/';
  18. listsep = [';',':'];
  19. exeext = '';
  20. pasext = '.pas';
  21. ppext = '.pp';
  22. {$else}
  23. dirsep = '\';
  24. listsep = [';'];
  25. exeext = '.exe';
  26. pasext = '.pas';
  27. ppext = '.pp';
  28. {$endif}
  29. function IntToStr(L: longint): string;
  30. function IntToStrZ(L: longint; MinLen: byte): string;
  31. function IntToStrL(L: longint; MinLen: byte): string;
  32. function StrToInt(const S: string): longint;
  33. function IntToHex(L: longint): string;
  34. function IntToHexL(L: longint; MinLen: byte): string;
  35. function HexToInt(S: string): longint;
  36. function SmartPath(Path: string): string;
  37. Function FixPath(s:string;allowdot:boolean):string;
  38. function FixFileName(const s:string):string;
  39. function MakeExeName(const fn:string):string;
  40. function LExpand(const S: string; MinLen: byte): string;
  41. function RExpand(const S: string; MinLen: byte): string;
  42. function FitStr(const S: string; Len: byte): string;
  43. function LTrim(const S: string): string;
  44. function RTrim(const S: string): string;
  45. function Trim(const S: string): string;
  46. function KillTilde(S: string): string;
  47. function UpcaseStr(const S: string): string;
  48. function LowercaseStr(const S: string): string;
  49. function Max(A,B: longint): longint;
  50. function Min(A,B: longint): longint;
  51. function DirOf(const S: string): string;
  52. function ExtOf(const S: string): string;
  53. function NameOf(const S: string): string;
  54. function NameAndExtOf(const S: string): string;
  55. function StrToExtended(S: string): Extended;
  56. function Power(const A,B: double): double;
  57. function GetCurDir: string;
  58. function MatchesMask(What, Mask: string): boolean;
  59. function MatchesMaskList(What, MaskList: string): boolean;
  60. function MatchesFileList(What, FileList: string): boolean;
  61. function EatIO: integer;
  62. function ExistsFile(const FileName: string): boolean;
  63. function CompleteDir(const Path: string): string;
  64. function LocateFile(FileList: string): string;
  65. function LocatePasFile(const FileName:string):string;
  66. function LocateExeFile(var FileName:string): boolean;
  67. function EraseFile(FileName: string): boolean;
  68. function GetStr(const P: PString): string;
  69. procedure ReplaceStr(var S: string; const What,NewS: string);
  70. procedure ReplaceStrI(var S: string; What: string; const NewS: string);
  71. const LastStrToIntResult : integer = 0;
  72. LastHexToIntResult : integer = 0;
  73. ListSeparator : char = ';';
  74. implementation
  75. uses Dos,
  76. WUtils,
  77. FPVars;
  78. function IntToStr(L: longint): string;
  79. var S: string;
  80. begin
  81. Str(L,S);
  82. IntToStr:=S;
  83. end;
  84. function StrToInt(const S: string): longint;
  85. var L: longint;
  86. C: integer;
  87. begin
  88. Val(S,L,C);
  89. if C<>0 then L:=-1;
  90. LastStrToIntResult:=C;
  91. StrToInt:=L;
  92. end;
  93. function IntToStrZ(L: longint; MinLen: byte): string;
  94. var S: string;
  95. begin
  96. S:=IntToStr(L);
  97. if length(S)<MinLen then S:=CharStr('0',MinLen-length(S))+S;
  98. IntToStrZ:=S;
  99. end;
  100. function IntToStrL(L: longint; MinLen: byte): string;
  101. var S: string;
  102. begin
  103. S:=IntToStr(L);
  104. if length(S)<MinLen then S:=CharStr(' ',MinLen-length(S))+S;
  105. IntToStrL:=S;
  106. end;
  107. function SmartPath(Path: string): string;
  108. var S: string;
  109. begin
  110. GetDir(0,S); if copy(S,length(S),1)<>DirSep then S:=S+DirSep;
  111. if (copy(Path,1,length(S))=S) {and (Pos('\',copy(Path,length(S)+1,255))=0)} then
  112. system.Delete(Path,1,length(S));
  113. SmartPath:=Path;
  114. end;
  115. Function FixPath(s:string;allowdot:boolean):string;
  116. var
  117. i : longint;
  118. begin
  119. for i:=1 to length(s) do
  120. if s[i] in ['/','\'] then
  121. s[i]:=DirSep;
  122. if (length(s)>0) and (s[length(s)]<>DirSep) and
  123. (s[length(s)]<>':') then
  124. s:=s+DirSep;
  125. if (not allowdot) and (s='.'+DirSep) then
  126. s:='';
  127. FixPath:=s;
  128. end;
  129. function FixFileName(const s:string):string;
  130. var
  131. i : longint;
  132. NoPath : boolean;
  133. begin
  134. NoPath:=true;
  135. for i:=length(s) downto 1 do
  136. begin
  137. case s[i] of
  138. {$ifdef Linux}
  139. '/','\' : begin
  140. FixFileName[i]:='/';
  141. NoPath:=false; {Skip lowercasing path: 'X11'<>'x11' }
  142. end;
  143. 'A'..'Z' : if NoPath then
  144. FixFileName[i]:=char(byte(s[i])+32)
  145. else
  146. FixFileName[i]:=s[i];
  147. {$else}
  148. '/' : FixFileName[i]:='\';
  149. 'A'..'Z' : FixFileName[i]:=char(byte(s[i])+32);
  150. {$endif}
  151. else
  152. FixFileName[i]:=s[i];
  153. end;
  154. end;
  155. FixFileName[0]:=s[0];
  156. end;
  157. function MakeExeName(const fn:string):string;
  158. var
  159. d : DirStr;
  160. n : NameStr;
  161. e : ExtStr;
  162. begin
  163. FSplit(fn,d,n,e);
  164. MakeExeName:=d+n+ExeExt;
  165. end;
  166. function LExpand(const S: string; MinLen: byte): string;
  167. begin
  168. if length(S)<MinLen then
  169. LExpand:=CharStr(' ',MinLen-length(S))+S
  170. else
  171. LExpand:=S;
  172. end;
  173. function RExpand(const S: string; MinLen: byte): string;
  174. begin
  175. if length(S)<MinLen then
  176. RExpand:=S+CharStr(' ',MinLen-length(S))
  177. else
  178. RExpand:=S;
  179. end;
  180. function FitStr(const S: string; Len: byte): string;
  181. begin
  182. FitStr:=RExpand(copy(S,1,Len),Len);
  183. end;
  184. function KillTilde(S: string): string;
  185. var P: longint;
  186. begin
  187. repeat
  188. P:=Pos('~',S);
  189. if P>0 then
  190. Delete(S,P,1);
  191. until P=0;
  192. KillTilde:=S;
  193. end;
  194. function UpcaseStr(const S: string): string;
  195. var
  196. I: Longint;
  197. begin
  198. for I:=1 to length(S) do
  199. if S[I] in ['a'..'z'] then
  200. UpCaseStr[I]:=chr(ord(S[I])-32)
  201. else
  202. UpCaseStr[I]:=S[I];
  203. UpcaseStr[0]:=S[0];
  204. end;
  205. function LowerCaseStr(const S: string): string;
  206. var
  207. I: Longint;
  208. begin
  209. for I:=1 to length(S) do
  210. if S[I] in ['A'..'Z'] then
  211. LowerCaseStr[I]:=chr(ord(S[I])+32)
  212. else
  213. LowerCaseStr[I]:=S[I];
  214. LowercaseStr[0]:=S[0];
  215. end;
  216. function Max(A,B: longint): longint;
  217. begin
  218. if A>B then Max:=A else Max:=B;
  219. end;
  220. function Min(A,B: longint): longint;
  221. begin
  222. if A<B then Min:=A else Min:=B;
  223. end;
  224. function DirOf(const S: string): string;
  225. var D: DirStr; E: ExtStr; N: NameStr;
  226. begin
  227. FSplit(S,D,N,E);
  228. if (D<>'') and (D[Length(D)]<>DirSep) then
  229. DirOf:=D+DirSep
  230. else
  231. DirOf:=D;
  232. end;
  233. function ExtOf(const S: string): string;
  234. var D: DirStr; E: ExtStr; N: NameStr;
  235. begin
  236. FSplit(S,D,N,E);
  237. ExtOf:=E;
  238. end;
  239. function NameOf(const S: string): string;
  240. var D: DirStr; E: ExtStr; N: NameStr;
  241. begin
  242. FSplit(S,D,N,E);
  243. NameOf:=N;
  244. end;
  245. function NameAndExtOf(const S: string): string;
  246. var D: DirStr; E: ExtStr; N: NameStr;
  247. begin
  248. FSplit(S,D,N,E);
  249. NameAndExtOf:=N+E;
  250. end;
  251. function StrToExtended(S: string): Extended;
  252. var R : Extended;
  253. C : integer;
  254. begin
  255. Val(S,R,C);
  256. StrToExtended:=R;
  257. end;
  258. function Power(const A,B: double): double;
  259. begin
  260. if A=0 then Power:=0
  261. else Power:=exp(B*ln(A));
  262. end;
  263. function GetCurDir: string;
  264. var S: string;
  265. begin
  266. GetDir(0,S);
  267. if copy(S,length(S),1)<>DirSep then S:=S+DirSep;
  268. GetCurDir:=S;
  269. end;
  270. function IntToHex(L: longint): string;
  271. const HexNums : string[16] = '0123456789ABCDEF';
  272. var S: string;
  273. R: real;
  274. function DivF(Mit,Mivel: real): longint;
  275. begin
  276. DivF:=trunc(Mit/Mivel);
  277. end;
  278. function ModF(Mit,Mivel: real): longint;
  279. begin
  280. ModF:=trunc(Mit-DivF(Mit,Mivel)*Mivel);
  281. end;
  282. begin
  283. S:='';
  284. R:=L; if R<0 then begin R:=R+2147483647+2147483647+2; end;
  285. repeat
  286. S:=HexNums[ModF(R,16)+1]+S;
  287. R:=DivF(R,16);
  288. until R=0;
  289. IntToHex:=S;
  290. end;
  291. function HexToInt(S: string): longint;
  292. var L,I: longint;
  293. C: char;
  294. const HexNums: string[16] = '0123456789ABCDEF';
  295. begin
  296. S:=Trim(S); L:=0; I:=1; LastHexToIntResult:=0;
  297. while (I<=length(S)) and (LastHexToIntResult=0) do
  298. begin
  299. C:=Upcase(S[I]);
  300. if C in['0'..'9','A'..'F'] then
  301. begin
  302. L:=L*16+(Pos(C,HexNums)-1);
  303. end else LastHexToIntResult:=I;
  304. Inc(I);
  305. end;
  306. HexToInt:=L;
  307. end;
  308. function IntToHexL(L: longint; MinLen: byte): string;
  309. var S: string;
  310. begin
  311. S:=IntToHex(L);
  312. while length(S)<MinLen do S:='0'+S;
  313. IntToHexL:=S;
  314. end;
  315. function LTrim(const S: string): string;
  316. var
  317. i : longint;
  318. begin
  319. i:=1;
  320. while (i<length(s)) and (s[i]=' ') do
  321. inc(i);
  322. LTrim:=Copy(s,i,255);
  323. end;
  324. function RTrim(const S: string): string;
  325. var
  326. i : longint;
  327. begin
  328. i:=length(s);
  329. while (i>0) and (s[i]=' ') do
  330. dec(i);
  331. RTrim:=Copy(s,1,i);
  332. end;
  333. function Trim(const S: string): string;
  334. begin
  335. Trim:=RTrim(LTrim(S));
  336. end;
  337. function MatchesMask(What, Mask: string): boolean;
  338. function upper(const s : string) : string;
  339. var
  340. i : Sw_integer;
  341. begin
  342. for i:=1 to length(s) do
  343. if s[i] in ['a'..'z'] then
  344. upper[i]:=char(byte(s[i])-32)
  345. else
  346. upper[i]:=s[i];
  347. upper[0]:=s[0];
  348. end;
  349. Function CmpStr(const hstr1,hstr2:string):boolean;
  350. var
  351. found : boolean;
  352. i1,i2 : Sw_integer;
  353. begin
  354. i1:=0;
  355. i2:=0;
  356. found:=true;
  357. while found and (i1<length(hstr1)) and (i2<=length(hstr2)) do
  358. begin
  359. if found then
  360. inc(i2);
  361. inc(i1);
  362. case hstr1[i1] of
  363. '?' :
  364. found:=true;
  365. '*' :
  366. begin
  367. found:=true;
  368. if (i1=length(hstr1)) then
  369. i2:=length(hstr2)
  370. else
  371. if (i1<length(hstr1)) and (hstr1[i1+1]<>hstr2[i2]) then
  372. begin
  373. if i2<length(hstr2) then
  374. dec(i1)
  375. end
  376. else
  377. if i2>1 then
  378. dec(i2);
  379. end;
  380. else
  381. found:=(hstr1[i1]=hstr2[i2]) or (hstr2[i2]='?');
  382. end;
  383. end;
  384. if found then
  385. found:=(i1>=length(hstr1)) and (i2>=length(hstr2));
  386. CmpStr:=found;
  387. end;
  388. var
  389. D1,D2 : DirStr;
  390. N1,N2 : NameStr;
  391. E1,E2 : Extstr;
  392. begin
  393. {$ifdef linux}
  394. FSplit(What,D1,N1,E1);
  395. FSplit(Mask,D2,N2,E2);
  396. {$else}
  397. FSplit(Upper(What),D1,N1,E1);
  398. FSplit(Upper(Mask),D2,N2,E2);
  399. {$endif}
  400. MatchesMask:=CmpStr(N2,N1) and CmpStr(E2,E1);
  401. end;
  402. function MatchesMaskList(What, MaskList: string): boolean;
  403. var P: integer;
  404. Match: boolean;
  405. begin
  406. Match:=false;
  407. if What<>'' then
  408. repeat
  409. P:=Pos(ListSeparator, MaskList);
  410. if P=0 then P:=length(MaskList)+1;
  411. Match:=MatchesMask(What,copy(MaskList,1,P-1));
  412. Delete(MaskList,1,P);
  413. until Match or (MaskList='');
  414. MatchesMaskList:=Match;
  415. end;
  416. function MatchesFileList(What, FileList: string): boolean;
  417. var P: integer;
  418. Match: boolean;
  419. WD,FD : record D: DirStr; N: NameStr; E: ExtStr; end;
  420. F: string;
  421. begin
  422. Match:=false;
  423. FSplit(What,WD.D,WD.N,WD.E);
  424. if What<>'' then
  425. repeat
  426. P:=Pos(ListSeparator, FileList);
  427. if P=0 then P:=length(FileList)+1;
  428. F:=copy(FileList,1,P-1);
  429. FSplit(F,FD.D,FD.N,FD.E);
  430. Match:=MatchesMask(WD.D+WD.N,FD.D+FD.N) and
  431. MatchesMask(WD.E,FD.E);
  432. Delete(FileList,1,P);
  433. until Match or (FileList='');
  434. MatchesFileList:=Match;
  435. end;
  436. function EatIO: integer;
  437. begin
  438. EatIO:=IOResult;
  439. end;
  440. function ExistsFile(const FileName: string): boolean;
  441. var
  442. Dir : SearchRec;
  443. begin
  444. FindFirst(FileName,Archive+ReadOnly,Dir);
  445. ExistsFile:=(DosError=0);
  446. {$ifdef FPC}
  447. FindClose(Dir);
  448. {$endif def FPC}
  449. end;
  450. function CompleteDir(const Path: string): string;
  451. begin
  452. { keep c: untouched PM }
  453. if (Path<>'') and (Path[Length(Path)]<>DirSep) and
  454. (Path[Length(Path)]<>':') then
  455. CompleteDir:=Path+DirSep
  456. else
  457. CompleteDir:=Path;
  458. end;
  459. function LocateFile(FileList: string): string;
  460. var FilePath: string;
  461. function CheckFile(Path,Name: string): boolean;
  462. var OK: boolean;
  463. begin
  464. Path:=CompleteDir(Path);
  465. Path:=Path+Name;
  466. OK:=ExistsFile(Path);
  467. if OK then FilePath:=Path;
  468. CheckFile:=OK;
  469. end;
  470. function LocateSingleFile(FileName: string): boolean;
  471. var OK: boolean;
  472. begin
  473. OK:=CheckFile(FExpand('.'),FileName);
  474. if OK=false then OK:=CheckFile(StartupDir,FileName);
  475. if OK=false then OK:=CheckFile(IDEDir,FileName);
  476. LocateSingleFile:=OK;
  477. end;
  478. var P: integer;
  479. begin
  480. FilePath:='';
  481. if FileList<>'' then
  482. repeat
  483. P:=Pos(ListSeparator,FileList); if P=0 then P:=length(FileList)+1;
  484. LocateSingleFile(copy(FileList,1,P-1));
  485. Delete(FileList,1,P);
  486. until (FilePath<>'') or (FileList='');
  487. LocateFile:=FilePath;
  488. end;
  489. function LocatePasFile(const FileName:string):string;
  490. var
  491. s : string;
  492. begin
  493. LocatePasFile:=FileName;
  494. if ExistsFile(FileName) or (ExtOf(FileName)<>'') then
  495. exit;
  496. S:=FileName+PPExt;
  497. if ExistsFile(S) then
  498. begin
  499. LocatePasFile:=S;
  500. exit;
  501. end;
  502. S:=FileName+PasExt;
  503. if ExistsFile(S) then
  504. begin
  505. LocatePasFile:=S;
  506. exit;
  507. end;
  508. end;
  509. function LocateExeFile(var FileName:string): boolean;
  510. var
  511. dir,s : string;
  512. i : longint;
  513. begin
  514. LocateExeFile:=False;
  515. if ExistsFile(FileName) then
  516. begin
  517. LocateExeFile:=true;
  518. Exit;
  519. end;
  520. S:=GetEnv('PATH');
  521. While Length(S)>0 do
  522. begin
  523. i:=1;
  524. While (i<=Length(S)) and not (S[i] in ListSep) do
  525. Inc(i);
  526. Dir:=CompleteDir(Copy(S,1,i-1));
  527. if i<Length(S) then
  528. Delete(S,1,i)
  529. else
  530. S:='';
  531. if ExistsFile(Dir+FileName) then
  532. Begin
  533. FileName:=Dir+FileName;
  534. LocateExeFile:=true;
  535. Exit;
  536. End;
  537. end;
  538. end;
  539. function GetStr(const P: PString): string;
  540. begin
  541. if P=nil then GetStr:='' else GetStr:=P^;
  542. end;
  543. function EraseFile(FileName: string): boolean;
  544. var f: file;
  545. begin
  546. if FileName='' then Exit;
  547. {$I-}
  548. Assign(f,FileName);
  549. Erase(f);
  550. {$I+}
  551. EraseFile:=(EatIO=0);
  552. end;
  553. procedure ReplaceStr(var S: string; const What,NewS: string);
  554. var I : Sw_integer;
  555. begin
  556. repeat
  557. I:=Pos(What,S);
  558. if I>0 then
  559. begin
  560. Delete(S,I,length(What));
  561. Insert(NewS,S,I);
  562. end;
  563. until I=0;
  564. end;
  565. procedure ReplaceStrI(var S: string; What: string; const NewS: string);
  566. var I : integer;
  567. UpcaseS: string;
  568. begin
  569. UpcaseS:=UpcaseStr(S); What:=UpcaseStr(What);
  570. repeat
  571. I:=Pos(What,UpcaseS);
  572. if I>0 then
  573. begin
  574. Delete(S,I,length(What));
  575. Insert(NewS,S,I);
  576. end;
  577. until I=0;
  578. end;
  579. END.
  580. {
  581. $Log$
  582. Revision 1.13 1999-04-15 08:58:07 peter
  583. * syntax highlight fixes
  584. * browser updates
  585. Revision 1.12 1999/04/07 21:55:55 peter
  586. + object support for browser
  587. * html help fixes
  588. * more desktop saving things
  589. * NODEBUG directive to exclude debugger
  590. Revision 1.11 1999/03/19 16:04:31 peter
  591. * new compiler dialog
  592. Revision 1.10 1999/03/08 14:58:14 peter
  593. + prompt with dialogs for tools
  594. Revision 1.9 1999/03/01 15:42:06 peter
  595. + Added dummy entries for functions not yet implemented
  596. * MenuBar didn't update itself automatically on command-set changes
  597. * Fixed Debugging/Profiling options dialog
  598. * TCodeEditor converts spaces to tabs at save only if efUseTabChars is
  599. set
  600. * efBackSpaceUnindents works correctly
  601. + 'Messages' window implemented
  602. + Added '$CAP MSG()' and '$CAP EDIT' to available tool-macros
  603. + Added TP message-filter support (for ex. you can call GREP thru
  604. GREP2MSG and view the result in the messages window - just like in TP)
  605. * A 'var' was missing from the param-list of THelpFacility.TopicSearch,
  606. so topic search didn't work...
  607. * In FPHELP.PAS there were still context-variables defined as word instead
  608. of THelpCtx
  609. * StdStatusKeys() was missing from the statusdef for help windows
  610. + Topic-title for index-table can be specified when adding a HTML-files
  611. Revision 1.8 1999/02/22 02:15:20 peter
  612. + default extension for save in the editor
  613. + Separate Text to Find for the grep dialog
  614. * fixed redir crash with tp7
  615. Revision 1.7 1999/02/16 17:13:55 pierre
  616. + findclose added for FPC
  617. Revision 1.6 1999/02/05 12:12:01 pierre
  618. + SourceDir that stores directories for sources that the
  619. compiler should not know about
  620. Automatically asked for addition when a new file that
  621. needed filedialog to be found is in an unknown directory
  622. Stored and retrieved from INIFile
  623. + Breakpoints conditions added to INIFile
  624. * Breakpoints insterted and removed at debin and end of debug session
  625. Revision 1.5 1999/02/02 16:41:43 peter
  626. + automatic .pas/.pp adding by opening of file
  627. * better debuggerscreen changes
  628. Revision 1.4 1999/01/21 11:54:25 peter
  629. + tools menu
  630. + speedsearch in symbolbrowser
  631. * working run command
  632. Revision 1.3 1999/01/12 14:29:40 peter
  633. + Implemented still missing 'switch' entries in Options menu
  634. + Pressing Ctrl-B sets ASCII mode in editor, after which keypresses (even
  635. ones with ASCII < 32 ; entered with Alt+<###>) are interpreted always as
  636. ASCII chars and inserted directly in the text.
  637. + Added symbol browser
  638. * splitted fp.pas to fpide.pas
  639. Revision 1.2 1998/12/28 15:47:53 peter
  640. + Added user screen support, display & window
  641. + Implemented Editor,Mouse Options dialog
  642. + Added location of .INI and .CFG file
  643. + Option (INI) file managment implemented (see bottom of Options Menu)
  644. + Switches updated
  645. + Run program
  646. Revision 1.31 1998/12/27 11:25:37 gabor
  647. + MatchesMask(), MatchesMaskList() and MatchesFileList() added
  648. + NameAndExtOf() added
  649. Revision 1.3 1998/12/22 10:39:52 peter
  650. + options are now written/read
  651. + find and replace routines
  652. }