ppu.pas 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  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. {$ifopt H+}
  508. setlength(s,getbyte);
  509. {$else}
  510. s[0]:=chr(getbyte);
  511. {$endif}
  512. if entryidx+length(s)>entry.size then
  513. begin
  514. error:=true;
  515. exit;
  516. end;
  517. ReadData(s[1],length(s));
  518. getstring:=s;
  519. inc(entryidx,length(s));
  520. end;
  521. function tppufile.skipuntilentry(untilb:byte):boolean;
  522. var
  523. b : byte;
  524. begin
  525. repeat
  526. b:=readentry;
  527. until (b in [ibend,iberror]) or ((b=untilb) and (entry.id=mainentryid));
  528. skipuntilentry:=(b=untilb);
  529. end;
  530. {*****************************************************************************
  531. TPPUFile Writing
  532. *****************************************************************************}
  533. function tppufile.create:boolean;
  534. begin
  535. create:=false;
  536. assign(f,fname);
  537. {$I-}
  538. rewrite(f,1);
  539. {$I+}
  540. if ioresult<>0 then
  541. exit;
  542. Mode:=2;
  543. {write header for sure}
  544. blockwrite(f,header,sizeof(tppuheader));
  545. bufsize:=ppubufsize;
  546. bufstart:=sizeof(tppuheader);
  547. bufidx:=0;
  548. {reset}
  549. crc:=$ffffffff;
  550. Error:=false;
  551. do_crc:=true;
  552. size:=0;
  553. entrytyp:=mainentryid;
  554. {start}
  555. NewEntry;
  556. create:=true;
  557. end;
  558. procedure tppufile.writeheader;
  559. var
  560. opos : longint;
  561. begin
  562. { flush buffer }
  563. writebuf;
  564. { update size (w/o header!) in the header }
  565. header.size:=bufstart-sizeof(tppuheader);
  566. { write header and restore filepos after it }
  567. opos:=filepos(f);
  568. seek(f,0);
  569. blockwrite(f,header,sizeof(tppuheader));
  570. seek(f,opos);
  571. end;
  572. procedure tppufile.writebuf;
  573. begin
  574. blockwrite(f,buf^,bufidx);
  575. inc(bufstart,bufidx);
  576. bufidx:=0;
  577. end;
  578. procedure tppufile.writedata(var b;len:longint);
  579. var
  580. p : pchar;
  581. left,
  582. idx : longint;
  583. begin
  584. p:=pchar(@b);
  585. idx:=0;
  586. while len>0 do
  587. begin
  588. left:=bufsize-bufidx;
  589. if len>left then
  590. begin
  591. move(p[idx],buf[bufidx],left);
  592. dec(len,left);
  593. inc(idx,left);
  594. inc(bufidx,left);
  595. writebuf;
  596. end
  597. else
  598. begin
  599. move(p[idx],buf[bufidx],len);
  600. inc(bufidx,len);
  601. exit;
  602. end;
  603. end;
  604. end;
  605. procedure tppufile.NewEntry;
  606. begin
  607. with entry do
  608. begin
  609. id:=entrytyp;
  610. nr:=ibend;
  611. size:=0;
  612. end;
  613. {Reset Entry State}
  614. entryidx:=0;
  615. entrybufstart:=bufstart;
  616. entrystart:=bufstart+bufidx;
  617. {Alloc in buffer}
  618. writedata(entry,sizeof(tppuentry));
  619. end;
  620. procedure tppufile.writeentry(ibnr:byte);
  621. var
  622. opos : longint;
  623. begin
  624. {create entry}
  625. entry.id:=entrytyp;
  626. entry.nr:=ibnr;
  627. entry.size:=entryidx;
  628. {it's already been sent to disk ?}
  629. if entrybufstart<>bufstart then
  630. begin
  631. {flush to be sure}
  632. WriteBuf;
  633. {write entry}
  634. opos:=filepos(f);
  635. seek(f,entrystart);
  636. blockwrite(f,entry,sizeof(tppuentry));
  637. seek(f,opos);
  638. entrybufstart:=bufstart;
  639. end
  640. else
  641. move(entry,buf[entrystart-bufstart],sizeof(entry));
  642. {Add New Entry, which is ibend by default}
  643. entrystart:=bufstart+bufidx; {next entry position}
  644. NewEntry;
  645. end;
  646. procedure tppufile.putdata(var b;len:longint);
  647. begin
  648. if do_crc then
  649. crc:=UpdateCrc32(crc,b,len);
  650. writedata(b,len);
  651. inc(entryidx,len);
  652. end;
  653. procedure tppufile.putbyte(b:byte);
  654. begin
  655. writedata(b,1);
  656. inc(entryidx);
  657. end;
  658. procedure tppufile.putword(w:word);
  659. begin
  660. if change_endian then
  661. w:=swap(w);
  662. putdata(w,2);
  663. end;
  664. procedure tppufile.putlongint(l:longint);
  665. begin
  666. if change_endian then
  667. { someone added swap(l : longint) in system unit
  668. this broke the following code !! }
  669. l:=swap(word(l shr 16)) or (longint(swap(word(l and $ffff))) shl 16);
  670. putdata(l,4);
  671. end;
  672. procedure tppufile.putreal(d:ppureal);
  673. begin
  674. putdata(d,sizeof(ppureal));
  675. end;
  676. procedure tppufile.putstring(s:string);
  677. begin
  678. putdata(s,length(s)+1);
  679. end;
  680. end.
  681. {
  682. $Log$
  683. Revision 1.18 1998-11-16 12:18:03 peter
  684. * H+ fixes
  685. Revision 1.17 1998/10/14 10:45:08 pierre
  686. * ppu problems for m68k fixed (at least in cross compiling)
  687. * one last memory leak for sysamiga fixed
  688. * the amiga RTL compiles now completely !!
  689. Revision 1.16 1998/09/24 23:49:14 peter
  690. + aktmodeswitches
  691. Revision 1.15 1998/09/23 15:39:10 pierre
  692. * browser bugfixes
  693. was adding a reference when looking for the symbol
  694. if -bSYM_NAME was used
  695. Revision 1.14 1998/09/21 10:00:07 peter
  696. * store number of defs in ppu file
  697. Revision 1.13 1998/09/21 08:45:18 pierre
  698. + added vmt_offset in tobjectdef.write for fututre use
  699. (first steps to have objects without vmt if no virtual !!)
  700. + added fpu_used field for tabstractprocdef :
  701. sets this level to 2 if the functions return with value in FPU
  702. (is then set to correct value at parsing of implementation)
  703. THIS MIGHT refuse some code with FPU expression too complex
  704. that were accepted before and even in some cases
  705. that don't overflow in fact
  706. ( like if f : float; is a forward that finally in implementation
  707. only uses one fpu register !!)
  708. Nevertheless I think that it will improve security on
  709. FPU operations !!
  710. * most other changes only for UseBrowser code
  711. (added symtable references for record and objects)
  712. local switch for refs to args and local of each function
  713. (static symtable still missing)
  714. UseBrowser still not stable and probably broken by
  715. the definition hash array !!
  716. Revision 1.12 1998/09/18 08:01:37 pierre
  717. + improvement on the usebrowser part
  718. (does not work correctly for now)
  719. Revision 1.11 1998/09/11 15:16:47 peter
  720. * merge fixes
  721. Revision 1.10.2.1 1998/09/11 15:15:04 peter
  722. * fixed not in [] bug
  723. Revision 1.10 1998/08/31 12:26:30 peter
  724. * m68k and palmos updates from surebugfixes
  725. Revision 1.9 1998/08/17 09:17:51 peter
  726. * static/shared linking updates
  727. Revision 1.8 1998/08/11 15:31:40 peter
  728. * write extended to ppu file
  729. * new version 0.99.7
  730. Revision 1.7 1998/06/25 10:51:01 pierre
  731. * removed a remaining ifndef NEWPPU
  732. replaced by ifdef OLDPPU
  733. * added uf_finalize to ppu unit
  734. Revision 1.6 1998/06/16 08:56:26 peter
  735. + targetcpu
  736. * cleaner pmodules for newppu
  737. Revision 1.5 1998/06/13 00:10:12 peter
  738. * working browser and newppu
  739. * some small fixes against crashes which occured in bp7 (but not in
  740. fpc?!)
  741. Revision 1.4 1998/06/09 16:01:48 pierre
  742. + added procedure directive parsing for procvars
  743. (accepted are popstack cdecl and pascal)
  744. + added C vars with the following syntax
  745. var C calias 'true_c_name';(can be followed by external)
  746. reason is that you must add the Cprefix
  747. which is target dependent
  748. Revision 1.3 1998/05/28 14:40:26 peter
  749. * fixes for newppu, remake3 works now with it
  750. Revision 1.2 1998/05/27 19:45:08 peter
  751. * symtable.pas splitted into includefiles
  752. * symtable adapted for $ifdef NEWPPU
  753. Revision 1.1 1998/05/12 10:56:07 peter
  754. + the ppufile object unit
  755. }