ppu.pas 17 KB

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