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

编译器/解释器

开发平台:

C/C++

  1.                                                   a->args[i]->val.i - a->args[j]->val.i);
  2.                     for (k = 0; k < - a->args[j]->val.i; k++)
  3.                         a->args[i]->val.s[k] = '>';
  4.                     delfreearg(&a, j);
  5.                     j--;
  6.                 }
  7.             }
  8.         }
  9.     }
  10.     if (checkconst(a->args[a->nargs-1], 0))
  11.         delfreearg(&a, a->nargs-1);
  12.     for (i = 0; i < a->nargs; i++) {
  13.         if (a->args[i]->kind == EK_NEG && nosideeffects(a->args[i], 1)) {
  14.             for (j = 0; j < a->nargs; j++) {
  15.                 if (exprsame(a->args[j], a->args[i]->args[0], 1)) {
  16.                     delfreearg(&a, i);
  17.                     if (i < j) j--; else i--;
  18.                     delfreearg(&a, j);
  19.                     i--;
  20.                     break;
  21.                 }
  22.             }
  23.         }
  24.     }
  25.     if (a->nargs < 2) {
  26.         if (a->nargs < 1) {
  27.     type = a->val.type;
  28.             FREE(a);
  29.             a = gentle_cast(makeexpr_long(0), type);
  30.     a->val.type = type;
  31.     return a;
  32.         } else {
  33.             b = a->args[0];
  34.             FREE(a);
  35.             return b;
  36.         }
  37.     }
  38.     if (a->nargs == 2 && ISCONST(a->args[1]->kind) &&
  39. a->args[1]->val.i <= -127 &&
  40. true_type(a->args[0]) == tp_char && signedchars != 0) {
  41. a->args[0] = force_unsigned(a->args[0]);
  42.     }
  43.     if (a->nargs > 2 &&
  44. ISCONST(a->args[a->nargs-1]->kind) &&
  45. ISCONST(a->args[a->nargs-2]->kind) &&
  46. ischartype(a->args[a->nargs-1]) &&
  47. ischartype(a->args[a->nargs-2])) {
  48. i = a->args[a->nargs-1]->val.i;
  49. j = a->args[a->nargs-2]->val.i;
  50. if ((i == 'a' || i == 'A' || i == -'a' || i == -'A') &&
  51.     (j == 'a' || j == 'A' || j == -'a' || j == -'A')) {
  52.     if (abs(i+j) == 32) {
  53. delfreearg(&a, a->nargs-1);
  54. delsimpfreearg(&a, a->nargs-1);
  55. a = makeexpr_bicall_1((i+j > 0) ? "_tolower" : "_toupper",
  56.       tp_char, a);
  57.     }
  58. }
  59.     }
  60.     return a;
  61. }
  62. Expr *makeexpr_minus(a, b)
  63. Expr *a, *b;
  64. {
  65.     int okneg;
  66.     if (debug>2) { fprintf(outf,"makeexpr_minus("); dumpexpr(a); fprintf(outf,", "); dumpexpr(b); fprintf(outf,")n"); }
  67.     if (ISCONST(b->kind) && b->val.i == 0 &&       /* kludge for array indexing */
  68.         ord_type(b->val.type)->kind == TK_ENUM) {
  69.         b->val.type = tp_integer;
  70.     }
  71.     okneg = (a->kind != EK_PLUS && b->kind != EK_PLUS);
  72.     a = makeexpr_plus(a, makeexpr_neg(b));
  73.     if (okneg && a->kind == EK_PLUS)
  74.         a->val.i = 1;   /* this flag says to write as "a-b" if possible */
  75.     return a;
  76. }
  77. Expr *makeexpr_inc(a, b)
  78. Expr *a, *b;
  79. {
  80.     Type *type;
  81.     type = a->val.type;
  82.     a = makeexpr_plus(makeexpr_charcast(a), b);
  83.     if (ord_type(type)->kind != TK_INTEGER &&
  84. ord_type(type)->kind != TK_CHAR)
  85. a = makeexpr_cast(a, type);
  86.     return a;
  87. }
  88. /* Apply the distributive law for a sum of products */
  89. Expr *distribute_plus(ex)
  90. Expr *ex;
  91. {
  92.     int i, j, icom;
  93.     Expr *common, *outer, *ex2, **exp;
  94.     if (debug>2) { fprintf(outf,"distribute_plus("); dumpexpr(ex); fprintf(outf,")n"); }
  95.     if (ex->kind != EK_PLUS)
  96.         return ex;
  97.     for (i = 0; i < ex->nargs; i++)
  98.         if (ex->args[i]->kind == EK_TIMES)
  99.             break;
  100.     if (i == ex->nargs)
  101.         return ex;
  102.     outer = NULL;
  103.     icom = 0;
  104.     for (;;) {
  105. ex2 = ex->args[0];
  106. if (ex2->kind == EK_NEG)
  107.     ex2 = ex2->args[0];
  108.         if (ex2->kind == EK_TIMES) {
  109.     if (icom >= ex2->nargs)
  110. break;
  111.             common = ex2->args[icom];
  112.     if (common->kind == EK_NEG)
  113. common = common->args[0];
  114.         } else {
  115.     if (icom > 0)
  116. break;
  117.             common = ex2;
  118.     icom++;
  119. }
  120.         for (i = 1; i < ex->nargs; i++) {
  121.     ex2 = ex->args[i];
  122.     if (ex2->kind == EK_NEG)
  123. ex2 = ex2->args[i];
  124.             if (ex2->kind == EK_TIMES) {
  125.                 for (j = ex2->nargs; --j >= 0; ) {
  126.                     if (exprsame(ex2->args[j], common, 1) ||
  127. (ex2->args[j]->kind == EK_NEG &&
  128.  exprsame(ex2->args[j]->args[0], common, 1)))
  129.                         break;
  130.                 }
  131.                 if (j < 0)
  132.                     break;
  133.             } else {
  134.                 if (!exprsame(ex2, common, 1))
  135.                     break;
  136.             }
  137.         }
  138.         if (i == ex->nargs) {
  139.             if (debug>2) { fprintf(outf,"distribute_plus does "); dumpexpr(common); fprintf(outf,"n"); }
  140.     common = copyexpr(common);
  141.             for (i = 0; i < ex->nargs; i++) {
  142. if (ex->args[i]->kind == EK_NEG)
  143.     ex2 = *(exp = &ex->args[i]->args[0]);
  144. else
  145.     ex2 = *(exp = &ex->args[i]);
  146. if (ex2->kind == EK_TIMES) {
  147.                     for (j = ex2->nargs; --j >= 0; ) {
  148.                         if (exprsame(ex2->args[j], common, 1)) {
  149.                             delsimpfreearg(exp, j);
  150.                             break;
  151.                         } else if (ex2->args[j]->kind == EK_NEG &&
  152.    exprsame(ex2->args[j]->args[0], common,1)) {
  153.     freeexpr(ex2->args[j]);
  154.     ex2->args[j] = makeexpr_long(-1);
  155.     break;
  156. }
  157.                     }
  158. } else {
  159.     freeexpr(ex2);
  160.     *exp = makeexpr_long(1);
  161.                 }
  162. ex->args[i] = resimplify(ex->args[i]);
  163.             }
  164.             outer = makeexpr_times(common, outer);
  165.         } else
  166.     icom++;
  167.     }
  168.     return makeexpr_times(resimplify(ex), outer);
  169. }
  170. Expr *makeexpr_times(a, b)
  171. Expr *a, *b;
  172. {
  173.     int i, n;
  174.     Type *type;
  175.     if (debug>2) { fprintf(outf,"makeexpr_times("); dumpexpr(a); fprintf(outf,", "); dumpexpr(b); fprintf(outf,")n"); }
  176.     if (!a)
  177.         return b;
  178.     if (!b)
  179.         return a;
  180.     a = commute(a, b, EK_TIMES);
  181.     if (a->val.type->kind == TK_INTEGER) {
  182.         i = a->nargs-1;
  183.         if (i > 0 && ISCONST(a->args[i-1]->kind)) {
  184.             a->args[i-1]->val.i *= a->args[i]->val.i;
  185.             delfreearg(&a, i);
  186.         }
  187.     }
  188.     for (i = n = 0; i < a->nargs; i++) {
  189.         if (expr_neg_cost(a->args[i]) < 0)
  190.             n++;
  191.     }
  192.     if (n & 1) {
  193.         for (i = 0; i < a->nargs; i++) {
  194.             if (ISCONST(a->args[i]->kind) &&
  195.                 expr_neg_cost(a->args[i]) >= 0) {
  196.                 a->args[i] = makeexpr_neg(a->args[i]);
  197.                 n++;
  198.                 break;
  199.             }
  200.         }
  201.     } else
  202.         n++;
  203.     for (i = 0; i < a->nargs && n >= 2; i++) {
  204.         if (expr_neg_cost(a->args[i]) < 0) {
  205.             a->args[i] = makeexpr_neg(a->args[i]);
  206.             n--;
  207.         }
  208.     }
  209.     if (checkconst(a->args[a->nargs-1], 1))
  210.         delfreearg(&a, a->nargs-1);
  211.     if (checkconst(a->args[a->nargs-1], -1)) {
  212.         delfreearg(&a, a->nargs-1);
  213. a->args[0] = makeexpr_neg(a->args[0]);
  214.     }
  215.     if (checkconst(a->args[a->nargs-1], 0) && nosideeffects(a, 1)) {
  216.         type = a->val.type;
  217.         return makeexpr_cast(grabarg(a, a->nargs-1), type);
  218.     }
  219.     if (a->nargs < 2) {
  220.         if (a->nargs < 1) {
  221.             FREE(a);
  222.             a = makeexpr_long(1);
  223.         } else {
  224.             b = a->args[0];
  225.             FREE(a);
  226.             a = b;
  227.         }
  228.     }
  229.     return a;
  230. }
  231. Expr *makeexpr_sqr(ex, cube)
  232. Expr *ex;
  233. int cube;
  234. {
  235.     Expr *ex2;
  236.     Meaning *tvar;
  237.     Type *type;
  238.     if (exprspeed(ex) <= 2 && nosideeffects(ex, 0)) {
  239. ex2 = NULL;
  240.     } else {
  241. type = (ex->val.type->kind == TK_REAL) ? tp_longreal : tp_integer;
  242. tvar = makestmttempvar(type, name_TEMP);
  243. ex2 = makeexpr_assign(makeexpr_var(tvar), ex);
  244. ex = makeexpr_var(tvar);
  245.     }
  246.     if (cube)
  247. ex = makeexpr_times(ex, makeexpr_times(copyexpr(ex), copyexpr(ex)));
  248.     else
  249. ex = makeexpr_times(ex, copyexpr(ex));
  250.     return makeexpr_comma(ex2, ex);
  251. }
  252. Expr *makeexpr_divide(a, b)
  253. Expr *a, *b;
  254. {
  255.     Expr *ex;
  256.     int p;
  257.     if (debug>2) { fprintf(outf,"makeexpr_divide("); dumpexpr(a); fprintf(outf,", "); dumpexpr(b); fprintf(outf,")n"); }
  258.     if (a->val.type->kind != TK_REAL &&
  259. b->val.type->kind != TK_REAL) {     /* must do a real division */
  260.         ex = docast(a, tp_longreal);
  261.         if (ex)
  262.             a = ex;
  263.         else {
  264.             ex = docast(b, tp_longreal);
  265.             if (ex)
  266.                 b = ex;
  267.             else
  268.                 a = makeexpr_cast(a, tp_longreal);
  269.         }
  270.     }
  271.     if (a->kind == EK_TIMES) {
  272. for (p = 0; p < a->nargs; p++)
  273.     if (exprsame(a->args[p], b, 1))
  274. break;
  275. if (p < a->nargs) {
  276.     delfreearg(&a, p);
  277.     freeexpr(b);
  278.     if (a->nargs == 1)
  279. return grabarg(a, 0);
  280.     else
  281. return a;
  282. }
  283.     }
  284.     if (expr_neg_cost(a) < 0 && expr_neg_cost(b) < 0) {
  285.         a = makeexpr_neg(a);
  286.         b = makeexpr_neg(b);
  287.     }
  288.     if (checkconst(b, 0))
  289.         warning("Division by zero [163]");
  290.     return makeexpr_bin(EK_DIVIDE, tp_longreal, a, b);
  291. }
  292. int gcd(a, b)
  293. int a, b;
  294. {
  295.     if (a < 0) a = -a;
  296.     if (b < 0) b = -b;
  297.     while (a != 0) {
  298. b %= a;
  299. if (b != 0)
  300.     a %= b;
  301. else
  302.     return a;
  303.     }
  304.     return b;
  305. }
  306. /* possible signs of ex: 1=may be neg, 2=may be zero, 4=may be pos */
  307. int negsigns(mask)
  308. int mask;
  309. {
  310.     return (mask & 2) |
  311.    ((mask & 1) << 2) |
  312.    ((mask & 4) >> 2);
  313. }
  314. int possiblesigns(ex)
  315. Expr *ex;
  316. {
  317.     Value val;
  318.     Type *tp;
  319.     char *cp;
  320.     int i, mask, mask2;
  321.     if (isliteralconst(ex, &val) && val.type) {
  322. if (val.type == tp_real || val.type == tp_longreal) {
  323.     if (realzero(val.s))
  324. return 2;
  325.     if (*val.s == '-')
  326. return 1;
  327.     return 4;
  328. } else
  329.     return (val.i < 0) ? 1 : (val.i == 0) ? 2 : 4;
  330.     }
  331.     if (ex->kind == EK_CAST &&
  332. similartypes(ex->val.type, ex->args[0]->val.type))
  333. return possiblesigns(ex->args[0]);
  334.     if (ex->kind == EK_NEG)
  335. return negsigns(possiblesigns(ex->args[0]));
  336.     if (ex->kind == EK_TIMES || ex->kind == EK_DIVIDE) {
  337. mask = possiblesigns(ex->args[0]);
  338. for (i = 1; i < ex->nargs; i++) {
  339.     mask2 = possiblesigns(ex->args[i]);
  340.     if (mask2 & 2)
  341. mask |= 2;
  342.     if ((mask2 & (1|4)) == 1)
  343. mask = negsigns(mask);
  344.     else if ((mask2 & (1|4)) != 4)
  345. mask = 1|2|4;
  346. }
  347. return mask;
  348.     }
  349.     if (ex->kind == EK_DIV || ex->kind == EK_MOD) {
  350. mask = possiblesigns(ex->args[0]);
  351. mask2 = possiblesigns(ex->args[1]);
  352. if (!((mask | mask2) & 1))
  353.     return 2|4;
  354.     }
  355.     if (ex->kind == EK_PLUS) {
  356. mask = 0;
  357. for (i = 0; i < ex->nargs; i++) {
  358.     mask2 = possiblesigns(ex->args[i]);
  359.     if ((mask & negsigns(mask2)) & (1|4))
  360. mask |= (1|2|4);
  361.     else
  362. mask |= mask2;
  363. }
  364. return mask;
  365.     }
  366.     if (ex->kind == EK_COND) {
  367. return possiblesigns(ex->args[1]) | possiblesigns(ex->args[2]);
  368.     }
  369.     if (ex->kind == EK_EQ || ex->kind == EK_LT || ex->kind == EK_GT ||
  370. ex->kind == EK_NE || ex->kind == EK_LE || ex->kind == EK_GE ||
  371. ex->kind == EK_AND || ex->kind == EK_OR || ex->kind == EK_NOT)
  372. return 2|4;
  373.     if (ex->kind == EK_BICALL) {
  374. cp = ex->val.s;
  375. if (!strcmp(cp, "strlen") ||
  376.     !strcmp(cp, "abs") ||
  377.     !strcmp(cp, "labs") ||
  378.     !strcmp(cp, "fabs"))
  379.     return 2|4;
  380.     }
  381.     tp = (ex->kind == EK_VAR) ? ((Meaning *)ex->val.i)->type : ex->val.type;
  382.     if (ord_range(ex->val.type, &val.i, NULL)) {
  383. if (val.i > 0)
  384.     return 4;
  385. if (val.i >= 0)
  386.     return 2|4;
  387.     }
  388.     if (ord_range(ex->val.type, NULL, &val.i)) {
  389. if (val.i < 0)
  390.     return 1;
  391. if (val.i <= 0)
  392.     return 1|2;
  393.     }
  394.     return 1|2|4;
  395. }
  396. Expr *dodivmod(funcname, ekind, a, b)
  397. char *funcname;
  398. enum exprkind ekind;
  399. Expr *a, *b;
  400. {
  401.     Meaning *tvar;
  402.     Type *type;
  403.     Expr *asn;
  404.     int sa, sb;
  405.     type = promote_type_bin(a->val.type, b->val.type);
  406.     tvar = NULL;
  407.     sa = possiblesigns(a);
  408.     sb = possiblesigns(b);
  409.     if ((sa & 1) || (sb & 1)) {
  410. if (*funcname) {
  411.     asn = NULL;
  412.     if (*funcname == '*') {
  413. if (exprspeed(a) >= 5 || !nosideeffects(a, 0)) {
  414.     tvar = makestmttempvar(a->val.type, name_TEMP);
  415.     asn = makeexpr_assign(makeexpr_var(tvar), a);
  416.     a = makeexpr_var(tvar);
  417. }
  418. if (exprspeed(b) >= 5 || !nosideeffects(b, 0)) {
  419.     tvar = makestmttempvar(b->val.type, name_TEMP);
  420.     asn = makeexpr_comma(asn,
  421.  makeexpr_assign(makeexpr_var(tvar),
  422.  b));
  423.     b = makeexpr_var(tvar);
  424. }
  425.     }
  426.     return makeexpr_comma(asn,
  427.   makeexpr_bicall_2(funcname, type, a, b));
  428. } else {
  429.     if ((sa & 1) && (ekind == EK_MOD))
  430. note("Using % for possibly-negative arguments [317]");
  431.     return makeexpr_bin(ekind, type, a, b);
  432. }
  433.     } else
  434. return makeexpr_bin(ekind, type, a, b);
  435. }
  436. Expr *makeexpr_div(a, b)
  437. Expr *a, *b;
  438. {
  439.     Meaning *mp;
  440.     Type *type;
  441.     long i;
  442.     int p;
  443.     if (ISCONST(a->kind) && ISCONST(b->kind)) {
  444.         if (a->val.i >= 0 && b->val.i > 0) {
  445.     a->val.i /= b->val.i;
  446.     freeexpr(b);
  447.     return a;
  448. }
  449. i = gcd(a->val.i, b->val.i);
  450. if (i >= 0) {
  451.     a->val.i /= i;
  452.     b->val.i /= i;
  453. }
  454.     }
  455.     if (((b->kind == EK_CONST && (i = b->val.i)) ||
  456.          (b->kind == EK_VAR && (mp = (Meaning *)b->val.i)->kind == MK_CONST &&
  457.                                (i = mp->val.i) && foldconsts != 0)) && i > 0) {
  458.         if (i == 1)
  459.             return a;
  460.         if (div_po2 > 0) {
  461.             p = 0;
  462.             while (!(i&1))
  463.                 p++, i >>= 1;
  464.             if (i == 1) {
  465. type = promote_type_bin(a->val.type, b->val.type);
  466.                 return makeexpr_bin(EK_RSH, type, a, makeexpr_long(p));
  467.             }
  468.         }
  469.     }
  470.     if (a->kind == EK_TIMES) {
  471. for (p = 0; p < a->nargs; p++) {
  472.     if (exprsame(a->args[p], b, 1)) {
  473. delfreearg(&a, p);
  474. freeexpr(b);
  475. if (a->nargs == 1)
  476.     return grabarg(a, 0);
  477. else
  478.     return a;
  479.     } else if (ISCONST(a->args[p]->kind) && ISCONST(b->kind)) {
  480. i = gcd(a->args[p]->val.i, b->val.i);
  481. if (i > 1) {
  482.     a->args[p]->val.i /= i;
  483.     b->val.i /= i;
  484.     i = a->args[p]->val.i;
  485.     delfreearg(&a, p);
  486.     a = makeexpr_times(a, makeexpr_long(i));   /* resimplify */
  487.     p = -1;   /* start the loop over */
  488. }
  489.     }
  490. }
  491.     }
  492.     if (checkconst(b, 1)) {
  493.         freeexpr(b);
  494.         return a;
  495.     } else if (checkconst(b, -1)) {
  496.         freeexpr(b);
  497.         return makeexpr_neg(a);
  498.     } else {
  499.         if (checkconst(b, 0))
  500.             warning("Division by zero [163]");
  501.         return dodivmod(divname, EK_DIV, a, b);
  502.     }
  503. }
  504. Expr *makeexpr_mod(a, b)
  505. Expr *a, *b;
  506. {
  507.     Meaning *mp;
  508.     Type *type;
  509.     long i;
  510.     if (a->kind == EK_CONST && b->kind == EK_CONST &&
  511.         a->val.i >= 0 && b->val.i > 0) {
  512.         a->val.i %= b->val.i;
  513.         freeexpr(b);
  514.         return a;
  515.     }
  516.     if (((b->kind == EK_CONST && (i = b->val.i)) ||
  517.          (b->kind == EK_VAR && (mp = (Meaning *)b->val.i)->kind == MK_CONST &&
  518.                                (i = mp->val.i) && foldconsts != 0)) && i > 0) {
  519.         if (i == 1)
  520.             return makeexpr_long(0);
  521.         if (mod_po2 != 0) {
  522.             while (!(i&1))
  523.                 i >>= 1;
  524.             if (i == 1) {
  525. type = promote_type_bin(a->val.type, b->val.type);
  526.                 return makeexpr_bin(EK_BAND, type, a,
  527.                                     makeexpr_minus(b, makeexpr_long(1)));
  528.             }
  529.         }
  530.     }
  531.     if (checkconst(b, 0))
  532.         warning("Division by zero [163]");
  533.     return dodivmod(modname, EK_MOD, a, b);
  534. }
  535. Expr *makeexpr_rem(a, b)
  536. Expr *a, *b;
  537. {
  538.     if (!(possiblesigns(a) & 1) && !(possiblesigns(b) & 1))
  539. return makeexpr_mod(a, b);
  540.     if (checkconst(b, 0))
  541.         warning("Division by zero [163]");
  542.     if (!*remname)
  543. note("Translating REM same as MOD [141]");
  544.     return dodivmod(*remname ? remname : modname, EK_MOD, a, b);
  545. }
  546. int expr_not_cost(a)
  547. Expr *a;
  548. {
  549.     int i, c;
  550.     switch (a->kind) {
  551.         case EK_CONST:
  552.             return 0;
  553.         case EK_NOT:
  554.             return -1;
  555.         case EK_EQ:
  556.         case EK_NE:
  557.         case EK_LT:
  558.         case EK_GT:
  559.         case EK_LE:
  560.         case EK_GE:
  561.             return 0;
  562.         case EK_AND:
  563.         case EK_OR:
  564.             c = 0;
  565.             for (i = 0; i < a->nargs; i++)
  566.                 c += expr_not_cost(a->args[i]);
  567.             return (c > 1) ? 1 : c;
  568.         case EK_BICALL:
  569.             if (!strcmp(a->val.s, oddname) ||
  570.                 !strcmp(a->val.s, evenname))
  571.                 return 0;
  572.             return 1;
  573.         default:
  574.             return 1;
  575.     }
  576. }
  577. Expr *makeexpr_not(a)
  578. Expr *a;
  579. {
  580.     Expr *ex;
  581.     int i;
  582.     if (debug>2) { fprintf(outf,"makeexpr_not("); dumpexpr(a); fprintf(outf,")n"); }
  583.     switch (a->kind) {
  584.         case EK_CONST:
  585.             if (a->val.type == tp_boolean) {
  586.                 a->val.i = !a->val.i;
  587.                 return a;
  588.             }
  589.             break;
  590.         case EK_EQ:
  591.             a->kind = EK_NE;
  592.             return a;
  593.         case EK_NE:
  594.             a->kind = EK_EQ;
  595.             return a;
  596.         case EK_LT:
  597.             a->kind = EK_GE;
  598.             return a;
  599.         case EK_GT:
  600.             a->kind = EK_LE;
  601.             return a;
  602.         case EK_LE:
  603.             a->kind = EK_GT;
  604.             return a;
  605.         case EK_GE:
  606.             a->kind = EK_LT;
  607.             return a;
  608.         case EK_AND:
  609.         case EK_OR:
  610.             if (expr_not_cost(a) > 0)
  611.                 break;
  612.             a->kind = (a->kind == EK_OR) ? EK_AND : EK_OR;
  613.             for (i = 0; i < a->nargs; i++)
  614.                 a->args[i] = makeexpr_not(a->args[i]);
  615.             return a;
  616.         case EK_NOT:
  617.             ex = a->args[0];
  618.             FREE(a);
  619.             ex->val.type = tp_boolean;
  620.             return ex;
  621.         case EK_BICALL:
  622.             if (!strcmp(a->val.s, oddname) && *evenname) {
  623.                 strchange(&a->val.s, evenname);
  624.                 return a;
  625.             } else if (!strcmp(a->val.s, evenname)) {
  626.                 strchange(&a->val.s, oddname);
  627.                 return a;
  628.             }
  629.             break;
  630. default:
  631.     break;
  632.     }
  633.     return makeexpr_un(EK_NOT, tp_boolean, a);
  634. }
  635. Type *mixsets(ep1, ep2)
  636. Expr **ep1, **ep2;
  637. {
  638.     Expr *ex1 = *ep1, *ex2 = *ep2;
  639.     Meaning *tvar;
  640.     long min1, max1, min2, max2;
  641.     Type *type;
  642.     if (ex1->val.type->kind == TK_SMALLSET &&
  643.         ex2->val.type->kind == TK_SMALLSET)
  644.         return ex1->val.type;
  645.     if (ex1->val.type->kind == TK_SMALLSET) {
  646.         tvar = makestmttempvar(ex2->val.type, name_SET);
  647.         ex1 = makeexpr_bicall_2(setexpandname, ex2->val.type,
  648.                                 makeexpr_var(tvar),
  649.                                 makeexpr_arglong(ex1, 1));
  650.     }
  651.     if (ex2->val.type->kind == TK_SMALLSET) {
  652.         tvar = makestmttempvar(ex1->val.type, name_SET);
  653.         ex2 = makeexpr_bicall_2(setexpandname, ex1->val.type,
  654.                                 makeexpr_var(tvar),
  655.                                 makeexpr_arglong(ex2, 1));
  656.     }
  657.     if (ord_range(ex1->val.type->indextype, &min1, &max1) &&
  658.         ord_range(ex2->val.type->indextype, &min2, &max2)) {
  659.         if (min1 <= min2 && max1 >= max2)
  660.             type = ex1->val.type;
  661.         else if (min2 <= min1 && max2 >= max1)
  662.             type = ex2->val.type;
  663.         else {
  664.             if (min2 < min1) min1 = min2;
  665.             if (max2 > max1) max1 = max2;
  666.             type = maketype(TK_SET);
  667.             type->basetype = tp_integer;
  668.             type->indextype = maketype(TK_SUBR);
  669.             type->indextype->basetype = ord_type(ex1->val.type->indextype);
  670.             type->indextype->smin = makeexpr_long(min1);
  671.             type->indextype->smax = makeexpr_long(max1);
  672.         }
  673.     } else
  674. type = ex1->val.type;
  675.     *ep1 = ex1, *ep2 = ex2;
  676.     return type;
  677. }
  678. Meaning *istempprocptr(ex)
  679. Expr *ex;
  680. {
  681.     Meaning *mp;
  682.     if (debug>2) { fprintf(outf,"istempprocptr("); dumpexpr(ex); fprintf(outf,")n"); }
  683.     if (ex->kind == EK_COMMA && ex->nargs == 3) {
  684.         if ((mp = istempvar(ex->args[2])) != NULL &&
  685.     mp->type->kind == TK_PROCPTR &&
  686.     ex->args[0]->kind == EK_ASSIGN &&
  687.     ex->args[0]->args[0]->kind == EK_DOT &&
  688.     exprsame(ex->args[0]->args[0]->args[0], ex->args[2], 1) &&
  689.     ex->args[1]->kind == EK_ASSIGN &&
  690.     ex->args[1]->args[0]->kind == EK_DOT &&
  691.     exprsame(ex->args[1]->args[0]->args[0], ex->args[2], 1))
  692.     return mp;
  693.     }
  694.     if (ex->kind == EK_COMMA && ex->nargs == 2) {
  695.         if ((mp = istempvar(ex->args[1])) != NULL &&
  696.     mp->type->kind == TK_CPROCPTR &&
  697.     ex->args[0]->kind == EK_ASSIGN &&
  698.     exprsame(ex->args[0]->args[0], ex->args[1], 1))
  699.     return mp;
  700.     }
  701.     return NULL;
  702. }
  703. Expr *makeexpr_stringify(ex)
  704. Expr *ex;
  705. {
  706.     ex = makeexpr_stringcast(ex);
  707.     if (ex->val.type->kind == TK_STRING)
  708.         return ex;
  709.     return makeexpr_sprintfify(ex);
  710. }
  711. Expr *makeexpr_rel(rel, a, b)
  712. enum exprkind rel;
  713. Expr *a, *b;
  714. {
  715.     int i, sign;
  716.     Expr *ex, *ex2;
  717.     Meaning *mp;
  718.     char *name;
  719.     if (debug>2) { fprintf(outf,"makeexpr_rel(%s,", exprkindname(rel)); dumpexpr(a); fprintf(outf,", "); dumpexpr(b); fprintf(outf,")n"); }
  720.     a = makeexpr_unlongcast(a);
  721.     b = makeexpr_unlongcast(b);
  722.     if ((compenums == 0 || (compenums < 0 && ansiC <= 0)) &&
  723. (rel != EK_EQ && rel != EK_NE)){
  724. a = enum_to_int(a);
  725. b = enum_to_int(b);
  726.     }
  727.     if (a->val.type != b->val.type) {
  728.         if (a->val.type->kind == TK_STRING &&
  729.             a->kind != EK_CONST) {
  730.             b = makeexpr_stringify(b);
  731.         } else if (b->val.type->kind == TK_STRING &&
  732.                    b->kind != EK_CONST) {
  733.             a = makeexpr_stringify(a);
  734.         } else if (ord_type(a->val.type)->kind == TK_CHAR ||
  735.                    a->val.type->kind == TK_ARRAY) {
  736.             b = gentle_cast(b, ord_type(a->val.type));
  737.         } else if (ord_type(b->val.type)->kind == TK_CHAR ||
  738.                    b->val.type->kind == TK_ARRAY) {
  739.             a = gentle_cast(a, ord_type(b->val.type));
  740.         } else if (a->val.type == tp_anyptr && !voidstar) {
  741.             a = gentle_cast(a, b->val.type);
  742.         } else if (b->val.type == tp_anyptr && !voidstar) {
  743.             b = gentle_cast(b, a->val.type);
  744.         }
  745.     }
  746.     if (useisspace && b->val.type->kind == TK_CHAR && checkconst(b, ' ')) {
  747.         if (rel == EK_EQ) {
  748.             freeexpr(b);
  749.             return makeexpr_bicall_1("isspace", tp_boolean, a);
  750.         } else if (rel == EK_NE) {
  751.             freeexpr(b);
  752.             return makeexpr_not(makeexpr_bicall_1("isspace", tp_boolean, a));
  753.         }
  754.     }
  755.     if (rel == EK_LT || rel == EK_GE)
  756.         sign = 1;
  757.     else if (rel == EK_GT || rel == EK_LE)
  758.         sign = -1;
  759.     else
  760.         sign = 0;
  761.     if (ord_type(b->val.type)->kind == TK_INTEGER ||
  762. ord_type(b->val.type)->kind == TK_CHAR) {
  763.         for (;;) {
  764.             if (a->kind == EK_PLUS && ISCONST(a->args[a->nargs-1]->kind) &&
  765.                  a->args[a->nargs-1]->val.i &&
  766.                  (ISCONST(b->kind) ||
  767.                   (b->kind == EK_PLUS && ISCONST(b->args[b->nargs-1]->kind)))) {
  768.                 b = makeexpr_minus(b, copyexpr(a->args[a->nargs-1]));
  769.                 a = makeexpr_minus(a, copyexpr(a->args[a->nargs-1]));
  770.                 continue;
  771.             }
  772.             if (b->kind == EK_PLUS && ISCONST(b->args[b->nargs-1]->kind) &&
  773.                  b->args[b->nargs-1]->val.i &&
  774.                  ISCONST(a->kind)) {
  775.                 a = makeexpr_minus(a, copyexpr(b->args[b->nargs-1]));
  776.                 b = makeexpr_minus(b, copyexpr(b->args[b->nargs-1]));
  777.                 continue;
  778.             }
  779.             if (b->kind == EK_PLUS && sign &&
  780.                  checkconst(b->args[b->nargs-1], sign)) {
  781.                 b = makeexpr_plus(b, makeexpr_long(-sign));
  782.                 switch (rel) {
  783.                     case EK_LT:
  784.                         rel = EK_LE;
  785.                         break;
  786.                     case EK_GT:
  787.                         rel = EK_GE;
  788.                         break;
  789.                     case EK_LE:
  790.                         rel = EK_LT;
  791.                         break;
  792.                     case EK_GE:
  793.                         rel = EK_GT;
  794.                         break;
  795.     default:
  796. break;
  797.                 }
  798.                 sign = -sign;
  799.                 continue;
  800.             }
  801.             if (a->kind == EK_TIMES && checkconst(b, 0) && !sign) {
  802.                 for (i = 0; i < a->nargs; i++) {
  803.                     if (ISCONST(a->args[i]->kind) && a->args[i]->val.i)
  804.                         break;
  805.                     if (a->args[i]->kind == EK_SIZEOF)
  806.                         break;
  807.                 }
  808.                 if (i < a->nargs) {
  809.                     delfreearg(&a, i);
  810.                     continue;
  811.                 }
  812.             }
  813.             break;
  814.         }
  815.         if (a->kind == EK_BICALL && !strcmp(a->val.s, "strlen") &&
  816.             checkconst(b, 0)) {
  817.             if (rel == EK_LT || rel == EK_GE) {
  818.                 note("Unusual use of STRLEN encountered [142]");
  819.             } else {
  820.                 freeexpr(b);
  821.                 a = makeexpr_hat(grabarg(a, 0), 0);
  822.                 b = makeexpr_char(0);      /* "strlen(a) = 0" => "*a == 0" */
  823.                 if (rel == EK_EQ || rel == EK_LE)
  824.                     return makeexpr_rel(EK_EQ, a, b);
  825.                 else
  826.                     return makeexpr_rel(EK_NE, a, b);
  827.             }
  828.         }
  829.         if (ISCONST(a->kind) && ISCONST(b->kind)) {
  830.             if ((a->val.i == b->val.i && (rel == EK_EQ || rel == EK_GE || rel == EK_LE)) ||
  831.                 (a->val.i <  b->val.i && (rel == EK_NE || rel == EK_LE || rel == EK_LT)) ||
  832.                 (a->val.i >  b->val.i && (rel == EK_NE || rel == EK_GE || rel == EK_GT)))
  833.                 return makeexpr_val(make_ord(tp_boolean, 1));
  834.             else
  835.                 return makeexpr_val(make_ord(tp_boolean, 0));
  836.         }
  837. if ((a->val.type == tp_char || true_type(a) == tp_char) &&
  838.     ISCONST(b->kind) && signedchars != 0) {
  839.     i = (b->val.i == 128 && sign == 1) ||
  840. (b->val.i == 127 && sign == -1);
  841.     if (highcharbits && (highcharbits > 0 || signedchars < 0) && i) {
  842. if (highcharbits == 2)
  843.     b = makeexpr_long(128);
  844. else
  845.     b = makeexpr_un(EK_BNOT, tp_integer, makeexpr_long(127));
  846. return makeexpr_rel((rel == EK_GE || rel == EK_GT)
  847.     ? EK_NE : EK_EQ,
  848.     makeexpr_bin(EK_BAND, tp_integer,
  849.  eatcasts(a), b),
  850.     makeexpr_long(0));
  851.     } else if (signedchars == 1 && i) {
  852. return makeexpr_rel((rel == EK_GE || rel == EK_GT)
  853.     ? EK_LT : EK_GE,
  854.     eatcasts(a), makeexpr_long(0));
  855.     } else if (signedchars == 1 && b->val.i >= 128 && sign == 0) {
  856. b->val.i -= 256;
  857.     } else if (b->val.i >= 128 ||
  858.        (b->val.i == 127 && sign != 0)) {
  859. if (highcharbits && (highcharbits > 0 || signedchars < 0))
  860.     a = makeexpr_bin(EK_BAND, a->val.type, eatcasts(a),
  861.      makeexpr_long(255));
  862. else
  863.     a = force_unsigned(a);
  864.     }
  865. }
  866.     } else if (a->val.type->kind == TK_STRING &&
  867.                b->val.type->kind == TK_STRING) {
  868.         if (b->kind == EK_CONST && b->val.i == 0 && !sign) {
  869.             a = makeexpr_hat(a, 0);
  870.             b = makeexpr_char(0);      /* "a = ''" => "*a == 0" */
  871.         } else {
  872.             a = makeexpr_bicall_2("strcmp", tp_int, a, b);
  873.             b = makeexpr_long(0);
  874.         }
  875.     } else if ((a->val.type->kind == TK_ARRAY ||
  876. a->val.type->kind == TK_STRING ||
  877. a->val.type->kind == TK_RECORD) &&
  878.        (b->val.type->kind == TK_ARRAY ||
  879. b->val.type->kind == TK_STRING ||
  880. b->val.type->kind == TK_RECORD)) {
  881.         if (a->val.type->kind == TK_ARRAY) {
  882.             if (b->val.type->kind == TK_ARRAY) {
  883.                 ex = makeexpr_sizeof(copyexpr(a), 0);
  884.                 ex2 = makeexpr_sizeof(copyexpr(b), 0);
  885.                 if (!exprsame(ex, ex2, 1))
  886.                     warning("Incompatible array sizes [164]");
  887.                 freeexpr(ex2);
  888.             } else {
  889.                 ex = makeexpr_sizeof(copyexpr(a), 0);
  890.             }
  891.         } else
  892.             ex = makeexpr_sizeof(copyexpr(b), 0);
  893. name = (usestrncmp &&
  894. a->val.type->kind == TK_ARRAY &&
  895. a->val.type->basetype->kind == TK_CHAR) ? "strncmp" : "memcmp";
  896.         a = makeexpr_bicall_3(name, tp_int,
  897.       makeexpr_addr(a), 
  898.       makeexpr_addr(b), ex);
  899.         b = makeexpr_long(0);
  900.     } else if (a->val.type->kind == TK_SET ||
  901.                a->val.type->kind == TK_SMALLSET) {
  902.         if (rel == EK_GE) {
  903.             swapexprs(a, b);
  904.             rel = EK_LE;
  905.         }
  906.         if (mixsets(&a, &b)->kind == TK_SMALLSET) {
  907.             if (rel == EK_LE) {
  908.                 a = makeexpr_bin(EK_BAND, tp_integer,
  909.                                  a, makeexpr_un(EK_BNOT, tp_integer, b));
  910.                 b = makeexpr_long(0);
  911.                 rel = EK_EQ;
  912.             }
  913.         } else if (b->kind == EK_BICALL &&
  914.                    !strcmp(b->val.s, setexpandname) &&
  915.                    (mp = istempvar(b->args[0])) != NULL &&
  916.                    checkconst(b->args[1], 0)) {
  917.             canceltempvar(mp);
  918.             a = makeexpr_hat(a, 0);
  919.             b = grabarg(b, 1);
  920.             if (rel == EK_LE)
  921.                 rel = EK_EQ;
  922.         } else {
  923.             ex = makeexpr_bicall_2((rel == EK_LE) ? subsetname : setequalname,
  924.                                    tp_boolean, a, b);
  925.             return (rel == EK_NE) ? makeexpr_not(ex) : ex;
  926.         }
  927.     } else if (a->val.type->kind == TK_PROCPTR ||
  928.        a->val.type->kind == TK_CPROCPTR) {
  929.         /* we compare proc only (not link) -- same as Pascal compiler! */
  930. if (a->val.type->kind == TK_PROCPTR)
  931.     a = makeexpr_dotq(a, "proc", tp_anyptr);
  932.         if ((mp = istempprocptr(b)) != NULL) {
  933.             canceltempvar(mp);
  934.     b = grabarg(grabarg(b, 0), 1);
  935.             if (!voidstar)
  936.                 b = makeexpr_cast(b, tp_anyptr);
  937.         } else if (b->val.type->kind == TK_PROCPTR)
  938.             b = makeexpr_dotq(b, "proc", tp_anyptr);
  939.     }
  940.     return makeexpr_bin(rel, tp_boolean, a, b);
  941. }
  942. Expr *makeexpr_and(a, b)
  943. Expr *a, *b;
  944. {
  945.     Expr *ex, **exp, *low;
  946.     if (!a)
  947.         return b;
  948.     if (!b)
  949.         return a;
  950.     for (exp = &a; (ex = *exp)->kind == EK_AND; exp = &ex->args[1]) ;
  951.     if ((b->kind == EK_LT || b->kind == EK_LE) &&
  952.         ((ex->kind == EK_LE && exprsame(ex->args[1], b->args[0], 1)) ||
  953.          (ex->kind == EK_GE && exprsame(ex->args[0], b->args[0], 1)))) {
  954.         low = (ex->kind == EK_LE) ? ex->args[0] : ex->args[1];
  955.         if (unsignedtrick && checkconst(low, 0)) {
  956.             freeexpr(ex);
  957.             b->args[0] = force_unsigned(b->args[0]);
  958.             *exp = b;
  959.             return a;
  960.         }
  961.         if (b->args[1]->val.type->kind == TK_CHAR && useisalpha) {
  962.             if (checkconst(low, 'A') && checkconst(b->args[1], 'Z')) {
  963.                 freeexpr(ex);
  964.                 *exp = makeexpr_bicall_1("isupper", tp_boolean, grabarg(b, 0));
  965.                 return a;
  966.             }
  967.             if (checkconst(low, 'a') && checkconst(b->args[1], 'z')) {
  968.                 freeexpr(ex);
  969.                 *exp = makeexpr_bicall_1("islower", tp_boolean, grabarg(b, 0));
  970.                 return a;
  971.             }
  972.             if (checkconst(low, '0') && checkconst(b->args[1], '9')) {
  973.                 freeexpr(ex);
  974.                 *exp = makeexpr_bicall_1("isdigit", tp_boolean, grabarg(b, 0));
  975.                 return a;
  976.             }
  977.         }
  978.     }
  979.     return makeexpr_bin(EK_AND, tp_boolean, a, b);
  980. }
  981. Expr *makeexpr_or(a, b)
  982. Expr *a, *b;
  983. {
  984.     Expr *ex, **exp, *low;
  985.     if (!a)
  986.         return b;
  987.     if (!b)
  988.         return a;
  989.     for (exp = &a; (ex = *exp)->kind == EK_OR; exp = &ex->args[1]) ;
  990.     if (((b->kind == EK_BICALL && !strcmp(b->val.s, "isdigit") &&
  991.           ex->kind == EK_BICALL && !strcmp(ex->val.s, "isalpha")) ||
  992.          (b->kind == EK_BICALL && !strcmp(b->val.s, "isalpha") &&
  993.           ex->kind == EK_BICALL && !strcmp(ex->val.s, "isdigit"))) &&
  994.         exprsame(ex->args[0], b->args[0], 1)) {
  995.         strchange(&ex->val.s, "isalnum");
  996.         freeexpr(b);
  997.         return a;
  998.     }
  999.     if (((b->kind == EK_BICALL && !strcmp(b->val.s, "islower") &&
  1000.           ex->kind == EK_BICALL && !strcmp(ex->val.s, "isupper")) ||
  1001.          (b->kind == EK_BICALL && !strcmp(b->val.s, "isupper") &&
  1002.           ex->kind == EK_BICALL && !strcmp(ex->val.s, "islower"))) &&
  1003.         exprsame(ex->args[0], b->args[0], 1)) {
  1004.         strchange(&ex->val.s, "isalpha");
  1005.         freeexpr(b);
  1006.         return a;
  1007.     }
  1008.     if ((b->kind == EK_GT || b->kind == EK_GE) &&
  1009.         ((ex->kind == EK_GT && exprsame(ex->args[1], b->args[0], 1)) ||
  1010.          (ex->kind == EK_LT && exprsame(ex->args[0], b->args[0], 1)))) {
  1011.         low = (ex->kind == EK_GT) ? ex->args[0] : ex->args[1];
  1012.         if (unsignedtrick && checkconst(low, 0)) {
  1013.             freeexpr(ex);
  1014.             b->args[0] = force_unsigned(b->args[0]);
  1015.             *exp = b;
  1016.             return a;
  1017.         }
  1018.     }
  1019.     return makeexpr_bin(EK_OR, tp_boolean, a, b);
  1020. }
  1021. Expr *makeexpr_range(ex, exlow, exhigh, higheq)
  1022. Expr *ex, *exlow, *exhigh;
  1023. int higheq;
  1024. {
  1025.     Expr *ex2;
  1026.     enum exprkind rel = (higheq) ? EK_LE : EK_LT;
  1027.     if (exprsame(exlow, exhigh, 1) && higheq)
  1028.         return makeexpr_rel(EK_EQ, ex, exlow);
  1029.     ex2 = makeexpr_rel(rel, copyexpr(ex), exhigh);
  1030.     if (lelerange)
  1031.         return makeexpr_and(makeexpr_rel(EK_LE, exlow, ex), ex2);
  1032.     else
  1033.         return makeexpr_and(makeexpr_rel(EK_GE, ex, exlow), ex2);
  1034. }
  1035. Expr *makeexpr_cond(c, a, b)
  1036. Expr *c, *a, *b;
  1037. {
  1038.     Expr *ex;
  1039.     ex = makeexpr(EK_COND, 3);
  1040.     ex->val.type = a->val.type;
  1041.     ex->args[0] = c;
  1042.     ex->args[1] = a;
  1043.     ex->args[2] = b;
  1044.     if (debug>2) { fprintf(outf,"makeexpr_cond returns "); dumpexpr(ex); fprintf(outf,"n"); }
  1045.     return ex;
  1046. }
  1047. int expr_is_lvalue(ex)
  1048. Expr *ex;
  1049. {
  1050.     Meaning *mp;
  1051.     switch (ex->kind) {
  1052.         case EK_VAR:
  1053.             mp = (Meaning *)ex->val.i;
  1054.             return ((mp->kind == MK_VAR || mp->kind == MK_PARAM) ||
  1055.                     (mp->kind == MK_CONST &&
  1056.                      (mp->type->kind == TK_ARRAY ||
  1057.                       mp->type->kind == TK_RECORD ||
  1058.                       mp->type->kind == TK_SET)));
  1059.         case EK_HAT:
  1060.             return 1;
  1061.         case EK_INDEX:
  1062.             return expr_is_lvalue(ex->args[0]);
  1063. case EK_DOT:
  1064.     return expr_is_lvalue(ex->args[0]);
  1065.         default:
  1066.             return 0;
  1067.     }
  1068. }
  1069. int expr_has_address(ex)
  1070. Expr *ex;
  1071. {
  1072.     if (ex->kind == EK_DOT &&
  1073. ((Meaning *)ex->val.i)->val.i)
  1074. return 0;    /* bit fields do not have an address */
  1075.     return expr_is_lvalue(ex);
  1076. }
  1077. Expr *checknil(ex)
  1078. Expr *ex;
  1079. {
  1080.     if (nilcheck == 1) {
  1081.         if (singlevar(ex)) {
  1082.             ex = makeexpr_un(EK_CHECKNIL, ex->val.type, ex);
  1083.         } else {
  1084.             ex = makeexpr_bin(EK_CHECKNIL, ex->val.type, ex,
  1085.                               makeexpr_var(makestmttempvar(ex->val.type,
  1086.                                                            name_PTR)));
  1087.         }
  1088.     }
  1089.     return ex;
  1090. }
  1091. int checkvarinlists(yes, no, def, mp)
  1092. Strlist *yes, *no;
  1093. int def;
  1094. Meaning *mp;
  1095. {
  1096.     char *cp;
  1097.     Meaning *ctx;
  1098.     if (mp->kind == MK_FIELD)
  1099. ctx = mp->rectype->meaning;
  1100.     else
  1101. ctx = mp->ctx;
  1102.     if (ctx && ctx->name)
  1103. cp = format_ss("%s.%s", ctx->name, mp->name);
  1104.     else
  1105. cp = NULL;
  1106.     if (strlist_cifind(yes, cp))
  1107. return 1;
  1108.     if (strlist_cifind(no, cp))
  1109. return 0;
  1110.     if (strlist_cifind(yes, mp->name))
  1111. return 1;
  1112.     if (strlist_cifind(no, mp->name))
  1113. return 0;
  1114.     if (strlist_cifind(yes, "1"))
  1115. return 1;
  1116.     if (strlist_cifind(no, "1"))
  1117. return 0;
  1118.     return def;
  1119. }
  1120. void requirefilebuffer(ex)
  1121. Expr *ex;
  1122. {
  1123.     Meaning *mp;
  1124.     mp = isfilevar(ex);
  1125.     if (!mp) {
  1126. if (ex->kind == EK_HAT)
  1127.     ex = ex->args[0];
  1128. if (ex->kind == EK_VAR) {
  1129.     mp = (Meaning *)ex->val.i;
  1130.     if (mp->kind == MK_PARAM || mp->kind == MK_VARPARAM)
  1131. note(format_s("File parameter %s needs its associated buffers [318]",
  1132.       mp->name));
  1133. }
  1134.     } else if (!mp->bufferedfile &&
  1135.        checkvarinlists(bufferedfiles, unbufferedfiles, 1, mp)) {
  1136. if (mp->wasdeclared)
  1137.     note(format_s("Discovered too late that %s should be buffered [143]",
  1138.   mp->name));
  1139. mp->bufferedfile = 1;
  1140.     }
  1141. }
  1142. Expr *makeexpr_hat(a, check)
  1143. Expr *a;
  1144. int check;
  1145. {
  1146.     Expr *ex;
  1147.     if (debug>2) { fprintf(outf,"makeexpr_hat("); dumpexpr(a); fprintf(outf,")n"); }
  1148.     if (isfiletype(a->val.type)) {
  1149. requirefilebuffer(a);
  1150. if (*chargetfbufname &&
  1151.     a->val.type->basetype->basetype->kind == TK_CHAR)
  1152.     return makeexpr_bicall_1(chargetfbufname,
  1153.      a->val.type->basetype->basetype, a);
  1154. else if (*arraygetfbufname &&
  1155.  a->val.type->basetype->basetype->kind == TK_ARRAY)
  1156.     return makeexpr_bicall_2(arraygetfbufname,
  1157.      a->val.type->basetype->basetype, a,
  1158.      makeexpr_type(a->val.type->basetype->basetype));
  1159. else
  1160.     return makeexpr_bicall_2(getfbufname,
  1161.      a->val.type->basetype->basetype, a,
  1162.      makeexpr_type(a->val.type->basetype->basetype));
  1163.     }
  1164.     if (a->kind == EK_PLUS && 
  1165.                (ex = a->args[0])->val.type->kind == TK_POINTER &&
  1166.                (ex->val.type->basetype->kind == TK_ARRAY ||
  1167.                 ex->val.type->basetype->kind == TK_STRING ||
  1168.                 ex->val.type->basetype->kind == TK_SET)) {
  1169.         ex->val.type = ex->val.type->basetype;   /* convert *(a+n) to a[n] */
  1170.         deletearg(&a, 0);
  1171.         if (a->nargs == 1)
  1172.             a = grabarg(a, 0);
  1173.         return makeexpr_bin(EK_INDEX, ex->val.type->basetype, ex, a);
  1174.     }
  1175.     if (a->val.type->kind == TK_STRING || 
  1176.         a->val.type->kind == TK_ARRAY ||
  1177.         a->val.type->kind == TK_SET) {
  1178.         if (starindex == 0)
  1179.             return makeexpr_bin(EK_INDEX, a->val.type->basetype, a, makeexpr_long(0));
  1180.         else
  1181.             return makeexpr_un(EK_HAT, a->val.type->basetype, a);
  1182.     }
  1183.     if (a->val.type->kind != TK_POINTER || !a->val.type->basetype) {
  1184.         warning("bad pointer dereference [165]");
  1185.         return a;
  1186.     }
  1187.     if (a->kind == EK_CAST &&
  1188. a->val.type->basetype->kind == TK_POINTER &&
  1189. a->args[0]->val.type->kind == TK_POINTER &&
  1190. a->args[0]->val.type->basetype->kind == TK_POINTER) {
  1191. return makeexpr_cast(makeexpr_hat(a->args[0], 0),
  1192.      a->val.type->basetype);
  1193.     }
  1194.     switch (a->val.type->basetype->kind) {
  1195.       case TK_ARRAY:
  1196.       case TK_STRING:
  1197.       case TK_SET:
  1198. if (a->kind != EK_HAT || 1 ||
  1199.     a->val.type == a->args[0]->val.type->basetype) {
  1200.     a->val.type = a->val.type->basetype;
  1201.     return a;
  1202. }
  1203.       default:
  1204. if (a->kind == EK_ADDR) {
  1205.     ex = a->args[0];
  1206.     FREE(a);
  1207.     return ex;
  1208. } else {
  1209.     if (check)
  1210. ex = checknil(a);
  1211.     else
  1212. ex = a;
  1213.     return makeexpr_un(EK_HAT, a->val.type->basetype, ex);
  1214.         }
  1215.     }
  1216. }
  1217. Expr *un_sign_extend(a)
  1218. Expr *a;
  1219. {
  1220.     if (a->kind == EK_BICALL &&
  1221.         !strcmp(a->val.s, signextname) && *signextname) {
  1222.         return grabarg(a, 0);
  1223.     }
  1224.     return a;
  1225. }
  1226. Expr *makeexpr_addr(a)
  1227. Expr *a;
  1228. {
  1229.     Expr *ex;
  1230.     Type *type;
  1231.     a = un_sign_extend(a);
  1232.     type = makepointertype(a->val.type);
  1233.     if (debug>2) { fprintf(outf,"makeexpr_addr("); dumpexpr(a); fprintf(outf,", "); dumptypename(type, 1); fprintf(outf,")n"); }
  1234.     if (a->kind == EK_CONST && a->val.type->kind == TK_STRING) {
  1235.         return a;     /* kludge to help assignments */
  1236.     } else if (a->kind == EK_INDEX &&
  1237.        (a->val.type->kind != TK_ARRAY &&
  1238. a->val.type->kind != TK_SET &&
  1239. a->val.type->kind != TK_STRING) &&
  1240.        (addindex == 1 ||
  1241. (addindex != 0 && checkconst(a->args[1], 0)))) {
  1242.         ex = makeexpr_plus(makeexpr_addr(a->args[0]), a->args[1]);
  1243.         FREE(a);
  1244.         ex->val.type = type;
  1245.         return ex;
  1246.     } else {
  1247.         switch (a->val.type->kind) {
  1248.     
  1249.   case TK_ARRAY:
  1250.   case TK_STRING:
  1251.   case TK_SET:
  1252.     if (a->val.type->smin) {
  1253. return makeexpr_un(EK_ADDR, type, 
  1254.    makeexpr_index(a, 
  1255.   copyexpr(a->val.type->smin),
  1256.   NULL));
  1257.     }
  1258.     a->val.type = type;
  1259.     return a;
  1260.     
  1261.   default:
  1262.     if (a->kind == EK_HAT) {
  1263. ex = a->args[0];
  1264. FREE(a);
  1265. return ex;
  1266.     } else if (a->kind == EK_ACTCAST)
  1267. return makeexpr_actcast(makeexpr_addr(grabarg(a, 0)), type);
  1268.     else if (a->kind == EK_CAST)
  1269. return makeexpr_cast(makeexpr_addr(grabarg(a, 0)), type);
  1270.     else
  1271. return makeexpr_un(EK_ADDR, type, a);
  1272. }
  1273.     }
  1274. }
  1275. Expr *makeexpr_addrstr(a)
  1276. Expr *a;
  1277. {
  1278.     if (debug>2) { fprintf(outf,"makeexpr_addrstr("); dumpexpr(a); fprintf(outf,")n"); }
  1279.     if (a->val.type->kind == TK_POINTER)
  1280. return a;
  1281.     return makeexpr_addr(a);
  1282. }
  1283. Expr *makeexpr_addrf(a)
  1284. Expr *a;
  1285. {
  1286.     Meaning *mp, *tvar;
  1287.     mp = (Meaning *)a->val.i;
  1288.     if ((a->kind == EK_VAR &&
  1289.          (mp == mp_input || mp == mp_output)) ||
  1290.         (a->kind == EK_NAME &&
  1291.          !strcmp(a->val.s, "stderr"))) {
  1292.         if (addrstdfiles == 0) {
  1293.             note(format_s("Taking address of %s; consider setting VarFiles = 0 [144]",
  1294.                           (a->kind == EK_VAR) ? ((Meaning *)a->val.i)->name
  1295.                                               : a->val.s));
  1296.             tvar = makestmttempvar(tp_text, name_TEMP);
  1297.             return makeexpr_comma(makeexpr_assign(makeexpr_var(tvar), a),
  1298.                                   makeexpr_addr(makeexpr_var(tvar)));
  1299.         }
  1300.     }
  1301.     if ((a->kind == EK_VAR &&
  1302.          mp->kind == MK_FIELD && mp->val.i) ||
  1303.         (a->kind == EK_BICALL &&
  1304.          !strcmp(a->val.s, getbitsname))) {
  1305.         warning("Can't take the address of a bit-field [166]");
  1306.     }
  1307.     return makeexpr_addr(a);
  1308. }
  1309. Expr *makeexpr_index(a, b, offset)
  1310. Expr *a, *b, *offset;
  1311. {
  1312.     Type *indextype, *btype;
  1313.     if (debug>2) { fprintf(outf,"makeexpr_index("); dumpexpr(a); fprintf(outf,", "); dumpexpr(b);
  1314.                                                                  fprintf(outf,", "); dumpexpr(offset); fprintf(outf,")n"); }
  1315.     indextype = (a->val.type->kind == TK_ARRAY) ? a->val.type->indextype
  1316.                                                 : tp_integer;
  1317.     b = gentle_cast(b, indextype);
  1318.     if (!offset)
  1319.         offset = makeexpr_long(0);
  1320.     b = makeexpr_minus(b, gentle_cast(offset, indextype));
  1321.     btype = a->val.type;
  1322.     if (btype->basetype)
  1323. btype = btype->basetype;
  1324.     if (checkconst(b, 0) && starindex == 1)
  1325.         return makeexpr_un(EK_HAT, btype, a);
  1326.     else
  1327.         return makeexpr_bin(EK_INDEX, btype, a,
  1328.                             gentle_cast(b, indextype));
  1329. }
  1330. Expr *makeexpr_type(type)
  1331. Type *type;
  1332. {
  1333.     Expr *ex;
  1334.     ex = makeexpr(EK_TYPENAME, 0);
  1335.     ex->val.type = type;
  1336.     return ex;
  1337. }
  1338. Expr *makeexpr_sizeof(ex, incskipped)
  1339. Expr *ex;
  1340. int incskipped;
  1341. {
  1342.     Expr *ex2, *ex3;
  1343.     Type *btype;
  1344.     char *name;
  1345.     if (ex->val.type->meaning) {
  1346. name = find_special_variant(ex->val.type->meaning->name,
  1347.     "SpecialSizeOf", specialsizeofs, 1);
  1348. if (name) {
  1349.     freeexpr(ex);
  1350.     return pc_expr_str(name);
  1351. }
  1352.     }
  1353.     switch (ex->val.type->kind) {
  1354.         case TK_CHAR:
  1355.         case TK_BOOLEAN:
  1356.             freeexpr(ex);
  1357.             return makeexpr_long(1);
  1358.         case TK_SUBR:
  1359.     btype = findbasetype(ex->val.type, 0);
  1360.     if (btype->kind == TK_CHAR || btype == tp_abyte) {
  1361. freeexpr(ex);
  1362. return makeexpr_long(1);
  1363.     }
  1364.     break;
  1365.         case TK_STRING:
  1366.         case TK_ARRAY:
  1367.             if (!ex->val.type->meaning || ex->val.type->kind == TK_STRING) {
  1368.                 ex3 = arraysize(ex->val.type, incskipped);
  1369.                 return makeexpr_times(ex3,
  1370.                                       makeexpr_sizeof(makeexpr_type(
  1371.                                            ex->val.type->basetype), 1));
  1372.             }
  1373.             break;
  1374.         case TK_SET:
  1375.             ord_range_expr(ex->val.type->indextype, NULL, &ex2);
  1376.             freeexpr(ex);
  1377.             return makeexpr_times(makeexpr_plus(makeexpr_div(copyexpr(ex2),
  1378.                                                              makeexpr_setbits()),
  1379.                                                 makeexpr_long(2)),
  1380.                                   makeexpr_sizeof(makeexpr_type(tp_integer), 0));
  1381.             break;
  1382. default:
  1383.     break;
  1384.     }
  1385.     if (ex->kind != EK_CONST &&
  1386.         (findbasetype(ex->val.type,0)->meaning || /* if type has a name... */
  1387.          ex->val.type->kind == TK_STRING ||       /* if C sizeof(expr) will give wrong answer */
  1388.          ex->val.type->kind == TK_ARRAY ||
  1389.          ex->val.type->kind == TK_SET)) {
  1390.         ex2 = makeexpr_type(ex->val.type);
  1391.         freeexpr(ex);
  1392.         ex = ex2;
  1393.     }
  1394.     return makeexpr_un(EK_SIZEOF, tp_integer, ex);
  1395. }
  1396. /* Compute a measure of how fast or slow the expression is likely to be.
  1397.    0 is a constant, 1 is a variable, extra points added per "operation". */
  1398. int exprspeed(ex)
  1399. Expr *ex;
  1400. {
  1401.     Meaning *mp, *mp2;
  1402.     int i, cost, speed;
  1403.     switch (ex->kind) {
  1404.         case EK_VAR:
  1405.             mp = (Meaning *)ex->val.i;
  1406.             if (mp->kind == MK_CONST)
  1407.                 return 0;
  1408.             if (!mp->ctx || mp->ctx->kind == MK_FUNCTION)
  1409.                 return 1;
  1410.             i = 1;
  1411.             for (mp2 = curctx; mp2 && mp2 != mp->ctx; mp2 = mp2->ctx)
  1412.                 i++;    /* cost of following static links */
  1413.             return (i);
  1414.         case EK_CONST:
  1415.         case EK_LONGCONST:
  1416.         case EK_SIZEOF:
  1417.             return 0;
  1418.         case EK_ADDR:
  1419.             speed = exprspeed(ex->args[0]);
  1420.             return (speed > 1) ? speed : 0;
  1421.         case EK_DOT:
  1422.             return exprspeed(ex->args[0]);
  1423.         case EK_NEG:
  1424.             return exprspeed(ex->args[0]) + 1;
  1425.         case EK_CAST:
  1426.         case EK_ACTCAST:
  1427.             i = (ord_type(ex->val.type)->kind == TK_REAL) !=
  1428.                 (ord_type(ex->args[0]->val.type)->kind == TK_REAL);
  1429.             return (i + exprspeed(ex->args[0]));
  1430.         case EK_COND:
  1431.             return 2 + exprspeed(ex->args[0]) +
  1432.                    MAX(exprspeed(ex->args[1]), exprspeed(ex->args[2]));
  1433.         case EK_AND:
  1434.         case EK_OR:
  1435.         case EK_COMMA:
  1436.             speed = 2;
  1437.             for (i = 0; i < ex->nargs; i++)
  1438.                 speed += exprspeed(ex->args[i]);
  1439.             return speed;
  1440.         case EK_FUNCTION:
  1441.         case EK_BICALL:
  1442.         case EK_SPCALL:
  1443.             return 1000;
  1444.         case EK_ASSIGN:
  1445.         case EK_POSTINC:
  1446.         case EK_POSTDEC:
  1447.             return 100 + exprspeed(ex->args[0]) + exprspeed(ex->args[1]);
  1448.         default:
  1449.             cost = (ex->kind == EK_PLUS) ? 1 : 2;
  1450.             if (ex->val.type->kind == TK_REAL)
  1451.                 cost *= 2;
  1452.             speed = -cost;
  1453.             for (i = 0; i < ex->nargs; i++) {
  1454.                 if (!isliteralconst(ex->args[i], NULL) ||
  1455.                     ex->val.type->kind == TK_REAL)
  1456.                     speed += exprspeed(ex->args[i]) + cost;
  1457.             }
  1458.             return MAX(speed, 0);
  1459.     }
  1460. }
  1461. int noargdependencies(ex, vars)
  1462. Expr *ex;
  1463. int vars;
  1464. {
  1465.     int i;
  1466.     for (i = 0; i < ex->nargs; i++) {
  1467.         if (!nodependencies(ex->args[i], vars))
  1468.             return 0;
  1469.     }
  1470.     return 1;
  1471. }
  1472. int nodependencies(ex, vars)
  1473. Expr *ex;
  1474. int vars;   /* 1 if explicit dependencies on vars count as dependencies */
  1475. {           /* 2 if global but not local vars count as dependencies */
  1476.     Meaning *mp;
  1477.     if (debug>2) { fprintf(outf,"nodependencies("); dumpexpr(ex); fprintf(outf,")n"); }
  1478.     if (!noargdependencies(ex, vars))
  1479.         return 0;
  1480.     switch (ex->kind) {
  1481.         case EK_VAR:
  1482.             mp = (Meaning *)ex->val.i;
  1483.     if (mp->kind == MK_CONST)
  1484. return 1;
  1485.     if (vars == 2 &&
  1486. mp->ctx == curctx &&
  1487. mp->ctx->kind == MK_FUNCTION &&
  1488. !mp->varstructflag)
  1489. return 1;
  1490.             return (mp->kind == MK_CONST ||
  1491.     (!vars &&
  1492.      (mp->kind == MK_VAR || mp->kind == MK_VARREF ||
  1493.       mp->kind == MK_PARAM || mp->kind == MK_VARPARAM)));
  1494.         case EK_BICALL:
  1495.             return nosideeffects_func(ex);
  1496.         case EK_FUNCTION:
  1497.         case EK_SPCALL:
  1498.         case EK_ASSIGN:
  1499.         case EK_POSTINC:
  1500.         case EK_POSTDEC:
  1501.         case EK_HAT:
  1502.         case EK_INDEX:
  1503.             return 0;
  1504.         default:
  1505.             return 1;
  1506.     }
  1507. }
  1508. int exprdependsvar(ex, mp)
  1509. Expr *ex;
  1510. Meaning *mp;
  1511. {
  1512.     int i;
  1513.     i = ex->nargs;
  1514.     while (--i >= 0)
  1515. if (exprdependsvar(ex->args[i], mp))
  1516.     return 1;
  1517.     switch (ex->kind) {
  1518.         case EK_VAR:
  1519.     return ((Meaning *)ex->val.i == mp);
  1520. case EK_BICALL:
  1521.     if (nodependencies(ex, 1))
  1522. return 0;
  1523. /* fall through */
  1524. case EK_FUNCTION:
  1525. case EK_SPCALL:
  1526.     return (mp->ctx != curctx ||
  1527.     mp->ctx->kind != MK_FUNCTION ||
  1528.     mp->varstructflag);
  1529. case EK_HAT:
  1530.     return 1;
  1531. default:
  1532.     return 0;
  1533.     }
  1534. }
  1535. int exprdepends(ex, ex2)
  1536. Expr *ex, *ex2;     /* Expression ex somehow depends on value of ex2 */
  1537. {
  1538.     switch (ex2->kind) {
  1539.         case EK_VAR:
  1540.     return exprdependsvar(ex, (Meaning *)ex2->val.i);
  1541. case EK_CONST:
  1542. case EK_LONGCONST:
  1543.     return 0;
  1544. case EK_INDEX:
  1545. case EK_DOT:
  1546.     return exprdepends(ex, ex2->args[0]);
  1547. default:
  1548.     return !nodependencies(ex, 1);
  1549.     }
  1550. }
  1551. int nosideeffects_func(ex)
  1552. Expr *ex;
  1553. {
  1554.     Meaning *mp;
  1555.     Symbol *sp;
  1556.     switch (ex->kind) {
  1557.         case EK_FUNCTION:
  1558.             mp = (Meaning *)ex->val.i;
  1559.             sp = findsymbol_opt(mp->name);
  1560.             return sp && (sp->flags & (NOSIDEEFF|DETERMF));
  1561.         case EK_BICALL:
  1562.             sp = findsymbol_opt(ex->val.s);
  1563.             return sp && (sp->flags & (NOSIDEEFF|DETERMF));
  1564.         default:
  1565.             return 0;
  1566.     }
  1567. }
  1568. int deterministic_func(ex)
  1569. Expr *ex;
  1570. {
  1571.     Meaning *mp;
  1572.     Symbol *sp;
  1573.     switch (ex->kind) {
  1574.         case EK_FUNCTION:
  1575.             mp = (Meaning *)ex->val.i;
  1576.             sp = findsymbol_opt(mp->name);
  1577.             return sp && (sp->flags & DETERMF);
  1578.         case EK_BICALL:
  1579.             sp = findsymbol_opt(ex->val.s);
  1580.             return sp && (sp->flags & DETERMF);
  1581.         default:
  1582.             return 0;
  1583.     }
  1584. }
  1585. int noargsideeffects(ex, mode)
  1586. Expr *ex;
  1587. int mode;
  1588. {
  1589.     int i;
  1590.     for (i = 0; i < ex->nargs; i++) {