expr.c.3
上传用户:upcnvip
上传日期:2007-01-06
资源大小:474k
文件大小:41k
源码类别:

编译器/解释器

开发平台:

C/C++

  1.         if (!nosideeffects(ex->args[i], mode))
  2.             return 0;
  3.     }
  4.     return 1;
  5. }
  6. /* mode=0: liberal about bicall's: safe unless sideeffects_bicall() */
  7. /* mode=1: conservative about bicall's: must be explicitly NOSIDEEFF */
  8. int nosideeffects(ex, mode)
  9. Expr *ex;
  10. int mode;
  11. {
  12.     if (debug>2) { fprintf(outf,"nosideeffects("); dumpexpr(ex); fprintf(outf,")n"); }
  13.     if (!noargsideeffects(ex, mode))
  14.         return 0;
  15.     switch (ex->kind) {
  16.         case EK_BICALL:
  17.             if (mode == 0)
  18.                 return !sideeffects_bicall(ex->val.s);
  19.         /* fall through */
  20.         case EK_FUNCTION:
  21.             return nosideeffects_func(ex);
  22.         case EK_SPCALL:
  23.         case EK_ASSIGN:
  24.         case EK_POSTINC:
  25.         case EK_POSTDEC:
  26.             return 0;
  27.         default:
  28.             return 1;
  29.     }
  30. }
  31. int exproccurs(ex, ex2)
  32. Expr *ex, *ex2;
  33. {
  34.     int i, count = 0;
  35.     if (debug>2) { fprintf(outf,"exproccurs("); dumpexpr(ex); fprintf(outf,", "); dumpexpr(ex2); fprintf(outf,")n"); }
  36.     for (i = 0; i < ex->nargs; i++)
  37.         count += exproccurs(ex->args[i], ex2);
  38.     if (exprsame(ex, ex2, 0))
  39.         count++;
  40.     return count;
  41. }
  42. Expr *singlevar(ex)
  43. Expr *ex;
  44. {
  45.     if (debug>2) { fprintf(outf,"singlevar("); dumpexpr(ex); fprintf(outf,")n"); }
  46.     switch (ex->kind) {
  47.         case EK_VAR:
  48.         case EK_MACARG:
  49.             return ex;
  50.         case EK_HAT:
  51.         case EK_ADDR:
  52.         case EK_DOT:
  53.             return singlevar(ex->args[0]);
  54.         case EK_INDEX:
  55.             if (!nodependencies(ex->args[1], 1))
  56.                 return NULL;
  57.             return singlevar(ex->args[0]);
  58. default:
  59.     return NULL;
  60.     }
  61. }
  62. /* Is "ex" a function which takes a return buffer pointer as its
  63.    first argument, and returns a copy of that pointer? */
  64. int structuredfunc(ex)
  65. Expr *ex;
  66. {
  67.     Meaning *mp;
  68.     Symbol *sp;
  69.     if (debug>2) { fprintf(outf,"structuredfunc("); dumpexpr(ex); fprintf(outf,")n"); }
  70.     switch (ex->kind) {
  71.         case EK_FUNCTION:
  72.             mp = (Meaning *)ex->val.i;
  73.             if (mp->isfunction && mp->cbase && mp->cbase->kind == MK_VARPARAM)
  74.                 return 1;
  75.             sp = findsymbol_opt(mp->name);
  76.             return sp && (sp->flags & (STRUCTF|STRLAPF));
  77.         case EK_BICALL:
  78.             sp = findsymbol_opt(ex->val.s);
  79.             return sp && (sp->flags & (STRUCTF|STRLAPF));
  80. default:
  81.     return 0;
  82.     }
  83. }
  84. int strlapfunc(ex)
  85. Expr *ex;
  86. {
  87.     Meaning *mp;
  88.     Symbol *sp;
  89.     switch (ex->kind) {
  90.         case EK_FUNCTION:
  91.             mp = (Meaning *)ex->val.i;
  92.             sp = findsymbol_opt(mp->name);
  93.             return sp && (sp->flags & STRLAPF);
  94.         case EK_BICALL:
  95.             sp = findsymbol_opt(ex->val.s);
  96.             return sp && (sp->flags & STRLAPF);
  97.         default:
  98.             return 0;
  99.     }
  100. }
  101. Meaning *istempvar(ex)
  102. Expr *ex;
  103. {
  104.     Meaning *mp;
  105.     if (debug>2) { fprintf(outf,"istempvar("); dumpexpr(ex); fprintf(outf,")n"); }
  106.     if (ex->kind == EK_VAR) {
  107.         mp = (Meaning *)ex->val.i;
  108.         if (mp->istemporary)
  109.             return mp;
  110.         else
  111.             return NULL;
  112.     }
  113.     return NULL;
  114. }
  115. Meaning *isretvar(ex)
  116. Expr *ex;
  117. {
  118.     Meaning *mp;
  119.     if (debug>2) { fprintf(outf,"isretvar("); dumpexpr(ex); fprintf(outf,")n"); }
  120.     if (ex->kind == EK_HAT)
  121.         ex = ex->args[0];
  122.     if (ex->kind == EK_VAR) {
  123.         mp = (Meaning *)ex->val.i;
  124.         if (mp->ctx && mp->ctx->kind == MK_FUNCTION &&
  125.             mp->ctx->isfunction && mp == mp->ctx->cbase)
  126.             return mp;
  127.         else
  128.             return NULL;
  129.     }
  130.     return NULL;
  131. }
  132. Expr *bumpstring(ex, index, offset)
  133. Expr *ex, *index;
  134. int offset;
  135. {
  136.     if (checkconst(index, offset)) {
  137.         freeexpr(index);
  138.         return ex;
  139.     }
  140.     if (addindex != 0)
  141.         ex = makeexpr_plus(makeexpr_addrstr(ex),
  142.    makeexpr_minus(index, makeexpr_long(offset)));
  143.     else
  144.         ex = makeexpr_addr(makeexpr_index(ex, index, makeexpr_long(offset)));
  145.     ex->val.type = tp_str255;
  146.     return ex;
  147. }
  148. long po2m1(n)
  149. int n;
  150. {
  151.     if (n == 32)
  152.         return -1;
  153.     else if (n == 31)
  154.         return 0x7fffffff;
  155.     else
  156.         return (1<<n) - 1;
  157. }
  158. int isarithkind(kind)
  159. enum exprkind kind;
  160. {
  161.     return (kind == EK_EQ || kind == EK_LT || kind == EK_GT ||
  162.     kind == EK_NE || kind == EK_LE || kind == EK_GE ||
  163.     kind == EK_PLUS || kind == EK_TIMES || kind == EK_DIVIDE ||
  164.     kind == EK_DIV || kind == EK_MOD || kind == EK_NEG ||
  165.     kind == EK_AND || kind == EK_OR || kind == EK_NOT ||
  166.     kind == EK_BAND || kind == EK_BOR || kind == EK_BXOR ||
  167.     kind == EK_LSH || kind == EK_RSH || kind == EK_BNOT ||
  168.     kind == EK_FUNCTION || kind == EK_BICALL);
  169. }
  170. Expr *makeexpr_assign(a, b)
  171. Expr *a, *b;
  172. {
  173.     int i, j;
  174.     Expr *ex, *ex2, *ex3, **ep;
  175.     Meaning *mp;
  176.     Type *tp;
  177.     if (debug>2) { fprintf(outf,"makeexpr_assign("); dumpexpr(a); fprintf(outf,", "); dumpexpr(b); fprintf(outf,")n"); }
  178.     if (stringtrunclimit > 0 &&
  179. a->val.type->kind == TK_STRING &&
  180. (i = strmax(a)) <= stringtrunclimit &&
  181. strmax(b) > i) {
  182. note("Possible string truncation in assignment [145]");
  183.     }
  184.     a = un_sign_extend(a);
  185.     b = gentle_cast(b, a->val.type);
  186.     if (b->kind == EK_BICALL && !strcmp(b->val.s, "sprintf") &&
  187.          (mp = istempvar(b->args[0])) != NULL &&
  188.          b->nargs >= 2 &&
  189.          b->args[1]->kind == EK_CONST &&              /* all this handles string appending */
  190.          b->args[1]->val.i > 2 &&                     /*   of the form, "s := s + ..." */
  191.          !strncmp(b->args[1]->val.s, "%s", 2) &&
  192.          exprsame(a, b->args[2], 1) &&
  193.          nosideeffects(a, 0) &&
  194.          (ex = singlevar(a)) != NULL) {
  195.         ex2 = copyexpr(b);
  196.         delfreearg(&ex2, 2);
  197.         freeexpr(ex2->args[1]);
  198.         ex2->args[1] = makeexpr_lstring(b->args[1]->val.s+2,
  199.                                         b->args[1]->val.i-2);
  200.         if (/*(ex = singlevar(a)) != NULL && */
  201.            /* noargdependencies(ex2) && */ !exproccurs(ex2, ex)) {
  202.             freeexpr(b);
  203.             if (ex2->args[1]->val.i == 2 &&     /* s := s + s2 */
  204.                 !strncmp(ex2->args[1]->val.s, "%s", 2)) {
  205.                 canceltempvar(mp);
  206. tp = ex2->val.type;
  207.                 return makeexpr_bicall_2("strcat", tp,
  208.                                          makeexpr_addrstr(a), grabarg(ex2, 2));
  209.             } else if (sprintflength(ex2, 0) >= 0) {    /* s := s + 's2' */
  210. tp = ex2->val.type;
  211.                 return makeexpr_bicall_2("strcat", tp,
  212.                                          makeexpr_addrstr(a), 
  213.                                          makeexpr_unsprintfify(ex2));
  214.             } else {                            /* general case */
  215.                 canceltempvar(mp);
  216.                 freeexpr(ex2->args[0]);
  217.                 ex = makeexpr_bicall_1("strlen", tp_int, copyexpr(a));
  218.                 ex2->args[0] = bumpstring(a, ex, 0);
  219.                 return ex2;
  220.             }
  221.         } else
  222.             freeexpr(ex2);
  223.     }
  224.     if (b->kind == EK_BICALL && !strcmp(b->val.s, "sprintf") &&
  225.          istempvar(b->args[0]) &&
  226.          (ex = singlevar(a)) != NULL) {
  227.         j = -1;     /* does lhs var appear exactly once on rhs? */
  228.         for (i = 2; i < b->nargs; i++) {
  229.             if (exprsame(b->args[i], ex, 1) && j < 0)
  230.                 j = i;
  231.             else if (exproccurs(b->args[i], ex))
  232.                 break;
  233.         }
  234.         if (i == b->nargs && j > 0) {
  235.             b->args[j] = makeexpr_bicall_2("strcpy", tp_str255,
  236.                                            makeexpr_addrstr(b->args[0]),
  237.                                            makeexpr_addrstr(b->args[j]));
  238.             b->args[0] = makeexpr_addrstr(a);
  239.             return b;
  240.         }
  241.     }
  242.     if (structuredfunc(b) && (ex2 = singlevar(a)) != NULL) {
  243. ep = &b->args[0];
  244. i = strlapfunc(b);
  245. while (structuredfunc((ex = *ep))) {
  246.     i = i && strlapfunc(ex);
  247.     ep = &ex->args[0];
  248. }
  249. if ((mp = istempvar(ex)) != NULL &&
  250.     (i || !exproccurs(b, ex2))) {
  251.     canceltempvar(mp);
  252.     freeexpr(*ep);
  253.     *ep = makeexpr_addrstr(a);
  254.     return b;
  255. }
  256.     }
  257.     if (a->val.type->kind == TK_PROCPTR &&
  258.         (mp = istempprocptr(b)) != NULL &&
  259.         nosideeffects(a, 0)) {
  260.         freeexpr(b->args[0]->args[0]->args[0]);
  261.         b->args[0]->args[0]->args[0] = copyexpr(a);
  262. if (b->nargs == 3) {
  263.     freeexpr(b->args[1]->args[0]->args[0]);
  264.     b->args[1]->args[0]->args[0] = a;
  265.     delfreearg(&b, 2);
  266. } else {
  267.     freeexpr(b->args[1]);
  268.     b->args[1] = makeexpr_assign(makeexpr_dotq(a, "link", tp_anyptr),
  269.  makeexpr_nil());
  270. }
  271.         canceltempvar(mp);
  272.         return b;
  273.     }
  274.     if (a->val.type->kind == TK_PROCPTR &&
  275. (b->val.type->kind == TK_CPROCPTR ||
  276.  checkconst(b, 0))) {
  277. ex = makeexpr_dotq(copyexpr(a), "proc", tp_anyptr);
  278. b = makeexpr_comma(makeexpr_assign(ex, b),
  279.    makeexpr_assign(makeexpr_dotq(a, "link", tp_anyptr),
  280.    makeexpr_nil()));
  281. return b;
  282.     }
  283.     if (a->val.type->kind == TK_CPROCPTR &&
  284. (mp = istempprocptr(b)) != NULL &&
  285. nosideeffects(a, 0)) {
  286. freeexpr(b->args[0]->args[0]);
  287. b->args[0]->args[0] = a;
  288. if (b->nargs == 3)
  289.     delfreearg(&b, 1);
  290. delfreearg(&b, 1);
  291. canceltempvar(mp);
  292. return b;
  293.     }
  294.     if (a->val.type->kind == TK_CPROCPTR &&
  295. b->val.type->kind == TK_PROCPTR) {
  296. b = makeexpr_dotq(b, "proc", tp_anyptr);
  297.     }
  298.     if (a->val.type->kind == TK_STRING) {
  299.         if (b->kind == EK_CONST && b->val.i == 0 && !isretvar(a)) {
  300.                 /* optimizing retvar would mess up "return" optimization */
  301.             return makeexpr_assign(makeexpr_hat(a, 0),
  302.                                    makeexpr_char(0));
  303.         }
  304.         a = makeexpr_addrstr(a);
  305.         b = makeexpr_addrstr(b);
  306.         return makeexpr_bicall_2("strcpy", a->val.type, a, b);
  307.     }
  308.     if (a->kind == EK_BICALL && !strcmp(a->val.s, "strlen")) {
  309.         if (b->kind == EK_CAST &&
  310.              ord_type(b->args[0]->val.type)->kind == TK_INTEGER) {
  311.             b = grabarg(b, 0);
  312.         }
  313.         j = (b->kind == EK_PLUS &&      /* handle "s[0] := xxx" */
  314.              b->args[0]->kind == EK_BICALL &&
  315.              !strcmp(b->args[0]->val.s, "strlen") &&
  316.              exprsame(a->args[0], b->args[0]->args[0], 0) &&
  317.              isliteralconst(b->args[1], NULL) == 2);
  318.         if (j && b->args[1]->val.i > 0 &&
  319.                  b->args[1]->val.i <= 5) {     /* lengthening the string */
  320.             a = grabarg(a, 0);
  321.             i = b->args[1]->val.i;
  322.             freeexpr(b);
  323.             if (i == 1)
  324.                 b = makeexpr_string(" ");
  325.             else
  326.                 b = makeexpr_lstring("12345", i);
  327.             return makeexpr_bicall_2("strcat", a->val.type, a, b);
  328.         } else {      /* maybe shortening the string */
  329.             if (!j && !isconstexpr(b, NULL))
  330.                 note("Modification of string length may translate incorrectly [146]");
  331.             a = grabarg(a, 0);
  332.             b = makeexpr_ord(b);
  333.             return makeexpr_assign(makeexpr_index(a, b, NULL),
  334.                                    makeexpr_char(0));
  335.         }
  336.     }
  337.     if (a->val.type->kind == TK_ARRAY ||
  338. (a->val.type->kind == TK_PROCPTR && copystructs < 1) ||
  339. (a->val.type->kind == TK_RECORD &&
  340.  (copystructs < 1 || a->val.type != b->val.type))) {
  341.         ex = makeexpr_sizeof(copyexpr(a), 0);
  342.         ex2 = makeexpr_sizeof(copyexpr(b), 0);
  343.         if (!exprsame(ex, ex2, 1) &&
  344.             !(a->val.type->kind == TK_ARRAY &&
  345.               b->val.type->kind != TK_ARRAY))
  346.             warning("Incompatible types or sizes [167]");
  347.         freeexpr(ex2);
  348.         ex = makeexpr_arglong(ex, (size_t_long != 0));
  349.         a = makeexpr_addrstr(a);
  350.         b = makeexpr_addrstr(b);
  351.         return makeexpr_bicall_3("memcpy", a->val.type, a, b, ex);
  352.     }
  353.     if (a->val.type->kind == TK_SET) {
  354.         a = makeexpr_addrstr(a);
  355.         b = makeexpr_addrstr(b);
  356.         return makeexpr_bicall_2(setcopyname, a->val.type, a, b);
  357.     }
  358.     for (ep = &a; (ex3 = *ep); ) {
  359.         if (ex3->kind == EK_COMMA)
  360.             ep = &ex3->args[ex3->nargs-1];
  361.         else if (ex3->kind == EK_CAST || ex3->kind == EK_ACTCAST)
  362.             ep = &ex3->args[0];
  363.         else
  364.             break;
  365.     }
  366.     if (ex3->kind == EK_BICALL) {
  367.         if (!strcmp(ex3->val.s, getbitsname)) {
  368.     tp = ex3->args[0]->val.type;
  369.     if (tp->kind == TK_ARRAY)
  370. ex3->args[0] = makeexpr_addr(ex3->args[0]);
  371.             ex3->val.type = tp_void;
  372.             if (checkconst(b, 0) && *clrbitsname) {
  373.                 strchange(&ex3->val.s, clrbitsname);
  374.             } else if (*putbitsname &&
  375.                        ((ISCONST(b->kind) &&
  376.                          (b->val.i | ~((1 << (1 << tp->escale)) - 1)) == -1) ||
  377.                         checkconst(b, (1 << (1 << tp->escale)) - 1))) {
  378.                 strchange(&ex3->val.s, putbitsname);
  379.                 insertarg(ep, 2, makeexpr_arglong(makeexpr_ord(b), 0));
  380.             } else {
  381.                 b = makeexpr_arglong(makeexpr_ord(b), 0);
  382.                 if (*storebitsname) {
  383.                     strchange(&ex3->val.s, storebitsname);
  384.                     insertarg(ep, 2, b);
  385.                 } else {
  386.                     if (exproccurs(b, ex3->args[0])) {
  387.                         mp = makestmttempvar(b->val.type, name_TEMP);
  388.                         ex2 = makeexpr_assign(makeexpr_var(mp), b);
  389.                         b = makeexpr_var(mp);
  390.                     } else
  391.                         ex2 = NULL;
  392.                     ex = copyexpr(ex3);
  393.                     strchange(&ex3->val.s, putbitsname);
  394.                     insertarg(&ex3, 2, b);
  395.                     strchange(&ex->val.s, clrbitsname);
  396.                     *ep = makeexpr_comma(ex2, makeexpr_comma(ex, ex3));
  397.                 }
  398.             }
  399.             return a;
  400.         } else if (!strcmp(ex3->val.s, getfbufname)) {
  401.     ex3->val.type = tp_void;
  402.     strchange(&ex3->val.s, putfbufname);
  403.     insertarg(ep, 2, b);
  404.     return a;
  405.         } else if (!strcmp(ex3->val.s, chargetfbufname)) {
  406.     ex3->val.type = tp_void;
  407.     if (*charputfbufname) {
  408. strchange(&ex3->val.s, charputfbufname);
  409. insertarg(ep, 1, b);
  410.     } else {
  411. strchange(&ex3->val.s, putfbufname);
  412. insertarg(ep, 1, makeexpr_type(ex3->val.type->basetype->basetype));
  413. insertarg(ep, 2, b);
  414.     }
  415.     return a;
  416.         } else if (!strcmp(ex3->val.s, arraygetfbufname)) {
  417.     ex3->val.type = tp_void;
  418.     if (*arrayputfbufname) {
  419. strchange(&ex3->val.s, arrayputfbufname);
  420. insertarg(ep, 1, b);
  421.     } else {
  422. strchange(&ex3->val.s, putfbufname);
  423. insertarg(ep, 1, makeexpr_type(ex3->val.type->basetype->basetype));
  424. insertarg(ep, 2, b);
  425.     }
  426.     return a;
  427. }
  428.     }
  429.     while (a->kind == EK_CAST || a->kind == EK_ACTCAST) {
  430. if (ansiC < 2 ||     /* in GNU C, a cast is an lvalue */
  431.     isarithkind(a->args[0]->kind) ||
  432.     (a->val.type->kind == TK_POINTER &&
  433.      a->args[0]->val.type->kind == TK_POINTER)) {
  434.     if (a->kind == EK_CAST)
  435. b = makeexpr_cast(b, a->args[0]->val.type);
  436.     else
  437. b = makeexpr_actcast(b, a->args[0]->val.type);
  438.             a = grabarg(a, 0);
  439.         } else
  440.     break;
  441.     }
  442.     if (a->kind == EK_NEG)
  443. return makeexpr_assign(grabarg(a, 0), makeexpr_neg(b));
  444.     if (a->kind == EK_NOT)
  445. return makeexpr_assign(grabarg(a, 0), makeexpr_not(b));
  446.     if (a->kind == EK_BNOT)
  447. return makeexpr_assign(grabarg(a, 0),
  448.        makeexpr_un(EK_BNOT, b->val.type, b));
  449.     if (a->kind == EK_PLUS) {
  450. for (i = 0; i < a->nargs && a->nargs > 1; ) {
  451.     if (isconstantexpr(a->args[i])) {
  452. b = makeexpr_minus(b, a->args[i]);
  453. deletearg(&a, i);
  454.     } else
  455. i++;
  456. }
  457. if (a->nargs == 1)
  458.     return makeexpr_assign(grabarg(a, 0), b);
  459.     }
  460.     if (a->kind == EK_TIMES) {
  461. for (i = 0; i < a->nargs && a->nargs > 1; ) {
  462.     if (isconstantexpr(a->args[i])) {
  463. if (a->val.type->kind == TK_REAL)
  464.     b = makeexpr_divide(b, a->args[i]);
  465. else {
  466.     if (ISCONST(b->kind) && ISCONST(a->args[i]->kind) &&
  467. (b->val.i % a->args[i]->val.i) != 0) {
  468. break;
  469.     }
  470.     b = makeexpr_div(b, a->args[i]);
  471. }
  472. deletearg(&a, i);
  473.     } else
  474. i++;
  475. }
  476. if (a->nargs == 1)
  477.     return makeexpr_assign(grabarg(a, 0), b);
  478.     }
  479.     if ((a->kind == EK_DIVIDE || a->kind == EK_DIV) &&
  480.  isconstantexpr(a->args[1])) {
  481. b = makeexpr_times(b, a->args[1]);
  482. return makeexpr_assign(a->args[0], b);
  483.     }
  484.     if (a->kind == EK_LSH && isconstantexpr(a->args[1])) {
  485. if (ISCONST(b->kind) && ISCONST(a->args[1]->kind)) {
  486.     if ((b->val.i & ((1L << a->args[1]->val.i)-1)) == 0) {
  487. b->val.i >>= a->args[1]->val.i;
  488. return makeexpr_assign(grabarg(a, 0), b);
  489.     }
  490. } else {
  491.     b = makeexpr_bin(EK_RSH, b->val.type, b, a->args[1]);
  492.     return makeexpr_assign(a->args[0], b);
  493. }
  494.     }
  495.     if (a->kind == EK_RSH && isconstantexpr(a->args[1])) {
  496. if (ISCONST(b->kind) && ISCONST(a->args[1]->kind))
  497.     b->val.i <<= a->args[1]->val.i;
  498. else
  499.     b = makeexpr_bin(EK_LSH, b->val.type, b, a->args[1]);
  500. return makeexpr_assign(a->args[0], b);
  501.     }
  502.     if (isarithkind(a->kind))
  503. warning("Invalid assignment [168]");
  504.     return makeexpr_bin(EK_ASSIGN, a->val.type, a, makeexpr_unlongcast(b));
  505. }
  506. Expr *makeexpr_comma(a, b)
  507. Expr *a, *b;
  508. {
  509.     Type *type;
  510.     if (!a || nosideeffects(a, 1))
  511.         return b;
  512.     if (!b)
  513.         return a;
  514.     type = b->val.type;
  515.     a = commute(a, b, EK_COMMA);
  516.     a->val.type = type;
  517.     return a;
  518. }
  519. int strmax(ex)
  520. Expr *ex;
  521. {
  522.     Meaning *mp;
  523.     long smin, smax;
  524.     Value val;
  525.     Type *type;
  526.     type = ex->val.type;
  527.     if (type->kind == TK_POINTER)
  528.         type = type->basetype;
  529.     if (type->kind == TK_CHAR)
  530.         return 1;
  531.     if (type->kind == TK_ARRAY && type->basetype->kind == TK_CHAR) {
  532.         if (ord_range(type->indextype, &smin, &smax))
  533.             return smax - smin + 1;
  534.         else
  535.             return stringceiling;
  536.     }
  537.     if (type->kind != TK_STRING) {
  538.         intwarning("strmax", "strmax encountered a non-string value [169]");
  539.         return stringceiling;
  540.     }
  541.     if (ex->kind == EK_CONST)
  542.         return ex->val.i;
  543.     if (ex->kind == EK_VAR && foldstrconsts != 0 &&
  544.         (mp = (Meaning *)(ex->val.i))->kind == MK_CONST)
  545.         return mp->val.i;
  546.     if (ex->kind == EK_BICALL) {
  547. if (!strcmp(ex->val.s, strsubname)) {
  548.     if (isliteralconst(ex->args[3], &val) && val.type)
  549. return val.i;
  550. }
  551.     }
  552.     if (ord_range(type->indextype, NULL, &smax))
  553.         return smax;
  554.     else
  555.         return stringceiling;
  556. }
  557. int strhasnull(val)
  558. Value val;
  559. {
  560.     int i;
  561.     for (i = 0; i < val.i; i++) {
  562.         if (!val.s[i])
  563.             return (i == val.i-1) ? 1 : 2;
  564.     }
  565.     return 0;
  566. }
  567. int istempsprintf(ex)
  568. Expr *ex;
  569. {
  570.     return (ex->kind == EK_BICALL && !strcmp(ex->val.s, "sprintf") &&
  571.             ex->nargs >= 2 &&
  572.             istempvar(ex->args[0]) && 
  573.             ex->args[1]->kind == EK_CONST && 
  574.             ex->args[1]->val.type->kind == TK_STRING);
  575. }
  576. Expr *makeexpr_sprintfify(ex)
  577. Expr *ex;
  578. {
  579.     Meaning *tvar;
  580.     char stringbuf[500];
  581.     char *cp, ch;
  582.     int j, nnulls;
  583.     Expr *ex2;
  584.     if (debug>2) { fprintf(outf,"makeexpr_sprintfify("); dumpexpr(ex); fprintf(outf,")n"); }
  585.     if (istempsprintf(ex))
  586.         return ex;
  587.     ex = makeexpr_stringcast(ex);
  588.     tvar = makestmttempvar(tp_str255, name_STRING);
  589.     if (ex->kind == EK_CONST && ex->val.type->kind == TK_STRING) {
  590.         cp = stringbuf;
  591.         nnulls = 0;
  592.         for (j = 0; j < ex->val.i; j++) {
  593.             ch = ex->val.s[j];
  594.             if (!ch) {
  595.                 if (j < ex->val.i-1)
  596.                     note("Null character in sprintf control string [147]");
  597.                 else
  598.                     note("Null character at end of sprintf control string [148]");
  599.                 if (keepnulls) {
  600.                     *cp++ = '%';
  601.                     *cp++ = 'c';
  602.                     nnulls++;
  603.                 }
  604.             } else {
  605.                 *cp++ = ch;
  606.                 if (ch == '%')
  607.                     *cp++ = ch;
  608.             }
  609.         }
  610.         *cp = 0;
  611.         ex = makeexpr_bicall_2("sprintf", tp_str255,
  612.                                makeexpr_var(tvar),
  613.                                makeexpr_string(stringbuf));
  614.         while (--nnulls >= 0)
  615.             insertarg(&ex, 2, makeexpr_char(0));
  616.         return ex;
  617.     } else if (ex->val.type->kind == TK_ARRAY &&
  618.                ex->val.type->basetype->kind == TK_CHAR) {
  619.         ex2 = arraysize(ex->val.type, 0);
  620.         return cleansprintf(
  621.                 makeexpr_bicall_4("sprintf", tp_str255,
  622.                                   makeexpr_var(tvar),
  623.                                   makeexpr_string("%.*s"),
  624.                                   ex2,
  625.                                   makeexpr_addrstr(ex)));
  626.     } else {
  627.         if (ord_type(ex->val.type)->kind == TK_CHAR)
  628.             cp = "%c";
  629.         else if (ex->val.type->kind == TK_STRING)
  630.             cp = "%s";
  631.         else {
  632.             warning("Mixing non-strings with strings [170]");
  633.             return ex;
  634.         }
  635.         return makeexpr_bicall_3("sprintf", tp_str255,
  636.                                  makeexpr_var(tvar),
  637.                                  makeexpr_string(cp),
  638.                                  ex);
  639.     }
  640. }
  641. Expr *makeexpr_unsprintfify(ex)
  642. Expr *ex;
  643. {
  644.     char stringbuf[500];
  645.     char *cp, ch;
  646.     int i;
  647.     if (debug>2) { fprintf(outf,"makeexpr_unsprintfify("); dumpexpr(ex); fprintf(outf,")n"); }
  648.     if (!istempsprintf(ex))
  649.         return ex;
  650.     canceltempvar(istempvar(ex->args[0]));
  651.     for (i = 2; i < ex->nargs; i++) {
  652.         if (ex->args[i]->val.type->kind != TK_CHAR ||
  653.             !checkconst(ex, 0))
  654.             return ex;
  655.     }
  656.     cp = stringbuf;
  657.     for (i = 0; i < ex->args[1]->val.i; i++) {
  658.         ch = ex->args[1]->val.s[i];
  659.         *cp++ = ch;
  660.         if (ch == '%') {
  661.             if (++i == ex->args[1]->val.i)
  662.                 return ex;
  663.             ch = ex->args[1]->val.s[i];
  664.             if (ch == 'c')
  665.                 cp[-1] = 0;
  666.             else if (ch != '%')
  667.                 return ex;
  668.         }
  669.     }
  670.     freeexpr(ex);
  671.     return makeexpr_lstring(stringbuf, cp - stringbuf);
  672. }
  673. /* Returns >= 0 iff unsprintfify would return a string constant */
  674. int sprintflength(ex, allownulls)
  675. Expr *ex;
  676. int allownulls;
  677. {
  678.     int i, len;
  679.     if (!istempsprintf(ex))
  680.         return -1;
  681.     for (i = 2; i < ex->nargs; i++) {
  682.         if (!allownulls ||
  683.             ex->args[i]->val.type->kind != TK_CHAR ||
  684.             !checkconst(ex, 0))
  685.             return -1;
  686.     }
  687.     len = 0;
  688.     for (i = 0; i < ex->args[1]->val.i; i++) {
  689.         len++;
  690.         if (ex->args[1]->val.s[i] == '%') {
  691.             if (++i == ex->args[1]->val.i)
  692.                 return -1;
  693.             if (ex->args[1]->val.s[i] != 'c' &&
  694.                 ex->args[1]->val.s[i] != '%')
  695.                 return -1;
  696.         }
  697.     }
  698.     return len;
  699. }
  700. Expr *makeexpr_concat(a, b, usesprintf)
  701. Expr *a, *b;
  702. int usesprintf;
  703. {
  704.     int i, ii, j, len, nargs;
  705.     Type *type;
  706.     Meaning *mp, *tvar;
  707.     Expr *ex, *args[2];
  708.     int akind[2];
  709.     Value val, val1, val2;
  710.     char formatstr[300];
  711.     if (debug>2) { fprintf(outf,"makeexpr_concat("); dumpexpr(a); fprintf(outf,", "); dumpexpr(b); fprintf(outf,")n"); }
  712.     if (!a)
  713.         return b;
  714.     if (!b)
  715.         return a;
  716.     a = makeexpr_stringcast(a);
  717.     b = makeexpr_stringcast(b);
  718.     if (checkconst(a, 0)) {
  719.         freeexpr(a);
  720.         return b;
  721.     }
  722.     if (checkconst(b, 0)) {
  723.         freeexpr(b);
  724.         return a;
  725.     }
  726.     len = strmax(a) + strmax(b);
  727.     type = makestringtype(len);
  728.     if (a->kind == EK_CONST && b->kind == EK_CONST) {
  729.         val1 = a->val;
  730.         val2 = b->val;
  731.         val.i = val1.i + val2.i;
  732.         val.s = ALLOC(val.i+1, char, literals);
  733. val.s[val.i] = 0;
  734.         val.type = type;
  735.         memcpy(val.s, val1.s, val1.i);
  736.         memcpy(val.s + val1.i, val2.s, val2.i);
  737.         freeexpr(a);
  738.         freeexpr(b);
  739.         return makeexpr_val(val);
  740.     }
  741.     tvar = makestmttempvar(type, name_STRING);
  742.     if (sprintf_value != 2 || usesprintf) {
  743.         nargs = 2;                 /* Generate a call to sprintf(), unfolding */
  744.         args[0] = a;               /*  nested sprintf()'s. */
  745.         args[1] = b;
  746.         *formatstr = 0;
  747.         for (i = 0; i < 2; i++) {
  748. #if 1
  749.             ex = args[i] = makeexpr_sprintfify(args[i]);
  750.     if (!ex->args[1] || !ex->args[1]->val.s)
  751. intwarning("makeexpr_concat", "NULL in ex->args[1]");
  752.     else
  753. strncat(formatstr, ex->args[1]->val.s, ex->args[1]->val.i);
  754.             canceltempvar(istempvar(ex->args[0]));
  755.             nargs += (ex->nargs - 2);
  756.             akind[i] = 0;      /* now obsolete */
  757. #else
  758.             ex = args[i];
  759.             if (ex->kind == EK_CONST)
  760.                 ex = makeexpr_sprintfify(ex);
  761.             if (istempsprintf(ex)) {
  762.                 strncat(formatstr, ex->args[1]->val.s, ex->args[1]->val.i);
  763.                 canceltempvar(istempvar(ex->args[0]));
  764.                 nargs += (ex->nargs - 2);
  765.                 akind[i] = 0;
  766.             } else {
  767.                 strcat(formatstr, "%s");
  768.                 nargs++;
  769.                 akind[i] = 1;
  770.             }
  771. #endif
  772.         }
  773.         ex = makeexpr(EK_BICALL, nargs);
  774.         ex->val.type = type;
  775.         ex->val.s = stralloc("sprintf");
  776.         ex->args[0] = makeexpr_var(tvar);
  777.         ex->args[1] = makeexpr_string(formatstr);
  778.         j = 2;
  779.         for (i = 0; i < 2; i++) {
  780.             switch (akind[i]) {
  781.                 case 0:   /* flattened sub-sprintf */
  782.                     for (ii = 2; ii < args[i]->nargs; ii++)
  783.                         ex->args[j++] = copyexpr(args[i]->args[ii]);
  784.                     freeexpr(args[i]);
  785.                     break;
  786.                 case 1:   /* included string expr */
  787.                     ex->args[j++] = args[i];
  788.                     break;
  789.             }
  790.         }
  791.     } else {
  792.         ex = a;
  793.         while (ex->kind == EK_BICALL && !strcmp(ex->val.s, "strcat"))
  794.             ex = ex->args[0];
  795.         if (ex->kind == EK_BICALL && !strcmp(ex->val.s, "strcpy") &&
  796.             (mp = istempvar(ex->args[0])) != NULL) {
  797.             canceltempvar(mp);
  798.             freeexpr(ex->args[0]);
  799.             ex->args[0] = makeexpr_var(tvar);
  800.         } else {
  801.             a = makeexpr_bicall_2("strcpy", type, makeexpr_var(tvar), a);
  802.         }
  803.         ex = makeexpr_bicall_2("strcat", type, a, b);
  804.     }
  805.     if (debug>2) { fprintf(outf,"makeexpr_concat returns "); dumpexpr(ex); fprintf(outf,"n"); }
  806.     return ex;
  807. }
  808. Expr *cleansprintf(ex)
  809. Expr *ex;
  810. {
  811.     int fidx, i, j, k, len, changed = 0;
  812.     char *cp, *bp;
  813.     char fmtbuf[300];
  814.     if (ex->kind != EK_BICALL)
  815. return ex;
  816.     if (!strcmp(ex->val.s, "printf"))
  817. fidx = 0;
  818.     else if (!strcmp(ex->val.s, "sprintf") ||
  819.      !strcmp(ex->val.s, "fprintf"))
  820. fidx = 1;
  821.     else
  822. return ex;
  823.     len = ex->args[fidx]->val.i;
  824.     cp = ex->args[fidx]->val.s;      /* printf("%*d",17,x)  =>  printf("%17d",x) */
  825.     bp = fmtbuf;
  826.     j = fidx + 1;
  827.     for (i = 0; i < len; i++) {
  828.         *bp++ = cp[i];
  829.         if (cp[i] == '%') {
  830.     if (cp[i+1] == 's' && ex->args[j]->kind == EK_CONST) {
  831. bp--;
  832. for (k = 0; k < ex->args[j]->val.i; k++)
  833.     *bp++ = ex->args[j]->val.s[k];
  834. delfreearg(&ex, j);
  835. changed = 1;
  836. i++;
  837. continue;
  838.     }
  839.             for (i++; i < len &&
  840.                       !(isalpha(cp[i]) && cp[i] != 'l'); i++) {
  841.                 if (cp[i] == '*') {
  842.                     if (isliteralconst(ex->args[j], NULL) == 2) {
  843.                         sprintf(bp, "%ld", ex->args[j]->val.i);
  844.                         bp += strlen(bp);
  845.                         delfreearg(&ex, j);
  846.                         changed = 1;
  847.                     } else {
  848.                         *bp++ = cp[i];
  849.                         j++;
  850.                     }
  851.                 } else
  852.                     *bp++ = cp[i];
  853.             }
  854.             if (i < len)
  855.                 *bp++ = cp[i];
  856.             j++;
  857.         }
  858.     }
  859.     *bp = 0;
  860.     if (changed) {
  861.         freeexpr(ex->args[fidx]);
  862.         ex->args[fidx] = makeexpr_string(fmtbuf);
  863.     }
  864.     return ex;
  865. }
  866. Expr *makeexpr_substring(vex, ex, exi, exj)
  867. Expr *vex, *ex, *exi, *exj;
  868. {
  869.     exi = makeexpr_unlongcast(exi);
  870.     exj = makeexpr_longcast(exj, 0);
  871.     ex = bumpstring(ex, exi, 1);
  872.     return cleansprintf(makeexpr_bicall_4("sprintf", tp_str255,
  873.                                           vex,
  874.                                           makeexpr_string("%.*s"),
  875.                                           exj,
  876.                                           ex));
  877. }
  878. Expr *makeexpr_dot(ex, mp)
  879. Expr *ex;
  880. Meaning *mp;
  881. {
  882.     Type *ot1, *ot2;
  883.     Expr *ex2, *ex3, *nex;
  884.     Meaning *tvar;
  885.     if (ex->kind == EK_FUNCTION && copystructfuncs > 0) {
  886.         tvar = makestmttempvar(ex->val.type, name_TEMP);
  887.         ex2 = makeexpr_assign(makeexpr_var(tvar), ex);
  888.         ex = makeexpr_var(tvar);
  889.     } else
  890.         ex2 = NULL;
  891.     if (mp->constdefn) {
  892.         nex = makeexpr(EK_MACARG, 0);
  893.         nex->val.type = tp_integer;
  894.         ex3 = replaceexprexpr(copyexpr(mp->constdefn), nex, ex);
  895.         freeexpr(ex);
  896.         freeexpr(nex);
  897.         ex = gentle_cast(ex3, mp->val.type);
  898.     } else {
  899.         ex = makeexpr_un(EK_DOT, mp->type, ex);
  900.         ex->val.i = (long)mp;
  901.         ot1 = ord_type(mp->type);
  902.         ot2 = ord_type(mp->val.type);
  903.         if (ot1->kind != ot2->kind && ot2->kind == TK_ENUM && ot2->meaning && useenum)
  904.             ex = makeexpr_cast(ex, mp->val.type);
  905.         else if (mp->val.i && !hassignedchar &&
  906.  (mp->type == tp_sint || mp->type == tp_abyte)) {
  907.             if (*signextname) {
  908.                 ex = makeexpr_bicall_2(signextname, tp_integer,
  909.                                        ex, makeexpr_long(mp->val.i));
  910.             } else
  911.                 note(format_s("Unable to sign-extend field %s [149]", mp->name));
  912.         }
  913.     }
  914.     ex->val.type = mp->val.type;
  915.     return makeexpr_comma(ex2, ex);
  916. }
  917. Expr *makeexpr_dotq(ex, name, type)
  918. Expr *ex;
  919. char *name;
  920. Type *type;
  921. {
  922.     ex = makeexpr_un(EK_DOT, type, ex);
  923.     ex->val.s = stralloc(name);
  924.     return ex;
  925. }
  926. Expr *strmax_func(ex)
  927. Expr *ex;
  928. {
  929.     Meaning *mp;
  930.     Expr *ex2;
  931.     Type *type;
  932.     type = ex->val.type;
  933.     if (type->kind == TK_POINTER) {
  934.         intwarning("strmax_func", "got a pointer instead of a string [171]");
  935.         type = type->basetype;
  936.     }
  937.     if (type->kind == TK_CHAR)
  938.         return makeexpr_long(1);
  939.     if (type->kind != TK_STRING) {
  940.         warning("STRMAX of non-string value [172]");
  941.         return makeexpr_long(stringceiling);
  942.     }
  943.     if (ex->kind == EK_CONST)
  944. return makeexpr_long(ex->val.i);
  945.     if (ex->kind == EK_VAR &&
  946. (mp = (Meaning *)ex->val.i)->kind == MK_CONST &&
  947. mp->type == tp_str255)
  948. return makeexpr_long(mp->val.i);
  949.     if (ex->kind == EK_VAR &&
  950.         (mp = (Meaning *)ex->val.i)->kind == MK_VARPARAM &&
  951.         mp->type == tp_strptr) {
  952. if (mp->anyvarflag) {
  953.     if (mp->ctx != curctx && mp->ctx->kind == MK_FUNCTION)
  954. note(format_s("Reference to STRMAX of parent proc's "%s" must be fixed [150]",
  955.       mp->name));
  956.     return makeexpr_name(format_s(name_STRMAX, mp->name), tp_int);
  957. } else
  958.     note(format_s("STRMAX of "%s" wants VarStrings=1 [151]", mp->name));
  959.     }
  960.     ord_range_expr(type->indextype, NULL, &ex2);
  961.     return copyexpr(ex2);
  962. }
  963. Expr *makeexpr_nil()
  964. {
  965.     Expr *ex;
  966.     ex = makeexpr(EK_CONST, 0);
  967.     ex->val.type = tp_anyptr;
  968.     ex->val.i = 0;
  969.     ex->val.s = NULL;
  970.     return ex;
  971. }
  972. Expr *makeexpr_ctx(ctx)
  973. Meaning *ctx;
  974. {
  975.     Expr *ex;
  976.     ex = makeexpr(EK_CTX, 0);
  977.     ex->val.type = tp_text;     /* handy pointer type */
  978.     ex->val.i = (long)ctx;
  979.     return ex;
  980. }
  981. Expr *force_signed(ex)
  982. Expr *ex;
  983. {
  984.     Type *tp;
  985.     if (isliteralconst(ex, NULL) == 2 && ex->nargs == 0)
  986.         return ex;
  987.     tp = true_type(ex);
  988.     if (tp == tp_ushort || tp == tp_ubyte || tp == tp_uchar)
  989. return makeexpr_cast(ex, tp_sshort);
  990.     else if (tp == tp_unsigned || tp == tp_uint) {
  991. if (exprlongness(ex) < 0)
  992.     return makeexpr_cast(ex, tp_sint);
  993. else
  994.     return makeexpr_cast(ex, tp_integer);
  995.     }
  996.     return ex;
  997. }
  998. Expr *force_unsigned(ex)
  999. Expr *ex;
  1000. {
  1001.     Type *tp;
  1002.     if (isliteralconst(ex, NULL) == 2 && !expr_is_neg(ex))
  1003.         return ex;
  1004.     tp = true_type(ex);
  1005.     if (tp == tp_unsigned || tp == tp_uint || tp == tp_ushort ||
  1006. tp == tp_ubyte || tp == tp_uchar)
  1007.         return ex;
  1008.     if (tp->kind == TK_CHAR)
  1009. return makeexpr_actcast(ex, tp_uchar);
  1010.     else if (exprlongness(ex) < 0)
  1011.         return makeexpr_cast(ex, tp_uint);
  1012.     else
  1013.         return makeexpr_cast(ex, tp_unsigned);
  1014. }
  1015. #define CHECKSIZE(size) (((size) > 0 && (size)%charsize == 0) ? (size)/charsize : 0)
  1016. long type_sizeof(type, pasc)
  1017. Type *type;
  1018. int pasc;
  1019. {
  1020.     long s1, smin, smax;
  1021.     int charsize = (sizeof_char) ? sizeof_char : CHAR_BIT;      /* from <limits.h> */
  1022.     switch (type->kind) {
  1023.         case TK_INTEGER:
  1024.             if (type == tp_integer ||
  1025.                 type == tp_unsigned)
  1026.                 return pasc ? 4 : CHECKSIZE(sizeof_integer);
  1027.             else
  1028.                 return pasc ? 2 : CHECKSIZE(sizeof_short);
  1029.         case TK_CHAR:
  1030.         case TK_BOOLEAN:
  1031.             return 1;
  1032.         case TK_SUBR:
  1033.             type = findbasetype(type, 0);
  1034.             if (pasc) {
  1035.                 if (type == tp_integer || type == tp_unsigned)
  1036.                     return 4;
  1037.                 else
  1038.                     return 2;
  1039.             } else {
  1040.                 if (type == tp_abyte || type == tp_ubyte || type == tp_sbyte)
  1041.                     return 1;
  1042.                 else if (type == tp_ushort || type == tp_sshort)
  1043.                     return CHECKSIZE(sizeof_short);
  1044.                 else
  1045.                     return CHECKSIZE(sizeof_integer);
  1046.             }
  1047.         case TK_POINTER:
  1048.             return pasc ? 4 : CHECKSIZE(sizeof_pointer);
  1049.         case TK_REAL:
  1050.     if (type == tp_longreal)
  1051. return pasc ? (which_lang == LANG_TURBO ? 6 : 8) : CHECKSIZE(sizeof_double);
  1052.     else
  1053. return pasc ? 4 : CHECKSIZE(sizeof_float);
  1054.         case TK_ENUM:
  1055.     if (!pasc)
  1056. return CHECKSIZE(sizeof_enum);
  1057.     type = findbasetype(type, 0);
  1058.             return type->kind != TK_ENUM ? type_sizeof(type, pasc)
  1059.    : CHECKSIZE(pascalenumsize);
  1060.         case TK_SMALLSET:
  1061.         case TK_SMALLARRAY:
  1062.             return pasc ? 0 : type_sizeof(type->basetype, pasc);
  1063.         case TK_ARRAY:
  1064.             s1 = type_sizeof(type->basetype, pasc);
  1065.             if (s1 && ord_range(type->indextype, &smin, &smax))
  1066.                 return s1 * (smax - smin + 1);
  1067.             else
  1068.                 return 0;
  1069.         case TK_RECORD:
  1070.             if (pasc && type->meaning) {
  1071.                 if (!strcmp(type->meaning->sym->name, "NA_WORD"))
  1072.                     return 2;
  1073.                 else if (!strcmp(type->meaning->sym->name, "NA_LONGWORD"))
  1074.                     return 4;
  1075.                 else if (!strcmp(type->meaning->sym->name, "NA_QUADWORD"))
  1076.                     return 8;
  1077.                 else
  1078.                     return 0;
  1079.             } else
  1080.                 return 0;
  1081.         default:
  1082.             return 0;
  1083.     }
  1084. }
  1085. Static Value eval_expr_either(ex, pasc)
  1086. Expr *ex;
  1087. int pasc;
  1088. {
  1089.     Value val, val2;
  1090.     Meaning *mp;
  1091.     int i;
  1092.     if (debug>2) { fprintf(outf,"eval_expr("); dumpexpr(ex); fprintf(outf,")n"); }
  1093.     switch (ex->kind) {
  1094.         case EK_CONST:
  1095.         case EK_LONGCONST:
  1096.             return ex->val;
  1097.         case EK_VAR:
  1098.             mp = (Meaning *) ex->val.i;
  1099.             if (mp->kind == MK_CONST && 
  1100.                 (foldconsts != 0 ||
  1101.                  mp == mp_maxint || mp == mp_minint))
  1102.                 return mp->val;
  1103.             break;
  1104.         case EK_SIZEOF:
  1105.             i = type_sizeof(ex->args[0]->val.type, pasc);
  1106.             if (i)
  1107.                 return make_ord(tp_integer, i);
  1108.             break;
  1109.         case EK_PLUS:
  1110.             val = eval_expr_either(ex->args[0], pasc);
  1111.             if (!val.type || ord_type(val.type) != tp_integer)
  1112.                 val.type = NULL;
  1113.             for (i = 1; val.type && i < ex->nargs; i++) {
  1114.                 val2 = eval_expr_either(ex->args[i], pasc);
  1115.                 if (!val2.type || ord_type(val2.type) != tp_integer)
  1116.                     val.type = NULL;
  1117.                 else
  1118.                     val.i += val2.i;
  1119.             }
  1120.             return val;
  1121.         case EK_TIMES:
  1122.             val = eval_expr_either(ex->args[0], pasc);
  1123.             if (!val.type || ord_type(val.type) != tp_integer)
  1124.                 val.type = NULL;
  1125.             for (i = 1; val.type && i < ex->nargs; i++) {
  1126.                 val2 = eval_expr_either(ex->args[i], pasc);
  1127.                 if (!val2.type || ord_type(val2.type) != tp_integer)
  1128.                     val.type = NULL;
  1129.                 else
  1130.                     val.i *= val2.i;
  1131.             }
  1132.             return val;
  1133.         case EK_DIV:
  1134.             val = eval_expr_either(ex->args[0], pasc);
  1135.             val2 = eval_expr_either(ex->args[1], pasc);
  1136.             if (val.type && ord_type(val.type) == tp_integer &&
  1137.                 val2.type && ord_type(val2.type) == tp_integer && val2.i) {
  1138.                 val.i /= val2.i;
  1139.                 return val;
  1140.             }
  1141.             break;
  1142.         case EK_MOD:
  1143.             val = eval_expr_either(ex->args[0], pasc);
  1144.             val2 = eval_expr_either(ex->args[1], pasc);
  1145.             if (val.type && ord_type(val.type) == tp_integer &&
  1146.                 val2.type && ord_type(val2.type) == tp_integer && val2.i) {
  1147.                 val.i %= val2.i;
  1148.                 return val;
  1149.             }
  1150.             break;
  1151.         case EK_NEG:
  1152.             val = eval_expr_either(ex->args[0], pasc);
  1153.             if (val.type) {
  1154.                 val.i = -val.i;
  1155.                 return val;
  1156.             }
  1157.             break;
  1158.         case EK_LSH:
  1159.             val = eval_expr_either(ex->args[0], pasc);
  1160.             val2 = eval_expr_either(ex->args[1], pasc);
  1161.             if (val.type && val2.type) {
  1162.                 val.i <<= val2.i;
  1163.                 return val;
  1164.             }
  1165.             break;
  1166.         case EK_RSH:
  1167.             val = eval_expr_either(ex->args[0], pasc);
  1168.             val2 = eval_expr_either(ex->args[1], pasc);
  1169.             if (val.type && val2.type) {
  1170.                 val.i >>= val2.i;
  1171.                 return val;
  1172.             }
  1173.             break;
  1174.         case EK_BAND:
  1175.             val = eval_expr_either(ex->args[0], pasc);
  1176.             val2 = eval_expr_either(ex->args[1], pasc);
  1177.             if (val.type && val2.type) {
  1178.                 val.i &= val2.i;
  1179.                 return val;
  1180.             }
  1181.             break;
  1182.         case EK_BOR:
  1183.             val = eval_expr_either(ex->args[0], pasc);
  1184.             val2 = eval_expr_either(ex->args[1], pasc);
  1185.             if (val.type && val2.type) {
  1186.                 val.i |= val2.i;
  1187.                 return val;
  1188.             }
  1189.             break;
  1190.         case EK_BXOR:
  1191.             val = eval_expr_either(ex->args[0], pasc);
  1192.             val2 = eval_expr_either(ex->args[1], pasc);
  1193.             if (val.type && val2.type) {
  1194.                 val.i ^= val2.i;
  1195.                 return val;
  1196.             }
  1197.             break;
  1198.         case EK_BNOT:
  1199.             val = eval_expr_either(ex->args[0], pasc);
  1200.             if (val.type) {
  1201.                 val.i = ~val.i;
  1202.                 return val;
  1203.             }
  1204.             break;
  1205.         case EK_EQ:
  1206.         case EK_NE:
  1207.         case EK_GT:
  1208.         case EK_LT:
  1209.         case EK_GE:
  1210.         case EK_LE:
  1211.             val = eval_expr_either(ex->args[0], pasc);
  1212.             val2 = eval_expr_either(ex->args[1], pasc);
  1213.             if (val.type) {
  1214.                 if (val.i == val2.i)
  1215.                     val.i = (ex->kind == EK_EQ || ex->kind == EK_GE || ex->kind == EK_LE);
  1216.                 else if (val.i < val2.i)
  1217.                     val.i = (ex->kind == EK_LT || ex->kind == EK_LE || ex->kind == EK_NE);
  1218.                 else
  1219.                     val.i = (ex->kind == EK_GT || ex->kind == EK_GE || ex->kind == EK_NE);
  1220.                 val.type = tp_boolean;
  1221.                 return val;
  1222.             }
  1223.             break;
  1224.         case EK_NOT:
  1225.             val = eval_expr_either(ex->args[0], pasc);
  1226.             if (val.type)
  1227.                 val.i = !val.i;
  1228.             return val;
  1229.         case EK_AND:
  1230.             for (i = 0; i < ex->nargs; i++) {
  1231.                 val = eval_expr_either(ex->args[i], pasc);
  1232.                 if (!val.type || !val.i)
  1233.                     return val;
  1234.             }
  1235.             return val;
  1236.         case EK_OR:
  1237.             for (i = 0; i < ex->nargs; i++) {
  1238.                 val = eval_expr_either(ex->args[i], pasc);
  1239.                 if (!val.type || val.i)
  1240.                     return val;
  1241.             }
  1242.             return val;
  1243.         case EK_COMMA:
  1244.             return eval_expr_either(ex->args[ex->nargs-1], pasc);
  1245. default:
  1246.     break;
  1247.     }
  1248.     val.type = NULL;
  1249.     return val;
  1250. }
  1251. Value eval_expr(ex)
  1252. Expr *ex;
  1253. {
  1254.     return eval_expr_either(ex, 0);
  1255. }
  1256. Value eval_expr_consts(ex)
  1257. Expr *ex;
  1258. {
  1259.     Value val;
  1260.     short save_fold = foldconsts;
  1261.     foldconsts = 1;
  1262.     val = eval_expr_either(ex, 0);
  1263.     foldconsts = save_fold;
  1264.     return val;
  1265. }
  1266. Value eval_expr_pasc(ex)
  1267. Expr *ex;
  1268. {
  1269.     return eval_expr_either(ex, 1);
  1270. }
  1271. int expr_is_const(ex)
  1272. Expr *ex;
  1273. {
  1274.     int i;
  1275.     switch (ex->kind) {
  1276.         case EK_CONST:
  1277.         case EK_LONGCONST:
  1278.         case EK_SIZEOF:
  1279.             return 1;
  1280.         case EK_VAR:
  1281.             return (((Meaning *)ex->val.i)->kind == MK_CONST);
  1282.         case EK_HAT:
  1283.         case EK_ASSIGN:
  1284.         case EK_POSTINC:
  1285.         case EK_POSTDEC:
  1286.             return 0;
  1287.         case EK_ADDR:
  1288.             if (ex->args[0]->kind == EK_VAR)
  1289.                 return 1;
  1290.             return 0;   /* conservative */
  1291.         case EK_FUNCTION:
  1292.             if (!nosideeffects_func(ex))
  1293.                 return 0;
  1294.             break;
  1295.         case EK_BICALL:
  1296.             if (!nosideeffects_func(ex))
  1297.                 return 0;
  1298.             break;
  1299. default:
  1300.     break;
  1301.     }
  1302.     for (i = 0; i < ex->nargs; i++) {
  1303.         if (!expr_is_const(ex->args[i]))
  1304.             return 0;
  1305.     }
  1306.     return 1;
  1307. }
  1308. Expr *eatcasts(ex)
  1309. Expr *ex;
  1310. {
  1311.     while (ex->kind == EK_CAST)
  1312.         ex = grabarg(ex, 0);
  1313.     return ex;
  1314. }
  1315. /* End. */