INIT.C
上传用户:hlzzc88
上传日期:2007-01-06
资源大小:220k
文件大小:21k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2.  * 68K/386 32-bit C compiler.
  3.  *
  4.  * copyright (c) 1997, David Lindauer
  5.  * 
  6.  * This compiler is intended for educational use.  It may not be used
  7.  * for profit without the express written consent of the author.
  8.  *
  9.  * It may be freely redistributed, as long as this notice remains intact
  10.  * and either the original sources or derived sources 
  11.  * are distributed along with any executables derived from the originals.
  12.  *
  13.  * The author is not responsible for any damages that may arise from use
  14.  * of this software, either idirect or consequential.
  15.  *
  16.  * v1.35 March 1997
  17.  * David Lindauer, gclind01@starbase.spd.louisville.edu
  18.  *
  19.  * Credits to Mathew Brandt for original K&R C compiler
  20.  *
  21.  */
  22. /*
  23.  * handles initialization of module-scoped declarations
  24.  */
  25. #include        <stdio.h>
  26. #include <limits.h>
  27. #include        "expr.h"
  28. #include        "c.h"
  29. #include        "errors.h"
  30. extern int stdldoublesize;
  31. extern enum e_sym lastst;
  32. extern char lastid[], laststr[];
  33. extern TABLE gsyms;
  34. extern int skm_declend[];
  35. extern long bittab[];
  36. extern int nextlabel;
  37. extern TYP stdmatch;
  38. extern int skm_closebr[];
  39. extern int prm_cplusplus;
  40. extern SYM *currentfunc;
  41. extern int prm_bss;
  42. static SYM *locsp;
  43. static short cursize;
  44. static short startbit,bits;
  45. static long totbits;
  46. static int allocated;
  47. static ENODE *cpprefhead;
  48. static ENODE **cppreftail;
  49. static int baseoffs = 0;
  50. static struct decldata **sptr;
  51. static struct declares {
  52. struct declares *link;
  53. SYM *sp;
  54. } *declarations, *decltail;
  55. void initini(void)
  56. {
  57. cpprefhead = 0;
  58. declarations = decltail = 0;
  59. }
  60. void initrundown(void)
  61. /*
  62.  * Dump out C++ pointer and reference initializations functions 
  63.  */
  64. {
  65. struct declares *q;
  66. long nbytes,obytes,val,onbytes;
  67. #ifdef CPLUSPLUS
  68. if (cpprefhead) {
  69. int lbl = nextlabel++;
  70. SNODE stmt;
  71. currentfunc = xalloc(sizeof(SYM));
  72. currentfunc->tp = maketype(bt_func,0);
  73. currentfunc->tp->btp = maketype(bt_void,0);
  74. currentfunc->tp->lst.head = 0;
  75. currentfunc->intflag = 0;
  76. stmt.stype = st_expr;
  77. stmt.next = 0;
  78. stmt.exp = cpprefhead;
  79. cseg();
  80. gen_label(lbl);
  81. genfunc(&stmt);
  82. flush_peep();
  83. cppseg();
  84. gen_labref(lbl);
  85. currentfunc = 0;
  86. cpprefhead = 0;
  87. }
  88. #endif
  89. nl();
  90. dseg();
  91. q = declarations;
  92. nbytes = 0;
  93. while (q) {
  94. SYM *sp = q->sp;
  95. if ((sp->init || !prm_bss) && !sp->absflag) {
  96. int align = getalign(sc_global,sp->tp);
  97. val = align - (nbytes % align);
  98. if (val != align) {
  99. genstorage(val);
  100. nbytes += val;
  101. nl();
  102. }
  103. onbytes = nbytes;
  104. nbytes += gen(sp);
  105. sp->value.i = onbytes;
  106. }
  107. q = q->link;
  108. }
  109. if (prm_bss) {
  110. obytes  = nbytes;
  111. nbytes = 0;
  112. bssseg();
  113. q = declarations;
  114. while (q) {
  115. SYM *sp = q->sp;
  116. if (!sp->init && !sp->absflag) {
  117. int align = getalign(sc_global,sp->tp);
  118. val = align - (nbytes % align);
  119. if (val != align) {
  120. genstorage(val);
  121. nbytes += val;
  122. nl();
  123. }
  124. onbytes = nbytes;
  125. nbytes += gen(sp);
  126. sp->value.i = onbytes + obytes;
  127. }
  128. q = q->link;
  129. }
  130. }
  131. }
  132. static long gen(SYM *sp)
  133. {
  134. struct decldata *decldata = sp->init;
  135. long nbytes=0;
  136. if (sp->storage_class == sc_global) {
  137. globaldef(sp);
  138. }
  139. if (sp->staticlabel)
  140. put_staticlabel(sp->value.i);
  141. else
  142. gen_strlab(sp);
  143. if (decldata) {
  144. while (decldata) {
  145. switch (decldata->mode) {
  146. case dd_byte: 
  147. genbyte(decldata->val.i);
  148. nbytes++;;
  149. break;
  150. case dd_word:
  151. genword(decldata->val.i);
  152. nbytes += 2;
  153. break;
  154. case dd_long:
  155. genlong(decldata->val.i);
  156. nbytes += 4;
  157. break;
  158. case dd_float:
  159. genfloat(decldata->val.f);
  160. nbytes += 4;
  161. break;
  162. case dd_double:
  163. gendouble(decldata->val.f);
  164. nbytes += 8;
  165. break;
  166. case dd_ldouble:
  167. genlongdouble(decldata->val.f);
  168. nbytes += stdldoublesize;
  169. break;
  170. case dd_pcname:
  171. genpcref(decldata->val.sp,decldata->offset);
  172. nbytes += 4;
  173. break;
  174. case dd_dataname:
  175. genref(decldata->val.sp,decldata->offset);
  176. nbytes += 4;
  177. break;
  178. case dd_storage:
  179. genstorage(decldata->val.i);
  180. nbytes += decldata->val.i;
  181. break;
  182. case dd_label:
  183. gen_labref(decldata->val.i);
  184. nbytes += 4;
  185. break;
  186. }
  187. decldata = decldata->link;
  188. }
  189. }
  190. else {
  191. if (sp->tp->size == 0)
  192. gensymerror(ERR_ZEROSTORAGE,sp->name);
  193. else
  194. genstorage(nbytes += sp->tp->size);
  195. }
  196. nl();
  197. return nbytes;
  198. }
  199. #ifdef CPLUSPLUS
  200. void cppinitinsert(ENODE *node)
  201. /*
  202.  * insert an initialization function on the list
  203.  */
  204. {
  205. if (!cpprefhead) {
  206. cpprefhead = node;
  207. cppreftail = &cpprefhead;
  208. }
  209. else {
  210. *cppreftail = makenode(en_void,*cppreftail,node);
  211. cppreftail = & (*cppreftail)->v.p[1];
  212. }
  213. }
  214. #endif
  215. void doinit(SYM *sp)
  216. /*
  217.  * Handle static variable initialize
  218.  */
  219. {
  220. sp->tp->uflags |= UF_DEFINED;
  221. allocated = FALSE;
  222. baseoffs = 0;
  223. totbits = 0;
  224. cursize = -1;
  225. bits = -1;
  226. locsp = sp;
  227. sptr = &sp->init;
  228. if (!sp->indecltable) {
  229.   struct declares * p = xalloc(sizeof(struct declares));
  230. p -> sp = sp;
  231. p->link = 0;
  232. if (declarations)
  233. decltail = decltail->link = p;
  234. else
  235. decltail = declarations = p;
  236. sp->indecltable = TRUE;
  237. }
  238.         if( lastst == assign) {
  239. if (sp->init)
  240. gensymerror(ERR_MULTIPLEINIT,sp->name);
  241. if (sp->absflag) {
  242. generror(ERR_NOINIT,0,skm_declend);
  243.           return;
  244. }
  245.                 getsym();
  246.                 inittype(sp->tp);
  247. *sptr = 0;
  248.         }
  249.         endinit();
  250. }
  251. int     inittype(TYP *tp)
  252. /*
  253.  * Init for basic types
  254.  */
  255. {       int     nbytes;
  256.         switch(tp->type) {
  257. case bt_float:
  258. nbytes = initfloat();
  259. break;
  260. case bt_longdouble:
  261. nbytes = initlongdouble();
  262. break;
  263. case bt_double:
  264. nbytes = initdouble();
  265. break;
  266.                 case bt_char:
  267.                         nbytes = initchar();
  268.                         break;
  269.                 case bt_unsignedchar:
  270.                         nbytes = inituchar();
  271.                         break;
  272.                 case bt_unsignedshort:
  273.                         nbytes = initushort();
  274.                         break;
  275.                 case bt_short:
  276.                 case bt_enum:
  277.                         nbytes = initshort();
  278.                         break;
  279.                 case bt_ptrfunc:
  280.                         nbytes = initpointerfunc();
  281.                         break;
  282.                 case bt_pointer:
  283.                         if( tp->val_flag)
  284.                                 nbytes = initarray(tp);
  285.                         else
  286.                                 nbytes = initpointer();
  287.                         break;
  288. #ifdef CPLUSPLUS
  289. case bt_ref:
  290. nbytes = initref(tp->btp);
  291. break;
  292. #endif
  293.                 case bt_unsigned:
  294.                         nbytes = initulong();
  295.                         break;
  296.                 case bt_long:
  297.                 case bt_matchall:
  298.                         nbytes = initlong();
  299.                         break;
  300.                 case bt_struct:
  301.                         nbytes = initstruct(tp);
  302.                         break;
  303.                 default:
  304.    gensymerror(ERR_NOINIT,locsp->name);
  305.                         nbytes = 0;
  306.                 }
  307. baseoffs+=nbytes;
  308.         return nbytes;
  309. }
  310. int initarray(TYP *tp)
  311. /*
  312.  * Init for arrays
  313.  */
  314. {       int     nbytes;
  315. int canpad = FALSE;
  316.         char    *p;
  317. int needend = FALSE;
  318.         nbytes = 0;
  319.         if( lastst == begin) {
  320.                 getsym();               /* skip past the brace */
  321. needend = TRUE;
  322. if ((tp->btp->type == bt_char  || tp->btp->type ==bt_unsignedchar)&& lastst == sconst)
  323. goto grabchar;
  324. if ((tp->btp->type == bt_short  || tp->btp->type ==bt_unsignedshort)&& lastst == lsconst)
  325. goto grabchar;
  326.                 while(lastst != end) {
  327.                         nbytes += inittype(tp->btp);
  328.                         if( lastst == comma)
  329.                                 getsym();
  330.                         else if( lastst != end) {
  331.                                 expecttoken(end,0);
  332. break;
  333. }
  334.                         }
  335.                 getsym();               /* skip closing brace */
  336.                 }
  337.         else { 
  338. grabchar:
  339. allocated = TRUE;
  340. nbytes = 0;
  341. if ((tp->btp->type == bt_char  || tp->btp->type ==bt_unsignedchar)&& lastst == sconst) {
  342. canpad = TRUE;
  343. while (lastst == sconst) {
  344.                 p = laststr;
  345. while (*p) {
  346. nbytes++;
  347. agflush(1,*p++);
  348. }
  349.                 getsym();
  350. }
  351. if (needend)
  352. needpunc(end,skm_declend);
  353. agflush(1,0);
  354. nbytes++;
  355.   } else if ((tp->btp->type == bt_short  || tp->btp->type ==bt_unsignedshort)&& lastst == lsconst) {
  356. while (lastst == lsconst) {
  357.                 p = laststr;
  358. while (*p) {
  359. nbytes+=2;
  360. agflush(2,*p++);
  361. }
  362.                 getsym();
  363. }
  364. if (needend)
  365. needpunc(end,skm_declend);
  366. agflush(2,0);
  367. nbytes +=2;
  368.             }
  369.             else generror(ERR_PUNCT,semicolon,0);
  370. }
  371.         if( nbytes < tp->size) {
  372. nl();
  373.                 makestorage( tp->size - nbytes);
  374.                 nbytes = tp->size;
  375.                 }
  376.         else if (tp->size == 0)
  377. tp->size = nbytes;
  378. else if( nbytes > tp->size && (!canpad || nbytes > tp->size+1))
  379.                 generror(ERR_INITSIZE,0,0);    /* too many initializers */
  380.         return nbytes;
  381. }
  382. int initstruct(TYP *tp)
  383. /*
  384.  * Init for structures
  385.  */
  386. {       SYM     *sp;
  387.         int     nbytes;
  388.         needpunc(begin,0);
  389.         nbytes = 0;
  390.         sp = tp->lst.head;      /* start at top of symbol table */
  391.         while(sp != 0 && lastst != end) {
  392. startbit = sp->tp->startbit;
  393. bits = sp->tp->bits;
  394. if (nbytes < sp->value.i)
  395. makestorage(sp->value.i - nbytes);
  396. nbytes = sp->value.i;
  397.                 nbytes += inittype(sp->tp);
  398.                 if( lastst == comma)
  399.                         getsym();
  400.                 else if(lastst == end)
  401.                         break;
  402.                 else
  403.                         expecttoken(end,0);
  404.                 sp = sp->next;
  405.                 }
  406. nbytes += agbits(-1,0);
  407.         if( nbytes < tp->size) {
  408. makestorage(tp->size - nbytes);
  409. }
  410.         needpunc(end,skm_declend);
  411.         return tp->size;
  412. }
  413. int makelabel(void)
  414. {
  415. struct decldata *q = *sptr = xalloc(sizeof(struct decldata));
  416. q->val.i = tostring();
  417. sptr = &(*sptr)->link;
  418. q->mode = dd_label;
  419. }
  420. int makeref(int ispc, SYM *sp, long val)
  421. {
  422. struct decldata *q = *sptr = xalloc(sizeof(struct decldata));
  423. sp->extflag = TRUE;
  424. q->val.sp = sp;
  425. q->offset = val;
  426. sptr = &(*sptr)->link;
  427. q->mode = ispc ? dd_pcname : dd_dataname;
  428. }
  429. int makestorage(long val)
  430. {
  431. struct decldata *q = *sptr = xalloc(sizeof(struct decldata));
  432. q->val.i = val;
  433. sptr = &(*sptr)->link;
  434. q->mode = dd_storage;
  435. }
  436. int agflush(int size, long val)
  437. /*
  438.  * flush a bit field when it is full
  439.  */
  440. {
  441. struct decldata *q = *sptr = xalloc(sizeof(struct decldata));
  442. q->val.i = val;
  443. sptr = &(*sptr)->link;
  444. switch (size) {
  445. case 1:
  446. q->mode = dd_byte;
  447. return 1;
  448. case 2:
  449. q->mode = dd_word;
  450. return 2;
  451. case 4:
  452. q->mode = dd_long;
  453. return 4;
  454. default:
  455. q->mode = dd_byte;
  456. return 0;
  457. }
  458. }
  459. /* Aggregate bits */
  460. int agbits(int size, long value)
  461. /*
  462.  * ombine bit declarations into a bit field
  463.  */
  464. {
  465. long rv = 0;
  466. if (cursize != -1 && (size != cursize || bits == -1 || (bits != -1 &&startbit==0))) {
  467. rv = agflush(cursize,totbits);
  468. cursize = -1;
  469. totbits = 0;
  470. }
  471. if (bits != -1) {
  472. totbits |= (value & bittab[bits-1]) << startbit;
  473. cursize = size;
  474. }
  475. else {
  476. if (size != -1)
  477. rv+= agflush(size,value);
  478. cursize = -1;
  479. totbits = 0;
  480. }
  481. startbit = -1;
  482. return(rv);
  483. }
  484. /* Basic type subroutines */
  485. int initfloat(void)
  486. {
  487. struct decldata *q = *sptr = xalloc(sizeof(struct decldata));
  488. q->val.f = floatexpr();
  489. sptr = &(*sptr)->link;
  490. q->mode = dd_float;
  491. allocated = TRUE;
  492. return(4);
  493. }
  494. int initlongdouble(void)
  495. {
  496. struct decldata *q = *sptr = xalloc(sizeof(struct decldata));
  497. q->val.f = floatexpr();
  498. sptr = &(*sptr)->link;
  499. q->mode = dd_ldouble;
  500. allocated = TRUE;
  501. return(stdldoublesize);
  502. }
  503. int initdouble(void)
  504. {
  505. struct decldata *q = *sptr = xalloc(sizeof(struct decldata));
  506. allocated = TRUE;
  507. q->val.f = floatexpr();
  508. sptr = &(*sptr)->link;
  509. q->mode = dd_double;
  510. return(8);
  511. }
  512. int initchar(void)
  513. {       
  514. long t;
  515. int rv;
  516. allocated = TRUE;
  517. rv = agbits(1,t = intexpr(0));
  518. if (t < SCHAR_MIN || t > SCHAR_MAX)
  519. generror(ERR_CONSTTOOLARGE,0,0);
  520. return rv;
  521. }
  522. int initshort(void)
  523. {   
  524. long t;
  525. int rv;
  526. allocated = TRUE;
  527. rv = agbits(2,t = intexpr(0));
  528. if (t < SHRT_MIN || t > SHRT_MAX)
  529. generror(ERR_CONSTTOOLARGE,0,0);
  530. return rv;
  531. }
  532. int inituchar(void)
  533. {       
  534. long t;
  535. int rv;
  536. allocated = TRUE;
  537. rv = agbits(1,t = intexpr(0));
  538. if (t < 0 || t > UCHAR_MAX)
  539. generror(ERR_CONSTTOOLARGE,0,0);
  540. return rv;
  541. }
  542. int initushort(void)
  543. {   
  544. long t;
  545. int rv;
  546. allocated = TRUE;
  547. rv = agbits(2,t = intexpr(0));
  548. if (t < 0 || t > USHRT_MAX)
  549. generror(ERR_CONSTTOOLARGE,0,0);
  550. return rv;
  551. }
  552. int initlong(void)
  553. {       
  554. long t;
  555. int rv;
  556. allocated = TRUE;
  557. rv = agbits(4,t = intexpr(0));
  558. if (t < LONG_MIN || t > LONG_MAX)
  559. generror(ERR_CONSTTOOLARGE,0,0);
  560. return rv;
  561. }
  562. int initulong(void)
  563. {   
  564. long t;
  565. int rv;
  566. allocated = TRUE;
  567. rv = agbits(4,t = intexpr(0));
  568. if (t < 0 || t > ULONG_MAX)
  569. generror(ERR_CONSTTOOLARGE,0,0);
  570. return rv;
  571. }
  572. void getreflvalue(ENODE **node, TYP **tp,int pointer)
  573. /*
  574.  * create a node tree for pointer and references that are going in as data
  575.  */
  576. {
  577. SYM *sp;
  578. ENODE *pnode=0;
  579. sp = 0;
  580. while (lastst == star) {
  581. getsym();
  582. getreflvalue(&pnode,tp,pointer);
  583. if ((*tp)->type == bt_pointer) {
  584. *tp = (*tp)->btp;
  585. pnode = makenode(en_l_ref,pnode,0);
  586. }
  587. else {
  588. generror(ERR_DEREF,0,0);
  589. }
  590. *node = pnode;
  591. return;
  592. }
  593. if (lastst == and && pointer) {
  594. getsym();
  595. getreflvalue(&pnode,tp,pointer);
  596. if (!((*tp)->type == bt_ifunc) && !((*tp)->type == bt_func) && !(*tp)->val_flag) {
  597. TYP *tp1 = maketype(bt_pointer,4);
  598. tp1->btp = *tp;
  599. *tp = tp1;
  600. if (pnode)
  601. pnode = pnode->v.p[0];
  602. }
  603. *node = pnode;
  604. return;
  605. }
  606. if (lastst != id) {
  607. long temp;
  608. getsym();
  609. temp = intexpr(tp);
  610. (*node) = makenode(en_icon,(char *)temp,0);
  611. return;
  612. }
  613. if ((sp = search(lastid,&gsyms)) == 0) {
  614. gensymerror(ERR_UNDEFINED,lastid);
  615. return;
  616. }
  617. pnode = makenode(en_nacon,(char *)sp->name,0);
  618. if (pointer && !sp->tp->val_flag)
  619. pnode = makenode(en_l_ref,pnode,0);
  620. *tp = sp->tp;
  621. getsym();
  622. while (TRUE) {
  623. long temp;
  624. switch(lastst) {
  625.     case openbr:    /* build a subscript reference */
  626. getsym();
  627. temp = intexpr(0);
  628.        if( (*tp)->type != bt_pointer )
  629.          generrorexp(ERR_NOPOINTER,0,skm_closebr);
  630.       else {
  631.          (*tp) = (*tp)->btp;
  632. pnode = makenode(en_add,pnode,makenode(en_icon,(char *)(temp*(*tp)->size),0));
  633. }
  634.        needpuncexp(closebr,skm_closebr);
  635.        break;
  636.       case pointsto:
  637.         if( (*tp)->type != bt_pointer ) {
  638.          generror(ERR_NOPOINTER,0,0);
  639. while (lastst == pointsto || lastst == dot) {
  640. getsym();
  641. getsym();
  642. }
  643. break;
  644. }
  645.         else {
  646.          (*tp) = (*tp)->btp;
  647. pnode = makenode(en_l_ref,pnode,0);
  648. }
  649. /*
  650.  *      fall through to dot operation
  651.  */
  652.       case dot:
  653.         getsym();       /* past -> or . */
  654.       if( lastst != id )
  655.          generror(ERR_IDEXPECT,0,0);
  656.        else    {
  657.          sp = search(lastid,&(*tp)->lst);
  658.          if( sp == 0 ) {
  659. (*tp) = &stdmatch;
  660.           gensymerror(ERR_UNDEFINED,lastid);
  661. getsym();
  662. while (lastst == pointsto || lastst == dot) {
  663. getsym();
  664. getsym();
  665. }
  666. }
  667.          else    {
  668. pnode = makenode(en_add,pnode,makenode(en_icon,(char *)sp->value.i,0));
  669.            (*tp) = sp->tp;
  670.            getsym();       /* past id */
  671.          }
  672.          break;
  673. }
  674. case plus:
  675. getsym();
  676. pnode = makenode(en_add,pnode,makenode(en_icon,(char *)intexpr(0),0));
  677. break;
  678. case minus:
  679. getsym();
  680. pnode = makenode(en_add,pnode,makenode(en_icon,(char *)(-intexpr(0)),0));
  681. break;
  682. default:
  683. *node =pnode;
  684. return;
  685. }
  686. }
  687. }
  688. int checkrefeval(ENODE *node)
  689. /*
  690.  * see if a reference node can be evaluated at compile time
  691.  */
  692. {
  693. switch(node->nodetype) {
  694. case en_add:
  695. return(checkrefeval(node->v.p[0]) || checkrefeval(node->v.p[1]));
  696. case en_l_ref:
  697. return 1;
  698. case en_nacon:
  699. case en_icon:
  700. case en_lcon:
  701. case en_lucon:
  702. case en_iucon:
  703. return 0;
  704. default:
  705. return 1;
  706. }
  707. }
  708. int refeval(ENODE *one, ENODE **two)
  709. /*
  710.  * compile time evaluation of references and pointers */
  711. {
  712. while (1) {
  713. switch (one->nodetype) {
  714. case en_add:
  715. return(refeval(one->v.p[0],two) + refeval(one->v.p[1],two));
  716. case en_icon:
  717. case en_lcon:
  718. case en_lucon:
  719. case en_iucon:
  720. return(one->v.i);
  721. case en_nacon:
  722. *two = one;
  723. return 0;
  724. default:
  725. return 0;
  726. }
  727. }
  728. }
  729. #ifdef CPLUSPLUS
  730. int initref(TYP *tp)
  731. /*
  732.  * init for reference variables
  733.  */
  734. {
  735. SYM *sp;
  736. TYP *tp1;
  737. ENODE *node=0,*node1;
  738. int ofs;
  739. allocated = TRUE;
  740. getreflvalue(&node,&tp1,0);
  741. if (!node || !checktype(tp,tp1)) {
  742. genstorage(4);
  743. generror(ERR_REFLVALUE,0,0);
  744. }
  745. else {
  746. if (!checkrefeval(node)) {
  747. ofs = refeval(node,&node1);
  748. sp = search(node1->v.sp,&gsyms);
  749. makeref(FALSE,sp,ofs);
  750. sp->tp->uflags |= UF_USED;
  751. }
  752. else  {
  753. node1 = makenode(en_l_ref,makenode(en_nacon,locsp->name,0),0);
  754. node1 = makenode(en_assign,node1,node);
  755. cppinitinsert(node1);
  756. genstorage(4);
  757. }
  758. }
  759. endinit();
  760. return 4;
  761. }
  762. #endif
  763. int initpointer(void)
  764. {       SYM     *sp;
  765. ENODE *node=0,*node1;
  766. TYP *tp1;
  767. allocated = TRUE;
  768.         if(lastst == sconst) {
  769.                 makelabel();
  770.                 }
  771.         else if(lastst == lsconst) {
  772.                 makelabel();
  773.                 }
  774. else if (lastst == iconst || lastst == lconst || lastst == iuconst || lastst == luconst) {
  775. long temp;
  776. TYP *tp;
  777.                 agflush(4,temp = intexpr(&tp));
  778. if (temp && (tp->type != bt_pointer && tp->type != bt_ptrfunc))
  779. generror(ERR_NONPORT,0,0);
  780. }
  781. else {
  782. getreflvalue(&node,&tp1,1);
  783. if (!node || (tp1->type != bt_pointer && tp1->type != bt_func && tp1->type != bt_ifunc && !tp1->val_flag))
  784. gensymerror(ERR_NOINIT,locsp->name);
  785. else {
  786. if (!checkrefeval(node)) {
  787. int ofs = refeval(node,&node1);
  788. sp = search(node1->v.sp,&gsyms);
  789. if (sp->tp->type == bt_func || sp->tp->type == bt_ifunc) {
  790.                makeref(TRUE,sp,ofs);
  791. }
  792. else
  793.                makeref(FALSE,sp,ofs);
  794. sp->tp->uflags |= UF_USED;
  795. }
  796. else  {
  797. if (!prm_cplusplus) 
  798. gensymerror(ERR_NOINIT,locsp->name);
  799. #ifdef CPLUSPLUS
  800. else {
  801. node1 = makenode(en_l_ref,makenode(en_nacon,locsp->name,0),0);
  802. node1 = makenode(en_assign,node1,node);
  803. cppinitinsert(node1);
  804. }
  805. #endif
  806. makestorage(4);
  807. }
  808.  }
  809. }
  810.         endinit();
  811.         return 4;       /* pointers are 4 bytes long */
  812. }
  813. int initpointerfunc(void)
  814. {       SYM     *sp;
  815. char *nm;
  816. allocated = TRUE;
  817.         if(lastst == and)     /* address of a variable */
  818.                 getsym();
  819.         if(lastst != id) {
  820. long temp;
  821. TYP *tp;
  822.                 agflush(4,temp = intexpr(&tp));
  823. if (temp && (tp->type != bt_pointer && tp->type != bt_ptrfunc))
  824. generror(ERR_NONPORT,0,0);
  825. endinit();
  826. return(4);
  827.  }
  828.         else  {
  829. #ifdef CPLUSPLUS
  830. if (prm_cplusplus)
  831. nm = cppmangle(lastid,locsp->tp);
  832. else
  833. #endif
  834. nm = lastid;
  835. if( (sp = gsearch(nm)) == 0)
  836.   gensymerror(ERR_UNDEFINED,nm);
  837.          else
  838.            getsym();
  839. }
  840.         makeref(TRUE,sp,0);
  841. if (sp)
  842. sp->tp->uflags |= UF_USED;
  843.         endinit();
  844.         return 4;       /* pointers are 4 bytes long */
  845. }
  846. /* Finish init */
  847. void endinit(void)
  848. {       if( lastst != comma && lastst != semicolon && lastst != end) {
  849.                 expecttoken(end,0);
  850.                 while( lastst != comma && lastst != semicolon && lastst != end && lastst != eof)
  851.                         getsym();
  852.                 }
  853. }