fputils.pas 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759
  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.16 2000-06-22 09:07:13 pierre
  598. * Gabor changes: see fixes.txt
  599. Revision 1.15 2000/04/18 11:42:37 pierre
  600. lot of Gabor changes : see fixes.txt
  601. Revision 1.14 2000/01/03 11:38:34 michael
  602. Changes from Gabor
  603. Revision 1.13 1999/04/15 08:58:07 peter
  604. * syntax highlight fixes
  605. * browser updates
  606. Revision 1.12 1999/04/07 21:55:55 peter
  607. + object support for browser
  608. * html help fixes
  609. * more desktop saving things
  610. * NODEBUG directive to exclude debugger
  611. Revision 1.11 1999/03/19 16:04:31 peter
  612. * new compiler dialog
  613. Revision 1.10 1999/03/08 14:58:14 peter
  614. + prompt with dialogs for tools
  615. Revision 1.9 1999/03/01 15:42:06 peter
  616. + Added dummy entries for functions not yet implemented
  617. * MenuBar didn't update itself automatically on command-set changes
  618. * Fixed Debugging/Profiling options dialog
  619. * TCodeEditor converts spaces to tabs at save only if efUseTabChars is
  620. set
  621. * efBackSpaceUnindents works correctly
  622. + 'Messages' window implemented
  623. + Added '$CAP MSG()' and '$CAP EDIT' to available tool-macros
  624. + Added TP message-filter support (for ex. you can call GREP thru
  625. GREP2MSG and view the result in the messages window - just like in TP)
  626. * A 'var' was missing from the param-list of THelpFacility.TopicSearch,
  627. so topic search didn't work...
  628. * In FPHELP.PAS there were still context-variables defined as word instead
  629. of THelpCtx
  630. * StdStatusKeys() was missing from the statusdef for help windows
  631. + Topic-title for index-table can be specified when adding a HTML-files
  632. Revision 1.8 1999/02/22 02:15:20 peter
  633. + default extension for save in the editor
  634. + Separate Text to Find for the grep dialog
  635. * fixed redir crash with tp7
  636. Revision 1.7 1999/02/16 17:13:55 pierre
  637. + findclose added for FPC
  638. Revision 1.6 1999/02/05 12:12:01 pierre
  639. + SourceDir that stores directories for sources that the
  640. compiler should not know about
  641. Automatically asked for addition when a new file that
  642. needed filedialog to be found is in an unknown directory
  643. Stored and retrieved from INIFile
  644. + Breakpoints conditions added to INIFile
  645. * Breakpoints insterted and removed at debin and end of debug session
  646. Revision 1.5 1999/02/02 16:41:43 peter
  647. + automatic .pas/.pp adding by opening of file
  648. * better debuggerscreen changes
  649. Revision 1.4 1999/01/21 11:54:25 peter
  650. + tools menu
  651. + speedsearch in symbolbrowser
  652. * working run command
  653. Revision 1.3 1999/01/12 14:29:40 peter
  654. + Implemented still missing 'switch' entries in Options menu
  655. + Pressing Ctrl-B sets ASCII mode in editor, after which keypresses (even
  656. ones with ASCII < 32 ; entered with Alt+<###>) are interpreted always as
  657. ASCII chars and inserted directly in the text.
  658. + Added symbol browser
  659. * splitted fp.pas to fpide.pas
  660. Revision 1.2 1998/12/28 15:47:53 peter
  661. + Added user screen support, display & window
  662. + Implemented Editor,Mouse Options dialog
  663. + Added location of .INI and .CFG file
  664. + Option (INI) file managment implemented (see bottom of Options Menu)
  665. + Switches updated
  666. + Run program
  667. Revision 1.31 1998/12/27 11:25:37 gabor
  668. + MatchesMask(), MatchesMaskList() and MatchesFileList() added
  669. + NameAndExtOf() added
  670. Revision 1.3 1998/12/22 10:39:52 peter
  671. + options are now written/read
  672. + find and replace routines
  673. }