ptype.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  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 tp mode don't allow forward types }
  200. if m_tp 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.33 2002-01-15 16:13:34 jonas
  584. * fixed web bugs 1758 and 1760
  585. Revision 1.32 2002/01/06 12:08:15 peter
  586. * removed uauto from orddef, use new range_to_basetype generating
  587. the correct ordinal type for a range
  588. Revision 1.30 2001/08/30 20:13:53 peter
  589. * rtti/init table updates
  590. * rttisym for reusable global rtti/init info
  591. * support published for interfaces
  592. Revision 1.29 2001/08/12 22:10:16 peter
  593. * write name in original case when type not found
  594. Revision 1.28 2001/07/09 21:15:41 peter
  595. * Length made internal
  596. * Add array support for Length
  597. Revision 1.27 2001/07/01 20:16:16 peter
  598. * alignmentinfo record added
  599. * -Oa argument supports more alignment settings that can be specified
  600. per type: PROC,LOOP,VARMIN,VARMAX,CONSTMIN,CONSTMAX,RECORDMIN
  601. RECORDMAX,LOCALMIN,LOCALMAX. It is possible to set the mimimum
  602. required alignment and the maximum usefull alignment. The final
  603. alignment will be choosen per variable size dependent on these
  604. settings
  605. Revision 1.26 2001/06/04 18:06:38 peter
  606. * fix for enum with assignment
  607. Revision 1.25 2001/06/04 11:51:59 peter
  608. * enum type declarations assignments can also be of the same enum
  609. type
  610. Revision 1.24 2001/06/03 20:16:19 peter
  611. * allow int64 in range declaration for new types
  612. Revision 1.23 2001/04/13 01:22:13 peter
  613. * symtable change to classes
  614. * range check generation and errors fixed, make cycle DEBUG=1 works
  615. * memory leaks fixed
  616. Revision 1.22 2001/04/04 22:43:53 peter
  617. * remove unnecessary calls to firstpass
  618. Revision 1.21 2001/04/02 21:20:34 peter
  619. * resulttype rewrite
  620. Revision 1.20 2001/03/22 22:35:42 florian
  621. + support for type a = (a=1); in Delphi mode added
  622. + procedure p(); in Delphi mode supported
  623. + on isn't keyword anymore, it can be used as
  624. id etc. now
  625. Revision 1.19 2001/03/12 12:49:01 michael
  626. + Patches from peter
  627. Revision 1.18 2001/03/11 22:58:50 peter
  628. * getsym redesign, removed the globals srsym,srsymtable
  629. Revision 1.17 2000/12/07 17:19:43 jonas
  630. * new constant handling: from now on, hex constants >$7fffffff are
  631. parsed as unsigned constants (otherwise, $80000000 got sign extended
  632. and became $ffffffff80000000), all constants in the longint range
  633. become longints, all constants >$7fffffff and <=cardinal($ffffffff)
  634. are cardinals and the rest are int64's.
  635. * added lots of longint typecast to prevent range check errors in the
  636. compiler and rtl
  637. * type casts of symbolic ordinal constants are now preserved
  638. * fixed bug where the original resulttype.def wasn't restored correctly
  639. after doing a 64bit rangecheck
  640. Revision 1.16 2000/11/29 00:30:38 florian
  641. * unused units removed from uses clause
  642. * some changes for widestrings
  643. Revision 1.15 2000/11/14 23:43:38 florian
  644. * fixed 1238
  645. Revision 1.14 2000/11/04 14:25:21 florian
  646. + merged Attila's changes for interfaces, not tested yet
  647. Revision 1.13 2000/10/31 22:02:51 peter
  648. * symtable splitted, no real code changes
  649. Revision 1.12 2000/10/26 21:54:03 peter
  650. * fixed crash with error in child definition (merged)
  651. Revision 1.11 2000/10/21 18:16:12 florian
  652. * a lot of changes:
  653. - basic dyn. array support
  654. - basic C++ support
  655. - some work for interfaces done
  656. ....
  657. Revision 1.10 2000/10/14 10:14:52 peter
  658. * moehrendorf oct 2000 rewrite
  659. Revision 1.9 2000/09/24 15:06:25 peter
  660. * use defines.inc
  661. Revision 1.8 2000/08/27 20:19:39 peter
  662. * store strings with case in ppu, when an internal symbol is created
  663. a '$' is prefixed so it's not automatic uppercased
  664. Revision 1.7 2000/08/27 16:11:52 peter
  665. * moved some util functions from globals,cobjects to cutils
  666. * splitted files into finput,fmodule
  667. Revision 1.6 2000/08/16 18:33:54 peter
  668. * splitted namedobjectitem.next into indexnext and listnext so it
  669. can be used in both lists
  670. * don't allow "word = word" type definitions (merged)
  671. Revision 1.5 2000/08/06 14:17:15 peter
  672. * overload fixes (merged)
  673. Revision 1.4 2000/07/30 17:04:43 peter
  674. * merged fixes
  675. Revision 1.3 2000/07/13 12:08:27 michael
  676. + patched to 1.1.0 with former 1.09patch from peter
  677. Revision 1.2 2000/07/13 11:32:47 michael
  678. + removed logs
  679. }