ptype.pas 25 KB

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