2
0

fputils.pas 18 KB

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