2
0

msg2inc.pp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830
  1. {
  2. $Id$
  3. This program is part of the Free Pascal run time library.
  4. Copyright (c) 1998-2002 by Peter Vreman
  5. Convert a .msg file to an .inc file with a const array of char
  6. And for the lazy docwriters it can also generate some TeX output
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  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.
  12. **********************************************************************}
  13. program msg2inc;
  14. uses
  15. strings;
  16. {$ifdef unix}
  17. {$define EOL_ONE_CHAR}
  18. {$endif unix}
  19. {$ifdef amiga}
  20. {$define EOL_ONE_CHAR}
  21. {$endif amiga}
  22. const
  23. version='1.00';
  24. {$ifdef EOL_ONE_CHAR}
  25. eollen=1;
  26. {$else}
  27. eollen=2;
  28. {$endif}
  29. msgparts = 20;
  30. type
  31. TMode=(M_Char,M_Tex,M_Intel,M_String,M_Renumber);
  32. var
  33. InFile,
  34. OutFile,
  35. OutName : string;
  36. Mode : TMode;
  37. TexHeader : boolean;
  38. MsgTxt : pchar;
  39. EnumTxt : pchar;
  40. enumsize,
  41. msgsize : longint;
  42. msgidxmax : array[1..msgparts] of longint;
  43. msgs : array[0..msgparts,0..999] of boolean;
  44. procedure LoadMsgFile(const fn:string);
  45. var
  46. f : text;
  47. error,
  48. multiline : boolean;
  49. code : word;
  50. numpart,numidx,
  51. line,i,j,num : longint;
  52. ptxt,
  53. penum : pchar;
  54. number,
  55. s,s1 : string;
  56. procedure err(const msgstr:string);
  57. begin
  58. writeln('error in line ',line,': ',msgstr);
  59. error:=true;
  60. end;
  61. begin
  62. Writeln('Loading messagefile ',fn);
  63. {Read the message file}
  64. assign(f,fn);
  65. {$I-}
  66. reset(f);
  67. {$I+}
  68. if ioresult<>0 then
  69. begin
  70. WriteLn('fatal error: '+fn+' not found');
  71. halt(1);
  72. end;
  73. { First parse the file and count bytes needed }
  74. fillchar(msgidxmax,sizeof(msgidxmax),0);
  75. fillchar(msgs,sizeof(msgs),0);
  76. error:=false;
  77. line:=0;
  78. multiline:=false;
  79. msgsize:=0;
  80. while not eof(f) do
  81. begin
  82. readln(f,s);
  83. inc(line);
  84. if multiline then
  85. begin
  86. if s=']' then
  87. multiline:=false
  88. else
  89. inc(msgsize,length(s)+1); { +1 for linebreak }
  90. end
  91. else
  92. begin
  93. if (s<>'') and not(s[1] in ['#',';','%']) then
  94. begin
  95. i:=pos('=',s);
  96. if i>0 then
  97. begin
  98. j:=i+1;
  99. if not(s[j] in ['0'..'9']) then
  100. err('no number found')
  101. else
  102. begin
  103. while (s[j] in ['0'..'9']) do
  104. inc(j);
  105. end;
  106. if j-i-1<>5 then
  107. err('number length is not 5');
  108. number:=Copy(s,i+1,j-i-1);
  109. { update the max index }
  110. val(number,num,code);
  111. numpart:=num div 1000;
  112. if numpart=0 then
  113. err('number should be > 1000');
  114. numidx:=num mod 1000;
  115. { duplicate ? }
  116. if msgs[numpart,numidx] then
  117. err('duplicate number found');
  118. msgs[numpart,numidx]:=true;
  119. { check range }
  120. if numpart > msgparts then
  121. err('number is to large')
  122. else
  123. if numidx > msgidxmax[numpart] then
  124. msgidxmax[numpart]:=numidx;
  125. if s[j+1]='[' then
  126. begin
  127. inc(msgsize,j-i);
  128. multiline:=true
  129. end
  130. else
  131. inc(msgsize,length(s)-i+1);
  132. inc(enumsize,j);
  133. end
  134. else
  135. err('no = found');
  136. end;
  137. end;
  138. end;
  139. if multiline then
  140. err('still in multiline mode');
  141. if error then
  142. begin
  143. close(f);
  144. writeln('aborting');
  145. halt(1);
  146. end;
  147. { alloc memory }
  148. getmem(msgtxt,msgsize);
  149. ptxt:=msgtxt;
  150. getmem(enumtxt,enumsize);
  151. penum:=enumtxt;
  152. { now read the buffer in mem }
  153. reset(f);
  154. while not eof(f) do
  155. begin
  156. readln(f,s);
  157. if multiline then
  158. begin
  159. if s=']' then
  160. begin
  161. multiline:=false;
  162. { overwrite last eol }
  163. dec(ptxt);
  164. ptxt^:=#0;
  165. inc(ptxt);
  166. end
  167. else
  168. begin
  169. move(s[1],ptxt^,length(s));
  170. inc(ptxt,length(s));
  171. ptxt^:=#10;
  172. inc(ptxt);
  173. end;
  174. end
  175. else
  176. begin
  177. if (s<>'') and not(s[1] in ['#',';','%']) then
  178. begin
  179. i:=pos('=',s);
  180. if i>0 then
  181. begin
  182. j:=i+1;
  183. while (s[j] in ['0'..'9']) do
  184. inc(j);
  185. {enum}
  186. move(s[1],penum^,i-1);
  187. inc(penum,i-1);
  188. penum^:='=';
  189. inc(penum);
  190. number:=Copy(s,i+1,j-i-1);
  191. move(number[1],penum^,length(number));
  192. inc(penum,length(number));
  193. penum^:=#0;
  194. inc(penum);
  195. { multiline start then no txt }
  196. if s[j+1]='[' then
  197. begin
  198. s1:=Copy(s,i+1,j-i);
  199. move(s1[1],ptxt^,length(s1));
  200. inc(ptxt,length(s1));
  201. multiline:=true;
  202. end
  203. else
  204. begin
  205. { txt including number }
  206. s1:=Copy(s,i+1,255);
  207. move(s1[1],ptxt^,length(s1));
  208. inc(ptxt,length(s1));
  209. ptxt^:=#0;
  210. inc(ptxt);
  211. end;
  212. end;
  213. end;
  214. end;
  215. end;
  216. close(f);
  217. end;
  218. {*****************************************************************************
  219. WriteEnumFile
  220. *****************************************************************************}
  221. procedure WriteEnumFile(const fn,typename:string);
  222. var
  223. t : text;
  224. i : longint;
  225. p : pchar;
  226. start : boolean;
  227. begin
  228. writeln('Writing enumfile '+fn);
  229. {Open textfile}
  230. assign(t,fn);
  231. rewrite(t);
  232. writeln(t,'const');
  233. {Parse buffer in msgbuf and create indexs}
  234. p:=enumtxt;
  235. start:=true;
  236. for i:=1 to enumsize do
  237. begin
  238. if start then
  239. begin
  240. write(t,' ');
  241. start:=false;
  242. end;
  243. if p^=#0 then
  244. begin
  245. writeln(t,';');
  246. start:=true;
  247. end
  248. else
  249. begin
  250. write(t,p^);
  251. end;
  252. inc(p);
  253. end;
  254. writeln(t,'');
  255. { msgtxt size }
  256. writeln(t,' MsgTxtSize = ',msgsize,';');
  257. writeln(t,'');
  258. { max msg idx table }
  259. writeln(t,' MsgIdxMax : array[1..20] of longint=(');
  260. write(t,' ');
  261. for i:=1 to 20 do
  262. begin
  263. write(t,msgidxmax[i]+1);
  264. if i<20 then
  265. write(t,',');
  266. if i=10 then
  267. begin
  268. writeln(t,'');
  269. write(t,' ');
  270. end;
  271. end;
  272. writeln(t,'');
  273. writeln(t,' );');
  274. close(t);
  275. end;
  276. {*****************************************************************************
  277. WriteStringFile
  278. *****************************************************************************}
  279. procedure WriteStringFile(const fn,constname:string);
  280. const
  281. maxslen=240; { to overcome aligning problems }
  282. function l0(l:longint):string;
  283. var
  284. s : string[16];
  285. begin
  286. str(l,s);
  287. while (length(s)<5) do
  288. s:='0'+s;
  289. l0:=s;
  290. end;
  291. var
  292. t : text;
  293. f : file;
  294. slen,
  295. len,i : longint;
  296. p : pchar;
  297. s : string;
  298. start,
  299. quote : boolean;
  300. begin
  301. writeln('Writing stringfile ',fn);
  302. {Open textfile}
  303. assign(t,fn);
  304. rewrite(t);
  305. writeln(t,'{$ifdef Delphi}');
  306. writeln(t,'const '+constname+' : array[0..000000] of string[',maxslen,']=(');
  307. writeln(t,'{$else Delphi}');
  308. writeln(t,'const '+constname+' : array[0..000000,1..',maxslen,'] of char=(');
  309. write(t,'{$endif Delphi}');
  310. {Parse buffer in msgbuf and create indexs}
  311. p:=msgtxt;
  312. slen:=0;
  313. len:=0;
  314. quote:=false;
  315. start:=true;
  316. for i:=1 to msgsize do
  317. begin
  318. if slen>=maxslen then
  319. begin
  320. if quote then
  321. begin
  322. write(t,'''');
  323. quote:=false;
  324. end;
  325. write(t,',');
  326. slen:=0;
  327. inc(len);
  328. end;
  329. if (len>70) or (start) then
  330. begin
  331. if quote then
  332. begin
  333. write(t,'''');
  334. quote:=false;
  335. end;
  336. if slen>0 then
  337. writeln(t,'+')
  338. else
  339. writeln(t);
  340. len:=0;
  341. start:=false;
  342. end;
  343. if (len=0) then
  344. write(t,' ');
  345. if (ord(p^)>=32) and (p^<>#39) then
  346. begin
  347. if not quote then
  348. begin
  349. write(t,'''');
  350. quote:=true;
  351. inc(len);
  352. end;
  353. write(t,p^);
  354. inc(len);
  355. end
  356. else
  357. begin
  358. if quote then
  359. begin
  360. write(t,'''');
  361. inc(len);
  362. quote:=false;
  363. end;
  364. write(t,'#'+chr(ord(p^) div 100+48)+chr((ord(p^) mod 100) div 10+48)+chr(ord(p^) mod 10+48));
  365. inc(len,3);
  366. end;
  367. if p^ in [#0,#10] then
  368. start:=true;
  369. inc(slen);
  370. inc(p);
  371. end;
  372. if quote then
  373. write(t,'''');
  374. writeln(t,'');
  375. writeln(t,');');
  376. close(t);
  377. {update arraysize}
  378. s:=l0(msgsize div maxslen); { we start with 0 }
  379. assign(f,fn);
  380. reset(f,1);
  381. seek(f,34+eollen+length(constname));
  382. blockwrite(f,s[1],5);
  383. seek(f,90+3*eollen+2*length(constname));
  384. blockwrite(f,s[1],5);
  385. close(f);
  386. end;
  387. {*****************************************************************************
  388. WriteCharFile
  389. *****************************************************************************}
  390. procedure WriteCharFile(const fn,constname:string);
  391. function l0(l:longint):string;
  392. var
  393. s : string[16];
  394. begin
  395. str(l,s);
  396. while (length(s)<5) do
  397. s:='0'+s;
  398. l0:=s;
  399. end;
  400. function createconst(b:byte):string;
  401. begin
  402. if (b in [32..127]) and (b<>39) then
  403. createconst:=''''+chr(b)+''''
  404. else
  405. createconst:='#'+chr(b div 100+48)+chr((b mod 100) div 10+48)+chr(b mod 10+48)
  406. end;
  407. var
  408. t : text;
  409. f : file;
  410. cidx,i : longint;
  411. p : pchar;
  412. s : string;
  413. begin
  414. writeln('Writing charfile '+fn);
  415. {Open textfile}
  416. assign(t,fn);
  417. rewrite(t);
  418. writeln(t,'const ',constname,' : array[1..00000] of char=(');
  419. {Parse buffer in msgbuf and create indexs}
  420. p:=msgtxt;
  421. cidx:=0;
  422. for i:=1to msgsize do
  423. begin
  424. if cidx=15 then
  425. begin
  426. if cidx>0 then
  427. writeln(t,',')
  428. else
  429. writeln(t,'');
  430. write(t,' ');
  431. cidx:=0;
  432. end
  433. else
  434. if cidx>0 then
  435. write(t,',')
  436. else
  437. write(t,' ');
  438. write(t,createconst(ord(p^)));
  439. inc(cidx);
  440. inc(p);
  441. end;
  442. writeln(t,');');
  443. close(t);
  444. {update arraysize}
  445. s:=l0(msgsize);
  446. assign(f,fn);
  447. reset(f,1);
  448. seek(f,18+length(constname));
  449. blockwrite(f,s[1],5);
  450. close(f);
  451. end;
  452. {*****************************************************************************
  453. WriteIntelFile
  454. *****************************************************************************}
  455. procedure WriteIntelFile(const fn,constname:string);
  456. var
  457. t : text;
  458. len,i : longint;
  459. p : pchar;
  460. start,
  461. quote : boolean;
  462. begin
  463. writeln('Writing Intelfile ',fn);
  464. {Open textfile}
  465. assign(t,fn);
  466. rewrite(t);
  467. writeln(t,'procedure '+constname+';assembler;');
  468. writeln(t,'asm');
  469. {Parse buffer in msgbuf and create indexs}
  470. p:=msgtxt;
  471. len:=0;
  472. start:=true;
  473. quote:=false;
  474. for i:=1to msgsize do
  475. begin
  476. if len>70 then
  477. begin
  478. if quote then
  479. begin
  480. write(t,'''');
  481. quote:=false;
  482. end;
  483. writeln(t,'');
  484. start:=true;
  485. end;
  486. if start then
  487. begin
  488. write(t,' db ''');
  489. len:=0;
  490. quote:=true;
  491. end;
  492. if (ord(p^)>=32) and (p^<>#39) then
  493. begin
  494. if not quote then
  495. begin
  496. write(t,',''');
  497. quote:=true;
  498. inc(len);
  499. end;
  500. write(t,p^);
  501. inc(len);
  502. end
  503. else
  504. begin
  505. if quote then
  506. begin
  507. write(t,'''');
  508. inc(len);
  509. quote:=false;
  510. end;
  511. write(t,','+chr(ord(p^) div 100+48)+chr((ord(p^) mod 100) div 10+48)+chr(ord(p^) mod 10+48));
  512. inc(len,4);
  513. end;
  514. inc(p);
  515. end;
  516. if quote then
  517. write(t,'''');
  518. writeln(t,'');
  519. writeln(t,'end;');
  520. close(t);
  521. end;
  522. {*****************************************************************************
  523. RenumberFile
  524. *****************************************************************************}
  525. procedure RenumberFile(const fn,name:string);
  526. var
  527. f,t : text;
  528. i : longint;
  529. s,s1 : string;
  530. begin
  531. Writeln('Renumbering ',fn);
  532. {Read the message file}
  533. assign(f,fn);
  534. {$I-}
  535. reset(f);
  536. {$I+}
  537. if ioresult<>0 then
  538. begin
  539. WriteLn('*** message file '+fn+' not found ***');
  540. exit;
  541. end;
  542. assign(t,'msg2inc.$$$');
  543. rewrite(t);
  544. i:=0;
  545. while not eof(f) do
  546. begin
  547. readln(f,s);
  548. if (copy(s,1,length(Name))=Name) and (s[3] in ['0'..'9']) then
  549. begin
  550. inc(i);
  551. str(i,s1);
  552. while length(s1)<3 do
  553. s1:='0'+s1;
  554. writeln(t,Name+s1+Copy(s,6,255));
  555. end
  556. else
  557. writeln(t,s);
  558. end;
  559. close(t);
  560. close(f);
  561. { rename new file }
  562. erase(f);
  563. rename(t,fn);
  564. end;
  565. {*****************************************************************************
  566. WriteTexFile
  567. *****************************************************************************}
  568. Function EscapeString (Const S : String) : String;
  569. Var
  570. I : longint;
  571. hs : string;
  572. begin
  573. hs:='';
  574. for i:=1 to length(s) do
  575. if (S[i]='$') then
  576. begin
  577. if (s[i+1] in ['0'..'9']) then
  578. hs:=hs+'arg'
  579. else
  580. hs:=hs+'\$';
  581. end
  582. else
  583. hs:=hs+s[i];
  584. EscapeString:=hs;
  585. end;
  586. procedure WriteTexFile(const infn,outfn:string);
  587. var
  588. t,f : text;
  589. line,
  590. i,k : longint;
  591. s,s1 : string;
  592. texoutput : boolean;
  593. begin
  594. Writeln('Loading messagefile ',infn);
  595. writeln('Writing TeXfile ',outfn);
  596. { Open infile }
  597. assign(f,infn);
  598. {$I-}
  599. reset(f);
  600. {$I+}
  601. if ioresult<>0 then
  602. begin
  603. WriteLn('*** message file '+infn+' not found ***');
  604. exit;
  605. end;
  606. { Open outfile }
  607. assign(t,outfn);
  608. rewrite(t);
  609. If texheader then
  610. begin
  611. writeln (t,'\documentclass{article}');
  612. writeln (t,'\usepackage{html}');
  613. writeln (t,'\usepackage{fpc}');
  614. writeln (t,'\begin{document}');
  615. end;
  616. { Parse }
  617. line:=0;
  618. TexOutput:=False;
  619. while not eof(f) do
  620. begin
  621. readln(f,s);
  622. inc(line);
  623. If Pos ('# BeginOfTeX',S)=1 then
  624. TexOutPut:=True
  625. else if pos ('# EndOfTeX',S)=1 then
  626. TexOutPut:=False;
  627. if (s<>'') and not(s[1] in ['#',';']) and TeXOutPut then
  628. begin
  629. if s[1]='%' then
  630. begin
  631. Delete(s,1,1);
  632. writeln(t,s);
  633. end
  634. else
  635. begin
  636. i:=pos('=',s);
  637. if i>0 then
  638. begin
  639. inc(i);
  640. while s[i] in ['0'..'9'] do
  641. inc(i);
  642. inc(i);
  643. s1:='';
  644. k:=0;
  645. while (k<5) and (s[i+k]<>'_') do
  646. begin
  647. case s[i+k] of
  648. 'W' : s1:='Warning: ';
  649. 'E' : s1:='Error: ';
  650. 'F' : s1:='Fatal: ';
  651. 'N' : s1:='Note: ';
  652. 'I' : s1:='Info: ';
  653. 'H' : s1:='Hint: ';
  654. end;
  655. inc(k);
  656. end;
  657. if s[i+k]='_' then
  658. inc(i,k+1);
  659. writeln(t,'\item ['+s1+escapestring(Copy(s,i,255))+']');
  660. end
  661. else
  662. writeln('error in line: ',line,' skipping');
  663. end;
  664. end;
  665. end;
  666. If TexHeader then
  667. writeln (t,'\end{document}');
  668. close(t);
  669. close(f);
  670. end;
  671. {*****************************************************************************
  672. Main Program
  673. *****************************************************************************}
  674. procedure getpara;
  675. var
  676. ch : char;
  677. para : string;
  678. files,i : word;
  679. procedure helpscreen;
  680. begin
  681. writeln('usage : msg2inc [Options] <msgfile> <incfile> <constname>');
  682. writeln('<Options> can be : -T Create .doc TeX file');
  683. writeln(' -TS Create .doc TeX file (stand-alone)');
  684. writeln(' -I Intel style asm output');
  685. writeln(' -S array of string');
  686. writeln(' -C array of char');
  687. writeln(' -R renumber section <incfile>');
  688. writeln(' -V Show version');
  689. writeln(' -? or -H This HelpScreen');
  690. halt(1);
  691. end;
  692. begin
  693. Mode:=M_String;
  694. FIles:=0;
  695. for i:=1to paramcount do
  696. begin
  697. para:=paramstr(i);
  698. if (para[1]='-') then
  699. begin
  700. ch:=upcase(para[2]);
  701. delete(para,1,2);
  702. case ch of
  703. 'T' : begin
  704. case upcase(para[1]) of
  705. 'S' : TexHeader:=True;
  706. end;
  707. Mode:=M_Tex;
  708. end;
  709. 'I' : Mode:=M_Intel;
  710. 'S' : Mode:=M_String;
  711. 'C' : Mode:=M_Char;
  712. 'R' : Mode:=M_Renumber;
  713. 'V' : begin
  714. Writeln('Msg2Inc ',version,' for Free Pascal (C) 1998-2002 Peter Vreman');
  715. Writeln;
  716. Halt;
  717. end;
  718. '?','H' : helpscreen;
  719. end;
  720. end
  721. else
  722. begin
  723. inc(Files);
  724. if Files>3 then
  725. HelpScreen;
  726. case Files of
  727. 1 : InFile:=Para;
  728. 2 : OutFile:=Para;
  729. 3 : OutName:=Para;
  730. end;
  731. end;
  732. end;
  733. case Mode of
  734. M_Renumber,
  735. M_Tex : if Files<2 then
  736. Helpscreen;
  737. else
  738. if FIles<3 then
  739. HelpScreen;
  740. end;
  741. end;
  742. begin
  743. GetPara;
  744. case Mode of
  745. M_Renumber : begin
  746. Renumberfile(Infile,OutFile);
  747. end;
  748. M_Tex : begin
  749. if pos('.tex',outfile)=0 then
  750. Outfile:=OutFile+'.tex';
  751. WriteTexFile(InFile,Outfile);
  752. end;
  753. M_Intel : begin
  754. Loadmsgfile(InFile);
  755. WriteEnumFile(OutFile+'idx.inc',OutName+'const');
  756. WriteIntelFile(OutFile+'txt.inc',OutName+'txt');
  757. end;
  758. M_String : begin
  759. Loadmsgfile(InFile);
  760. WriteEnumFile(OutFile+'idx.inc',OutName+'const');
  761. WriteStringFile(OutFile+'txt.inc',OutName+'txt');
  762. end;
  763. M_Char : begin
  764. Loadmsgfile(InFile);
  765. WriteEnumFile(OutFile+'idx.inc',OutName+'const');
  766. WriteCharFile(OutFile+'txt.inc',OutName+'txt');
  767. end;
  768. end;
  769. end.
  770. {
  771. $Log$
  772. Revision 1.11 2003-03-16 23:10:04 pierre
  773. * merge from fixes branch
  774. Revision 1.1.2.6 2003/02/03 16:34:57 pierre
  775. * use EOL_ONE_CHAR to set eollen variable, also define it for amiga
  776. Revision 1.10 2002/05/18 13:34:27 peter
  777. * readded missing revisions
  778. Revision 1.9 2002/05/16 19:46:53 carl
  779. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  780. + try to fix temp allocation (still in ifdef)
  781. + generic constructor calls
  782. + start of tassembler / tmodulebase class cleanup
  783. }