symppu.inc 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. {
  2. $Id$
  3. Copyright (c) 1993-98 by Florian Klaempfl, Pierre Muller
  4. Implementation of the reading of PPU Files for the symtable
  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. const
  19. {$ifdef FPC}
  20. ppubufsize=32768;
  21. {$ELSE}
  22. {$IFDEF USEOVERLAY}
  23. ppubufsize=512;
  24. {$ELSE}
  25. ppubufsize=4096;
  26. {$ENDIF}
  27. {$ENDIF}
  28. {*****************************************************************************
  29. PPU Writing
  30. *****************************************************************************}
  31. procedure writebyte(b:byte);
  32. begin
  33. current_ppu^.putbyte(b);
  34. end;
  35. procedure writeword(w:word);
  36. begin
  37. current_ppu^.putword(w);
  38. end;
  39. procedure writelong(l:longint);
  40. begin
  41. current_ppu^.putlongint(l);
  42. end;
  43. procedure writereal(d:bestreal);
  44. begin
  45. current_ppu^.putreal(d);
  46. end;
  47. procedure writestring(const s:string);
  48. begin
  49. current_ppu^.putstring(s);
  50. end;
  51. procedure writenormalset(var s); {You cannot pass an array[0..31] of byte!}
  52. begin
  53. current_ppu^.putdata(s,sizeof(tnormalset));
  54. end;
  55. procedure writecontainer(var p:tstringcontainer;id:byte;hold,strippath:boolean);
  56. var
  57. hcontainer : tstringcontainer;
  58. s : string;
  59. begin
  60. if hold then
  61. hcontainer.init;
  62. while not p.empty do
  63. begin
  64. s:=p.get;
  65. if strippath then
  66. current_ppu^.putstring(SplitFileName(s))
  67. else
  68. current_ppu^.putstring(s);
  69. if hold then
  70. hcontainer.insert(s);
  71. end;
  72. current_ppu^.writeentry(id);
  73. if hold then
  74. p:=hcontainer;
  75. end;
  76. procedure writeposinfo(const p:tfileposinfo);
  77. begin
  78. current_ppu^.putword(p.fileindex);
  79. current_ppu^.putlongint(p.line);
  80. current_ppu^.putword(p.column);
  81. end;
  82. procedure writederef(p : psymtableentry);
  83. begin
  84. if p=nil then
  85. current_ppu^.putbyte(ord(derefnil))
  86. else
  87. begin
  88. { Static symtable ? }
  89. if p^.owner^.symtabletype=staticsymtable then
  90. begin
  91. current_ppu^.putbyte(ord(derefaktstaticindex));
  92. current_ppu^.putword(p^.indexnr);
  93. end
  94. { Local record/object symtable ? }
  95. else if (p^.owner=aktrecordsymtable) then
  96. begin
  97. current_ppu^.putbyte(ord(derefaktrecordindex));
  98. current_ppu^.putword(p^.indexnr);
  99. end
  100. else
  101. { else if p^.owner^.unitid>$8000 then
  102. current_ppu^.putword(p^.owner^.unitid) }
  103. begin
  104. current_ppu^.putbyte(ord(derefindex));
  105. current_ppu^.putword(p^.indexnr);
  106. { Current unit symtable ? }
  107. repeat
  108. if not assigned(p) then
  109. internalerror(556655);
  110. case p^.owner^.symtabletype of
  111. unitsymtable :
  112. begin
  113. current_ppu^.putbyte(ord(derefunit));
  114. current_ppu^.putword(p^.owner^.unitid);
  115. break;
  116. end;
  117. objectsymtable,
  118. recordsymtable :
  119. begin
  120. p:=p^.owner^.defowner;
  121. current_ppu^.putbyte(ord(derefrecord));
  122. current_ppu^.putword(p^.indexnr);
  123. end;
  124. else
  125. internalerror(556656);
  126. end;
  127. until false;
  128. end;
  129. end;
  130. end;
  131. procedure writedefref(p : pdef);
  132. begin
  133. writederef(p);
  134. end;
  135. procedure writesymref(p : psym);
  136. begin
  137. writederef(p);
  138. end;
  139. procedure writesourcefiles;
  140. var
  141. hp : pinputfile;
  142. begin
  143. { second write the used source files }
  144. current_ppu^.do_crc:=false;
  145. hp:=current_module^.sourcefiles^.files;
  146. while assigned(hp) do
  147. begin
  148. { only name and extension }
  149. current_ppu^.putstring(hp^.name^);
  150. hp:=hp^.ref_next;
  151. end;
  152. current_ppu^.writeentry(ibsourcefiles);
  153. current_ppu^.do_crc:=true;
  154. end;
  155. procedure writeusedunit;
  156. var
  157. hp : pused_unit;
  158. begin
  159. numberunits;
  160. hp:=pused_unit(current_module^.used_units.first);
  161. while assigned(hp) do
  162. begin
  163. current_ppu^.do_interface_crc:=hp^.in_interface;
  164. current_ppu^.putstring(hp^.name^);
  165. { the checksum should not affect the crc of this unit ! (PFV) }
  166. current_ppu^.do_crc:=false;
  167. current_ppu^.putlongint(hp^.checksum);
  168. current_ppu^.putlongint(hp^.interface_checksum);
  169. current_ppu^.do_crc:=true;
  170. current_ppu^.putbyte(byte(hp^.in_interface));
  171. hp:=pused_unit(hp^.next);
  172. end;
  173. current_ppu^.do_interface_crc:=true;
  174. current_ppu^.writeentry(ibloadunit);
  175. end;
  176. procedure writeunitas(const s : string;unittable : punitsymtable;only_crc : boolean);
  177. begin
  178. Message1(unit_u_ppu_write,s);
  179. { create unit flags }
  180. with Current_Module^ do
  181. begin
  182. if (((cs_create_staticlib in aktmoduleswitches) or
  183. (cs_smartlink in aktmoduleswitches)) and
  184. (SplitName(ppufilename^)<>SplitName(staticlibfilename^))) or
  185. ((cs_create_sharedlib in aktmoduleswitches) and
  186. (SplitName(ppufilename^)<>SplitName(sharedlibfilename^))) then
  187. flags:=flags or uf_in_library;
  188. if cs_smartlink in aktmoduleswitches then
  189. flags:=flags or uf_smartlink;
  190. {$ifdef GDB}
  191. if cs_gdb_dbx in aktglobalswitches then
  192. flags:=flags or uf_has_dbx;
  193. {$endif GDB}
  194. if target_os.endian=endian_big then
  195. flags:=flags or uf_big_endian;
  196. if cs_browser in aktmoduleswitches then
  197. flags:=flags or uf_has_browser;
  198. if cs_local_browser in aktmoduleswitches then
  199. flags:=flags or uf_local_browser;
  200. end;
  201. {$ifdef Test_Double_checksum_write}
  202. If only_crc then
  203. Assign(CRCFile,s+'.INT')
  204. else
  205. Assign(CRCFile,s+'.IMP');
  206. Rewrite(CRCFile);
  207. {$endif def Test_Double_checksum_write}
  208. { open ppufile }
  209. current_ppu:=new(pppufile,init(s));
  210. if not current_ppu^.create then
  211. Message(unit_f_ppu_cannot_write);
  212. current_ppu^.crc_only:=only_crc;
  213. {$ifdef Test_Double_checksum}
  214. if only_crc then
  215. begin
  216. new(current_ppu^.crc_test);
  217. end
  218. else
  219. begin
  220. current_ppu^.crc_test:=Current_Module^.crc_array;
  221. current_ppu^.crc_index:=Current_Module^.crc_size;
  222. end;
  223. {$endif def Test_Double_checksum}
  224. current_ppu^.change_endian:=source_os.endian<>target_os.endian;
  225. { write symbols and definitions }
  226. unittable^.writeasunit;
  227. { flush to be sure }
  228. current_ppu^.flush;
  229. { create and write header }
  230. current_ppu^.header.size:=current_ppu^.size;
  231. current_ppu^.header.checksum:=current_ppu^.crc;
  232. current_ppu^.header.interface_checksum:=current_ppu^.interface_crc;
  233. current_ppu^.header.compiler:=wordversion;
  234. current_ppu^.header.cpu:=word(target_cpu);
  235. current_ppu^.header.target:=word(target_info.target);
  236. current_ppu^.header.flags:=current_module^.flags;
  237. current_ppu^.writeheader;
  238. { save crc in current_module also }
  239. current_module^.crc:=current_ppu^.crc;
  240. current_module^.interface_crc:=current_ppu^.interface_crc;
  241. if only_crc then
  242. begin
  243. {$ifdef Test_Double_checksum}
  244. Current_Module^.crc_array:=current_ppu^.crc_test;
  245. current_ppu^.crc_test:=nil;
  246. Current_Module^.crc_size:=current_ppu^.crc_index;
  247. {$endif def Test_Double_checksum}
  248. closecurrentppu;
  249. end;
  250. {$ifdef Test_Double_checksum_write}
  251. close(CRCFile);
  252. {$endif Test_Double_checksum_write}
  253. end;
  254. procedure closecurrentppu;
  255. begin
  256. {$ifdef Test_Double_checksum}
  257. if assigned(current_ppu^.crc_test) then
  258. dispose(current_ppu^.crc_test);
  259. {$endif Test_Double_checksum}
  260. { close }
  261. current_ppu^.close;
  262. dispose(current_ppu,done);
  263. current_ppu:=nil;
  264. end;
  265. {*****************************************************************************
  266. PPU Reading
  267. *****************************************************************************}
  268. function readbyte:byte;
  269. begin
  270. readbyte:=current_ppu^.getbyte;
  271. if current_ppu^.error then
  272. Message(unit_f_ppu_read_error);
  273. end;
  274. function readword:word;
  275. begin
  276. readword:=current_ppu^.getword;
  277. if current_ppu^.error then
  278. Message(unit_f_ppu_read_error);
  279. end;
  280. function readlong:longint;
  281. begin
  282. readlong:=current_ppu^.getlongint;
  283. if current_ppu^.error then
  284. Message(unit_f_ppu_read_error);
  285. end;
  286. function readreal : bestreal;
  287. begin
  288. readreal:=current_ppu^.getreal;
  289. if current_ppu^.error then
  290. Message(unit_f_ppu_read_error);
  291. end;
  292. function readstring : string;
  293. begin
  294. readstring:=current_ppu^.getstring;
  295. if current_ppu^.error then
  296. Message(unit_f_ppu_read_error);
  297. end;
  298. procedure readnormalset(var s); {You cannot pass an array [0..31] of byte.}
  299. begin
  300. current_ppu^.getdata(s,sizeof(tnormalset));
  301. if current_ppu^.error then
  302. Message(unit_f_ppu_read_error);
  303. end;
  304. procedure readcontainer(var p:tstringcontainer);
  305. begin
  306. while not current_ppu^.endofentry do
  307. p.insert(current_ppu^.getstring);
  308. end;
  309. procedure readposinfo(var p:tfileposinfo);
  310. begin
  311. p.fileindex:=current_ppu^.getword;
  312. p.line:=current_ppu^.getlongint;
  313. p.column:=current_ppu^.getword;
  314. end;
  315. {$ifndef OLDDEREF}
  316. function readderef : pderef;
  317. var
  318. hp,p : pderef;
  319. b : tdereftype;
  320. begin
  321. p:=nil;
  322. repeat
  323. hp:=p;
  324. b:=tdereftype(current_ppu^.getbyte);
  325. case b of
  326. derefnil :
  327. break;
  328. derefunit,
  329. derefaktrecordindex,
  330. derefaktstaticindex :
  331. begin
  332. new(p,init(b,current_ppu^.getword));
  333. p^.next:=hp;
  334. break;
  335. end;
  336. derefindex,
  337. derefrecord :
  338. begin
  339. new(p,init(b,current_ppu^.getword));
  340. p^.next:=hp;
  341. end;
  342. end;
  343. until false;
  344. readderef:=p;
  345. end;
  346. function readdefref : pdef;
  347. begin
  348. readdefref:=pdef(readderef);
  349. end;
  350. function readsymref : psym;
  351. begin
  352. readsymref:=psym(readderef);
  353. end;
  354. {$else}
  355. function readdefref : pdef;
  356. var
  357. hd : pdef;
  358. begin
  359. longint(hd):=current_ppu^.getword;
  360. longint(hd):=longint(hd) or (longint(current_ppu^.getword) shl 16);
  361. readdefref:=hd;
  362. end;
  363. function readsymref : psym;
  364. var
  365. hd : psym;
  366. begin
  367. longint(hd):=current_ppu^.getword;
  368. longint(hd):=longint(hd) or (longint(current_ppu^.getword) shl 16);
  369. readsymref:=hd;
  370. end;
  371. {$endif}
  372. procedure readsourcefiles;
  373. var
  374. temp,hs : string;
  375. incfile_found : boolean;
  376. ppufiletime,
  377. source_time : longint;
  378. hp : pinputfile;
  379. begin
  380. ppufiletime:=getnamedfiletime(current_module^.ppufilename^);
  381. current_module^.sources_avail:=true;
  382. while not current_ppu^.endofentry do
  383. begin
  384. hs:=current_ppu^.getstring;
  385. temp:='';
  386. if (current_module^.flags and uf_in_library)<>0 then
  387. begin
  388. current_module^.sources_avail:=false;
  389. temp:=' library';
  390. end
  391. else if pos('Macro ',hs)=1 then
  392. begin
  393. { we don't want to find this file }
  394. { but there is a problem with file indexing !! }
  395. temp:='';
  396. end
  397. else
  398. begin
  399. { check the date of the source files }
  400. Source_Time:=GetNamedFileTime(current_module^.path^+hs);
  401. incfile_found:=false;
  402. if (Source_Time=-1) then
  403. begin
  404. temp:=search(hs,includesearchpath,incfile_found);
  405. if incfile_found then
  406. begin
  407. hs:=temp+hs;
  408. Source_Time:=GetNamedFileTime(hs);
  409. end
  410. end
  411. else
  412. hs:=current_module^.path^+hs;
  413. if Source_Time=-1 then
  414. begin
  415. current_module^.sources_avail:=false;
  416. temp:=' not found';
  417. end
  418. else
  419. begin
  420. { time newer? But only allow if the file is not searched
  421. in the include path (PFV), else you've problems with
  422. units which use the same includefile names }
  423. if incfile_found then
  424. temp:=' found'
  425. else
  426. begin
  427. temp:=' time '+filetimestring(source_time);
  428. if (source_time>ppufiletime) then
  429. begin
  430. current_module^.do_compile:=true;
  431. temp:=temp+' *'
  432. end;
  433. end;
  434. end;
  435. new(hp,init(hs));
  436. { the indexing is wrong here PM }
  437. current_module^.sourcefiles^.register_file(hp);
  438. end;
  439. Message1(unit_u_ppu_source,hs+temp);
  440. end;
  441. { main source is always the last }
  442. stringdispose(current_module^.mainsource);
  443. current_module^.mainsource:=stringdup(hs);
  444. { the indexing is corrected here PM }
  445. current_module^.sourcefiles^.inverse_register_indexes;
  446. { check if we want to rebuild every unit, only if the sources are
  447. available }
  448. if do_build and current_module^.sources_avail then
  449. current_module^.do_compile:=true;
  450. end;
  451. procedure readloadunit;
  452. var
  453. hs : string;
  454. intfchecksum,
  455. checksum : longint;
  456. in_interface : boolean;
  457. begin
  458. while not current_ppu^.endofentry do
  459. begin
  460. hs:=current_ppu^.getstring;
  461. checksum:=current_ppu^.getlongint;
  462. intfchecksum:=current_ppu^.getlongint;
  463. in_interface:=(current_ppu^.getbyte<>0);
  464. current_module^.used_units.concat(new(pused_unit,init_to_load(hs,checksum,intfchecksum,in_interface)));
  465. end;
  466. end;
  467. procedure load_interface;
  468. var
  469. b : byte;
  470. begin
  471. { read interface part }
  472. repeat
  473. b:=current_ppu^.readentry;
  474. case b of
  475. ibmodulename : begin
  476. stringdispose(current_module^.modulename);
  477. current_module^.modulename:=stringdup(current_ppu^.getstring);
  478. end;
  479. ibsourcefiles : readsourcefiles;
  480. ibloadunit : readloadunit;
  481. iblinksharedlibs : readcontainer(current_module^.LinkSharedLibs);
  482. iblinkstaticlibs : readcontainer(current_module^.LinkStaticLibs);
  483. iblinkunitfiles : readcontainer(current_module^.LinkUnitFiles);
  484. iblinkofiles : readcontainer(current_module^.LinkOFiles);
  485. ibendinterface : break;
  486. else
  487. Message1(unit_f_ppu_invalid_entry,tostr(b));
  488. end;
  489. until false;
  490. end;
  491. {
  492. $Log$
  493. Revision 1.41 1999-05-14 17:52:28 peter
  494. * new deref code
  495. Revision 1.40 1999/05/13 21:59:44 peter
  496. * removed oldppu code
  497. * warning if objpas is loaded from uses
  498. * first things for new deref writing
  499. Revision 1.39 1999/05/04 21:45:06 florian
  500. * changes to compile it with Delphi 4.0
  501. Revision 1.38 1999/04/26 13:31:51 peter
  502. * release storenumber,double_checksum
  503. Revision 1.37 1999/04/21 09:43:53 peter
  504. * storenumber works
  505. * fixed some typos in double_checksum
  506. + incompatible types type1 and type2 message (with storenumber)
  507. Revision 1.36 1999/04/14 09:15:01 peter
  508. * first things to store the symbol/def number in the ppu
  509. Revision 1.35 1999/04/07 15:39:35 pierre
  510. + double_checksum code added
  511. Revision 1.34 1999/03/02 13:49:19 peter
  512. * renamed loadunit_int -> loadunit
  513. Revision 1.33 1999/02/23 18:29:25 pierre
  514. * win32 compilation error fix
  515. + some work for local browser (not cl=omplete yet)
  516. Revision 1.32 1999/02/22 13:07:08 pierre
  517. + -b and -bl options work !
  518. + cs_local_browser ($L+) is disabled if cs_browser ($Y+)
  519. is not enabled when quitting global section
  520. * local vars and procedures are not yet stored into PPU
  521. Revision 1.31 1999/02/16 00:48:25 peter
  522. * save in the ppu if linked with obj file instead of using the
  523. library flag, so the .inc files are also checked
  524. Revision 1.30 1999/02/05 08:54:30 pierre
  525. + linkofiles splitted inot linkofiles and linkunitfiles
  526. because linkofiles must be stored with directory
  527. to enabled linking of different objects with same name
  528. in a different directory
  529. Revision 1.29 1999/01/20 10:16:46 peter
  530. * don't update crc when writing objs,libs and sources
  531. Revision 1.28 1999/01/12 14:25:35 peter
  532. + BrowserLog for browser.log generation
  533. + BrowserCol for browser info in TCollections
  534. * released all other UseBrowser
  535. Revision 1.27 1998/12/08 10:18:14 peter
  536. + -gh for heaptrc unit
  537. Revision 1.26 1998/11/26 14:36:02 peter
  538. * set also library flag if smartlinking and outputname is different
  539. Revision 1.25 1998/10/26 09:35:47 peter
  540. * don't count includefiles which are found in the includepath for a
  541. recompile.
  542. Revision 1.24 1998/10/20 08:06:59 pierre
  543. * several memory corruptions due to double freemem solved
  544. => never use p^.loc.location:=p^.left^.loc.location;
  545. + finally I added now by default
  546. that ra386dir translates global and unit symbols
  547. + added a first field in tsymtable and
  548. a nextsym field in tsym
  549. (this allows to obtain ordered type info for
  550. records and objects in gdb !)
  551. Revision 1.23 1998/10/16 13:37:24 florian
  552. + switch -FD added to specify the path for utilities
  553. Revision 1.22 1998/10/14 13:38:24 peter
  554. * fixed path with staticlib/objects in ppufiles
  555. Revision 1.21 1998/10/14 10:45:10 pierre
  556. * ppu problems for m68k fixed (at least in cross compiling)
  557. * one last memory leak for sysamiga fixed
  558. * the amiga RTL compiles now completely !!
  559. Revision 1.20 1998/10/13 13:10:30 peter
  560. * new style for m68k/i386 infos and enums
  561. Revision 1.19 1998/10/08 23:29:07 peter
  562. * -vu shows unit info, -vt shows tried/used files
  563. Revision 1.18 1998/09/28 16:57:27 pierre
  564. * changed all length(p^.value_str^) into str_length(p)
  565. to get it work with and without ansistrings
  566. * changed sourcefiles field of tmodule to a pointer
  567. Revision 1.17 1998/09/22 17:13:53 pierre
  568. + browsing updated and developed
  569. records and objects fields are also stored
  570. Revision 1.16 1998/09/22 15:40:56 peter
  571. * some extra ifdef GDB
  572. Revision 1.15 1998/09/21 08:45:23 pierre
  573. + added vmt_offset in tobjectdef.write for fututre use
  574. (first steps to have objects without vmt if no virtual !!)
  575. + added fpu_used field for tabstractprocdef :
  576. sets this level to 2 if the functions return with value in FPU
  577. (is then set to correct value at parsing of implementation)
  578. THIS MIGHT refuse some code with FPU expression too complex
  579. that were accepted before and even in some cases
  580. that don't overflow in fact
  581. ( like if f : float; is a forward that finally in implementation
  582. only uses one fpu register !!)
  583. Nevertheless I think that it will improve security on
  584. FPU operations !!
  585. * most other changes only for UseBrowser code
  586. (added symtable references for record and objects)
  587. local switch for refs to args and local of each function
  588. (static symtable still missing)
  589. UseBrowser still not stable and probably broken by
  590. the definition hash array !!
  591. Revision 1.14 1998/09/01 07:54:24 pierre
  592. * UseBrowser a little updated (might still be buggy !!)
  593. * bug in psub.pas in function specifier removed
  594. * stdcall allowed in interface and in implementation
  595. (FPC will not yet complain if it is missing in either part
  596. because stdcall is only a dummy !!)
  597. Revision 1.13 1998/08/17 10:10:11 peter
  598. - removed OLDPPU
  599. Revision 1.12 1998/08/17 09:17:53 peter
  600. * static/shared linking updates
  601. Revision 1.11 1998/08/16 20:32:49 peter
  602. * crcs of used units are not important for the current crc, reduces the
  603. amount of recompiles
  604. Revision 1.10 1998/08/13 10:57:30 peter
  605. * constant sets are now written correctly to the ppufile
  606. Revision 1.9 1998/08/11 15:31:41 peter
  607. * write extended to ppu file
  608. * new version 0.99.7
  609. Revision 1.8 1998/08/10 14:50:29 peter
  610. + localswitches, moduleswitches, globalswitches splitting
  611. Revision 1.7 1998/07/14 14:47:07 peter
  612. * released NEWINPUT
  613. Revision 1.6 1998/07/07 11:20:14 peter
  614. + NEWINPUT for a better inputfile and scanner object
  615. Revision 1.5 1998/06/24 14:48:39 peter
  616. * ifdef newppu -> ifndef oldppu
  617. Revision 1.4 1998/06/16 08:56:32 peter
  618. + targetcpu
  619. * cleaner pmodules for newppu
  620. Revision 1.3 1998/06/13 00:10:17 peter
  621. * working browser and newppu
  622. * some small fixes against crashes which occured in bp7 (but not in
  623. fpc?!)
  624. Revision 1.2 1998/05/28 14:40:28 peter
  625. * fixes for newppu, remake3 works now with it
  626. Revision 1.1 1998/05/27 19:45:09 peter
  627. * symtable.pas splitted into includefiles
  628. * symtable adapted for $ifdef NEWPPU
  629. }