ppu.pas 18 KB

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