ppu.pas 18 KB

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