2
0

ptype.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. {
  2. $Id$
  3. Copyright (c) 1998-2000 by Florian Klaempfl
  4. Does parsing types for Free Pascal
  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. unit ptype;
  19. {$i defines.inc}
  20. interface
  21. uses
  22. globtype,symtype;
  23. const
  24. { forward types should only be possible inside a TYPE statement }
  25. typecanbeforward : boolean = false;
  26. var
  27. { hack, which allows to use the current parsed }
  28. { object type as function argument type }
  29. testcurobject : byte;
  30. curobjectname : stringid;
  31. { reads a string, file type or a type id and returns a name and }
  32. { tdef }
  33. procedure single_type(var tt:ttype;var s : string;isforwarddef:boolean);
  34. procedure read_type(var tt:ttype;const name : stringid);
  35. { reads a type definition }
  36. { to a appropriating tdef, s gets the name of }
  37. { the type to allow name mangling }
  38. procedure id_type(var tt : ttype;var s : string;isforwarddef:boolean);
  39. implementation
  40. uses
  41. { common }
  42. cutils,cpuinfo,
  43. { global }
  44. globals,tokens,verbose,
  45. systems,
  46. { aasm }
  47. aasm,
  48. { symtable }
  49. symconst,symbase,symdef,symsym,symtable,types,
  50. { pass 1 }
  51. node,pass_1,
  52. nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,
  53. { parser }
  54. scanner,
  55. pbase,pexpr,pdecsub,pdecvar,pdecobj;
  56. procedure id_type(var tt : ttype;var s : string;isforwarddef:boolean);
  57. { reads a type definition }
  58. { to a appropriating tdef, s gets the name of }
  59. { the type to allow name mangling }
  60. var
  61. is_unit_specific : boolean;
  62. pos : tfileposinfo;
  63. srsym : tsym;
  64. srsymtable : tsymtable;
  65. sorg : stringid;
  66. begin
  67. s:=pattern;
  68. sorg:=orgpattern;
  69. pos:=akttokenpos;
  70. { classes can be used also in classes }
  71. if (curobjectname=pattern) and is_class_or_interface(aktobjectdef) then
  72. begin
  73. tt.setdef(aktobjectdef);
  74. consume(_ID);
  75. exit;
  76. end;
  77. { objects can be parameters }
  78. if (testcurobject=2) and (curobjectname=pattern) then
  79. begin
  80. tt.setdef(aktobjectdef);
  81. consume(_ID);
  82. exit;
  83. end;
  84. { try to load the symbol to see if it's a unitsym }
  85. is_unit_specific:=false;
  86. searchsym(s,srsym,srsymtable);
  87. consume(_ID);
  88. if assigned(srsym) and
  89. (srsym.typ=unitsym) then
  90. begin
  91. is_unit_specific:=true;
  92. consume(_POINT);
  93. if srsym.owner.unitid=0 then
  94. begin
  95. srsym:=searchsymonlyin(tunitsym(srsym).unitsymtable,pattern);
  96. pos:=akttokenpos;
  97. s:=pattern;
  98. end
  99. else
  100. srsym:=nil;
  101. consume(_ID);
  102. end;
  103. { are we parsing a possible forward def ? }
  104. if isforwarddef and
  105. not(is_unit_specific) then
  106. begin
  107. tt.setdef(tforwarddef.create(s,pos));
  108. exit;
  109. end;
  110. { unknown sym ? }
  111. if not assigned(srsym) then
  112. begin
  113. Message1(sym_e_id_not_found,sorg);
  114. tt:=generrortype;
  115. exit;
  116. end;
  117. { type sym ? }
  118. if (srsym.typ<>typesym) then
  119. begin
  120. Message(type_e_type_id_expected);
  121. tt:=generrortype;
  122. exit;
  123. end;
  124. { Types are first defined with an error def before assigning
  125. the real type so check if it's an errordef. if so then
  126. give an error }
  127. if (ttypesym(srsym).restype.def.deftype=errordef) then
  128. begin
  129. Message(sym_e_error_in_type_def);
  130. tt:=generrortype;
  131. exit;
  132. end;
  133. { Only use the definitions for system/current unit, becuase
  134. they can be refered from the parameters and symbols are not
  135. loaded at that time. A symbol reference to an other unit
  136. is still possible, because it's already loaded (PFV)
  137. can't use in [] here, becuase unitid can be > 255 }
  138. if (ttypesym(srsym).owner.unitid=0) or
  139. (ttypesym(srsym).owner.unitid=1) then
  140. tt.setdef(ttypesym(srsym).restype.def)
  141. else
  142. tt.setsym(srsym);
  143. end;
  144. procedure single_type(var tt:ttype;var s : string;isforwarddef:boolean);
  145. { reads a string, file type or a type id and returns a name and }
  146. { tdef }
  147. var
  148. hs : string;
  149. t2 : ttype;
  150. begin
  151. case token of
  152. _STRING:
  153. begin
  154. string_dec(tt);
  155. s:='STRING';
  156. end;
  157. _FILE:
  158. begin
  159. consume(_FILE);
  160. if token=_OF then
  161. begin
  162. consume(_OF);
  163. single_type(t2,hs,false);
  164. tt.setdef(tfiledef.createtyped(t2));
  165. s:='FILE$OF$'+hs;
  166. end
  167. else
  168. begin
  169. tt:=cfiletype;
  170. s:='FILE';
  171. end;
  172. end;
  173. _ID:
  174. begin
  175. id_type(tt,s,isforwarddef);
  176. end;
  177. else
  178. message(type_e_type_id_expected);
  179. end;
  180. end;
  181. { reads a record declaration }
  182. function record_dec : tdef;
  183. var
  184. symtable : tsymtable;
  185. storetypecanbeforward : boolean;
  186. old_object_option : tsymoptions;
  187. begin
  188. { create recdef }
  189. symtable:=trecordsymtable.create;
  190. record_dec:=trecorddef.create(symtable);
  191. { update symtable stack }
  192. symtable.next:=symtablestack;
  193. symtablestack:=symtable;
  194. { parse record }
  195. consume(_RECORD);
  196. old_object_option:=current_object_option;
  197. current_object_option:=[sp_public];
  198. storetypecanbeforward:=typecanbeforward;
  199. { for tp7 don't allow forward types }
  200. if m_tp7 in aktmodeswitches then
  201. typecanbeforward:=false;
  202. read_var_decs(true,false,false);
  203. consume(_END);
  204. typecanbeforward:=storetypecanbeforward;
  205. current_object_option:=old_object_option;
  206. { may be scale record size to a size of n*4 ? }
  207. symtablestack.datasize:=align(symtablestack.datasize,symtablestack.dataalignment);
  208. { restore symtable stack }
  209. symtablestack:=symtable.next;
  210. end;
  211. { reads a type definition and returns a pointer to it }
  212. procedure read_type(var tt : ttype;const name : stringid);
  213. var
  214. pt : tnode;
  215. tt2 : ttype;
  216. aktenumdef : tenumdef;
  217. ap : tarraydef;
  218. s : stringid;
  219. l,v : TConstExprInt;
  220. oldaktpackrecords : longint;
  221. hs : string;
  222. defpos,storepos : tfileposinfo;
  223. procedure expr_type;
  224. var
  225. pt1,pt2 : tnode;
  226. lv,hv : TConstExprInt;
  227. begin
  228. { use of current parsed object ? }
  229. if (token=_ID) and (testcurobject=2) and (curobjectname=pattern) then
  230. begin
  231. consume(_ID);
  232. tt.setdef(aktobjectdef);
  233. exit;
  234. end;
  235. { classes can be used also in classes }
  236. if (curobjectname=pattern) and is_class_or_interface(aktobjectdef) then
  237. begin
  238. tt.setdef(aktobjectdef);
  239. consume(_ID);
  240. exit;
  241. end;
  242. { we can't accept a equal in type }
  243. pt1:=comp_expr(not(ignore_equal));
  244. if (token=_POINTPOINT) then
  245. begin
  246. consume(_POINTPOINT);
  247. { get high value of range }
  248. pt2:=comp_expr(not(ignore_equal));
  249. { make both the same type }
  250. inserttypeconv(pt1,pt2.resulttype);
  251. { both must be evaluated to constants now }
  252. if (pt1.nodetype=ordconstn) and
  253. (pt2.nodetype=ordconstn) then
  254. begin
  255. lv:=tordconstnode(pt1).value;
  256. hv:=tordconstnode(pt2).value;
  257. { Check bounds }
  258. if hv<lv then
  259. Message(cg_e_upper_lower_than_lower)
  260. else
  261. begin
  262. { All checks passed, create the new def }
  263. case pt1.resulttype.def.deftype of
  264. enumdef :
  265. tt.setdef(tenumdef.create_subrange(tenumdef(pt1.resulttype.def),lv,hv));
  266. orddef :
  267. begin
  268. if is_char(pt1.resulttype.def) then
  269. tt.setdef(torddef.create(uchar,lv,hv))
  270. else
  271. if is_boolean(pt1.resulttype.def) then
  272. tt.setdef(torddef.create(bool8bit,l,hv))
  273. else
  274. tt.setdef(torddef.create(range_to_basetype(lv,hv),lv,hv));
  275. end;
  276. end;
  277. end;
  278. end
  279. else
  280. Message(sym_e_error_in_type_def);
  281. pt2.free;
  282. end
  283. else
  284. begin
  285. { a simple type renaming }
  286. if (pt1.nodetype=typen) then
  287. tt:=ttypenode(pt1).resulttype
  288. else
  289. Message(sym_e_error_in_type_def);
  290. end;
  291. pt1.free;
  292. end;
  293. procedure array_dec;
  294. var
  295. lowval,
  296. highval : longint;
  297. arraytype : ttype;
  298. ht : ttype;
  299. procedure setdefdecl(const t:ttype);
  300. begin
  301. case t.def.deftype of
  302. enumdef :
  303. begin
  304. lowval:=tenumdef(t.def).min;
  305. highval:=tenumdef(t.def).max;
  306. arraytype:=t;
  307. end;
  308. orddef :
  309. begin
  310. if torddef(t.def).typ in [uchar,
  311. u8bit,u16bit,
  312. s8bit,s16bit,s32bit,
  313. bool8bit,bool16bit,bool32bit,
  314. uwidechar] then
  315. begin
  316. lowval:=torddef(t.def).low;
  317. highval:=torddef(t.def).high;
  318. arraytype:=t;
  319. end
  320. else
  321. Message1(parser_e_type_cant_be_used_in_array_index,t.def.gettypename);
  322. end;
  323. else
  324. Message(sym_e_error_in_type_def);
  325. end;
  326. end;
  327. begin
  328. consume(_ARRAY);
  329. { open array? }
  330. if token=_LECKKLAMMER then
  331. begin
  332. consume(_LECKKLAMMER);
  333. { defaults }
  334. arraytype:=generrortype;
  335. lowval:=longint($80000000);
  336. highval:=$7fffffff;
  337. tt.reset;
  338. repeat
  339. { read the expression and check it, check apart if the
  340. declaration is an enum declaration because that needs to
  341. be parsed by readtype (PFV) }
  342. if token=_LKLAMMER then
  343. begin
  344. read_type(ht,'');
  345. setdefdecl(ht);
  346. end
  347. else
  348. begin
  349. pt:=expr;
  350. if pt.nodetype=typen then
  351. setdefdecl(pt.resulttype)
  352. else
  353. begin
  354. if (pt.nodetype=rangen) then
  355. begin
  356. if (trangenode(pt).left.nodetype=ordconstn) and
  357. (trangenode(pt).right.nodetype=ordconstn) then
  358. begin
  359. lowval:=tordconstnode(trangenode(pt).left).value;
  360. highval:=tordconstnode(trangenode(pt).right).value;
  361. if highval<lowval then
  362. begin
  363. Message(parser_e_array_lower_less_than_upper_bound);
  364. highval:=lowval;
  365. end;
  366. arraytype:=trangenode(pt).right.resulttype;
  367. end
  368. else
  369. Message(type_e_cant_eval_constant_expr);
  370. end
  371. else
  372. Message(sym_e_error_in_type_def)
  373. end;
  374. pt.free;
  375. end;
  376. { create arraydef }
  377. if not assigned(tt.def) then
  378. begin
  379. ap:=tarraydef.create(lowval,highval,arraytype);
  380. tt.setdef(ap);
  381. end
  382. else
  383. begin
  384. ap.elementtype.setdef(tarraydef.create(lowval,highval,arraytype));
  385. ap:=tarraydef(ap.elementtype.def);
  386. end;
  387. if token=_COMMA then
  388. consume(_COMMA)
  389. else
  390. break;
  391. until false;
  392. consume(_RECKKLAMMER);
  393. end
  394. else
  395. begin
  396. ap:=tarraydef.create(0,-1,s32bittype);
  397. ap.IsDynamicArray:=true;
  398. tt.setdef(ap);
  399. end;
  400. consume(_OF);
  401. read_type(tt2,'');
  402. { if no error, set element type }
  403. if assigned(ap) then
  404. ap.elementtype:=tt2;
  405. end;
  406. var
  407. p : tnode;
  408. enumdupmsg : boolean;
  409. begin
  410. tt.reset;
  411. case token of
  412. _STRING,_FILE:
  413. begin
  414. single_type(tt,hs,false);
  415. end;
  416. _LKLAMMER:
  417. begin
  418. consume(_LKLAMMER);
  419. { allow negativ value_str }
  420. l:=-1;
  421. enumdupmsg:=false;
  422. aktenumdef:=tenumdef.create;
  423. repeat
  424. s:=orgpattern;
  425. defpos:=akttokenpos;
  426. consume(_ID);
  427. { only allow assigning of specific numbers under fpc mode }
  428. if (m_fpc in aktmodeswitches) and
  429. (token=_ASSIGNMENT) then
  430. begin
  431. consume(_ASSIGNMENT);
  432. v:=get_intconst;
  433. { please leave that a note, allows type save }
  434. { declarations in the win32 units ! }
  435. if (v<=l) and (not enumdupmsg) then
  436. begin
  437. Message(parser_n_duplicate_enum);
  438. enumdupmsg:=true;
  439. end;
  440. l:=v;
  441. end
  442. else if (m_delphi in aktmodeswitches) and
  443. (token=_EQUAL) then
  444. begin
  445. consume(_EQUAL);
  446. p:=comp_expr(true);
  447. if (p.nodetype=ordconstn) then
  448. begin
  449. { we expect an integer or an enum of the
  450. same type }
  451. if is_integer(p.resulttype.def) or
  452. is_equal(p.resulttype.def,aktenumdef) then
  453. l:=tordconstnode(p).value
  454. else
  455. Message2(type_e_incompatible_types,p.resulttype.def.typename,s32bittype.def.typename);
  456. end
  457. else
  458. Message(cg_e_illegal_expression);
  459. p.free;
  460. end
  461. else
  462. inc(l);
  463. storepos:=akttokenpos;
  464. akttokenpos:=defpos;
  465. constsymtable.insert(tenumsym.create(s,aktenumdef,l));
  466. akttokenpos:=storepos;
  467. until not try_to_consume(_COMMA);
  468. tt.setdef(aktenumdef);
  469. consume(_RKLAMMER);
  470. end;
  471. _ARRAY:
  472. begin
  473. array_dec;
  474. end;
  475. _SET:
  476. begin
  477. consume(_SET);
  478. consume(_OF);
  479. read_type(tt2,'');
  480. if assigned(tt2.def) then
  481. begin
  482. case tt2.def.deftype of
  483. { don't forget that min can be negativ PM }
  484. enumdef :
  485. if tenumdef(tt2.def).min>=0 then
  486. tt.setdef(tsetdef.create(tt2,tenumdef(tt2.def).max))
  487. else
  488. Message(sym_e_ill_type_decl_set);
  489. orddef :
  490. begin
  491. case torddef(tt2.def).typ of
  492. uchar :
  493. tt.setdef(tsetdef.create(tt2,255));
  494. u8bit,u16bit,u32bit,
  495. s8bit,s16bit,s32bit :
  496. begin
  497. if (torddef(tt2.def).low>=0) then
  498. tt.setdef(tsetdef.create(tt2,torddef(tt2.def).high))
  499. else
  500. Message(sym_e_ill_type_decl_set);
  501. end;
  502. else
  503. Message(sym_e_ill_type_decl_set);
  504. end;
  505. end;
  506. else
  507. Message(sym_e_ill_type_decl_set);
  508. end;
  509. end
  510. else
  511. tt:=generrortype;
  512. end;
  513. _CARET:
  514. begin
  515. consume(_CARET);
  516. single_type(tt2,hs,typecanbeforward);
  517. tt.setdef(tpointerdef.create(tt2));
  518. end;
  519. _RECORD:
  520. begin
  521. tt.setdef(record_dec);
  522. end;
  523. _PACKED:
  524. begin
  525. consume(_PACKED);
  526. if token=_ARRAY then
  527. array_dec
  528. else
  529. begin
  530. oldaktpackrecords:=aktalignment.recordalignmax;
  531. aktalignment.recordalignmax:=1;
  532. if token in [_CLASS,_OBJECT] then
  533. tt.setdef(object_dec(name,nil))
  534. else
  535. tt.setdef(record_dec);
  536. aktalignment.recordalignmax:=oldaktpackrecords;
  537. end;
  538. end;
  539. _CLASS,
  540. _CPPCLASS,
  541. _INTERFACE,
  542. _OBJECT:
  543. begin
  544. tt.setdef(object_dec(name,nil));
  545. end;
  546. _PROCEDURE:
  547. begin
  548. consume(_PROCEDURE);
  549. tt.setdef(tprocvardef.create);
  550. if token=_LKLAMMER then
  551. parameter_dec(tprocvardef(tt.def));
  552. if token=_OF then
  553. begin
  554. consume(_OF);
  555. consume(_OBJECT);
  556. include(tprocvardef(tt.def).procoptions,po_methodpointer);
  557. end;
  558. end;
  559. _FUNCTION:
  560. begin
  561. consume(_FUNCTION);
  562. tt.def:=tprocvardef.create;
  563. if token=_LKLAMMER then
  564. parameter_dec(tprocvardef(tt.def));
  565. consume(_COLON);
  566. single_type(tprocvardef(tt.def).rettype,hs,false);
  567. if token=_OF then
  568. begin
  569. consume(_OF);
  570. consume(_OBJECT);
  571. include(tprocvardef(tt.def).procoptions,po_methodpointer);
  572. end;
  573. end;
  574. else
  575. expr_type;
  576. end;
  577. if tt.def=nil then
  578. tt:=generrortype;
  579. end;
  580. end.
  581. {
  582. $Log$
  583. Revision 1.34 2002-01-24 18:25:49 peter
  584. * implicit result variable generation for assembler routines
  585. * removed m_tp modeswitch, use m_tp7 or not(m_fpc) instead
  586. Revision 1.33 2002/01/15 16:13:34 jonas
  587. * fixed web bugs 1758 and 1760
  588. Revision 1.32 2002/01/06 12:08:15 peter
  589. * removed uauto from orddef, use new range_to_basetype generating
  590. the correct ordinal type for a range
  591. Revision 1.30 2001/08/30 20:13:53 peter
  592. * rtti/init table updates
  593. * rttisym for reusable global rtti/init info
  594. * support published for interfaces
  595. Revision 1.29 2001/08/12 22:10:16 peter
  596. * write name in original case when type not found
  597. Revision 1.28 2001/07/09 21:15:41 peter
  598. * Length made internal
  599. * Add array support for Length
  600. Revision 1.27 2001/07/01 20:16:16 peter
  601. * alignmentinfo record added
  602. * -Oa argument supports more alignment settings that can be specified
  603. per type: PROC,LOOP,VARMIN,VARMAX,CONSTMIN,CONSTMAX,RECORDMIN
  604. RECORDMAX,LOCALMIN,LOCALMAX. It is possible to set the mimimum
  605. required alignment and the maximum usefull alignment. The final
  606. alignment will be choosen per variable size dependent on these
  607. settings
  608. Revision 1.26 2001/06/04 18:06:38 peter
  609. * fix for enum with assignment
  610. Revision 1.25 2001/06/04 11:51:59 peter
  611. * enum type declarations assignments can also be of the same enum
  612. type
  613. Revision 1.24 2001/06/03 20:16:19 peter
  614. * allow int64 in range declaration for new types
  615. Revision 1.23 2001/04/13 01:22:13 peter
  616. * symtable change to classes
  617. * range check generation and errors fixed, make cycle DEBUG=1 works
  618. * memory leaks fixed
  619. Revision 1.22 2001/04/04 22:43:53 peter
  620. * remove unnecessary calls to firstpass
  621. Revision 1.21 2001/04/02 21:20:34 peter
  622. * resulttype rewrite
  623. Revision 1.20 2001/03/22 22:35:42 florian
  624. + support for type a = (a=1); in Delphi mode added
  625. + procedure p(); in Delphi mode supported
  626. + on isn't keyword anymore, it can be used as
  627. id etc. now
  628. Revision 1.19 2001/03/12 12:49:01 michael
  629. + Patches from peter
  630. Revision 1.18 2001/03/11 22:58:50 peter
  631. * getsym redesign, removed the globals srsym,srsymtable
  632. Revision 1.17 2000/12/07 17:19:43 jonas
  633. * new constant handling: from now on, hex constants >$7fffffff are
  634. parsed as unsigned constants (otherwise, $80000000 got sign extended
  635. and became $ffffffff80000000), all constants in the longint range
  636. become longints, all constants >$7fffffff and <=cardinal($ffffffff)
  637. are cardinals and the rest are int64's.
  638. * added lots of longint typecast to prevent range check errors in the
  639. compiler and rtl
  640. * type casts of symbolic ordinal constants are now preserved
  641. * fixed bug where the original resulttype.def wasn't restored correctly
  642. after doing a 64bit rangecheck
  643. Revision 1.16 2000/11/29 00:30:38 florian
  644. * unused units removed from uses clause
  645. * some changes for widestrings
  646. Revision 1.15 2000/11/14 23:43:38 florian
  647. * fixed 1238
  648. Revision 1.14 2000/11/04 14:25:21 florian
  649. + merged Attila's changes for interfaces, not tested yet
  650. Revision 1.13 2000/10/31 22:02:51 peter
  651. * symtable splitted, no real code changes
  652. Revision 1.12 2000/10/26 21:54:03 peter
  653. * fixed crash with error in child definition (merged)
  654. Revision 1.11 2000/10/21 18:16:12 florian
  655. * a lot of changes:
  656. - basic dyn. array support
  657. - basic C++ support
  658. - some work for interfaces done
  659. ....
  660. Revision 1.10 2000/10/14 10:14:52 peter
  661. * moehrendorf oct 2000 rewrite
  662. Revision 1.9 2000/09/24 15:06:25 peter
  663. * use defines.inc
  664. Revision 1.8 2000/08/27 20:19:39 peter
  665. * store strings with case in ppu, when an internal symbol is created
  666. a '$' is prefixed so it's not automatic uppercased
  667. Revision 1.7 2000/08/27 16:11:52 peter
  668. * moved some util functions from globals,cobjects to cutils
  669. * splitted files into finput,fmodule
  670. Revision 1.6 2000/08/16 18:33:54 peter
  671. * splitted namedobjectitem.next into indexnext and listnext so it
  672. can be used in both lists
  673. * don't allow "word = word" type definitions (merged)
  674. Revision 1.5 2000/08/06 14:17:15 peter
  675. * overload fixes (merged)
  676. Revision 1.4 2000/07/30 17:04:43 peter
  677. * merged fixes
  678. Revision 1.3 2000/07/13 12:08:27 michael
  679. + patched to 1.1.0 with former 1.09patch from peter
  680. Revision 1.2 2000/07/13 11:32:47 michael
  681. + removed logs
  682. }