ppu.pas 17 KB

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