parser.pas 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. {
  2. $Id$
  3. Copyright (c) 1998-2000 by Florian Klaempfl
  4. This unit does the parsing process
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. unit parser;
  19. {$i defines.inc}
  20. interface
  21. {$ifdef PREPROCWRITE}
  22. procedure preprocess(const filename:string);
  23. {$endif PREPROCWRITE}
  24. procedure compile(const filename:string);
  25. procedure initparser;
  26. procedure doneparser;
  27. implementation
  28. uses
  29. cutils,cclasses,
  30. globtype,version,tokens,systems,globals,verbose,
  31. symbase,symtable,symsym,fmodule,fppu,aasm,
  32. cgbase,
  33. script,gendef,
  34. {$ifdef BrowserLog}
  35. browlog,
  36. {$endif BrowserLog}
  37. {$ifdef UseExcept}
  38. tpexcept,
  39. {$endif UseExcept}
  40. {$ifdef GDB}
  41. gdb,
  42. {$endif GDB}
  43. comphook,
  44. scanner,scandir,
  45. pbase,ptype,pmodules,cresstr;
  46. procedure initparser;
  47. begin
  48. { ^M means a string or a char, because we don't parse a }
  49. { type declaration }
  50. ignore_equal:=false;
  51. { we didn't parse a object or class declaration }
  52. { and no function header }
  53. testcurobject:=0;
  54. { a long time, this was forgotten }
  55. aktprocsym:=nil;
  56. current_module:=nil;
  57. compiled_module:=nil;
  58. procinfo:=nil;
  59. loaded_units:=TLinkedList.Create;
  60. usedunits:=TLinkedList.Create;
  61. { global switches }
  62. aktglobalswitches:=initglobalswitches;
  63. { initialize scanner }
  64. InitScanner;
  65. InitScannerDirectives;
  66. { scanner }
  67. c:=#0;
  68. pattern:='';
  69. orgpattern:='';
  70. current_scanner:=nil;
  71. { memory sizes }
  72. if heapsize=0 then
  73. heapsize:=target_info.heapsize;
  74. if maxheapsize=0 then
  75. maxheapsize:=target_info.maxheapsize;
  76. if stacksize=0 then
  77. stacksize:=target_info.stacksize;
  78. { open assembler response }
  79. GenerateAsmRes(outputexedir+'ppas');
  80. { open deffile }
  81. DefFile:=TDefFile.Create(outputexedir+inputfile+target_info.defext);
  82. { list of generated .o files, so the linker can remove them }
  83. SmartLinkOFiles:=TStringList.Create;
  84. end;
  85. procedure doneparser;
  86. begin
  87. { unload units }
  88. loaded_units.free;
  89. usedunits.free;
  90. { if there was an error in the scanner, the scanner is
  91. still assinged }
  92. if assigned(current_scanner) then
  93. begin
  94. current_scanner.free;
  95. current_scanner:=nil;
  96. end;
  97. { close scanner }
  98. DoneScanner;
  99. { close ppas,deffile }
  100. asmres.free;
  101. deffile.free;
  102. { free list of .o files }
  103. SmartLinkOFiles.Free;
  104. end;
  105. procedure default_macros;
  106. var
  107. hp : tstringlistitem;
  108. begin
  109. { commandline }
  110. hp:=tstringlistitem(initdefines.first);
  111. while assigned(hp) do
  112. begin
  113. current_scanner.def_macro(hp.str);
  114. hp:=tstringlistitem(hp.next);
  115. end;
  116. { set macros for version checking }
  117. current_scanner.set_macro('FPC_VERSION',version_nr);
  118. current_scanner.set_macro('FPC_RELEASE',release_nr);
  119. current_scanner.set_macro('FPC_PATCH',patch_nr);
  120. end;
  121. {$ifdef PREPROCWRITE}
  122. procedure preprocess(const filename:string);
  123. var
  124. i : longint;
  125. begin
  126. new(preprocfile,init('pre'));
  127. { default macros }
  128. current_scanner^.macros:=new(pdictionary,init);
  129. default_macros;
  130. { initialize a module }
  131. current_module:=new(pmodule,init(filename,false));
  132. main_module:=current_module;
  133. { startup scanner, and save in current_module }
  134. current_scanner:=new(pscannerfile,Init(filename));
  135. current_module.scanner:=current_scanner;
  136. { loop until EOF is found }
  137. repeat
  138. current_scanner^.readtoken;
  139. preprocfile^.AddSpace;
  140. case token of
  141. _ID :
  142. begin
  143. preprocfile^.Add(orgpattern);
  144. end;
  145. _REALNUMBER,
  146. _INTCONST :
  147. preprocfile^.Add(pattern);
  148. _CSTRING :
  149. begin
  150. i:=0;
  151. while (i<length(pattern)) do
  152. begin
  153. inc(i);
  154. if pattern[i]='''' then
  155. begin
  156. insert('''',pattern,i);
  157. inc(i);
  158. end;
  159. end;
  160. preprocfile^.Add(''''+pattern+'''');
  161. end;
  162. _CCHAR :
  163. begin
  164. case pattern[1] of
  165. #39 :
  166. pattern:='''''''';
  167. #0..#31,
  168. #128..#255 :
  169. begin
  170. str(ord(pattern[1]),pattern);
  171. pattern:='#'+pattern;
  172. end;
  173. else
  174. pattern:=''''+pattern[1]+'''';
  175. end;
  176. preprocfile^.Add(pattern);
  177. end;
  178. _EOF :
  179. break;
  180. else
  181. preprocfile^.Add(tokeninfo^[token].str)
  182. end;
  183. until false;
  184. { free scanner }
  185. dispose(current_scanner,done);
  186. current_scanner:=nil;
  187. { close }
  188. dispose(preprocfile,done);
  189. end;
  190. {$endif PREPROCWRITE}
  191. procedure compile(const filename:string);
  192. var
  193. { scanner }
  194. oldidtoken,
  195. oldtoken : ttoken;
  196. oldtokenpos : tfileposinfo;
  197. oldc : char;
  198. oldpattern,
  199. oldorgpattern : string;
  200. old_block_type : tblock_type;
  201. oldcurrent_scanner,prev_scanner,
  202. scanner : tscannerfile;
  203. { symtable }
  204. oldrefsymtable,
  205. olddefaultsymtablestack,
  206. oldsymtablestack : tsymtable;
  207. oldprocprefix : string;
  208. oldaktprocsym : tprocsym;
  209. oldoverloaded_operators : toverloaded_operators;
  210. { cg }
  211. oldnextlabelnr : longint;
  212. oldparse_only : boolean;
  213. { asmlists }
  214. oldimports,
  215. oldexports,
  216. oldresource,
  217. oldrttilist,
  218. oldresourcestringlist,
  219. oldbsssegment,
  220. olddatasegment,
  221. oldcodesegment,
  222. oldexprasmlist,
  223. olddebuglist,
  224. oldwithdebuglist,
  225. oldconsts : taasmoutput;
  226. oldasmsymbollist : tdictionary;
  227. { resourcestrings }
  228. OldResourceStrings : tResourceStrings;
  229. { akt.. things }
  230. oldaktlocalswitches : tlocalswitches;
  231. oldaktmoduleswitches : tmoduleswitches;
  232. oldaktfilepos : tfileposinfo;
  233. oldaktpackenum,oldaktmaxfpuregisters : longint;
  234. oldaktalignment : talignmentinfo;
  235. oldaktoutputformat : tasm;
  236. oldaktspecificoptprocessor,
  237. oldaktoptprocessor : tprocessors;
  238. oldaktasmmode : tasmmode;
  239. oldaktinterfacetype: tinterfacetypes;
  240. oldaktmodeswitches : tmodeswitches;
  241. old_compiled_module : tmodule;
  242. { will only be increased once we start parsing blocks in the }
  243. { implementation, so doesn't need to be saved/restored (JM) }
  244. { oldexceptblockcounter : integer; }
  245. oldstatement_level : integer;
  246. prev_name : pstring;
  247. {$ifdef USEEXCEPT}
  248. {$ifndef Delphi}
  249. recoverpos : jmp_buf;
  250. oldrecoverpos : pjmp_buf;
  251. {$endif Delphi}
  252. {$endif useexcept}
  253. {$ifdef newcg}
  254. oldcg : pcg;
  255. {$endif newcg}
  256. {$ifdef GDB}
  257. store_dbx : plongint;
  258. {$endif GDB}
  259. begin
  260. inc(compile_level);
  261. prev_name:=stringdup(parser_current_file);
  262. parser_current_file:=filename;
  263. old_compiled_module:=compiled_module;
  264. { save symtable state }
  265. oldsymtablestack:=symtablestack;
  266. olddefaultsymtablestack:=defaultsymtablestack;
  267. oldrefsymtable:=refsymtable;
  268. oldprocprefix:=procprefix;
  269. oldaktprocsym:=aktprocsym;
  270. move(overloaded_operators,oldoverloaded_operators,sizeof(toverloaded_operators));
  271. { save scanner state }
  272. oldc:=c;
  273. oldpattern:=pattern;
  274. oldorgpattern:=orgpattern;
  275. oldtoken:=token;
  276. oldidtoken:=idtoken;
  277. old_block_type:=block_type;
  278. oldtokenpos:=akttokenpos;
  279. oldcurrent_scanner:=current_scanner;
  280. { save cg }
  281. oldnextlabelnr:=nextlabelnr;
  282. oldparse_only:=parse_only;
  283. { save assembler lists }
  284. olddatasegment:=datasegment;
  285. oldbsssegment:=bsssegment;
  286. oldcodesegment:=codesegment;
  287. olddebuglist:=debuglist;
  288. oldwithdebuglist:=withdebuglist;
  289. oldconsts:=consts;
  290. oldrttilist:=rttilist;
  291. oldexprasmlist:=exprasmlist;
  292. oldimports:=importssection;
  293. oldexports:=exportssection;
  294. oldresource:=resourcesection;
  295. oldresourcestringlist:=resourcestringlist;
  296. oldasmsymbollist:=asmsymbollist;
  297. OldResourceStrings:=ResourceStrings;
  298. { save akt... state }
  299. { handle the postponed case first }
  300. if localswitcheschanged then
  301. begin
  302. aktlocalswitches:=nextaktlocalswitches;
  303. localswitcheschanged:=false;
  304. end;
  305. oldaktlocalswitches:=aktlocalswitches;
  306. oldaktmoduleswitches:=aktmoduleswitches;
  307. oldaktalignment:=aktalignment;
  308. oldaktpackenum:=aktpackenum;
  309. oldaktmaxfpuregisters:=aktmaxfpuregisters;
  310. oldaktoutputformat:=aktoutputformat;
  311. oldaktoptprocessor:=aktoptprocessor;
  312. oldaktspecificoptprocessor:=aktspecificoptprocessor;
  313. oldaktasmmode:=aktasmmode;
  314. oldaktinterfacetype:=aktinterfacetype;
  315. oldaktfilepos:=aktfilepos;
  316. oldaktmodeswitches:=aktmodeswitches;
  317. oldstatement_level:=statement_level;
  318. { oldexceptblockcounter:=exceptblockcounter; }
  319. {$ifdef newcg}
  320. oldcg:=cg;
  321. {$endif newcg}
  322. {$ifdef GDB}
  323. store_dbx:=dbx_counter;
  324. dbx_counter:=nil;
  325. {$endif GDB}
  326. { show info }
  327. Message1(parser_i_compiling,filename);
  328. { reset symtable }
  329. symtablestack:=nil;
  330. defaultsymtablestack:=nil;
  331. systemunit:=nil;
  332. refsymtable:=nil;
  333. aktprocsym:=nil;
  334. procprefix:='';
  335. registerdef:=true;
  336. statement_level:=0;
  337. aktexceptblock:=0;
  338. exceptblockcounter:=0;
  339. aktmaxfpuregisters:=-1;
  340. fillchar(overloaded_operators,sizeof(toverloaded_operators),0);
  341. { reset the unit or create a new program }
  342. if assigned(current_module) then
  343. begin
  344. {current_module.reset this is wrong !! }
  345. scanner:=tscannerfile(current_module.scanner);
  346. current_module.reset;
  347. tscannerfile(current_module.scanner):=scanner;
  348. end
  349. else
  350. begin
  351. current_module:=tppumodule.create(filename,'',false);
  352. main_module:=current_module;
  353. end;
  354. { a unit compiled at command line must be inside the loaded_unit list }
  355. if (compile_level=1) then
  356. loaded_units.insert(current_module);
  357. { Set the module to use for verbose }
  358. SetCompileModule(current_module);
  359. compiled_module:=current_module;
  360. current_module.in_compile:=true;
  361. { Load current state from the init values }
  362. aktlocalswitches:=initlocalswitches;
  363. aktmoduleswitches:=initmoduleswitches;
  364. aktmodeswitches:=initmodeswitches;
  365. {$IFDEF Testvarsets}
  366. aktsetalloc:=initsetalloc;
  367. {$ENDIF}
  368. aktalignment:=initalignment;
  369. aktpackenum:=initpackenum;
  370. aktoutputformat:=initoutputformat;
  371. aktoptprocessor:=initoptprocessor;
  372. aktspecificoptprocessor:=initspecificoptprocessor;
  373. aktasmmode:=initasmmode;
  374. aktinterfacetype:=initinterfacetype;
  375. { startup scanner, and save in current_module }
  376. current_scanner:=tscannerfile.Create(filename);
  377. { macros }
  378. default_macros;
  379. { read the first token }
  380. current_scanner.readtoken;
  381. prev_scanner:=tscannerfile(current_module.scanner);
  382. current_module.scanner:=current_scanner;
  383. { init code generator for a new module }
  384. codegen_newmodule;
  385. {$ifdef newcg}
  386. {$ifdef i386}
  387. cg:=new(pcg386,init);
  388. {$endif i386}
  389. {$ifdef alpha}
  390. cg:=new(pcgalpha,init);
  391. {$endif alpha}
  392. {$ifdef powerpc}
  393. cg:=new(pcgppc,init);
  394. {$endif powerpc}
  395. {$endif newcg}
  396. { If the compile level > 1 we get a nice "unit expected" error
  397. message if we are trying to use a program as unit.}
  398. {$ifdef USEEXCEPT}
  399. if setjmp(recoverpos)=0 then
  400. begin
  401. oldrecoverpos:=recoverpospointer;
  402. recoverpospointer:=@recoverpos;
  403. {$endif USEEXCEPT}
  404. if (token=_UNIT) or (compile_level>1) then
  405. begin
  406. current_module.is_unit:=true;
  407. proc_unit;
  408. end
  409. else
  410. proc_program(token=_LIBRARY);
  411. {$ifdef USEEXCEPT}
  412. recoverpospointer:=oldrecoverpos;
  413. end
  414. else
  415. begin
  416. recoverpospointer:=oldrecoverpos;
  417. longjump_used:=true;
  418. end;
  419. {$endif USEEXCEPT}
  420. { clear memory }
  421. {$ifdef Splitheap}
  422. if testsplit then
  423. begin
  424. { temp heap should be empty after that !!!}
  425. codegen_donemodule;
  426. Releasetempheap;
  427. end;
  428. {$endif Splitheap}
  429. { restore old state, close trees, > 0.99.5 has heapblocks, so
  430. it's the default to release the trees }
  431. codegen_donemodule;
  432. {$ifdef newcg}
  433. dispose(cg,done);
  434. {$endif newcg}
  435. { free ppu }
  436. if assigned(tppumodule(current_module).ppufile) then
  437. begin
  438. tppumodule(current_module).ppufile.free;
  439. tppumodule(current_module).ppufile:=nil;
  440. end;
  441. { free scanner }
  442. current_scanner.free;
  443. current_scanner:=nil;
  444. { restore previous scanner !! }
  445. current_module.scanner:=prev_scanner;
  446. if assigned(prev_scanner) then
  447. prev_scanner.invalid:=true;
  448. if (compile_level>1) then
  449. begin
  450. {$ifdef newcg}
  451. cg:=oldcg;
  452. {$endif newcg}
  453. {$ifdef GDB}
  454. dbx_counter:=store_dbx;
  455. {$endif GDB}
  456. { restore scanner }
  457. c:=oldc;
  458. pattern:=oldpattern;
  459. orgpattern:=oldorgpattern;
  460. token:=oldtoken;
  461. idtoken:=oldidtoken;
  462. akttokenpos:=oldtokenpos;
  463. block_type:=old_block_type;
  464. current_scanner:=oldcurrent_scanner;
  465. { restore cg }
  466. nextlabelnr:=oldnextlabelnr;
  467. parse_only:=oldparse_only;
  468. { restore asmlists }
  469. exprasmlist:=oldexprasmlist;
  470. datasegment:=olddatasegment;
  471. bsssegment:=oldbsssegment;
  472. codesegment:=oldcodesegment;
  473. consts:=oldconsts;
  474. debuglist:=olddebuglist;
  475. withdebuglist:=oldwithdebuglist;
  476. importssection:=oldimports;
  477. exportssection:=oldexports;
  478. resourcesection:=oldresource;
  479. rttilist:=oldrttilist;
  480. resourcestringlist:=oldresourcestringlist;
  481. asmsymbollist:=oldasmsymbollist;
  482. ResourceStrings:=OldResourceStrings;
  483. { restore symtable state }
  484. refsymtable:=oldrefsymtable;
  485. symtablestack:=oldsymtablestack;
  486. defaultsymtablestack:=olddefaultsymtablestack;
  487. aktprocsym:=oldaktprocsym;
  488. procprefix:=oldprocprefix;
  489. move(oldoverloaded_operators,overloaded_operators,sizeof(toverloaded_operators));
  490. aktlocalswitches:=oldaktlocalswitches;
  491. aktmoduleswitches:=oldaktmoduleswitches;
  492. aktalignment:=oldaktalignment;
  493. aktpackenum:=oldaktpackenum;
  494. aktmaxfpuregisters:=oldaktmaxfpuregisters;
  495. aktoutputformat:=oldaktoutputformat;
  496. aktoptprocessor:=oldaktoptprocessor;
  497. aktspecificoptprocessor:=oldaktspecificoptprocessor;
  498. aktasmmode:=oldaktasmmode;
  499. aktinterfacetype:=oldaktinterfacetype;
  500. aktfilepos:=oldaktfilepos;
  501. aktmodeswitches:=oldaktmodeswitches;
  502. statement_level:=oldstatement_level;
  503. aktexceptblock:=0;
  504. exceptblockcounter:=0;
  505. end;
  506. { Shut down things when the last file is compiled }
  507. if (compile_level=1) then
  508. begin
  509. { Close script }
  510. if (not AsmRes.Empty) then
  511. begin
  512. Message1(exec_i_closing_script,AsmRes.Fn);
  513. AsmRes.WriteToDisk;
  514. end;
  515. {$ifdef USEEXCEPT}
  516. if not longjump_used then
  517. {$endif USEEXCEPT}
  518. { do not create browsers on errors !! }
  519. if status.errorcount=0 then
  520. begin
  521. {$ifdef BrowserLog}
  522. { Write Browser Log }
  523. if (cs_browser_log in aktglobalswitches) and
  524. (cs_browser in aktmoduleswitches) then
  525. begin
  526. if browserlog.elements_to_list.empty then
  527. begin
  528. Message1(parser_i_writing_browser_log,browserlog.Fname);
  529. WriteBrowserLog;
  530. end
  531. else
  532. browserlog.list_elements;
  533. end;
  534. {$endif BrowserLog}
  535. { Write Browser Collections }
  536. do_extractsymbolinfo{$ifdef FPC}(){$endif};
  537. end;
  538. if current_module.in_second_compile then
  539. begin
  540. current_module.in_second_compile:=false;
  541. current_module.in_compile:=true;
  542. end
  543. else
  544. current_module.in_compile:=false;
  545. (* Obsolete code aktprocsym
  546. is disposed by the localsymtable disposal (PM)
  547. { Free last aktprocsym }
  548. if assigned(aktprocsym) and (aktprocsym.owner=nil) then
  549. begin
  550. { init parts are not needed in units !! }
  551. if current_module.is_unit then
  552. aktprocsym.definition.forwarddef:=false;
  553. dispose(aktprocsym,done);
  554. end; *)
  555. end;
  556. dec(compile_level);
  557. parser_current_file:=prev_name^;
  558. stringdispose(prev_name);
  559. compiled_module:=old_compiled_module;
  560. {$ifdef USEEXCEPT}
  561. if longjump_used then
  562. longjmp(recoverpospointer^,1);
  563. {$endif USEEXCEPT}
  564. end;
  565. end.
  566. {
  567. $Log$
  568. Revision 1.23 2001-10-16 15:10:35 jonas
  569. * fixed goto/label/try bugs
  570. Revision 1.22 2001/08/26 13:36:43 florian
  571. * some cg reorganisation
  572. * some PPC updates
  573. Revision 1.21 2001/07/30 20:59:27 peter
  574. * m68k updates from v10 merged
  575. Revision 1.20 2001/07/01 20:16:16 peter
  576. * alignmentinfo record added
  577. * -Oa argument supports more alignment settings that can be specified
  578. per type: PROC,LOOP,VARMIN,VARMAX,CONSTMIN,CONSTMAX,RECORDMIN
  579. RECORDMAX,LOCALMIN,LOCALMAX. It is possible to set the mimimum
  580. required alignment and the maximum usefull alignment. The final
  581. alignment will be choosen per variable size dependent on these
  582. settings
  583. Revision 1.19 2001/05/19 23:05:19 peter
  584. * support uses <unit> in <file> construction
  585. Revision 1.18 2001/05/06 14:49:17 peter
  586. * ppu object to class rewrite
  587. * move ppu read and write stuff to fppu
  588. Revision 1.17 2001/04/18 22:01:54 peter
  589. * registration of targets and assemblers
  590. Revision 1.16 2001/04/15 09:48:30 peter
  591. * fixed crash in labelnode
  592. * easier detection of goto and label in try blocks
  593. Revision 1.15 2001/04/13 18:08:37 peter
  594. * scanner object to class
  595. Revision 1.14 2001/04/13 01:22:10 peter
  596. * symtable change to classes
  597. * range check generation and errors fixed, make cycle DEBUG=1 works
  598. * memory leaks fixed
  599. Revision 1.13 2000/12/25 00:07:27 peter
  600. + new tlinkedlist class (merge of old tstringqueue,tcontainer and
  601. tlinkedlist objects)
  602. Revision 1.12 2000/12/24 12:24:38 peter
  603. * moved preprocessfile into a conditional
  604. Revision 1.11 2000/11/29 00:30:34 florian
  605. * unused units removed from uses clause
  606. * some changes for widestrings
  607. Revision 1.10 2000/11/12 22:17:46 peter
  608. * some realname updates for messages
  609. Revision 1.9 2000/11/04 14:25:20 florian
  610. + merged Attila's changes for interfaces, not tested yet
  611. Revision 1.8 2000/10/31 22:02:49 peter
  612. * symtable splitted, no real code changes
  613. Revision 1.7 2000/10/14 10:14:51 peter
  614. * moehrendorf oct 2000 rewrite
  615. Revision 1.6 2000/10/01 19:48:25 peter
  616. * lot of compile updates for cg11
  617. Revision 1.5 2000/09/24 15:06:20 peter
  618. * use defines.inc
  619. Revision 1.4 2000/08/27 16:11:51 peter
  620. * moved some util functions from globals,cobjects to cutils
  621. * splitted files into finput,fmodule
  622. Revision 1.3 2000/08/12 15:34:22 peter
  623. + usedasmsymbollist to check and reset only the used symbols (merged)
  624. Revision 1.2 2000/07/13 11:32:44 michael
  625. + removed logs
  626. }