ppu.pas 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  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. {$ifopt R+}
  200. {$define Range_check_on}
  201. {$endif opt R+}
  202. {$R- needed here }
  203. {CRC 32}
  204. Function Crc32(Const HStr:String):longint;
  205. var
  206. i,InitCrc : longint;
  207. begin
  208. if Crc32Tbl[1]=0 then
  209. MakeCrc32Tbl;
  210. InitCrc:=$ffffffff;
  211. for i:=1to Length(Hstr) do
  212. InitCrc:=Crc32Tbl[byte(InitCrc) xor ord(Hstr[i])] xor (InitCrc shr 8);
  213. Crc32:=InitCrc;
  214. end;
  215. Function UpdateCrc32(InitCrc:longint;var InBuf;InLen:Longint):longint;
  216. var
  217. i : word;
  218. p : pchar;
  219. begin
  220. if Crc32Tbl[1]=0 then
  221. MakeCrc32Tbl;
  222. p:=@InBuf;
  223. for i:=1to InLen do
  224. begin
  225. InitCrc:=Crc32Tbl[byte(InitCrc) xor byte(p^)] xor (InitCrc shr 8);
  226. inc(longint(p));
  227. end;
  228. UpdateCrc32:=InitCrc;
  229. end;
  230. Function UpdCrc32(InitCrc:longint;b:byte):longint;
  231. begin
  232. if Crc32Tbl[1]=0 then
  233. MakeCrc32Tbl;
  234. UpdCrc32:=Crc32Tbl[byte(InitCrc) xor b] xor (InitCrc shr 8);
  235. end;
  236. {$ifdef Range_check_on}
  237. {$R+}
  238. {$undef Range_check_on}
  239. {$endif Range_check_on}
  240. {*****************************************************************************
  241. TPPUFile
  242. *****************************************************************************}
  243. constructor tppufile.init(fn:string);
  244. begin
  245. fname:=fn;
  246. change_endian:=false;
  247. Mode:=0;
  248. NewHeader;
  249. Error:=false;
  250. getmem(buf,ppubufsize);
  251. end;
  252. destructor tppufile.done;
  253. begin
  254. close;
  255. freemem(buf,ppubufsize);
  256. end;
  257. procedure tppufile.flush;
  258. begin
  259. if Mode=2 then
  260. writebuf;
  261. end;
  262. procedure tppufile.close;
  263. var
  264. i : word;
  265. begin
  266. if Mode<>0 then
  267. begin
  268. Flush;
  269. {$I-}
  270. system.close(f);
  271. {$I+}
  272. i:=ioresult;
  273. Mode:=0;
  274. end;
  275. end;
  276. function tppufile.CheckPPUId:boolean;
  277. begin
  278. CheckPPUId:=((Header.Id[1]='P') and (Header.Id[2]='P') and (Header.Id[3]='U'));
  279. end;
  280. function tppufile.GetPPUVersion:longint;
  281. var
  282. l : longint;
  283. code : word;
  284. begin
  285. Val(header.ver[1]+header.ver[2]+header.ver[3],l,code);
  286. if code=0 then
  287. GetPPUVersion:=l
  288. else
  289. GetPPUVersion:=0;
  290. end;
  291. procedure tppufile.NewHeader;
  292. begin
  293. fillchar(header,sizeof(tppuheader),0);
  294. with header do
  295. begin
  296. Id[1]:='P';
  297. Id[2]:='P';
  298. Id[3]:='U';
  299. Ver[1]:='0';
  300. Ver[2]:='1';
  301. Ver[3]:='5';
  302. end;
  303. end;
  304. {*****************************************************************************
  305. TPPUFile Reading
  306. *****************************************************************************}
  307. function tppufile.open:boolean;
  308. var
  309. ofmode : byte;
  310. i : word;
  311. begin
  312. open:=false;
  313. assign(f,fname);
  314. ofmode:=filemode;
  315. filemode:=$0;
  316. {$I-}
  317. reset(f,1);
  318. {$I+}
  319. filemode:=ofmode;
  320. if ioresult<>0 then
  321. exit;
  322. {read ppuheader}
  323. fsize:=filesize(f);
  324. if fsize<sizeof(tppuheader) then
  325. exit;
  326. blockread(f,header,sizeof(tppuheader),i);
  327. {reset buffer}
  328. bufstart:=i;
  329. bufsize:=0;
  330. bufidx:=0;
  331. Mode:=1;
  332. FillChar(entry,sizeof(tppuentry),0);
  333. entryidx:=0;
  334. entrystart:=0;
  335. entrybufstart:=0;
  336. Error:=false;
  337. open:=true;
  338. end;
  339. procedure tppufile.reloadbuf;
  340. {$ifdef TP}
  341. var
  342. i : word;
  343. {$endif}
  344. begin
  345. inc(bufstart,bufsize);
  346. {$ifdef TP}
  347. blockread(f,buf^,ppubufsize,i);
  348. bufsize:=i;
  349. {$else}
  350. blockread(f,buf^,ppubufsize,bufsize);
  351. {$endif}
  352. bufidx:=0;
  353. end;
  354. procedure tppufile.readdata(var b;len:longint);
  355. var
  356. p : pchar;
  357. left,
  358. idx : longint;
  359. begin
  360. p:=pchar(@b);
  361. idx:=0;
  362. while len>0 do
  363. begin
  364. left:=bufsize-bufidx;
  365. if len>left then
  366. begin
  367. move(buf[bufidx],p[idx],left);
  368. dec(len,left);
  369. inc(idx,left);
  370. reloadbuf;
  371. if bufsize=0 then
  372. exit;
  373. end
  374. else
  375. begin
  376. move(buf[bufidx],p[idx],len);
  377. inc(bufidx,len);
  378. exit;
  379. end;
  380. end;
  381. end;
  382. procedure tppufile.skipdata(len:longint);
  383. var
  384. left : longint;
  385. begin
  386. while len>0 do
  387. begin
  388. left:=bufsize-bufidx;
  389. if len>left then
  390. begin
  391. dec(len,left);
  392. reloadbuf;
  393. if bufsize=0 then
  394. exit;
  395. end
  396. else
  397. begin
  398. inc(bufidx,len);
  399. exit;
  400. end;
  401. end;
  402. end;
  403. function tppufile.readentry:byte;
  404. begin
  405. if entryidx<entry.size then
  406. skipdata(entry.size-entryidx);
  407. readdata(entry,sizeof(tppuentry));
  408. entrystart:=bufstart+bufidx;
  409. entryidx:=0;
  410. if not(entry.id in [mainentryid,subentryid]) then
  411. begin
  412. readentry:=iberror;
  413. error:=true;
  414. exit;
  415. end;
  416. readentry:=entry.nr;
  417. end;
  418. function tppufile.endofentry:boolean;
  419. begin
  420. endofentry:=(entryidx>=entry.size);
  421. end;
  422. procedure tppufile.getdatabuf(var b;len:longint;var result:longint);
  423. begin
  424. if entryidx+len>entry.size then
  425. result:=entry.size-entryidx
  426. else
  427. result:=len;
  428. readdata(b,result);
  429. inc(entryidx,result);
  430. end;
  431. procedure tppufile.getdata(var b;len:longint);
  432. begin
  433. if entryidx+len>entry.size then
  434. begin
  435. error:=true;
  436. exit;
  437. end;
  438. readdata(b,len);
  439. inc(entryidx,len);
  440. end;
  441. function tppufile.getbyte:byte;
  442. var
  443. b : byte;
  444. begin
  445. if entryidx+1>entry.size then
  446. begin
  447. error:=true;
  448. getbyte:=0;
  449. exit;
  450. end;
  451. readdata(b,1);
  452. getbyte:=b;
  453. inc(entryidx);
  454. end;
  455. function tppufile.getword:word;
  456. type
  457. pword = ^word;
  458. var
  459. w : word;
  460. begin
  461. if entryidx+2>entry.size then
  462. begin
  463. error:=true;
  464. getword:=0;
  465. exit;
  466. end;
  467. readdata(w,2);
  468. if change_endian then
  469. getword:=swap(w)
  470. else
  471. getword:=w;
  472. inc(entryidx,2);
  473. end;
  474. function tppufile.getlongint:longint;
  475. type
  476. plongint = ^longint;
  477. var
  478. l : longint;
  479. begin
  480. if entryidx+4>entry.size then
  481. begin
  482. error:=true;
  483. getlongint:=0;
  484. exit;
  485. end;
  486. readdata(l,4);
  487. if change_endian then
  488. { someone added swap(l : longint) in system unit
  489. this broke the following code !! }
  490. getlongint:=swap(word(l shr 16)) or (longint(swap(word(l and $ffff))) shl 16)
  491. else
  492. getlongint:=l;
  493. inc(entryidx,4);
  494. end;
  495. function tppufile.getreal:ppureal;
  496. type
  497. pppureal = ^ppureal;
  498. var
  499. d : ppureal;
  500. begin
  501. if entryidx+sizeof(ppureal)>entry.size then
  502. begin
  503. error:=true;
  504. getreal:=0;
  505. exit;
  506. end;
  507. readdata(d,sizeof(ppureal));
  508. getreal:=d;
  509. inc(entryidx,sizeof(ppureal));
  510. end;
  511. function tppufile.getstring:string;
  512. var
  513. s : string;
  514. begin
  515. {$ifndef TP}
  516. {$ifopt H+}
  517. setlength(s,getbyte);
  518. {$else}
  519. s[0]:=chr(getbyte);
  520. {$endif}
  521. {$else}
  522. s[0]:=chr(getbyte);
  523. {$endif}
  524. if entryidx+length(s)>entry.size then
  525. begin
  526. error:=true;
  527. exit;
  528. end;
  529. ReadData(s[1],length(s));
  530. getstring:=s;
  531. inc(entryidx,length(s));
  532. end;
  533. function tppufile.skipuntilentry(untilb:byte):boolean;
  534. var
  535. b : byte;
  536. begin
  537. repeat
  538. b:=readentry;
  539. until (b in [ibend,iberror]) or ((b=untilb) and (entry.id=mainentryid));
  540. skipuntilentry:=(b=untilb);
  541. end;
  542. {*****************************************************************************
  543. TPPUFile Writing
  544. *****************************************************************************}
  545. function tppufile.create:boolean;
  546. begin
  547. create:=false;
  548. assign(f,fname);
  549. {$I-}
  550. rewrite(f,1);
  551. {$I+}
  552. if ioresult<>0 then
  553. exit;
  554. Mode:=2;
  555. {write header for sure}
  556. blockwrite(f,header,sizeof(tppuheader));
  557. bufsize:=ppubufsize;
  558. bufstart:=sizeof(tppuheader);
  559. bufidx:=0;
  560. {reset}
  561. crc:=$ffffffff;
  562. Error:=false;
  563. do_crc:=true;
  564. size:=0;
  565. entrytyp:=mainentryid;
  566. {start}
  567. NewEntry;
  568. create:=true;
  569. end;
  570. procedure tppufile.writeheader;
  571. var
  572. opos : longint;
  573. begin
  574. { flush buffer }
  575. writebuf;
  576. { update size (w/o header!) in the header }
  577. header.size:=bufstart-sizeof(tppuheader);
  578. { write header and restore filepos after it }
  579. opos:=filepos(f);
  580. seek(f,0);
  581. blockwrite(f,header,sizeof(tppuheader));
  582. seek(f,opos);
  583. end;
  584. procedure tppufile.writebuf;
  585. begin
  586. blockwrite(f,buf^,bufidx);
  587. inc(bufstart,bufidx);
  588. bufidx:=0;
  589. end;
  590. procedure tppufile.writedata(var b;len:longint);
  591. var
  592. p : pchar;
  593. left,
  594. idx : longint;
  595. begin
  596. p:=pchar(@b);
  597. idx:=0;
  598. while len>0 do
  599. begin
  600. left:=bufsize-bufidx;
  601. if len>left then
  602. begin
  603. move(p[idx],buf[bufidx],left);
  604. dec(len,left);
  605. inc(idx,left);
  606. inc(bufidx,left);
  607. writebuf;
  608. end
  609. else
  610. begin
  611. move(p[idx],buf[bufidx],len);
  612. inc(bufidx,len);
  613. exit;
  614. end;
  615. end;
  616. end;
  617. procedure tppufile.NewEntry;
  618. begin
  619. with entry do
  620. begin
  621. id:=entrytyp;
  622. nr:=ibend;
  623. size:=0;
  624. end;
  625. {Reset Entry State}
  626. entryidx:=0;
  627. entrybufstart:=bufstart;
  628. entrystart:=bufstart+bufidx;
  629. {Alloc in buffer}
  630. writedata(entry,sizeof(tppuentry));
  631. end;
  632. procedure tppufile.writeentry(ibnr:byte);
  633. var
  634. opos : longint;
  635. begin
  636. {create entry}
  637. entry.id:=entrytyp;
  638. entry.nr:=ibnr;
  639. entry.size:=entryidx;
  640. {it's already been sent to disk ?}
  641. if entrybufstart<>bufstart then
  642. begin
  643. {flush to be sure}
  644. WriteBuf;
  645. {write entry}
  646. opos:=filepos(f);
  647. seek(f,entrystart);
  648. blockwrite(f,entry,sizeof(tppuentry));
  649. seek(f,opos);
  650. entrybufstart:=bufstart;
  651. end
  652. else
  653. move(entry,buf[entrystart-bufstart],sizeof(entry));
  654. {Add New Entry, which is ibend by default}
  655. entrystart:=bufstart+bufidx; {next entry position}
  656. NewEntry;
  657. end;
  658. procedure tppufile.putdata(var b;len:longint);
  659. begin
  660. if do_crc then
  661. crc:=UpdateCrc32(crc,b,len);
  662. writedata(b,len);
  663. inc(entryidx,len);
  664. end;
  665. procedure tppufile.putbyte(b:byte);
  666. begin
  667. writedata(b,1);
  668. inc(entryidx);
  669. end;
  670. procedure tppufile.putword(w:word);
  671. begin
  672. if change_endian then
  673. w:=swap(w);
  674. putdata(w,2);
  675. end;
  676. procedure tppufile.putlongint(l:longint);
  677. begin
  678. if change_endian then
  679. { someone added swap(l : longint) in system unit
  680. this broke the following code !! }
  681. l:=swap(word(l shr 16)) or (longint(swap(word(l and $ffff))) shl 16);
  682. putdata(l,4);
  683. end;
  684. procedure tppufile.putreal(d:ppureal);
  685. begin
  686. putdata(d,sizeof(ppureal));
  687. end;
  688. procedure tppufile.putstring(s:string);
  689. begin
  690. putdata(s,length(s)+1);
  691. end;
  692. end.
  693. {
  694. $Log$
  695. Revision 1.20 1998-11-30 16:34:45 pierre
  696. * corrected problems with rangecheck
  697. + added needed code for no rangecheck in CRC32 functions in ppu unit
  698. * enumdef lso need its rangenr reset to zero
  699. when calling reset_global_defs
  700. Revision 1.19 1998/11/16 15:41:42 peter
  701. * tp7 didn't like my ifopt H+ :(
  702. Revision 1.18 1998/11/16 12:18:03 peter
  703. * H+ fixes
  704. Revision 1.17 1998/10/14 10:45:08 pierre
  705. * ppu problems for m68k fixed (at least in cross compiling)
  706. * one last memory leak for sysamiga fixed
  707. * the amiga RTL compiles now completely !!
  708. Revision 1.16 1998/09/24 23:49:14 peter
  709. + aktmodeswitches
  710. Revision 1.15 1998/09/23 15:39:10 pierre
  711. * browser bugfixes
  712. was adding a reference when looking for the symbol
  713. if -bSYM_NAME was used
  714. Revision 1.14 1998/09/21 10:00:07 peter
  715. * store number of defs in ppu file
  716. Revision 1.13 1998/09/21 08:45:18 pierre
  717. + added vmt_offset in tobjectdef.write for fututre use
  718. (first steps to have objects without vmt if no virtual !!)
  719. + added fpu_used field for tabstractprocdef :
  720. sets this level to 2 if the functions return with value in FPU
  721. (is then set to correct value at parsing of implementation)
  722. THIS MIGHT refuse some code with FPU expression too complex
  723. that were accepted before and even in some cases
  724. that don't overflow in fact
  725. ( like if f : float; is a forward that finally in implementation
  726. only uses one fpu register !!)
  727. Nevertheless I think that it will improve security on
  728. FPU operations !!
  729. * most other changes only for UseBrowser code
  730. (added symtable references for record and objects)
  731. local switch for refs to args and local of each function
  732. (static symtable still missing)
  733. UseBrowser still not stable and probably broken by
  734. the definition hash array !!
  735. Revision 1.12 1998/09/18 08:01:37 pierre
  736. + improvement on the usebrowser part
  737. (does not work correctly for now)
  738. Revision 1.11 1998/09/11 15:16:47 peter
  739. * merge fixes
  740. Revision 1.10.2.1 1998/09/11 15:15:04 peter
  741. * fixed not in [] bug
  742. Revision 1.10 1998/08/31 12:26:30 peter
  743. * m68k and palmos updates from surebugfixes
  744. Revision 1.9 1998/08/17 09:17:51 peter
  745. * static/shared linking updates
  746. Revision 1.8 1998/08/11 15:31:40 peter
  747. * write extended to ppu file
  748. * new version 0.99.7
  749. Revision 1.7 1998/06/25 10:51:01 pierre
  750. * removed a remaining ifndef NEWPPU
  751. replaced by ifdef OLDPPU
  752. * added uf_finalize to ppu unit
  753. Revision 1.6 1998/06/16 08:56:26 peter
  754. + targetcpu
  755. * cleaner pmodules for newppu
  756. Revision 1.5 1998/06/13 00:10:12 peter
  757. * working browser and newppu
  758. * some small fixes against crashes which occured in bp7 (but not in
  759. fpc?!)
  760. Revision 1.4 1998/06/09 16:01:48 pierre
  761. + added procedure directive parsing for procvars
  762. (accepted are popstack cdecl and pascal)
  763. + added C vars with the following syntax
  764. var C calias 'true_c_name';(can be followed by external)
  765. reason is that you must add the Cprefix
  766. which is target dependent
  767. Revision 1.3 1998/05/28 14:40:26 peter
  768. * fixes for newppu, remake3 works now with it
  769. Revision 1.2 1998/05/27 19:45:08 peter
  770. * symtable.pas splitted into includefiles
  771. * symtable adapted for $ifdef NEWPPU
  772. Revision 1.1 1998/05/12 10:56:07 peter
  773. + the ppufile object unit
  774. }