ppu.pas 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850
  1. {
  2. $Id$
  3. Copyright (c) 1993-98 by Florian Klaempfl
  4. Routines to read/write ppu files
  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. {$ifdef TP}
  19. {$N+,E+}
  20. {$endif}
  21. unit ppu;
  22. interface
  23. const
  24. { buffer sizes }
  25. maxentrysize = 1024;
  26. {$ifdef TP}
  27. ppubufsize = 1024;
  28. {$else}
  29. ppubufsize = 16384;
  30. {$endif}
  31. {ppu entries}
  32. mainentryid = 1;
  33. subentryid = 2;
  34. {special}
  35. iberror = 0;
  36. ibenddefs = 250;
  37. ibendsyms = 251;
  38. ibendinterface = 252;
  39. ibendimplementation = 253;
  40. ibendbrowser = 254;
  41. ibend = 255;
  42. {general}
  43. ibmodulename = 1;
  44. ibsourcefiles = 2;
  45. ibloadunit_int = 3;
  46. ibloadunit_imp = 4;
  47. ibinitunit = 5;
  48. iblinkofiles = 6;
  49. iblinksharedlibs = 7;
  50. iblinkstaticlibs = 8;
  51. ibdbxcount = 9;
  52. ibsymref = 10;
  53. ibdefref = 11;
  54. ibendsymtablebrowser = 12;
  55. ibbeginsymtablebrowser = 13;
  56. {syms}
  57. ibtypesym = 20;
  58. ibprocsym = 21;
  59. ibvarsym = 22;
  60. ibconstsym = 23;
  61. ibenumsym = 24;
  62. ibtypedconstsym = 25;
  63. ibabsolutesym = 26;
  64. ibpropertysym = 27;
  65. ibvarsym_C = 28;
  66. ibunitsym = 29; { needed for browser }
  67. iblabelsym = 30;
  68. {definitions}
  69. iborddef = 40;
  70. ibpointerdef = 41;
  71. ibarraydef = 42;
  72. ibprocdef = 43;
  73. ibstringdef = 44;
  74. ibrecorddef = 45;
  75. ibfiledef = 46;
  76. ibformaldef = 47;
  77. ibobjectdef = 48;
  78. ibenumdef = 49;
  79. ibsetdef = 50;
  80. ibprocvardef = 51;
  81. ibfloatdef = 52;
  82. ibclassrefdef = 53;
  83. iblongstringdef = 54;
  84. ibansistringdef = 55;
  85. ibwidestringdef = 56;
  86. { unit flags }
  87. uf_init = $1;
  88. uf_finalize = $2;
  89. uf_big_endian = $4;
  90. uf_has_dbx = $8;
  91. uf_has_browser = $10;
  92. uf_smartlink = $20;
  93. uf_in_library = $40; { is the file in another file than <ppufile>.* ? }
  94. uf_static_linked = $80;
  95. uf_shared_linked = $100;
  96. uf_local_browser = $200;
  97. type
  98. {$ifdef m68k}
  99. ppureal=single;
  100. {$else}
  101. ppureal=extended;
  102. {$endif}
  103. type
  104. tppuerror=(ppuentrytoobig,ppuentryerror);
  105. tppuheader=packed record
  106. id : array[1..3] of char; { = 'PPU' }
  107. ver : array[1..3] of char;
  108. compiler : word;
  109. cpu : word;
  110. target : word;
  111. flags : longint;
  112. size : longint; { size of the ppufile without header }
  113. checksum : longint; { checksum for this ppufile }
  114. end;
  115. tppuentry=packed record
  116. id : byte;
  117. nr : byte;
  118. size : longint;
  119. end;
  120. pppufile=^tppufile;
  121. tppufile=object
  122. f : file;
  123. mode : byte; {0 - Closed, 1 - Reading, 2 - Writing}
  124. error : boolean;
  125. fname : string;
  126. fsize : longint;
  127. header : tppuheader;
  128. size,crc : longint;
  129. do_crc,
  130. change_endian : boolean;
  131. buf : pchar;
  132. bufstart,
  133. bufsize,
  134. bufidx : longint;
  135. entrybufstart,
  136. entrystart,
  137. entryidx : longint;
  138. entry : tppuentry;
  139. entrytyp : byte;
  140. constructor init(fn:string);
  141. destructor done;
  142. procedure flush;
  143. procedure close;
  144. function CheckPPUId:boolean;
  145. function GetPPUVersion:longint;
  146. procedure NewHeader;
  147. procedure NewEntry;
  148. {read}
  149. function open:boolean;
  150. procedure reloadbuf;
  151. procedure readdata(var b;len:longint);
  152. procedure skipdata(len:longint);
  153. function readentry:byte;
  154. function EndOfEntry:boolean;
  155. procedure getdatabuf(var b;len:longint;var result:longint);
  156. procedure getdata(var b;len:longint);
  157. function getbyte:byte;
  158. function getword:word;
  159. function getlongint:longint;
  160. function getreal:ppureal;
  161. function getstring:string;
  162. function skipuntilentry(untilb:byte):boolean;
  163. {write}
  164. function create:boolean;
  165. procedure writeheader;
  166. procedure writebuf;
  167. procedure writedata(var b;len:longint);
  168. procedure writeentry(ibnr:byte);
  169. procedure putdata(var b;len:longint);
  170. procedure putbyte(b:byte);
  171. procedure putword(w:word);
  172. procedure putlongint(l:longint);
  173. procedure putreal(d:ppureal);
  174. procedure putstring(s:string);
  175. end;
  176. implementation
  177. {*****************************************************************************
  178. Crc 32
  179. *****************************************************************************}
  180. var
  181. Crc32Tbl : array[0..255] of longint;
  182. procedure MakeCRC32Tbl;
  183. var
  184. crc : longint;
  185. i,n : byte;
  186. begin
  187. for i:=0 to 255 do
  188. begin
  189. crc:=i;
  190. for n:=1 to 8 do
  191. if odd(crc) then
  192. crc:=(crc shr 1) xor $edb88320
  193. else
  194. crc:=crc shr 1;
  195. Crc32Tbl[i]:=crc;
  196. end;
  197. end;
  198. {CRC 32}
  199. Function Crc32(Const HStr:String):longint;
  200. var
  201. i,InitCrc : longint;
  202. begin
  203. if Crc32Tbl[1]=0 then
  204. MakeCrc32Tbl;
  205. InitCrc:=$ffffffff;
  206. for i:=1to Length(Hstr) do
  207. InitCrc:=Crc32Tbl[byte(InitCrc) xor ord(Hstr[i])] xor (InitCrc shr 8);
  208. Crc32:=InitCrc;
  209. end;
  210. Function UpdateCrc32(InitCrc:longint;var InBuf;InLen:Longint):longint;
  211. var
  212. i : word;
  213. p : pchar;
  214. begin
  215. if Crc32Tbl[1]=0 then
  216. MakeCrc32Tbl;
  217. p:=@InBuf;
  218. for i:=1to InLen do
  219. begin
  220. InitCrc:=Crc32Tbl[byte(InitCrc) xor byte(p^)] xor (InitCrc shr 8);
  221. inc(longint(p));
  222. end;
  223. UpdateCrc32:=InitCrc;
  224. end;
  225. Function UpdCrc32(InitCrc:longint;b:byte):longint;
  226. begin
  227. if Crc32Tbl[1]=0 then
  228. MakeCrc32Tbl;
  229. UpdCrc32:=Crc32Tbl[byte(InitCrc) xor b] xor (InitCrc shr 8);
  230. end;
  231. {*****************************************************************************
  232. TPPUFile
  233. *****************************************************************************}
  234. constructor tppufile.init(fn:string);
  235. begin
  236. fname:=fn;
  237. change_endian:=false;
  238. Mode:=0;
  239. NewHeader;
  240. Error:=false;
  241. getmem(buf,ppubufsize);
  242. end;
  243. destructor tppufile.done;
  244. begin
  245. close;
  246. freemem(buf,ppubufsize);
  247. end;
  248. procedure tppufile.flush;
  249. begin
  250. if Mode=2 then
  251. writebuf;
  252. end;
  253. procedure tppufile.close;
  254. var
  255. i : word;
  256. begin
  257. if Mode<>0 then
  258. begin
  259. Flush;
  260. {$I-}
  261. system.close(f);
  262. {$I+}
  263. i:=ioresult;
  264. Mode:=0;
  265. end;
  266. end;
  267. function tppufile.CheckPPUId:boolean;
  268. begin
  269. CheckPPUId:=((Header.Id[1]='P') and (Header.Id[2]='P') and (Header.Id[3]='U'));
  270. end;
  271. function tppufile.GetPPUVersion:longint;
  272. var
  273. l : longint;
  274. code : word;
  275. begin
  276. Val(header.ver[1]+header.ver[2]+header.ver[3],l,code);
  277. if code=0 then
  278. GetPPUVersion:=l
  279. else
  280. GetPPUVersion:=0;
  281. end;
  282. procedure tppufile.NewHeader;
  283. begin
  284. fillchar(header,sizeof(tppuheader),0);
  285. with header do
  286. begin
  287. Id[1]:='P';
  288. Id[2]:='P';
  289. Id[3]:='U';
  290. Ver[1]:='0';
  291. Ver[2]:='1';
  292. Ver[3]:='5';
  293. end;
  294. end;
  295. {*****************************************************************************
  296. TPPUFile Reading
  297. *****************************************************************************}
  298. function tppufile.open:boolean;
  299. var
  300. ofmode : byte;
  301. i : word;
  302. begin
  303. open:=false;
  304. assign(f,fname);
  305. ofmode:=filemode;
  306. filemode:=$0;
  307. {$I-}
  308. reset(f,1);
  309. {$I+}
  310. filemode:=ofmode;
  311. if ioresult<>0 then
  312. exit;
  313. {read ppuheader}
  314. fsize:=filesize(f);
  315. if fsize<sizeof(tppuheader) then
  316. exit;
  317. blockread(f,header,sizeof(tppuheader),i);
  318. {reset buffer}
  319. bufstart:=i;
  320. bufsize:=0;
  321. bufidx:=0;
  322. Mode:=1;
  323. FillChar(entry,sizeof(tppuentry),0);
  324. entryidx:=0;
  325. entrystart:=0;
  326. entrybufstart:=0;
  327. Error:=false;
  328. open:=true;
  329. end;
  330. procedure tppufile.reloadbuf;
  331. {$ifdef TP}
  332. var
  333. i : word;
  334. {$endif}
  335. begin
  336. inc(bufstart,bufsize);
  337. {$ifdef TP}
  338. blockread(f,buf^,ppubufsize,i);
  339. bufsize:=i;
  340. {$else}
  341. blockread(f,buf^,ppubufsize,bufsize);
  342. {$endif}
  343. bufidx:=0;
  344. end;
  345. procedure tppufile.readdata(var b;len:longint);
  346. var
  347. p : pchar;
  348. left,
  349. idx : longint;
  350. begin
  351. p:=pchar(@b);
  352. idx:=0;
  353. while len>0 do
  354. begin
  355. left:=bufsize-bufidx;
  356. if len>left then
  357. begin
  358. move(buf[bufidx],p[idx],left);
  359. dec(len,left);
  360. inc(idx,left);
  361. reloadbuf;
  362. if bufsize=0 then
  363. exit;
  364. end
  365. else
  366. begin
  367. move(buf[bufidx],p[idx],len);
  368. inc(bufidx,len);
  369. exit;
  370. end;
  371. end;
  372. end;
  373. procedure tppufile.skipdata(len:longint);
  374. var
  375. left : longint;
  376. begin
  377. while len>0 do
  378. begin
  379. left:=bufsize-bufidx;
  380. if len>left then
  381. begin
  382. dec(len,left);
  383. reloadbuf;
  384. if bufsize=0 then
  385. exit;
  386. end
  387. else
  388. begin
  389. inc(bufidx,len);
  390. exit;
  391. end;
  392. end;
  393. end;
  394. function tppufile.readentry:byte;
  395. begin
  396. if entryidx<entry.size then
  397. skipdata(entry.size-entryidx);
  398. readdata(entry,sizeof(tppuentry));
  399. entrystart:=bufstart+bufidx;
  400. entryidx:=0;
  401. if not(entry.id in [mainentryid,subentryid]) then
  402. begin
  403. readentry:=iberror;
  404. error:=true;
  405. exit;
  406. end;
  407. readentry:=entry.nr;
  408. end;
  409. function tppufile.endofentry:boolean;
  410. begin
  411. endofentry:=(entryidx>=entry.size);
  412. end;
  413. procedure tppufile.getdatabuf(var b;len:longint;var result:longint);
  414. begin
  415. if entryidx+len>entry.size then
  416. result:=entry.size-entryidx
  417. else
  418. result:=len;
  419. readdata(b,result);
  420. inc(entryidx,result);
  421. end;
  422. procedure tppufile.getdata(var b;len:longint);
  423. begin
  424. if entryidx+len>entry.size then
  425. begin
  426. error:=true;
  427. exit;
  428. end;
  429. readdata(b,len);
  430. inc(entryidx,len);
  431. end;
  432. function tppufile.getbyte:byte;
  433. var
  434. b : byte;
  435. begin
  436. if entryidx+1>entry.size then
  437. begin
  438. error:=true;
  439. getbyte:=0;
  440. exit;
  441. end;
  442. readdata(b,1);
  443. getbyte:=b;
  444. inc(entryidx);
  445. end;
  446. function tppufile.getword:word;
  447. type
  448. pword = ^word;
  449. var
  450. w : word;
  451. begin
  452. if entryidx+2>entry.size then
  453. begin
  454. error:=true;
  455. getword:=0;
  456. exit;
  457. end;
  458. readdata(w,2);
  459. if change_endian then
  460. getword:=swap(w)
  461. else
  462. getword:=w;
  463. inc(entryidx,2);
  464. end;
  465. function tppufile.getlongint:longint;
  466. type
  467. plongint = ^longint;
  468. var
  469. l : longint;
  470. begin
  471. if entryidx+4>entry.size then
  472. begin
  473. error:=true;
  474. getlongint:=0;
  475. exit;
  476. end;
  477. readdata(l,4);
  478. if change_endian then
  479. getlongint:=swap(l shr 16) or (longint(swap(l and $ffff)) shl 16)
  480. else
  481. getlongint:=l;
  482. inc(entryidx,4);
  483. end;
  484. function tppufile.getreal:ppureal;
  485. type
  486. pppureal = ^ppureal;
  487. var
  488. d : ppureal;
  489. begin
  490. if entryidx+sizeof(ppureal)>entry.size then
  491. begin
  492. error:=true;
  493. getreal:=0;
  494. exit;
  495. end;
  496. readdata(d,sizeof(ppureal));
  497. getreal:=d;
  498. inc(entryidx,sizeof(ppureal));
  499. end;
  500. function tppufile.getstring:string;
  501. var
  502. s : string;
  503. begin
  504. s[0]:=chr(getbyte);
  505. if entryidx+length(s)>entry.size then
  506. begin
  507. error:=true;
  508. exit;
  509. end;
  510. ReadData(s[1],length(s));
  511. getstring:=s;
  512. inc(entryidx,length(s));
  513. end;
  514. function tppufile.skipuntilentry(untilb:byte):boolean;
  515. var
  516. b : byte;
  517. begin
  518. repeat
  519. b:=readentry;
  520. until (b in [ibend,iberror]) or ((b=untilb) and (entry.id=mainentryid));
  521. skipuntilentry:=(b=untilb);
  522. end;
  523. {*****************************************************************************
  524. TPPUFile Writing
  525. *****************************************************************************}
  526. function tppufile.create:boolean;
  527. begin
  528. create:=false;
  529. assign(f,fname);
  530. {$I-}
  531. rewrite(f,1);
  532. {$I+}
  533. if ioresult<>0 then
  534. exit;
  535. Mode:=2;
  536. {write header for sure}
  537. blockwrite(f,header,sizeof(tppuheader));
  538. bufsize:=ppubufsize;
  539. bufstart:=sizeof(tppuheader);
  540. bufidx:=0;
  541. {reset}
  542. crc:=$ffffffff;
  543. Error:=false;
  544. do_crc:=true;
  545. size:=0;
  546. entrytyp:=mainentryid;
  547. {start}
  548. NewEntry;
  549. create:=true;
  550. end;
  551. procedure tppufile.writeheader;
  552. var
  553. opos : longint;
  554. begin
  555. { flush buffer }
  556. writebuf;
  557. { update size (w/o header!) in the header }
  558. header.size:=bufstart-sizeof(tppuheader);
  559. { write header and restore filepos after it }
  560. opos:=filepos(f);
  561. seek(f,0);
  562. blockwrite(f,header,sizeof(tppuheader));
  563. seek(f,opos);
  564. end;
  565. procedure tppufile.writebuf;
  566. begin
  567. blockwrite(f,buf^,bufidx);
  568. inc(bufstart,bufidx);
  569. bufidx:=0;
  570. end;
  571. procedure tppufile.writedata(var b;len:longint);
  572. var
  573. p : pchar;
  574. left,
  575. idx : longint;
  576. begin
  577. p:=pchar(@b);
  578. idx:=0;
  579. while len>0 do
  580. begin
  581. left:=bufsize-bufidx;
  582. if len>left then
  583. begin
  584. move(p[idx],buf[bufidx],left);
  585. dec(len,left);
  586. inc(idx,left);
  587. inc(bufidx,left);
  588. writebuf;
  589. end
  590. else
  591. begin
  592. move(p[idx],buf[bufidx],len);
  593. inc(bufidx,len);
  594. exit;
  595. end;
  596. end;
  597. end;
  598. procedure tppufile.NewEntry;
  599. begin
  600. with entry do
  601. begin
  602. id:=entrytyp;
  603. nr:=ibend;
  604. size:=0;
  605. end;
  606. {Reset Entry State}
  607. entryidx:=0;
  608. entrybufstart:=bufstart;
  609. entrystart:=bufstart+bufidx;
  610. {Alloc in buffer}
  611. writedata(entry,sizeof(tppuentry));
  612. end;
  613. procedure tppufile.writeentry(ibnr:byte);
  614. var
  615. opos : longint;
  616. begin
  617. {create entry}
  618. entry.id:=entrytyp;
  619. entry.nr:=ibnr;
  620. entry.size:=entryidx;
  621. {it's already been sent to disk ?}
  622. if entrybufstart<>bufstart then
  623. begin
  624. {flush to be sure}
  625. WriteBuf;
  626. {write entry}
  627. opos:=filepos(f);
  628. seek(f,entrystart);
  629. blockwrite(f,entry,sizeof(tppuentry));
  630. seek(f,opos);
  631. entrybufstart:=bufstart;
  632. end
  633. else
  634. move(entry,buf[entrystart-bufstart],sizeof(entry));
  635. {Add New Entry, which is ibend by default}
  636. entrystart:=bufstart+bufidx; {next entry position}
  637. NewEntry;
  638. end;
  639. procedure tppufile.putdata(var b;len:longint);
  640. begin
  641. if do_crc then
  642. crc:=UpdateCrc32(crc,b,len);
  643. writedata(b,len);
  644. inc(entryidx,len);
  645. end;
  646. procedure tppufile.putbyte(b:byte);
  647. begin
  648. writedata(b,1);
  649. inc(entryidx);
  650. end;
  651. procedure tppufile.putword(w:word);
  652. begin
  653. if change_endian then
  654. w:=swap(w);
  655. putdata(w,2);
  656. end;
  657. procedure tppufile.putlongint(l:longint);
  658. begin
  659. if change_endian then
  660. l:=swap(l shr 16) or (longint(swap(l and $ffff)) shl 16);
  661. putdata(l,4);
  662. end;
  663. procedure tppufile.putreal(d:ppureal);
  664. begin
  665. putdata(d,sizeof(ppureal));
  666. end;
  667. procedure tppufile.putstring(s:string);
  668. begin
  669. putdata(s,length(s)+1);
  670. end;
  671. end.
  672. {
  673. $Log$
  674. Revision 1.13 1998-09-21 08:45:18 pierre
  675. + added vmt_offset in tobjectdef.write for fututre use
  676. (first steps to have objects without vmt if no virtual !!)
  677. + added fpu_used field for tabstractprocdef :
  678. sets this level to 2 if the functions return with value in FPU
  679. (is then set to correct value at parsing of implementation)
  680. THIS MIGHT refuse some code with FPU expression too complex
  681. that were accepted before and even in some cases
  682. that don't overflow in fact
  683. ( like if f : float; is a forward that finally in implementation
  684. only uses one fpu register !!)
  685. Nevertheless I think that it will improve security on
  686. FPU operations !!
  687. * most other changes only for UseBrowser code
  688. (added symtable references for record and objects)
  689. local switch for refs to args and local of each function
  690. (static symtable still missing)
  691. UseBrowser still not stable and probably broken by
  692. the definition hash array !!
  693. Revision 1.12 1998/09/18 08:01:37 pierre
  694. + improvement on the usebrowser part
  695. (does not work correctly for now)
  696. Revision 1.11 1998/09/11 15:16:47 peter
  697. * merge fixes
  698. Revision 1.10.2.1 1998/09/11 15:15:04 peter
  699. * fixed not in [] bug
  700. Revision 1.10 1998/08/31 12:26:30 peter
  701. * m68k and palmos updates from surebugfixes
  702. Revision 1.9 1998/08/17 09:17:51 peter
  703. * static/shared linking updates
  704. Revision 1.8 1998/08/11 15:31:40 peter
  705. * write extended to ppu file
  706. * new version 0.99.7
  707. Revision 1.7 1998/06/25 10:51:01 pierre
  708. * removed a remaining ifndef NEWPPU
  709. replaced by ifdef OLDPPU
  710. * added uf_finalize to ppu unit
  711. Revision 1.6 1998/06/16 08:56:26 peter
  712. + targetcpu
  713. * cleaner pmodules for newppu
  714. Revision 1.5 1998/06/13 00:10:12 peter
  715. * working browser and newppu
  716. * some small fixes against crashes which occured in bp7 (but not in
  717. fpc?!)
  718. Revision 1.4 1998/06/09 16:01:48 pierre
  719. + added procedure directive parsing for procvars
  720. (accepted are popstack cdecl and pascal)
  721. + added C vars with the following syntax
  722. var C calias 'true_c_name';(can be followed by external)
  723. reason is that you must add the Cprefix
  724. which is target dependent
  725. Revision 1.3 1998/05/28 14:40:26 peter
  726. * fixes for newppu, remake3 works now with it
  727. Revision 1.2 1998/05/27 19:45:08 peter
  728. * symtable.pas splitted into includefiles
  729. * symtable adapted for $ifdef NEWPPU
  730. Revision 1.1 1998/05/12 10:56:07 peter
  731. + the ppufile object unit
  732. }