home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #1 / NN_1993_1.iso / spool / comp / os / minix / 5125 / patch4.2b.Z / patch4.2b
Encoding:
Text File  |  1993-01-11  |  32.5 KB  |  1,330 lines

  1. *** src/expr.c.o    Tue Dec 01 23:26:23 1992
  2. --- src/expr.c    Wed Dec 09 18:29:45 1992
  3. ***************
  4. *** 190,195 ****
  5. --- 190,196 ----
  6.       tp1 = tp->btp;
  7.       tp = mk_type(bt_pointer, tp_pointer.size);
  8.       tp->btp = tp1;
  9. +     tp->val_flag = 1;
  10.       }
  11.       return tp;
  12.   }
  13. ***************
  14. *** 246,252 ****
  15.           ep->esize = 4;
  16.           break;
  17.           }
  18. !         /* FALLTHU */
  19.         case sc_global:
  20.         case sc_external:
  21.           *node = ep = mk_node(en_nacon, NIL_ENODE, NIL_ENODE);
  22. --- 247,253 ----
  23.           ep->esize = 4;
  24.           break;
  25.           }
  26. !         /*FALLTHRU*/
  27.         case sc_global:
  28.         case sc_external:
  29.           *node = ep = mk_node(en_nacon, NIL_ENODE, NIL_ENODE);
  30. ***************
  31. *** 379,393 ****
  32.       enum e_sym      st;
  33.   {
  34.       struct sym     *sp;
  35. !     if (st == kw_char || st == kw_short || st == kw_int ||
  36. !     st == kw_long || st == kw_float || st == kw_double ||
  37. !     st == kw_struct || st == kw_union || st == kw_unsigned ||
  38. !     st == kw_const || st == kw_volatile ||
  39. !     st == kw_void || st == kw_enum)
  40. !     return 1;
  41. !     if (st == id && (sp = gsearch(lastid)) != 0 &&
  42. !     sp->storage_class == sc_typedef)
  43. !     return 1;
  44.       return 0;
  45.   }
  46.   
  47. --- 380,406 ----
  48.       enum e_sym      st;
  49.   {
  50.       struct sym     *sp;
  51. !     switch (st) {
  52. !       case kw_char:
  53. !       case kw_short:
  54. !       case kw_int:
  55. !       case kw_long:
  56. !       case kw_float:
  57. !       case kw_double:
  58. !       case kw_struct:
  59. !       case kw_union:
  60. !       case kw_unsigned:
  61. !       case kw_const:
  62. !       case kw_volatile:
  63. !       case kw_signed:
  64. !       case kw_void:
  65. !       case kw_enum:
  66. !       return 1;
  67. !       default:
  68. !       if (st == id && (sp = gsearch(lastid)) != 0 &&
  69. !           sp->storage_class == sc_typedef)
  70. !       return 1;
  71. !     }
  72.       return 0;
  73.   }
  74.   
  75. ***************
  76. *** 404,409 ****
  77. --- 417,424 ----
  78.    * primary.id
  79.    * primary->id
  80.    * primary( parameter list )
  81. +  * primary++
  82. +  * primary--
  83.    * -- or just a semicolon, yields empty expression --
  84.    *
  85.    */
  86. ***************
  87. *** 413,418 ****
  88. --- 428,434 ----
  89.       struct sym     *sp;
  90.       TYP            *tptr;
  91.       TYP            *tp1,*tp2;
  92. +     int        i;
  93.       switch (lastst) {
  94.   
  95.         case id:
  96. ***************
  97. *** 431,452 ****
  98.       }
  99.       break;
  100.         case iconst:
  101.         case uconst:
  102.         case lconst:
  103.       pnode = mk_icon((long)ival);
  104. !     if (lastst == uconst) {
  105. !         tptr = &tp_uint;
  106. !         pnode->etype = tp_uint.type;
  107. !         pnode->esize = tp_uint.size;
  108. !     } else if (lastst == lconst) {
  109. !         tptr = &tp_long;
  110. !         pnode->etype = bt_long;
  111. !         pnode->esize = 4;
  112. !     } else {
  113. !         tptr = &tp_int;
  114. !         pnode->etype = tp_int.type;
  115. !         pnode->esize = tp_int.size;
  116. !     }
  117.       getsym();
  118.       break;
  119.         case rconst:
  120. --- 447,466 ----
  121.       }
  122.       break;
  123.         case iconst:
  124. +     tptr = &tp_int;
  125. +     goto const1;
  126.         case uconst:
  127. +     tptr = &tp_uint;
  128. +     goto const1;
  129.         case lconst:
  130. +     tptr = &tp_long;
  131. +     goto const1;
  132. +       case ulconst:
  133. +     tptr = &tp_ulong;
  134. + const1:
  135.       pnode = mk_icon((long)ival);
  136. !     pnode->etype = tptr->type;
  137. !     pnode->esize = tptr->size;
  138.       getsym();
  139.       break;
  140.         case rconst:
  141. ***************
  142. *** 479,485 ****
  143.           needpunc(closepa);
  144.       } else {        /* cast operator */
  145.           struct typ *local_head = head, *local_tail=tail;
  146. !         decl((TABLE *) 0);    /* do cast declaration */
  147.           decl1();
  148.           tptr = head;
  149.           needpunc(closepa);
  150. --- 493,499 ----
  151.           needpunc(closepa);
  152.       } else {        /* cast operator */
  153.           struct typ *local_head = head, *local_tail=tail;
  154. !         decl();    /* do cast declaration */
  155.           decl1();
  156.           tptr = head;
  157.           needpunc(closepa);
  158. ***************
  159. *** 516,521 ****
  160. --- 530,537 ----
  161.           tp1 = expression(&pnode);
  162.           tptr = tp1;
  163.           }
  164. +         if (!integral(tp2))
  165. +         message(ERR_INTEGER);
  166.   
  167.   /*
  168.    * now, pnode and tp1 describe the pointer,
  169. ***************
  170. *** 533,539 ****
  171.   /*
  172.    * qnode is the size of the referenced object
  173.    */
  174. !         (void) cast_op(&rnode, tp2, &tp_long, 0);
  175.           /*
  176.            * we could check the type of the expression here...
  177.            */
  178. --- 549,555 ----
  179.   /*
  180.    * qnode is the size of the referenced object
  181.    */
  182. !         VOIDCAST cast_op(&rnode, tp2, &tp_long, 1);
  183.           /*
  184.            * we could check the type of the expression here...
  185.            */
  186. ***************
  187. *** 540,546 ****
  188.           qnode = mk_node(en_mul, qnode, rnode);
  189.           qnode->etype = bt_long;
  190.           qnode->esize = 4;
  191. !         (void) cast_op(&qnode, &tp_long, tp1, 0);
  192.           pnode = mk_node(en_add, qnode, pnode);
  193.           pnode->etype = bt_pointer;
  194.           pnode->esize = 4;
  195. --- 556,562 ----
  196.           qnode = mk_node(en_mul, qnode, rnode);
  197.           qnode->etype = bt_long;
  198.           qnode->esize = 4;
  199. !         VOIDCAST cast_op(&qnode, &tp_long, tp1, 1);
  200.           pnode = mk_node(en_add, qnode, pnode);
  201.           pnode->etype = bt_pointer;
  202.           pnode->esize = 4;
  203. ***************
  204. *** 613,618 ****
  205. --- 629,672 ----
  206.           pnode->esize = tptr->size;
  207.           needpunc(closepa);
  208.           break;
  209. +       case autodec:
  210. +       case autoinc:
  211. +         if (tptr->type == bt_pointer)
  212. +         i = tptr->btp->size;
  213. +         else
  214. +         i = 1;
  215. +         if (i == UNKNOWN_SIZE)
  216. +         message (ERR_SIZE);
  217. +         if (lvalue(pnode)) {
  218. +         if (floating(tptr)) {
  219. +             qnode = mk_node(en_fcon, NIL_ENODE, NIL_ENODE);
  220. + #ifndef NOFLOAT
  221. +             qnode->v.f = ((double)1);
  222. + #endif
  223. +             if (tptr->type == bt_float) {
  224. +             qnode->etype = tp_float.type;
  225. +             qnode->esize = tp_float.size;
  226. +             } else {
  227. +             qnode->etype = tp_double.type;
  228. +             qnode->esize = tp_double.size;
  229. +             }
  230. +         } else {
  231. +             qnode = mk_icon((long) i);
  232. +             qnode->etype = bt_long;
  233. +             qnode->esize = 4;
  234. +         }
  235. +         if (lastst == autodec)
  236. +             pnode = mk_node(en_adec, pnode, qnode);
  237. +         else
  238. +             pnode = mk_node(en_ainc, pnode, qnode);
  239. +         pnode->etype = tptr->type;
  240. +         pnode->esize = tptr->size;
  241. +         } else
  242. +         message(ERR_LVALUE);
  243. +         getsym();
  244. +         if (trad_option && lastst == pointsto)
  245. +         needpunc(lastst+1);    /* force an error as K&R doesn't allow this*/
  246. +         break;
  247.         default:
  248.           goto fini;
  249.       }
  250. ***************
  251. *** 628,635 ****
  252.    * evaluated. unary expressions are any of:
  253.    *
  254.    * primary
  255. -  * primary++
  256. -  * primary--
  257.    * !unary
  258.    * ~unary
  259.    * ++unary
  260. --- 682,687 ----
  261. ***************
  262. *** 673,679 ****
  263.           } else if (floating(tp)) {
  264.               ep2 = mk_node(en_fcon, NIL_ENODE, NIL_ENODE);
  265.   #ifndef NOFLOAT
  266. !             ep2->v.f = 1.0;
  267.   #endif
  268.               if (tp->type == bt_float) {
  269.               ep2->etype = tp_float.type;
  270. --- 725,731 ----
  271.           } else if (floating(tp)) {
  272.               ep2 = mk_node(en_fcon, NIL_ENODE, NIL_ENODE);
  273.   #ifndef NOFLOAT
  274. !             ep2->v.f = ((double)1);
  275.   #endif
  276.               if (tp->type == bt_float) {
  277.               ep2->etype = tp_float.type;
  278. ***************
  279. *** 792,797 ****
  280. --- 844,851 ----
  281.           }
  282.       } else if (tp->type == bt_pointer && tp->btp->type == bt_func) {
  283.           message(WARN_ADDFUNC);
  284. +     } else if (tp->type == bt_pointer && tp->val_flag) {
  285. +         message(WARN_ADDARRAY);
  286.       } else
  287.           message(ERR_LVALUE);
  288.       break;
  289. ***************
  290. *** 812,818 ****
  291.                */
  292.               tp1 = head;
  293.               tp  = tail;
  294. !             decl((TABLE *) 0);
  295.               decl1();
  296.           i = head->size;
  297.           tail = tp;
  298. --- 866,872 ----
  299.                */
  300.               tp1 = head;
  301.               tp  = tail;
  302. !             decl();
  303.               decl1();
  304.           i = head->size;
  305.           tail = tp;
  306. ***************
  307. *** 857,868 ****
  308.           if (ep1->v.i == 0) {
  309.           message(WARN_SIZEOF0);
  310.       }
  311. !     if (short_option && ep1->v.i > 65535) {
  312.           message(WARN_SIZEOFBIG);
  313.       }
  314. !     tp = &tp_uint;
  315. !     ep1->etype = tp_uint.type;
  316. !     ep1->esize = tp_uint.size;
  317.       break;
  318.         case plus:
  319.       if (trad_option == 0) {
  320. --- 911,922 ----
  321.           if (ep1->v.i == 0) {
  322.           message(WARN_SIZEOF0);
  323.       }
  324. !     if (((ep1->v.i)>>(TP_SIZE.size * 4))>>(TP_SIZE.size*4) != 0) {
  325.           message(WARN_SIZEOFBIG);
  326.       }
  327. !     tp = &TP_SIZE;
  328. !     ep1->etype = TP_SIZE.type;
  329. !     ep1->esize = TP_SIZE.size;
  330.       break;
  331.         case plus:
  332.       if (trad_option == 0) {
  333. ***************
  334. *** 878,920 ****
  335.       /*FALLTHRU*/
  336.         default:
  337.       tp = primary(&ep1);
  338. -     if (tp != 0) {
  339. -         if (tp->type == bt_pointer)
  340. -         i = tp->btp->size;
  341. -         else
  342. -         i = 1;
  343. -         if (lastst == autodec || lastst == autoinc) {
  344. -         if (i == -1)
  345. -             message (ERR_SIZE);
  346. -         if (lvalue(ep1)) {
  347. -             if (floating(tp)) {
  348. -             ep2 = mk_node(en_fcon, NIL_ENODE, NIL_ENODE);
  349. - #ifndef NOFLOAT
  350. -             ep2->v.f = 1.0;
  351. - #endif
  352. -             if (tp->type == bt_float) {
  353. -                 ep2->etype = tp_float.type;
  354. -                 ep2->esize = tp_float.size;
  355. -             } else {
  356. -                 ep2->etype = tp_double.type;
  357. -                 ep2->esize = tp_double.size;
  358. -             }
  359. -             } else {
  360. -             ep2 = mk_icon((long) i);
  361. -             ep2->etype = bt_long;
  362. -             ep2->esize = 4;
  363. -             }
  364. -             if (lastst == autodec)
  365. -                 ep1 = mk_node(en_adec, ep1, ep2);
  366. -             else
  367. -                 ep1 = mk_node(en_ainc, ep1, ep2);
  368. -             ep1->etype = tp->type;
  369. -             ep1->esize = tp->size;
  370. -         } else
  371. -             message(ERR_LVALUE);
  372. -         getsym();
  373. -         }
  374. -     }
  375.       break;
  376.       }
  377.       *node = ep1;
  378. --- 932,937 ----
  379. ***************
  380. *** 1041,1047 ****
  381.       switch (tp2->type) {
  382.         case bt_char:
  383.         case bt_uchar:
  384. !         (void) cast_op(node1, tp1, &tp_short, 0);
  385.           return cast_op(node2, tp2, &tp_short, 0);
  386.         case bt_short:
  387.         case bt_long:
  388. --- 1058,1064 ----
  389.       switch (tp2->type) {
  390.         case bt_char:
  391.         case bt_uchar:
  392. !         VOIDCAST cast_op(node1, tp1, &tp_short, 0);
  393.           return cast_op(node2, tp2, &tp_short, 0);
  394.         case bt_short:
  395.         case bt_long:
  396. ***************
  397. *** 1062,1068 ****
  398.               if (short_option)
  399.                  return cast_op (node1, tp1, &tp_ushort, 0);
  400.               else {
  401. !                (void) cast_op (node1, tp1, &tp_long, 0);
  402.                  return cast_op (node2, tp2, &tp_long, 0);
  403.               }
  404.         case bt_short:
  405. --- 1079,1085 ----
  406.               if (short_option)
  407.                  return cast_op (node1, tp1, &tp_ushort, 0);
  408.               else {
  409. !                VOIDCAST cast_op (node1, tp1, &tp_long, 0);
  410.                  return cast_op (node2, tp2, &tp_long, 0);
  411.               }
  412.         case bt_short:
  413. ***************
  414. *** 1069,1075 ****
  415.           if (short_option)
  416.           return cast_op(node2, tp2, &tp_ushort, 0);
  417.           else {
  418. !                (void) cast_op (node1, tp1, &tp_long, 0);
  419.                  return cast_op (node2, tp2, &tp_long, 0);
  420.               }
  421.         case bt_long:
  422. --- 1086,1092 ----
  423.           if (short_option)
  424.           return cast_op(node2, tp2, &tp_ushort, 0);
  425.           else {
  426. !                VOIDCAST cast_op (node1, tp1, &tp_long, 0);
  427.                  return cast_op (node2, tp2, &tp_long, 0);
  428.               }
  429.         case bt_long:
  430. ***************
  431. *** 1218,1224 ****
  432.           ep1 = mk_node(en_sub, ep1, ep2);
  433.           ep1->etype = bt_pointer;
  434.           ep1->esize = 4;
  435. !         (void) cast_op(&ep1, tp1, &tp_long, 0);
  436.           /* divide the result by the size */
  437.           ep2 = mk_icon((long) tp1->btp->size);
  438.           ep2->etype = bt_long;
  439. --- 1235,1241 ----
  440.           ep1 = mk_node(en_sub, ep1, ep2);
  441.           ep1->etype = bt_pointer;
  442.           ep1->esize = 4;
  443. !         VOIDCAST cast_op(&ep1, tp1, &tp_long, 1);
  444.           /* divide the result by the size */
  445.           ep2 = mk_icon((long) tp1->btp->size);
  446.           ep2->etype = bt_long;
  447. ***************
  448. *** 1232,1240 ****
  449.            * an 68000 with 32-bit pointers and 16-bit ints. In my opinion,
  450.            * it should remain "long".
  451.            */
  452. !         if (short_option)
  453.           message(WARN_PTRDIFF16);
  454. !         tp1 = cast_op(&ep1, &tp_long, &tp_int, short_option);
  455.           *node = ep1;
  456.           continue;
  457.       }
  458. --- 1249,1257 ----
  459.            * an 68000 with 32-bit pointers and 16-bit ints. In my opinion,
  460.            * it should remain "long".
  461.            */
  462. !         if (TP_PTRDIFF.size == 2)
  463.           message(WARN_PTRDIFF16);
  464. !         tp1 = cast_op(&ep1, &tp_long, &TP_PTRDIFF, TP_PTRDIFF.size == 2);
  465.           *node = ep1;
  466.           continue;
  467.       }
  468. ***************
  469. *** 1244,1250 ****
  470.           message(ERR_INTEGER);
  471.           if (tp1->btp->size == UNKNOWN_SIZE)
  472.           message (ERR_SIZE);
  473. !         (void) cast_op(&ep2, tp2, &tp_long, 0);
  474.           ep3 = mk_icon((long) tp1->btp->size);
  475.           ep3->etype = bt_long;
  476.           ep3->esize = 4;
  477. --- 1261,1267 ----
  478.           message(ERR_INTEGER);
  479.           if (tp1->btp->size == UNKNOWN_SIZE)
  480.           message (ERR_SIZE);
  481. !         VOIDCAST cast_op(&ep2, tp2, &tp_long, 0);
  482.           ep3 = mk_icon((long) tp1->btp->size);
  483.           ep3->etype = bt_long;
  484.           ep3->esize = 4;
  485. ***************
  486. *** 1262,1268 ****
  487.           message(ERR_INTEGER);
  488.           if (tp2->btp->size == UNKNOWN_SIZE)
  489.           message (ERR_SIZE);
  490. !         (void) cast_op(&ep1, tp1, &tp_long, 0);
  491.           ep3 = mk_icon((long) tp2->btp->size);
  492.           ep3->etype = bt_long;
  493.           ep3->esize = 4;
  494. --- 1279,1285 ----
  495.           message(ERR_INTEGER);
  496.           if (tp2->btp->size == UNKNOWN_SIZE)
  497.           message (ERR_SIZE);
  498. !         VOIDCAST cast_op(&ep1, tp1, &tp_long, 0);
  499.           ep3 = mk_icon((long) tp2->btp->size);
  500.           ep3->etype = bt_long;
  501.           ep3->esize = 4;
  502. ***************
  503. *** 1592,1598 ****
  504.           if (tp1->type == bt_pointer && integral(tp2)) {
  505.           if (tp1->btp->size == UNKNOWN_SIZE)
  506.               message (ERR_SIZE);
  507. !         (void) cast_op(&ep2, tp2, &tp_long, 0);
  508.           ep3 = mk_icon((long) tp1->btp->size);
  509.           ep3->etype = bt_long;
  510.           ep3->esize = 4;
  511. --- 1609,1615 ----
  512.           if (tp1->type == bt_pointer && integral(tp2)) {
  513.           if (tp1->btp->size == UNKNOWN_SIZE)
  514.               message (ERR_SIZE);
  515. !         VOIDCAST cast_op(&ep2, tp2, &tp_long, 1);
  516.           ep3 = mk_icon((long) tp1->btp->size);
  517.           ep3->etype = bt_long;
  518.           ep3->esize = 4;
  519. ***************
  520. *** 1599,1605 ****
  521.           ep2 = mk_node(en_mul, ep2, ep3);
  522.           ep2->etype = bt_long;
  523.           ep2->esize = 4;
  524. !         tp2 = cast_op(&ep2, &tp_long, tp1, 0);
  525.           }
  526.           goto ascomm2;
  527.         case asminus:
  528. --- 1616,1622 ----
  529.           ep2 = mk_node(en_mul, ep2, ep3);
  530.           ep2->etype = bt_long;
  531.           ep2->esize = 4;
  532. !         tp2 = cast_op(&ep2, &tp_long, tp1, 1);
  533.           }
  534.           goto ascomm2;
  535.         case asminus:
  536. ***************
  537. *** 1737,1743 ****
  538.       return tp2;
  539.       }
  540.   
  541. !     if ((*ep)->nodetype == en_icon)
  542.       if (integral(tp2) || tp2->type == bt_pointer || tp2->type == bt_void) {
  543.           long            j = (*ep)->v.i;
  544.           (*ep)->etype = tp2->type;
  545. --- 1754,1761 ----
  546.       return tp2;
  547.       }
  548.   
  549. !     switch ((*ep)->nodetype) {
  550. !       case en_icon:
  551.       if (integral(tp2) || tp2->type == bt_pointer || tp2->type == bt_void) {
  552.           long            j = (*ep)->v.i;
  553.           (*ep)->etype = tp2->type;
  554. ***************
  555. *** 1763,1775 ****
  556.           message(ERR_CASTCON);
  557.           return 0;
  558.       }
  559. !     if (tp2->type != bt_void  && tp2->type != bt_float
  560. !      && tp1->size > tp2->size  && (flag==0))
  561. !     message(WARN_NARROWER);
  562. !     else if (tp2->type == bt_pointer && tp1->size < tp_pointer.size)
  563.       message(WARN_SHORTPTR);
  564.   
  565.       ep2 = mk_node(en_cast, *ep, NIL_ENODE);
  566.       ep2->etype = tp2->type;
  567.       ep2->esize = tp2->size;
  568. --- 1781,1814 ----
  569.           message(ERR_CASTCON);
  570.           return 0;
  571.       }
  572. !       case en_fcon:
  573. !     if (integral(tp2)) {
  574. !         long            j = (*ep)->v.f;
  575. !         (*ep)->nodetype = en_icon;
  576. !         (*ep)->etype = tp2->type;
  577. !         (*ep)->esize = tp2->size;
  578. !         (*ep)->v.i = strip_icon(j, tp2->type);
  579. !         if (j != (*ep)->v.f ) {
  580. !         message(WARN_CONSTCAST, j, (*ep)->v.i);
  581. !         }
  582. !         return tp2;
  583. !     }
  584. !     }
  585. !     if(tp2->type == bt_struct || tp2->type == bt_union ||
  586. !        tp1->type == bt_struct || tp1->type == bt_union ) {
  587. !     message(ERR_ILLCAST);
  588. !     return(tp2);
  589. !     }
  590. !     if (flag == 0) {
  591. !     if (tp2->type == bt_pointer || tp1->type == bt_pointer)
  592. !         message(WARN_TYPECAST);
  593. !     if (tp2->type != bt_void  && tp2->type != bt_float
  594. !      && tp1->size > tp2->size )
  595. !         message(WARN_NARROWER);
  596. !     }
  597. !     if (tp2->type == bt_pointer && tp1->size < tp_pointer.size)
  598.       message(WARN_SHORTPTR);
  599.   
  600.       ep2 = mk_node(en_cast, *ep, NIL_ENODE);
  601.       ep2->etype = tp2->type;
  602.       ep2->esize = tp2->size;
  603. ***************
  604. *** 1820,1823 ****
  605. --- 1859,1910 ----
  606.       }
  607.       return i;
  608.   }
  609. +   
  610. + #ifdef TRACE
  611. + void
  612. + traceexpr(node)
  613. +     struct enode  **node;
  614. + {
  615. +     struct enode   *pnode;
  616. +     struct enode   *ep1, *ep2;
  617. +     static struct enode   *ep;
  618. +     extern int act_line;
  619. +     extern char act_file[];
  620. +     if (ep == 0) {
  621. +     struct sym     *sp;
  622. +     ++global_flag;
  623. +     sp = (struct sym *) xalloc((int) sizeof(struct sym));
  624. +     sp->tp = &tp_func;
  625. +     sp->name = strsave(".stmttrace");
  626. +     sp->storage_class = sc_external;
  627. +     ep = mk_node(en_nacon, NIL_ENODE, NIL_ENODE);
  628. +     ep->v.sp = sp->name;
  629. +     ep->etype = bt_pointer;
  630. +     ep->esize = 4;
  631. +     --global_flag;
  632. +     }
  633. +     /* create line number parameter */
  634. +     ep2 = mk_icon((long)act_line);
  635. +     ep2->etype = tp_int.type;
  636. +     ep2->esize = tp_int.size;
  637. +     ep1 = mk_node(en_list, ep2, NIL_ENODE);
  638. +     /* create file name parameter */
  639. +     ep2 = mk_node(en_labcon, NIL_ENODE, NIL_ENODE);
  640. +     ep2->v.i = stringlit(act_file, (int)strlen(act_file));
  641. +     ep2->etype = bt_pointer;
  642. +     ep2->esize = 4;
  643. +     ep1 = mk_node(en_list, ep2, ep1);
  644. +     /* do function call */
  645. +     pnode = mk_node(en_fcall, ep, ep1);
  646. +     pnode->etype = bt_void;
  647. +     pnode->esize = 0;
  648. +     *node = pnode;
  649. +     return;
  650. + }
  651. + #endif /* TRACE */
  652.   
  653. *** src/gen68k.c.o    Mon Dec  7 13:11:20 1992
  654. --- src/gen68k.c    Sun Dec  6 19:38:18 1992
  655. ***************
  656. *** 601,607 ****
  657.       if (!(flags & F_NOVALUE)) {
  658.           ap = temp_addr();
  659.           g_code(op_move, 4, mk_reg(RESULT), ap);
  660. !         ap->mode = am_ind;
  661.           return mk_legal(ap, flags, node->esize);
  662.       } else {
  663.       return 0;
  664. --- 601,608 ----
  665.       if (!(flags & F_NOVALUE)) {
  666.           ap = temp_addr();
  667.           g_code(op_move, 4, mk_reg(RESULT), ap);
  668. !         ap=copy_addr(ap);
  669. !     ap->mode = am_ind;
  670.           return mk_legal(ap, flags, node->esize);
  671.       } else {
  672.       return 0;
  673. ***************
  674. *** 1925,1931 ****
  675.       /*
  676.        * if (!tworegs)
  677.        * saves a function call result in D0
  678. !      * it is assumed that flags contain either F_DREG or F_AREG
  679.        *
  680.        * if (tworegs)
  681.        * saves a function call result in D0/D1
  682. --- 1926,1932 ----
  683.       /*
  684.        * if (!tworegs)
  685.        * saves a function call result in D0
  686. !      * it is assumed that flags contain either F_MEM, F_DREG or F_AREG
  687.        *
  688.        * if (tworegs)
  689.        * saves a function call result in D0/D1
  690. ***************
  691. *** 1966,1973 ****
  692.           g_code(op_move, 4, mk_reg(RESULT), ap);
  693.           return ap;
  694.           }
  695. !     }
  696. !     fatal("gen68k/func_result","illegal addressing mode");
  697.       return 0;
  698.   }
  699.   #endif /* NODOUBLE */
  700. --- 1967,1979 ----
  701.           g_code(op_move, 4, mk_reg(RESULT), ap);
  702.           return ap;
  703.           }
  704. !     if (flags & F_MEM) {
  705. !             ap = mk_scratch(4l);
  706. !         g_code(op_move, 4, mk_reg(RESULT), ap);
  707. !         return ap;
  708. !     }
  709. !     }
  710. !     fatal("gen68k/func_result","illegal addressing mode (%d, %d)", tworegs,flags);
  711.       return 0;
  712.   }
  713.   #endif /* NODOUBLE */
  714. ***************
  715. *** 2598,2606 ****
  716.       p->label = lab0;
  717.       p->value = node->v.f;
  718.       p->less = p->more = NULL;
  719. !     if (q == NULL)
  720. !         fptree = p;
  721. !     else if (q->value < node->v.f)
  722.           q->less = p;
  723.       else
  724.           q->more = p;
  725. --- 2604,2615 ----
  726.       p->label = lab0;
  727.       p->value = node->v.f;
  728.       p->less = p->more = NULL;
  729. !     if (q == NULL) {
  730. !         if (node->etype == bt_double)
  731. !         dfptree=p;
  732. !         else
  733. !             fptree=p;
  734. !     } else if (q->value < node->v.f)
  735.           q->less = p;
  736.       else
  737.           q->more = p;
  738. *** src/genstmt.c.o    Mon Dec  7 13:12:04 1992
  739. --- src/genstmt.c    Mon Dec  7 13:12:08 1992
  740. ***************
  741. *** 40,46 ****
  742.   /* genstmt.c */
  743.   static struct amode *mk_strlab P_((char *s));
  744.   static void genwhile P_((struct snode *stmt));
  745. ! static void g_for P_((struct snode *stmt));
  746.   static void genif P_((struct snode *stmt));
  747.   static void gendo P_((struct snode *stmt));
  748.   static void genswitch P_((struct snode *stmt));
  749. --- 40,46 ----
  750.   /* genstmt.c */
  751.   static struct amode *mk_strlab P_((char *s));
  752.   static void genwhile P_((struct snode *stmt));
  753. ! static void genfor P_((struct snode *stmt));
  754.   static void genif P_((struct snode *stmt));
  755.   static void gendo P_((struct snode *stmt));
  756.   static void genswitch P_((struct snode *stmt));
  757. ***************
  758. *** 126,131 ****
  759. --- 126,132 ----
  760.       return ap;
  761.   }
  762.   
  763. + #if 0
  764.   static void
  765.   genwhile(stmt)
  766.   /*
  767. ***************
  768. *** 177,250 ****
  769.       }
  770.       contlab = lab1;        /* restore old continue label */
  771.   }
  772. ! static void
  773. ! g_for(stmt)
  774. ! /*
  775. !  * generate code to evaluate a for loop
  776.    */
  777.       struct snode   *stmt;
  778.   {
  779. !     unsigned int    old_break, old_cont, exit_label, loop_label;
  780.       old_break = breaklab;
  781.       old_cont = contlab;
  782.       loop_label = nextlabel++;
  783. !     exit_label = nextlabel++;
  784. !     if (stmt->v2.e != 0)
  785. !     contlab = nextlabel++;
  786. !     else
  787. !     contlab = loop_label;
  788.   #ifdef ICODE
  789.       if (icode_option) {
  790.       if (stmt->exp != 0)
  791.           g_icode(stmt->exp);
  792. !     iprintf("\tL%u:\n", loop_label);
  793.       }
  794.   #endif
  795.       initstack();
  796.       if (stmt->exp != 0) {
  797. !     (void) g_expr(stmt->exp, F_ALL | F_NOVALUE);
  798. !         checkstack();
  799. !     }
  800. !     g_label(loop_label);
  801. !     initstack();
  802. !     if (stmt->v1.e != 0) {
  803. ! #ifdef ICODE
  804. !     if (icode_option) {
  805. !         iprintf("*falsejp L%u\n", exit_label);
  806. !         g_icode(stmt->v1.e);
  807. !     }
  808. ! #endif
  809. !     falsejp(stmt->v1.e, exit_label);
  810. !         checkstack();
  811. !     }
  812. !     if (stmt->s1 != 0) {
  813. !     breaklab = exit_label;
  814. !     genstmt(stmt->s1);
  815. !     }
  816. ! #ifdef ICODE
  817. !     if (icode_option) {
  818. !     if (stmt->v2.e != 0) {
  819. !         iprintf("\tL%u:\n", contlab);
  820. !         g_icode(stmt->v2.e);
  821. !     }
  822. !     iprintf("\tbranch_unconditional\tL%u\n", loop_label);
  823. !     }
  824. ! #endif
  825. !     initstack();
  826. !     if (stmt->v2.e != 0) {
  827. !     g_label(contlab);
  828. !     (void) g_expr(stmt->v2.e, F_ALL | F_NOVALUE);
  829. !         checkstack();
  830. !     }
  831. !     g_code(op_bra, 0, mk_label(loop_label), NIL_AMODE);
  832. !     breaklab = old_break;
  833. !     contlab = old_cont;
  834. !     g_label(exit_label);
  835. ! #ifdef ICODE
  836. !     if (icode_option)
  837. !     iprintf("\tL%u:\n", exit_label);
  838. ! #endif
  839.   }
  840.   
  841.   static void
  842. --- 178,300 ----
  843.       }
  844.       contlab = lab1;        /* restore old continue label */
  845.   }
  846. ! #endif
  847. ! static void
  848. ! genwhile(stmt)
  849. ! /*
  850. !  * generate code to evaluate a while statement.
  851.    */
  852.       struct snode   *stmt;
  853.   {
  854. !     unsigned int    lab1, lab2, looplab;
  855. !     initstack();        /* initialize temp registers */
  856. !     lab1 = contlab;        /* save old continue label */
  857. !     lab2 = breaklab;        /* save old break label */
  858. !     looplab = nextlabel++;    /* loop pabel */
  859. !     contlab = nextlabel++;    /* new continue label */
  860. !     breaklab = nextlabel++;    /* new break label */
  861. ! #ifdef ICODE
  862. !     if (icode_option) {
  863. !     iprintf("\tbranch_unconditional\tL%u\n", contlab);
  864. !     iprintf("\tL%u:\n", looplab);
  865. !     }
  866. ! #endif
  867. !     g_code(op_bra, 0, mk_label(contlab), NIL_AMODE);
  868. !     g_label(looplab);
  869. ! #ifdef ICODE
  870. !     if (icode_option)
  871. !     g_icode(stmt->exp);
  872. ! #endif
  873. !     genstmt(stmt->s1);
  874. ! #ifdef ICODE
  875. !     if (icode_option) {
  876. !     iprintf("\tL%u:\n", contlab);
  877. !     iprintf("*truejp L%u\n", looplab);
  878. !     }
  879. ! #endif
  880. !     g_label(contlab);
  881. !     initstack();
  882. !     truejp(stmt->exp, looplab);
  883. !     checkstack();
  884. ! #ifdef ICODE
  885. !     if (icode_option)
  886. !     iprintf("\tL%u:\n", breaklab);
  887. ! #endif
  888. !     g_label(breaklab);
  889. !     breaklab = lab2;    /* restore old break label */
  890. !     contlab = lab1;        /* restore old continue label */
  891. ! }
  892. ! static void
  893. ! genfor(stmt)
  894. ! /*
  895. !  * generate code to evaluate a for loop
  896. !  */
  897. !     struct snode   *stmt;
  898. ! {
  899. !     unsigned int    old_break, old_cont, loop_label, entry_label;
  900.       old_break = breaklab;
  901.       old_cont = contlab;
  902.       loop_label = nextlabel++;
  903. !     entry_label = nextlabel++;
  904. !     breaklab = nextlabel++;
  905. !     contlab = nextlabel++;
  906.   #ifdef ICODE
  907.       if (icode_option) {
  908.       if (stmt->exp != 0)
  909.           g_icode(stmt->exp);
  910. !     iprintf("\tbranch_unconditional\tL%u\n", entry_label);
  911.       }
  912.   #endif
  913.       initstack();
  914.       if (stmt->exp != 0) {
  915. !     VOIDCAST g_expr(stmt->exp, F_ALL | F_NOVALUE);
  916. !         checkstack();
  917. !     }
  918. !     g_code(op_bra, 0, mk_label(entry_label), NIL_AMODE);
  919. !     g_label(loop_label);
  920. ! #ifdef ICODE
  921. !     if (icode_option) {
  922. !     g_icode(stmt->v1.e);
  923. !     iprintf("\tL%u:\n", contlabel);
  924. !     }
  925. ! #endif
  926. !     genstmt(stmt->s1);
  927. !     g_label(contlab);
  928. !     initstack();
  929. ! #ifdef ICODE
  930. !     if (icode_option) {
  931. !     if (stmt->v2.e != 0)
  932. !         g_icode(stmt->v2.e);
  933. !     iprintf("\tL%u:\n", entry_lab);
  934. !     }
  935. ! #endif
  936. !     if (stmt->v2.e != 0) {
  937. !     VOIDCAST g_expr(stmt->v2.e, F_ALL | F_NOVALUE);
  938. !         checkstack();
  939. !     }
  940. !     g_label(entry_label);
  941. !     initstack();
  942. !     if (stmt->v1.e == 0) {
  943. ! #ifdef ICODE
  944. !     if (icode_option)
  945. !         iprintf("\tbranch_unconditional\tL%u\n", entry_label);
  946. ! #endif
  947. !     g_code(op_bra, 0, mk_label(loop_label), NIL_AMODE);
  948. !     } else {
  949. ! #ifdef ICODE
  950. !     if (icode_option) {
  951. !         g_icode(stmt->v1.e);
  952. !         iprintf("*truejp L%u\n", loop_label);
  953. !     }
  954. ! #endif
  955. !     truejp(stmt->v1.e, loop_label);
  956. !         checkstack();
  957. !     }
  958. !     g_label(breaklab);
  959. !     breaklab = old_break;
  960. !     contlab = old_cont;
  961.   }
  962.   
  963.   static void
  964. ***************
  965. *** 371,381 ****
  966.   #ifdef MC680X0
  967.       struct amode   *ap2;
  968.   #endif
  969. !     struct enode   *ep,*stmtexp;
  970.       long            size;
  971.       enum e_bt        type;
  972.       long            min_caselabel, max_caselabel, nxt_caselabel;
  973.       int             number_of_cases;
  974.       defcase = 0;
  975.   #ifdef ICODE
  976.       if (icode_option) {
  977. --- 421,436 ----
  978.   #ifdef MC680X0
  979.       struct amode   *ap2;
  980.   #endif
  981. ! #ifdef INTEL_386
  982. !     struct enode   *ep;
  983. ! #endif
  984. !     struct enode   *stmtexp;
  985.       long            size;
  986.       enum e_bt        type;
  987.       long            min_caselabel, max_caselabel, nxt_caselabel;
  988.       int             number_of_cases;
  989. +     struct swtab   *sw;
  990. +     int           *labels;
  991.       defcase = 0;
  992.   #ifdef ICODE
  993.       if (icode_option) {
  994. ***************
  995. *** 543,568 ****
  996.           iprintf("default             ==> L%u\n",
  997.               (unsigned int) deflab);
  998.   #endif
  999. ! #ifdef SEPARATE_I_D
  1000. !     dseg();
  1001. ! #else
  1002. !     cseg();
  1003. ! #endif    
  1004. !     nl();
  1005. !         put_align(AL_POINTER);
  1006. !     put_label(tablab);
  1007. !     ep = mk_node(en_labcon, NIL_ENODE, NIL_ENODE);
  1008.       while (min_caselabel <= max_caselabel) {
  1009.           nxt_caselabel = max_caselabel + 1;
  1010.           s = stmt;
  1011.           while (s != 0) {
  1012.           if (s->stype != st_default) {
  1013.               if (s->v2.i == min_caselabel) {
  1014. !             ep->v.i = nextlabel;
  1015. !             s->v2.i = nextlabel++;
  1016. !             /* remove statment from the list */
  1017. !             s->stype = st_default;
  1018. !             genptr(ep);
  1019.   #ifdef ICODE
  1020.               if (icode_option)
  1021.                   iprintf("case-value %8ld ==> L%u\n",
  1022. --- 598,618 ----
  1023.           iprintf("default             ==> L%u\n",
  1024.               (unsigned int) deflab);
  1025.   #endif
  1026. !     sw = xalloc((int)sizeof(struct swtab));
  1027. !     sw->tablab = tablab;
  1028. !     sw->numlabs = max_caselabel-min_caselabel +1;
  1029. !     sw->labels = labels = xalloc((int)sizeof(int) * sw->numlabs);
  1030. !     sw->next = swtables;
  1031. !     swtables = sw;
  1032.       while (min_caselabel <= max_caselabel) {
  1033.           nxt_caselabel = max_caselabel + 1;
  1034.           s = stmt;
  1035.           while (s != 0) {
  1036.           if (s->stype != st_default) {
  1037.               if (s->v2.i == min_caselabel) {
  1038. !             s->v2.i = *labels++ = nextlabel++;
  1039. !             /* remove statment from the list */
  1040. !             s->stype = st_default;
  1041.   #ifdef ICODE
  1042.               if (icode_option)
  1043.                   iprintf("case-value %8ld ==> L%u\n",
  1044. ***************
  1045. *** 575,582 ****
  1046.           }
  1047.           /* fill the holes */
  1048.           for (i = min_caselabel + 1; i < nxt_caselabel; i++) {
  1049. !         ep->v.i = deflab;
  1050. !         genptr(ep);
  1051.   #ifdef ICODE
  1052.           if (icode_option)
  1053.               iprintf("case-value %8ld ==> L%u\n",
  1054. --- 625,631 ----
  1055.           }
  1056.           /* fill the holes */
  1057.           for (i = min_caselabel + 1; i < nxt_caselabel; i++) {
  1058. !         *labels++ = deflab;
  1059.   #ifdef ICODE
  1060.           if (icode_option)
  1061.               iprintf("case-value %8ld ==> L%u\n",
  1062. ***************
  1063. *** 715,721 ****
  1064.           ep1 = mk_node(en_assign, ep1, stmt->exp);
  1065.           ep1->etype = ret_type->type;
  1066.           ep1->esize = ret_type->size;
  1067. !         (void) g_expr(ep1, F_ALL | F_NOVALUE);
  1068.   #ifdef MC680X0
  1069.           /* move pointer to D0 */
  1070.               ap = g_expr(ep, F_ALL);
  1071. --- 764,770 ----
  1072.           ep1 = mk_node(en_assign, ep1, stmt->exp);
  1073.           ep1->etype = ret_type->type;
  1074.           ep1->esize = ret_type->size;
  1075. !         VOIDCAST g_expr(ep1, F_ALL | F_NOVALUE);
  1076.   #ifdef MC680X0
  1077.           /* move pointer to D0 */
  1078.               ap = g_expr(ep, F_ALL);
  1079. ***************
  1080. *** 742,748 ****
  1081.             case bt_float:
  1082.   #ifdef INTEL_386
  1083.               /* return floating point value on top of fpu stack */
  1084. !             (void) g_expr(stmt->exp, F_FPSTACK);
  1085.   #ifdef FUNCS_USE_387
  1086.           if (!fpu_option)
  1087.   /*
  1088. --- 791,797 ----
  1089.             case bt_float:
  1090.   #ifdef INTEL_386
  1091.               /* return floating point value on top of fpu stack */
  1092. !             VOIDCAST g_expr(stmt->exp, F_FPSTACK);
  1093.   #ifdef FUNCS_USE_387
  1094.           if (!fpu_option)
  1095.   /*
  1096. ***************
  1097. *** 895,901 ****
  1098.           g_icode(stmt->exp);
  1099.   #endif
  1100.           initstack();
  1101. !         (void) g_expr(stmt->exp, F_ALL | F_NOVALUE);
  1102.               checkstack();
  1103.           break;
  1104.         case st_return:
  1105. --- 944,950 ----
  1106.           g_icode(stmt->exp);
  1107.   #endif
  1108.           initstack();
  1109. !         VOIDCAST g_expr(stmt->exp, F_ALL | F_NOVALUE);
  1110.               checkstack();
  1111.           break;
  1112.         case st_return:
  1113. ***************
  1114. *** 911,917 ****
  1115.           gendo(stmt);
  1116.           break;
  1117.         case st_for:
  1118. !         g_for(stmt);
  1119.           break;
  1120.         case st_continue:
  1121.           g_code(op_bra, 0, mk_label(contlab), NIL_AMODE);
  1122. --- 960,966 ----
  1123.           gendo(stmt);
  1124.           break;
  1125.         case st_for:
  1126. !         genfor(stmt);
  1127.           break;
  1128.         case st_continue:
  1129.           g_code(op_bra, 0, mk_label(contlab), NIL_AMODE);
  1130. ***************
  1131. *** 962,973 ****
  1132.       if (lc_auto % AL_DEFAULT != 0)
  1133.       lc_auto += AL_DEFAULT - (lc_auto % AL_DEFAULT);
  1134.   #ifdef VERBOSE
  1135. !     (void) times(&tms_buf);
  1136.       ltime = tms_buf.tms_utime;
  1137.   #endif                /* VERBOSE */
  1138.       opt1(stmt);
  1139.   #ifdef VERBOSE
  1140. !     (void) times(&tms_buf);
  1141.       opt_time += tms_buf.tms_utime - ltime;
  1142.   #endif                /* VERBOSE */
  1143.       genstmt(stmt);
  1144. --- 1011,1022 ----
  1145.       if (lc_auto % AL_DEFAULT != 0)
  1146.       lc_auto += AL_DEFAULT - (lc_auto % AL_DEFAULT);
  1147.   #ifdef VERBOSE
  1148. !     VOIDCAST times(&tms_buf);
  1149.       ltime = tms_buf.tms_utime;
  1150.   #endif                /* VERBOSE */
  1151.       opt1(stmt);
  1152.   #ifdef VERBOSE
  1153. !     VOIDCAST times(&tms_buf);
  1154.       opt_time += tms_buf.tms_utime - ltime;
  1155.   #endif                /* VERBOSE */
  1156.       genstmt(stmt);
  1157. *** src/init.c.o    Mon Dec  7 13:12:39 1992
  1158. --- src/init.c    Sat Nov 28 09:17:12 1992
  1159. ***************
  1160. *** 61,67 ****
  1161.       else
  1162.       g_strlab(sp->name);
  1163.       getsym();
  1164. !     (void) inittype(sp->tp);
  1165.       sp->used |= SYM_DEFINED;
  1166.   }
  1167.   
  1168. --- 61,67 ----
  1169.       else
  1170.       g_strlab(sp->name);
  1171.       getsym();
  1172. !     VOIDCAST inittype(sp->tp);
  1173.       sp->used |= SYM_DEFINED;
  1174.   }
  1175.   
  1176. ***************
  1177. *** 130,140 ****
  1178.       if (( lastst == sconst)
  1179.       &&  (tp->btp->type == bt_char || tp->btp->type == bt_uchar)) {
  1180.       len = lstrlen;
  1181. !     nbytes = len + 1;
  1182.       p = laststr;
  1183.       while (len--)
  1184.           genbyte((int)*p++);
  1185. !     genbyte(0);
  1186.       while (nbytes < tp->size) {
  1187.           genbyte(0);
  1188.           nbytes++;
  1189. --- 130,141 ----
  1190.       if (( lastst == sconst)
  1191.       &&  (tp->btp->type == bt_char || tp->btp->type == bt_uchar)) {
  1192.       len = lstrlen;
  1193. !     nbytes = len;
  1194.       p = laststr;
  1195.       while (len--)
  1196.           genbyte((int)*p++);
  1197. !       if (tp->size == 0)
  1198. !           tp->size = nbytes+1;
  1199.       while (nbytes < tp->size) {
  1200.           genbyte(0);
  1201.           nbytes++;
  1202. ***************
  1203. *** 146,151 ****
  1204. --- 147,154 ----
  1205.           if (lastst == comma)
  1206.           getsym();
  1207.           if (lastst == end || lastst == semicolon) {
  1208. +         if (nbytes < tp->size)
  1209. +             message(WARN_INCOMPLETE);
  1210.           while (nbytes < tp->size) {
  1211.               genbyte(0);
  1212.               nbytes++;
  1213. ***************
  1214. *** 202,209 ****
  1215.       nbytes += inittype(sp->tp);
  1216.       if (lastst == comma)
  1217.           getsym();
  1218. !     if (lastst == end || lastst == semicolon)
  1219. !         break;
  1220.       sp = sp->next;
  1221.       }
  1222.       while (nbytes < tp->size) {
  1223. --- 205,215 ----
  1224.       nbytes += inittype(sp->tp);
  1225.       if (lastst == comma)
  1226.           getsym();
  1227. !     if (lastst == end || lastst == semicolon) {
  1228. !         if (sp->next != NULL)
  1229. !         message (WARN_INCOMPLETE);
  1230. !         break;
  1231. !     }
  1232.       sp = sp->next;
  1233.       }
  1234.       while (nbytes < tp->size) {
  1235. ***************
  1236. *** 216,229 ****
  1237.   static int
  1238.   initchar()
  1239.   {
  1240. !     genbyte((int) intexpr());
  1241.       return 1;
  1242.   }
  1243.   
  1244.   static int
  1245.   initshort()
  1246.   {
  1247. !     genword((int) intexpr());
  1248.       return 2;
  1249.   }
  1250.   
  1251. --- 222,235 ----
  1252.   static int
  1253.   initchar()
  1254.   {
  1255. !     genbyte((int) arithexpr());
  1256.       return 1;
  1257.   }
  1258.   
  1259.   static int
  1260.   initshort()
  1261.   {
  1262. !     genword((int) arithexpr());
  1263.       return 2;
  1264.   }
  1265.   
  1266. *** src/intexpr.c.o    Mon Dec  7 13:12:50 1992
  1267. --- src/intexpr.c    Mon Dec  7 13:12:52 1992
  1268. ***************
  1269. *** 55,61 ****
  1270.   #endif /* !NOFLOAT */
  1271.   
  1272.   long
  1273. ! intexpr()
  1274.   {
  1275.       struct enode   *ep;
  1276.       struct typ     *tp;
  1277. --- 55,62 ----
  1278.   #endif /* !NOFLOAT */
  1279.   
  1280.   long
  1281. ! arithexpr()
  1282. ! /* integer arithmetic expression */
  1283.   {
  1284.       struct enode   *ep;
  1285.       struct typ     *tp;
  1286. ***************
  1287. *** 63,68 ****
  1288. --- 64,95 ----
  1289.       tp = exprnc(&ep);
  1290.       if (tp == 0) {
  1291.       message(ERR_INTEXPR);
  1292. +     return (double) 0;
  1293. +     }
  1294. +     opt4(&ep);
  1295. +     if (ep->nodetype == en_icon)
  1296. +         return ep->v.i;
  1297. + #ifndef NOFLOAT
  1298. +     if (ep->nodetype == en_fcon)
  1299. +         return (long) ep->v.f;
  1300. + #endif /* !NOFLOAT */
  1301. +     message (ERR_CONSTEXPR);
  1302. +     return 0;
  1303. + }
  1304. + long
  1305. + intexpr()
  1306. + {
  1307. +     struct enode   *ep;
  1308. +     struct typ     *tp;
  1309. +     tp = exprnc(&ep);
  1310. +     if (tp == 0) {
  1311. +     message(ERR_INTEXPR);
  1312.       /*
  1313.        * any return value is wrong, but 1 is 
  1314.        * less likely than 0 to cause spurious
  1315.