2
0

fputils.pas 17 KB

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