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

编译器/解释器

开发平台:

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.  * handle ALL declarative statements
  24.  */
  25. #include        <stdio.h>
  26. #include <limits.h>
  27. #include        "expr.h"
  28. #include        "c.h"
  29. #include        "errors.h"
  30. extern int stdinttype,stdunstype,stdintsize, stdldoublesize,stdaddrsize;
  31. extern int strucadd,strucmod;
  32. extern char laststr[];
  33. extern int global_flag;
  34. extern TABLE gsyms,lsyms;
  35. extern SNODE *cbautoinithead;
  36. extern int prm_packing;
  37. extern int prm_revbits;
  38. extern int prm_68020;
  39. extern int prm_ansi;
  40. extern HASHREC **globalhash;
  41. extern SYM *currentfunc;
  42. extern int prm_cplusplus;
  43. extern char * tn_unnamed;
  44. extern TYP stdconst;
  45. extern enum e_sym lastst;
  46. extern char lastid[];
  47. extern int block_nesting;
  48. extern long nextlabel;
  49. char *Cstr = "C";
  50. TABLE *active_table; /* This is so enums will not be put in structre tabs */
  51. int mangleflag;
  52. int skm_declopenpa[] = { semicolon, comma,openpa, eq,0 };
  53. int skm_declclosepa[] = { semicolon, comma,closepa, eq,0 };
  54. int skm_declclosebr[] = { comma,closebr, eq,0 };
  55. int skm_declend[] = { semicolon, comma, end, eq,0 };
  56. int skm_decl[] = {semicolon,kw_int, kw_long, kw_short, kw_char, kw_float,
  57. kw_double, kw_struct, kw_union, kw_enum, kw_unsigned, kw_signed, kw_auto,
  58. kw_extern, kw_static, kw_register, kw_typedef, id, kw_void, 0 };
  59. TYP             *head = 0;
  60. TYP             *tail = 0;
  61. char            declid[100];
  62. TABLE           tagtable = {0,0};
  63. int ispascal;
  64. static SYM *lastdecl;
  65. static  int pcount=0;
  66. static int bittype = -1;
  67. static int curbit = 0;
  68. static int curofs = 0;
  69. static int manglelevel;
  70. static int intflag;
  71. void declini(void)
  72. /*
  73.  * init
  74.  */
  75. {
  76. bittype = -1;
  77. head = tail = 0;
  78. declid[0] = 0;
  79. tagtable.head = tagtable.tail = 0;
  80. pcount = 0;
  81. mangleflag = TRUE;
  82. }
  83. int     imax(int i,int j)
  84. {       return (i > j) ? i : j;
  85. }
  86. char    *litlate(char *s)
  87. {       char    *p;
  88.         p = xalloc(strlen(s) + 1);
  89.         strcpy(p,s);
  90.         return p;
  91. }
  92. TYP     *maketype(int bt,int siz)
  93. /*
  94.  * Create a type list entry
  95.  */
  96. {       TYP     *tp;
  97.         tp = xalloc(sizeof(TYP));
  98.         tp->val_flag = 0;
  99. tp->bits = tp->startbit = -1;
  100.         tp->size = siz;
  101.         tp->type = bt;
  102.         tp->sname = 0;
  103. tp->cflags = 0;
  104. tp->uflags = 0;
  105.         tp->lst.head = tp->lst.tail = 0;
  106. tp->tdef = 0;
  107.         return tp;
  108. }
  109. TYP *cponetype(TYP *t)
  110. /*
  111.  * Copy a entry
  112.  */
  113. { TYP *tp;
  114. tp = xalloc(sizeof(TYP));
  115. tp->type = t->type;
  116. tp->val_flag = t->val_flag;
  117. tp->cflags = t->cflags;
  118. tp->bits = t->bits;
  119. tp->startbit = t->startbit;
  120. tp->size = t->size;
  121. tp->lst = t->lst;
  122. tp->btp = t->btp;
  123. tp->sname = t->sname;
  124. tp->uflags = t->uflags;
  125. tp->tdef = t->tdef;
  126. return tp;
  127. }
  128. TYP *copytype(TYP *itp, int flags)
  129. /*
  130.  * copy a type tree
  131.  */
  132. {
  133. TYP *head, *tail,*x=itp;
  134. while (x->type == bt_pointer)
  135. x = x->btp;
  136. if (x->type == bt_struct || x->type == bt_union)
  137. if (!x->lst.head) {
  138. itp->cflags = flags;
  139. return head = tail = itp;
  140. }
  141. head = tail = cponetype(itp);
  142. while (itp->type == bt_pointer) {
  143. tail = tail->btp = cponetype(itp->btp);
  144. itp = itp->btp;
  145. }
  146. if (itp->type == bt_func || itp->type == bt_ptrfunc || itp->type == bt_ifunc) {
  147. tail->btp = cponetype(itp->btp);
  148. }
  149. else {
  150. tail->cflags |= flags;
  151. }
  152. return head;
  153. }
  154. void     decl(TABLE *table)
  155. /*
  156.  * parse the declare keywords and create a basic type
  157.  */
  158. {
  159. int tp;
  160. SYM *sp;
  161. int flags = 0;
  162. while (lastst == kw_const || lastst == kw_volatile) {
  163. if (lastst == kw_const)
  164. flags |= DF_CONST;
  165. else
  166. flags |= DF_VOL;
  167. getsym();
  168. }
  169.         switch (lastst) {
  170. case kw_void:
  171.                         head = tail = maketype(bt_void,0);
  172. getsym();
  173. break;
  174.                 case kw_char:
  175.                         head = tail = maketype(bt_char,1);
  176.                         getsym();
  177.                         break;
  178.                 case kw_short:
  179. getsym();
  180. tp = bt_short;
  181. if (lastst == kw_unsigned) {
  182. tp = bt_unsignedshort;
  183. getsym();
  184. }
  185. if (lastst == kw_int)
  186. getsym();
  187.                         head = tail = maketype(tp,2);
  188.                         break;
  189.                 case kw_int: 
  190.                         head = tail = maketype(stdinttype,stdintsize);
  191.                         getsym();
  192.                         break;
  193.                 case kw_unsigned:
  194. getsym();
  195. switch (lastst) {
  196. case kw_char:
  197. getsym();
  198.                          head = tail = maketype(bt_unsignedchar,1);
  199. break;
  200. case kw_short:
  201. getsym();
  202. if (lastst == kw_int)
  203. getsym();
  204.                          head = tail = maketype(bt_unsignedshort,2);
  205. break;
  206. case kw_long:
  207. getsym();
  208. if (lastst == kw_long) {
  209. getsym();
  210. generror(ERR_LONGLONG,0,0);
  211. }
  212. if (lastst == kw_int)
  213. getsym();
  214.                          head = tail = maketype(bt_unsigned,4);
  215. break;
  216. case kw_int:
  217. getsym();
  218. default:
  219.                          head = tail = maketype(stdunstype,stdintsize);
  220. break;
  221. }
  222.                         break;
  223.                 case kw_signed:
  224. getsym();
  225. switch (lastst) {
  226. case kw_char:
  227. getsym();
  228.                          head = tail = maketype(bt_char,1);
  229. break;
  230. case kw_short:
  231. getsym();
  232. if (lastst == kw_int)
  233. getsym();
  234.                          head = tail = maketype(bt_short,2);
  235. break;
  236. case kw_long:
  237. getsym();
  238. if (lastst == kw_long) {
  239. getsym();
  240. generror(ERR_LONGLONG,0,0);
  241. }
  242. if (lastst == kw_int)
  243. getsym();
  244.                          head = tail = maketype(bt_long,4);
  245. break;
  246. case kw_int:
  247. getsym();
  248. default:
  249.                          head = tail = maketype(stdinttype,stdintsize);
  250. break;
  251. }
  252.                         break;
  253.                 case id:                /* no type declarator */
  254. if ((sp = gsearch(lastid)) != 0 && sp->storage_class == sc_type) {
  255. head = tail = copytype(sp->tp,flags);
  256. getsym();
  257. }
  258. else
  259.                         head = tail = maketype(bt_long,4);
  260.                         break;
  261.                 case kw_float:
  262.                         head = tail = maketype(bt_float,4);
  263.                         getsym();
  264.                         break;
  265. case kw_long:
  266. getsym();
  267. if (lastst==kw_double) {
  268. getsym();
  269.                          head = tail = maketype(bt_longdouble,stdldoublesize);
  270. break;
  271. }
  272. if (lastst==kw_float) {
  273. getsym();
  274.                          head = tail = maketype(bt_double,8);
  275. break;
  276. }
  277. if (lastst == kw_long) {
  278. getsym();
  279. generror(ERR_LONGLONG,0,0);
  280. }
  281. tp = bt_long;
  282. if (lastst == kw_unsigned) {
  283. tp = bt_unsigned;
  284. getsym();
  285. }
  286. if (lastst == kw_long) {
  287. getsym();
  288. generror(ERR_LONGLONG,0,0);
  289. }
  290. if (lastst == kw_int)
  291. getsym();
  292.                         head = tail = maketype(tp,4);
  293.                         break;
  294.                 case kw_double:
  295.                         head = tail = maketype(bt_double,8);
  296.                         getsym();
  297.                         break;
  298.                 case kw_enum:
  299.                         getsym();
  300.                         declenum(table);
  301.                         break;
  302.                 case kw_struct:
  303.                         getsym();
  304.                         declstruct(table, bt_struct,flags);
  305.                         break;
  306.                 case kw_union:
  307.                         getsym();
  308.                         declstruct(table, bt_union,flags);
  309.                         break;
  310.                 }
  311. head->cflags |= flags;
  312. head->uflags |= UF_CANASSIGN;
  313. }
  314. void decl1(void)
  315. /*
  316.  * Modifiers that could occur BEFORE the name of the var
  317.  */
  318. {       TYP     *temp1, *temp2, *temp3, *temp4;
  319. lp:
  320.         switch (lastst) {
  321. case kw_const:
  322. head->cflags |= DF_CONST;
  323. getsym();
  324. goto lp;
  325. case kw_volatile:
  326. head->cflags |= DF_VOL;
  327. getsym();
  328. goto lp;
  329. case kw__pascal:
  330. ispascal = TRUE;
  331. getsym();
  332. goto lp;
  333.                 case id:
  334. strcpy(declid,lastid);
  335.                         getsym();
  336.                         decl2();
  337.                         break;
  338. case and:
  339. #ifdef CPLUSPLUS
  340. if (prm_cplusplus) {
  341. getsym();
  342. if (prm_cplusplus) {
  343. decl1();
  344. if (head->type == bt_ref || head->type == bt_pointer)
  345. generror(ERR_CANTREF,0,0);
  346. else {
  347. temp1 = maketype(bt_ref,4);
  348. temp1->btp = head;
  349. head = temp1;
  350. if (tail == NULL)
  351. tail = head;
  352. }
  353. }
  354. else 
  355. generror(ERR_NOREF,0,0);
  356. }
  357. else
  358. #endif
  359. {
  360. decl2();
  361. break;
  362. }
  363. break;
  364.                 case star:
  365. head->uflags &= ~UF_CANASSIGN;
  366.                         temp1 = maketype(bt_pointer,4);
  367.                         temp1->btp = head;
  368.                         head = temp1;
  369. head->uflags |= UF_CANASSIGN;
  370.                         if(tail == NULL)
  371.                                 tail = head;
  372.                         getsym();
  373.                         decl1();
  374.                         break;
  375.                 case openpa:
  376.                         getsym();
  377.                       temp1 = head;
  378.                        temp2 = tail;
  379. /* Check here for function pointer */
  380. if (lastst == star) {
  381. getsym();
  382. {
  383.                        head = tail = maketype(bt_ptrfunc,4);
  384.                         head->btp = temp1;
  385. decl1();
  386. if (needpunc(closepa,skm_declclosepa)) {
  387. char temp[40];
  388. /* in case we have a pointer type in
  389.  * parenthesis
  390.  * Isn't C grand? */
  391. if (lastst != openpa) {
  392. /* change the pointerfunc to a pointer */
  393. if (head->type == bt_ptrfunc) 
  394. head->type = bt_pointer;
  395. else {
  396. temp3 = head;
  397. while (temp3->type != bt_ptrfunc)
  398. temp3 = temp3->btp;
  399. temp3->type = bt_pointer;
  400. }
  401. tail = temp2;
  402. decl2();
  403. break;
  404. }
  405. strcpy(temp,declid);
  406. if (head->type == bt_func) {
  407. declid[0] = 0;
  408. temp1 = head;
  409. head = head->btp;
  410. }
  411. else
  412. temp1 = 0;
  413. getsym();
  414. declfuncarg(intflag);
  415. if (temp1) {
  416. strcpy(declid,temp);
  417. temp1->btp = head;
  418. head = temp1;
  419. }
  420. if (lastst == begin) {
  421. temp1->type = bt_ifunc;
  422. break;
  423. }
  424. }
  425. else getsym();
  426. }
  427. }
  428. else {
  429. /* (In case a declaration is in parenthesis */
  430.                          decl1();
  431.                          needpunc(closepa,0);
  432. decl2();
  433. }
  434.                         break;
  435.                 default:
  436.                         decl2();
  437.                         break;
  438.                 }
  439. }
  440. void decl2(void)
  441. /*
  442.  * type modifiers that come AFTER the name of the variable
  443.  */
  444. {       TYP     *temp1;
  445. lp:
  446.         switch (lastst) {
  447. case kw_const:
  448. head->cflags |= DF_CONST;
  449. getsym();
  450. goto lp;
  451. case kw_volatile:
  452. head->cflags |= DF_VOL;
  453. getsym();
  454. goto lp;
  455.                 case openbr:
  456. decl3();
  457. decl2();
  458.                         break;
  459.                 case openpa:
  460.                         getsym();
  461.                       temp1 = maketype(bt_func,0);
  462. head->uflags |= UF_DEFINED;
  463.                        temp1->val_flag = 1;
  464.                        temp1->btp = head;
  465.                        head = temp1;
  466. head->uflags |= UF_DEFINED;
  467. declfuncarg(intflag);
  468. if (lastst == begin) {
  469. temp1->type = bt_ifunc;
  470. break;
  471. }
  472.                         break;
  473. case colon:
  474. getsym();
  475. head->bits = intexpr(0);
  476. if (head->type != bt_long && head->type != bt_unsigned
  477. && head->type != bt_short && head->type != bt_unsignedshort
  478. && head->type != bt_char && head->type != bt_unsignedchar) {
  479. if (prm_ansi)
  480. generror(ERR_INTBITFIELDS,0,0);
  481. else
  482. generror(ERR_BFTYPE,0,0);
  483. head->bits = -1;
  484. }
  485. else
  486. if (prm_ansi && head->size != stdintsize) {
  487. generror(ERR_INTBITFIELDS,0,0);
  488. head->bits = -1;
  489. }
  490. break;
  491.                 }
  492. }
  493. void decl3(void)
  494. /*
  495.  * Array index handling
  496.  */
  497. {
  498.   TYP *temp1, *list[40];
  499. int count = 0,i;
  500. int mustsize = 0;
  501. head->uflags |= UF_DEFINED;
  502. head->uflags &= ~UF_CANASSIGN;
  503. while(lastst == openbr) {
  504.                         getsym();
  505.                         temp1 = maketype(bt_pointer,0);  
  506.                         temp1->val_flag = 1;
  507.                         if(lastst == closebr) {
  508.     if (mustsize)
  509. generror(ERR_SIZE,0,0);
  510.                                 temp1->size = 0;
  511.                                 getsym();
  512.                                 }
  513.                         else {
  514.                                 temp1->size = intexpr(0);
  515.                                 needpunc(closebr,skm_declclosebr);
  516.                                 }
  517. list[count++] = temp1;
  518. mustsize = 1;
  519. }
  520. if (head != NULL) {
  521. list[count-1]->size *= head->size;
  522. if (tail == NULL)
  523. tail = head;
  524. }
  525. for (i=count-1; i>0; i--) {
  526. list[i-1]->size *= list[i]->size;
  527. list[count-1]->uflags |= UF_DEFINED;
  528. }
  529. for (i=0; i < count-1; i++)
  530. list[i]->btp = list[i+1];
  531. list[count-1]->btp = head;
  532. head = list[0];
  533. if (tail == NULL)
  534. tail = list[count-1];
  535. }
  536. int bitsize(int type)
  537. /*
  538.  * Max bit field depends on the type
  539.  */
  540. {
  541. switch (type) {
  542. case bt_char:
  543. case bt_unsignedchar:
  544. return 8;
  545. case bt_short:
  546. case bt_unsignedshort:
  547. return 16;
  548. case bt_long:
  549. case bt_unsigned:
  550. return 32;
  551. }
  552. return 0;
  553. }
  554. int oksize(void)
  555. /*
  556.  * See if the size field is ok or if we should gen a message
  557.  */
  558. {
  559. TYP *q = head;
  560. while (q->type == bt_pointer) {
  561. if (q->val_flag)
  562. return 1;
  563. q = q->btp;
  564. }
  565. return head->size != 0;
  566. }
  567. int     basedeclare(TABLE *table,int al,long ilc,int ztype, int flags)
  568. /*
  569.  *  Once a type declarator is found we come here to get the remainder of the
  570.  * declaration and allocate spae
  571.  *
  572.  */
  573. {       SYM     *sp=0, *sp1;
  574.         TYP     *dhead;
  575.         int     nbytes,ufsave;
  576.         nbytes = 0;
  577.         dhead = head;
  578. ufsave = head->uflags;
  579.         for(;;) {
  580. sp1 = 0;
  581.                 declid[0] = 0;
  582.                 decl1();
  583. /* stupid C standard uses a proper function name
  584. ** as an alias for a pointer to a func when is a member...
  585. */
  586. if (al == sc_member)
  587.   if (head->type == bt_func) {
  588. head->type = bt_ptrfunc;
  589. head->size = 4;
  590. }
  591. else if (head->type == bt_ifunc)
  592. generror(ERR_NOFUNCSTRUCT,0,0);
  593. /* In case they put the extern tag on an ifunc */
  594. if (head->type == bt_ifunc && al == sc_external)
  595. al = sc_global;
  596. if (declid[0] == 0) {
  597. if ((flags & DF_FUNCPARMS)) {
  598. sprintf(declid,"**ARG%d**",pcount++);
  599. }
  600. }
  601. head->cflags |= flags;
  602.                 if( declid[0] != 0) {      /* otherwise just struct tag... */
  603.                     sp = xalloc(sizeof(SYM));
  604. if (head->type == bt_func || head->type == bt_ifunc)
  605. #ifdef CPLUSPLUS
  606. if (prm_cplusplus)
  607. if (!strcmp(declid,"_main")) {
  608. SYM *sp1;
  609. head->sname = sp->name = litlate(declid);
  610. sp1 = search(sp->name,&gsyms);
  611. if (sp1 && sp1->tp->type == bt_ifunc)
  612. generror(ERR_NOOVERMAIN,0,0);
  613. }
  614. else if (mangleflag && !ispascal)
  615. head->sname = sp->name = cppmangle(declid,head);
  616. else
  617. head->sname = sp->name = litlate(declid);
  618. else 
  619. #endif
  620. head->sname = sp->name = litlate(declid);
  621. else
  622. sp->name = litlate(declid);
  623. sp->defalt = 0;
  624.                     sp->storage_class = al;
  625.                     sp->tp = head;
  626. sp->extflag = FALSE;
  627. sp->absflag = (al == sc_abs);
  628. sp->intflag = flags &DF_INT;
  629. sp->pascaldefn = ispascal;
  630. sp->init = 0;
  631. sp->indecltable = 0;
  632. sp->funcparm = 0;
  633. sp->inreg = 0;
  634. sp->staticlabel = FALSE;
  635. if (al == sc_external && lastst == assign)
  636. sp->storage_class = sc_global;
  637. if (sp->intflag && ispascal)
  638. generror(ERR_PASCAL_NO_INT,0,0);
  639. if (al == sc_autoreg) {
  640. if (head->size > 4) {
  641. sp->storage_class = sc_auto;
  642. gensymerror(ERR_ILLREGISTER,sp->name);
  643. }
  644. head->sname = sp->name;
  645. }
  646. if (al != sc_type && (oksize() || sp->tp->type == bt_func || sp->tp->type == bt_ifunc)) {
  647. if (al == sc_abs)
  648. sp->value.i = ilc;
  649. else
  650. if (head->type != bt_func && head->type != bt_ifunc)
  651. if (sp->storage_class == sc_static && table == &lsyms) {
  652. sp->value.i = nextlabel++;
  653. sp->staticlabel = TRUE;
  654. }
  655. else
  656. sp->value.i = block_nesting;
  657. else
  658.   sp->value.i = 0;
  659. {
  660. int align = getalign(al,head);
  661. int noadj = FALSE;
  662. if (al != sc_member || (head->bits != -1 && bittype != head->type && head->bits +curbit > bitsize(head->type))) {
  663. bittype = head->type;
  664. curbit = 0;
  665. }
  666. else
  667. noadj = head->bits != -1;
  668. if (al == sc_member) {
  669. int val;
  670. if (!noadj) {
  671. val = (ilc + nbytes) %align;
  672. if (val)  val = align - val;
  673. nbytes += val;
  674. }
  675. sp->value.i = nbytes + ilc;
  676. if (!noadj)
  677.                          if(ztype == bt_union)
  678.                                nbytes = imax(nbytes,sp->tp->size);
  679.                           else if(al != sc_external)
  680.                                nbytes += sp->tp->size;
  681. }
  682. }
  683. if (head->bits != -1) {
  684. if (al != sc_member) {
  685. generror(ERR_BFILLEGAL,0,0);
  686. head->bits = -1;
  687. }
  688. else if (head->bits > bitsize(head->type)) {
  689. generror(ERR_BFTOOBIG,0,0);
  690. head->bits = -1;
  691. }
  692. else {
  693. if (prm_revbits)
  694. head->startbit = head->size*8-curbit-head->bits;
  695. else
  696. head->startbit = curbit;
  697. curbit+=head->bits;
  698. }
  699. }
  700. if (sp->absflag &&( sp->tp->type == bt_func || sp->tp->type == bt_ifunc))
  701. gensymerror(ERR_ILLCLASS,lastid);
  702. if (sp->intflag &&( sp->tp->type != bt_func && sp->tp->type != bt_ifunc))
  703. gensymerror(ERR_ILLCLASS,lastid);
  704.                       if( sp->tp->type == bt_func  && al != sc_static)
  705.                             sp->storage_class = sc_externalfunc;
  706.    sp1 = search(sp->name,table);
  707. if (sp->name[0] == '@' && !sp1)
  708. funcrefinsert(declid,sp->name,head,table);
  709.                       if (!sp1 || (sp1->tp->type != bt_func && sp1->tp->type != bt_ifunc)) {
  710. if (!sp1 || al == sc_auto || al == sc_autoreg)
  711.                           insert(sp,table);                                                                       
  712. else {
  713. if (!exactype(sp->tp,sp1->tp))
  714. gensymerror(ERR_DECLMISMATCH,sp->name);
  715. if (sp1->tp->size == 0)
  716. sp1->tp = sp->tp;
  717. if (sp1->storage_class == sc_external || sp1->storage_class == sc_externalfunc) {
  718. sp1->storage_class = sp->storage_class;
  719. sp1->tp = sp->tp;
  720. sp1->value.i = sp->value.i;
  721. }
  722. }
  723. }
  724. else 
  725. join:
  726. if (sp1->tp->type == bt_func && sp->tp->type == bt_ifunc){
  727. if (sp1->storage_class == sc_external || sp1->storage_class == sc_externalfunc || sp1->storage_class == sc_static)
  728. if (al == sc_static || sp1->storage_class == sc_static)
  729. sp->storage_class = sp1->storage_class = sc_static;
  730. else
  731. sp->storage_class = sp1->storage_class = sc_global;
  732. }
  733.                       if( sp->tp->type == bt_ifunc) { /* function body follows */
  734.  if (sp1)
  735.  if (sp1->tp->type == bt_ifunc)
  736.    gensymerror(ERR_MULTIPLEINIT,sp->name);
  737.  else
  738.      sp1->tp->type = bt_ifunc;
  739.                              funcbody(sp);
  740.  lastdecl = sp1;
  741.                              return nbytes;
  742.                              }
  743.                       if( (sp->storage_class == sc_global || sp->storage_class == sc_static) &&
  744.                             sp->tp->type != bt_func && sp->tp->type != bt_ifunc
  745. && !(flags & DF_FUNCPARMS)) {
  746. if (sp->tp->type == bt_ref && lastst != assign)
  747. gensymerror(ERR_REFMUSTINIT,lastid);
  748. if (!sp1)
  749. sp1 = sp;
  750.                           doinit(sp1);
  751. }
  752. else 
  753. if (al == sc_auto || al == sc_autoreg) {
  754. #ifdef CPLUSPLUS
  755. if (prm_cplusplus &&(flags & DF_FUNCPARMS)) {
  756. dodefaultinit(sp);
  757. }
  758. else{
  759. if (sp->tp->type == bt_ref && lastst != assign)
  760. gensymerror(ERR_REFMUSTINIT,lastid);
  761. }
  762. #endif
  763.   doautoinit(sp);
  764. }
  765. }
  766. else if (al != sc_type) {
  767. gensymerror(ERR_SIZE,declid);
  768. expskim(skm_declclosepa);
  769. }
  770. else if (sp->tp->type == bt_func || sp->tp->type == bt_ifunc) {
  771. gensymerror(ERR_ILLTYPE,declid);
  772. expskim(skm_declclosepa);
  773. }
  774. else {
  775. if (sp->tp->size) {
  776. sp->tp = copytype(sp->tp,0);
  777. sp->tp->sname = sp->name;
  778. }
  779.                             insert(sp,table);
  780. }
  781.                 }
  782. if (!(flags & DF_FUNCPARMS)) {
  783.                 if(lastst == semicolon)
  784.                         break;
  785. dhead = copytype(dhead,0);
  786.                  needpunc(comma,0);
  787. }
  788. else {
  789.                 if(lastst == comma)
  790. break;
  791. if (sp1)
  792. lastdecl = sp1;
  793. else
  794. lastdecl = sp;
  795.                   return(nbytes);
  796. }
  797.                 if(declbegin(lastst) == 0)
  798.                         break;
  799.                 head = dhead;
  800. head->uflags = ufsave;
  801.                 }
  802.         getsym();
  803. if (sp1)
  804. lastdecl = sp1;
  805. else
  806. lastdecl = sp;
  807.         return nbytes;
  808. }
  809. int     declare(TABLE *table,int al,int ztype, int flags)
  810. /*
  811.  * In this wrapper we do an ENTIRE declaration
  812.  */
  813. {
  814. int old_gf = global_flag,rv;
  815. if (al != sc_member)
  816. active_table = table;
  817. if (al == sc_static)
  818. global_flag ++;
  819.         decl(table);
  820. rv = basedeclare(table,al,0,ztype,flags);
  821. global_flag = old_gf;
  822. return rv;
  823. }
  824. int     declare2(TABLE *table,int al,int ztype, int flags, long val)
  825. /*
  826.  * In this wrapper we do an ENTIRE declaration
  827.  */
  828. {
  829. int old_gf = global_flag,rv;
  830. if (al != sc_member)
  831. active_table = table;
  832. if (al == sc_static)
  833. global_flag ++;
  834.         decl(table);
  835. rv = basedeclare(table,al,val,ztype,flags);
  836. global_flag = old_gf;
  837. return rv;
  838. }
  839. int     declbegin(int st)
  840. /*
  841.  * This determines if another variable is being declared of the same type
  842.  */
  843. {       return st == star || st == id || st == openpa ||
  844.                 st == openbr;
  845. }
  846. void declenum(TABLE *table)
  847. /*
  848.  * declare enums
  849.  */
  850. {       SYM     *sp;
  851.         TYP     *tp;
  852. char *nm;
  853.         if( lastst == id) {
  854. /* tagged */
  855.                 if((sp = search(nm = litlate(lastid),&tagtable)) == 0) {
  856.                         sp = xalloc(sizeof(SYM));
  857.                         sp->tp = xalloc(sizeof(TYP));
  858.                         sp->tp->type = bt_enum;
  859.                         sp->tp->size = 2;
  860.                         sp->tp->lst.head = sp->tp->btp = 0;
  861.                         sp->storage_class = sc_type;
  862.                         sp->name = nm;
  863.                         sp->tp->sname = sp->name;
  864. sp->tp->bits = sp->tp->startbit = -1;
  865. #ifdef CPLUSPLUS
  866. /* tags are also typedefs in C++ */
  867. if (prm_cplusplus)
  868. insert(sp,active_table);
  869. #endif
  870.                         getsym();
  871.                         if( lastst != begin)
  872.                                 generror(ERR_PUNCT,begin,skm_declend);
  873.                         else    {
  874.                                 insert(sp,&tagtable);
  875.                                 getsym();
  876.                                 enumbody(table);
  877.                                 }
  878.                         }
  879.                 else
  880.                         getsym();
  881.                 head = sp->tp;
  882.                 }
  883.         else    {
  884. /* untagged */
  885.                 tp = xalloc(sizeof(TYP));
  886.                 tp->type = bt_enum;
  887.                 tp->lst.head = tp->btp = 0;
  888. tp->size = 2;
  889. tp->bits = tp->startbit = -1;
  890. tp->sname = 0;
  891.                 if( lastst != begin)
  892.                         generror(ERR_PUNCT,begin,skm_declend);
  893.                 else    {
  894.                         getsym();
  895.                         enumbody(table);
  896.                         }
  897.                 head = tp;
  898.                 }
  899. }
  900. void enumbody(TABLE *table)
  901. /*
  902.  * read the enumeration constants in
  903.  */
  904. {       long     evalue;
  905.         SYM     *sp;
  906.         evalue = 0;
  907.         while(lastst == id) {
  908.                 sp = xalloc(sizeof(SYM));
  909.                 sp->value.i = evalue++;
  910.                 sp->name = litlate(lastid);
  911.                 sp->storage_class = sc_const;
  912.                 sp->tp = &stdconst;
  913.                 insert(sp,active_table);
  914.                 getsym();
  915. if (lastst == assign) {
  916. getsym();
  917. evalue = sp->value.i = intexpr(0);
  918. sp->value.i = evalue++;
  919. if (sp->value.i < SHRT_MIN || sp->value.i >SHRT_MAX)
  920. generror(ERR_CONSTTOOLARGE,0,0);
  921. }
  922.                 if( lastst == comma)
  923.                         getsym();
  924.                 else if(lastst != end)
  925.                         break;
  926.                 }
  927.         needpunc(end,skm_declend);
  928. }
  929. void declstruct(TABLE *table, int ztype, int flags)
  930. /*
  931.  * declare a structure or union type
  932.  */
  933. {       SYM     *sp;
  934.         TYP     *tp;
  935. char *nm = litlate(lastid);
  936.         if(lastst == id) {
  937. /* tagged */
  938.                 if((sp = search(nm,&tagtable)) == 0) {
  939. /* if tag was never defined */
  940.                         sp = xalloc(sizeof(SYM));
  941.                         sp->name = nm;
  942.                         sp->tp = xalloc(sizeof(TYP));
  943.                         sp->tp->type = ztype;
  944.                         sp->tp->lst.head = 0;
  945.                         sp->storage_class = sc_type;
  946.                         sp->tp->sname = sp->name;
  947. sp->tp->cflags = flags;
  948. sp->tp->uflags = UF_DEFINED;
  949. sp->tp->size = 0;
  950. #ifdef CPLUSPLUS
  951. /* tags are also typedefs in C++ */
  952. if (prm_cplusplus)
  953. insert(sp,table);
  954. #endif
  955.                         getsym();
  956.                         if(lastst != begin) {
  957.                                 insert(sp,&tagtable);
  958. /* if (lastst != semicolon)
  959. generror(ERR_PUNCT,semicolon,skm_declend);
  960. */ }
  961.                         else    {
  962.                                 insert(sp,&tagtable);
  963.                                 getsym();
  964.                                 structbody(sp->tp,sp->name,ztype);
  965.                                 }
  966.                         }
  967.                 else {
  968. /* Allow redefinition if it was forward declared */
  969.                         getsym();
  970. if (lastst == begin) {
  971. getsym();
  972. if (sp->tp->size == 0) 
  973. structbody(sp->tp,sp->name,ztype);
  974. else {
  975. gensymerror(ERR_DUPSYM,sp->name);
  976. expskim(skm_declclosebr);
  977. }
  978. }
  979. }
  980. if (flags & (DF_CONST | DF_VOL))
  981. head = copytype(sp->tp,flags);
  982. else
  983.                  head = sp->tp;
  984. head->bits = head->startbit = -1;
  985.                 }
  986.         else    {
  987. /* untagged */
  988.                 tp = xalloc(sizeof(TYP));
  989.                 tp->type = ztype;
  990. tp->cflags = flags;
  991. tp->uflags = UF_DEFINED;
  992.                 tp->sname = 0;
  993.                 tp->lst.head = 0;
  994. tp->bits = tp->startbit =-1;
  995.                 if( lastst != begin)
  996.                         generror(ERR_PUNCT,begin,skm_declend);
  997.                 else    {
  998.                         getsym();
  999.                         structbody(tp,tn_unnamed,ztype);
  1000.                         }
  1001.                 head = tp;
  1002.                 }
  1003. }
  1004. void structbody(TYP *tp,char  *name,int ztype)
  1005. /*
  1006.  * read in the structure/union elements and calculate the total size
  1007.  */
  1008. {       int     slc;
  1009.         slc = 0;
  1010.         tp->val_flag = 1;
  1011. tp->uflags &= ~UF_CANASSIGN;
  1012.         while( lastst != end) {
  1013. int flags=0;
  1014.                 if(ztype == bt_struct)
  1015.                         slc += declare2(&tp->lst,sc_member,ztype,flags,slc);
  1016.                 else
  1017.                         slc = imax(slc,declare2(&tp->lst,sc_member,ztype,flags,0));
  1018. if (tp->lst.tail->tp->type == bt_ref)
  1019. genclasserror(ERR_REFNOCONS,name,tp->lst.tail->name);
  1020. tp->lst.tail->tp->uflags |= UF_DEFINED;
  1021.                 }
  1022. if (!prm_packing)
  1023.          tp->size = (slc+strucadd)&strucmod;
  1024. else
  1025. tp->size = slc;
  1026.         getsym();
  1027. }
  1028. void check_used(void)
  1029. /*
  1030.  * At the end of compilition we check for some common cases where 
  1031.  * module-scoped variables are either missing or unused
  1032.  */
  1033. {
  1034. int i;
  1035. SYM *sp;
  1036. for (i=0; i < HASHTABLESIZE; i++) {
  1037. if ((sp=(SYM *) globalhash[i]) != 0) {
  1038. while (sp) {
  1039. if (sp->storage_class == sc_static)
  1040. if (sp->tp->uflags & UF_USED) {
  1041. if (sp->tp->type == bt_func)
  1042. gensymerror(ERR_NOSTATICFUNC,sp->name);
  1043. }
  1044. else
  1045. if (sp->tp->type == bt_ifunc || sp->tp->type == bt_func)
  1046. gensymerror(ERR_FUNCUNUSED,sp->name);
  1047. else
  1048. gensymerror(ERR_STATICSYMUNUSED,sp->name);
  1049. sp = sp->next;
  1050. }
  1051. }
  1052. }
  1053. sp = tagtable.head;
  1054. while (sp) {
  1055. if (sp->tp->size == 0) 
  1056. gensymerror(ERR_NEVERSTRUCT,sp->name);
  1057. sp = sp->next;
  1058. }
  1059. }
  1060. void compile(void)
  1061. /*
  1062.  * Main compiler routine
  1063.  */
  1064. {       while(lastst != eof) {
  1065.                 dodecl(sc_global);
  1066. if (lastst != eof) {
  1067. generror(ERR_DECLEXPECT,0,0);
  1068. getsym();
  1069. }
  1070.         }
  1071.         flush_peep();
  1072. dumplits();
  1073. initrundown();
  1074. dumpstartups();
  1075. check_used();
  1076. putexterns();
  1077. }
  1078. void dodecl(int defclass)
  1079. /*
  1080.  * Declarations come here, ALWAYS
  1081.  */
  1082. {
  1083. SYM *sp;
  1084. int flags = 0;
  1085. long val;
  1086. char *nm;
  1087. cbautoinithead = 0;
  1088.         for(;;) {
  1089. ispascal = FALSE;
  1090.             switch(lastst) {
  1091. case semicolon:
  1092. getsym();
  1093. break;
  1094. case kw_typedef:
  1095. getsym();
  1096. if (defclass == sc_global)
  1097. declare(&gsyms,sc_type,bt_struct, 0);
  1098. else
  1099. declare(&lsyms,sc_type,bt_struct, 0);
  1100. break;
  1101.                 case kw_register:
  1102.                         if( defclass != sc_auto || flags & DF_VOL) {
  1103.                           gensymerror(ERR_ILLCLASS,lastid);
  1104.                          getsym();
  1105. }
  1106. else  {
  1107.                          getsym();
  1108.                              declare(&lsyms,sc_autoreg,bt_struct,flags | DF_AUTOREG);
  1109. };
  1110. break;
  1111.                 case id:
  1112. if (defclass == sc_auto)
  1113. if (!(((sp = search(nm = litlate(lastid),&gsyms)) != 0 && sp->storage_class == sc_type)
  1114.      || ((sp = search(nm,&lsyms)) != 0 && sp->storage_class == sc_type)))
  1115. return;
  1116. case kw_volatile:
  1117. case kw_const:
  1118.                 case kw_char: case kw_int: case kw_short: case kw_unsigned:
  1119.                 case kw_long: case kw_struct: case kw_union: case kw_signed:
  1120.                 case kw_enum: case kw_void:
  1121.                 case kw_float: case kw_double:
  1122.                     if( defclass == sc_global)
  1123.                             declare(&gsyms,sc_global,bt_struct,flags | DF_GLOBAL);
  1124.                     else if( defclass == sc_auto)
  1125.                             declare(&lsyms,sc_auto,bt_struct,flags);
  1126.                     else
  1127.                         declare(&lsyms,sc_auto,bt_struct,flags);
  1128.                     break;
  1129.                 case kw_static:
  1130.                         if( defclass == sc_member) {
  1131.                            gensymerror(ERR_ILLCLASS,lastid);
  1132. getsym();
  1133. break;
  1134. }
  1135. getsym();
  1136. if( defclass == sc_auto)
  1137. declare(&lsyms,sc_static,bt_struct,flags | DF_GLOBAL);
  1138. else
  1139. declare(&gsyms,sc_static,bt_struct,flags | DF_GLOBAL);
  1140.                         break;
  1141.                 case kw_extern: {
  1142. int thismangle = FALSE;
  1143.                         getsym();
  1144. #ifdef CPLUSPLUS
  1145. if (prm_cplusplus && lastst == sconst) {
  1146. if (!strcmp(laststr,Cstr)) {
  1147. mangleflag = FALSE;
  1148. manglelevel++;
  1149. getsym();
  1150. if (lastst == begin) {
  1151. getsym();
  1152.   thismangle = FALSE;
  1153. }
  1154. else thismangle = TRUE;
  1155. }
  1156. }
  1157. #endif
  1158.                         if( defclass == sc_member) {
  1159.                             gensymerror(ERR_ILLCLASS,lastid);
  1160. break;
  1161. }
  1162.                         ++global_flag;
  1163.                         declare(&gsyms,sc_external,bt_struct,flags);
  1164.                         --global_flag;
  1165. if (thismangle && !--manglelevel)
  1166. mangleflag = TRUE;
  1167. }
  1168.                         break;
  1169. case end:
  1170. #ifdef CPLUSPLUS
  1171. if (prm_cplusplus && manglelevel) {
  1172. mangleflag = (!--manglelevel);
  1173. getsym();
  1174. continue;
  1175. }
  1176. #endif
  1177. return;
  1178. case kw__interrupt:
  1179. intflag = 1;
  1180. flags |= DF_INT;
  1181. getsym();
  1182. continue;
  1183. case kw__abs:
  1184. ++global_flag;
  1185. getsym();
  1186. if (lastst != openpa) {
  1187. generror(ERR_PUNCT,openpa,0);
  1188. }
  1189. else {
  1190. getsym();
  1191. val = intexpr(0);
  1192. if (lastst != closepa)
  1193. generror(ERR_PUNCT,closepa,skm_declclosepa);
  1194. }
  1195. getsym();
  1196. declare2(&gsyms,sc_abs,bt_struct,flags,val);
  1197. --global_flag;
  1198. break;
  1199.                 default:
  1200.                         return;
  1201.                 }
  1202. flags = 0;
  1203. intflag = 0;
  1204.             }
  1205. }
  1206. void doargdecl(int defclass, char *names[], int *nparms, TABLE *table, int isinline)
  1207. /*
  1208.  * Function arguments are declared here
  1209.  */
  1210. {
  1211. SYM *sp;
  1212. int flags = isinline ? DF_FUNCPARMS : 0;
  1213.         for(;;) {
  1214.             switch(lastst) {
  1215. case ellipse: {
  1216. sprintf(declid,"**ELLIPSE%d**",pcount++);
  1217. sp = xalloc(sizeof(SYM));
  1218. sp->name = litlate(declid);
  1219.                   sp->storage_class = sc_auto;
  1220. sp->tp = maketype(bt_ellipse,0);
  1221. sp->tp->uflags |= UF_DEFINED | UF_USED;
  1222. insert(sp,table);
  1223. if (ispascal)
  1224. generror(ERR_PASCAL_NO_ELLIPSE,0,0);
  1225. getsym();
  1226. goto exit;
  1227. }
  1228. case kw_const:
  1229. case id:
  1230.                 case kw_char: case kw_int: case kw_short: case kw_unsigned:
  1231.                 case kw_long: case kw_struct: case kw_union: case kw_signed:
  1232.                 case kw_enum: case kw_void:
  1233.                 case kw_float: case kw_double:
  1234.                     declare(table,sc_auto,bt_struct,flags);
  1235.                     break;
  1236.                 case kw_static:
  1237. case kw_auto:
  1238. case kw_register:
  1239.                         gensymerror(ERR_ILLCLASS,lastid);
  1240.                         getsym();
  1241. continue;
  1242.                 default:
  1243. goto exit;
  1244.                 }
  1245. if (isinline) {
  1246. names[(*nparms)++] = litlate(declid);
  1247. }
  1248. flags &= ~DF_CONST;
  1249. }
  1250. exit:
  1251. #ifdef CPLUSPLUS
  1252. if (prm_cplusplus) {
  1253. SYM *sp = table->head;
  1254. int found = FALSE;
  1255. while (sp) {
  1256. if (sp->defalt)
  1257. found = TRUE;
  1258. else 
  1259. if (found)
  1260. gensymerror(ERR_MISSINGDEFAULT,sp->name);
  1261. sp = sp->next;
  1262. }
  1263. }
  1264. #endif
  1265. }