ptype.pas 25 KB

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