fputils.pas 18 KB

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