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

编译器/解释器

开发平台:

C/C++

  1. /* "p2c", a Pascal to C translator.
  2.    Copyright (C) 1989 David Gillespie.
  3.    Author's address: daveg@csvax.caltech.edu; 256-80 Caltech/Pasadena CA 91125.
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation (any version).
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; see the file COPYING.  If not, write to
  13. the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
  14. #define PROTO_EXPR_C
  15. #include "trans.h"
  16. void free_value(val)
  17. Value *val;
  18. {
  19.     if (!val || !val->type)
  20. return;
  21.     switch (val->type->kind) {
  22.         case TK_STRING:
  23.         case TK_REAL:
  24.         case TK_ARRAY:
  25.         case TK_RECORD:
  26.         case TK_SET:
  27.             if (val->s)
  28.                 FREE(val->s);
  29.             break;
  30. default:
  31.     break;
  32.     }
  33. }
  34. Value copyvalue(val)
  35. Value val;
  36. {
  37.     char *cp;
  38.     switch (val.type->kind) {
  39.         case TK_STRING:
  40.         case TK_SET:
  41.             if (val.s) {
  42.                 cp = ALLOC(val.i+1, char, literals);
  43.                 memcpy(cp, val.s, val.i);
  44. cp[val.i] = 0;
  45.                 val.s = cp;
  46.             }
  47.             break;
  48.         case TK_REAL:
  49.         case TK_ARRAY:
  50.         case TK_RECORD:
  51.             if (val.s)
  52.                 val.s = stralloc(val.s);
  53.             break;
  54. default:
  55.     break;
  56.     }
  57.     return val;
  58. }
  59. int valuesame(a, b)
  60. Value a, b;
  61. {
  62.     if (a.type != b.type)
  63.         return 0;
  64.     switch (a.type->kind) {
  65.         case TK_INTEGER:
  66.         case TK_CHAR:
  67.         case TK_BOOLEAN:
  68.         case TK_ENUM:
  69.         case TK_SMALLSET:
  70.         case TK_SMALLARRAY:
  71.             return (a.i == b.i);
  72.         case TK_STRING:
  73.         case TK_SET:
  74.             return (a.i == b.i && !memcmp(a.s, b.s, a.i));
  75.         case TK_REAL:
  76.         case TK_ARRAY:
  77.         case TK_RECORD:
  78.             return (!strcmp(a.s, b.s));
  79.         default:
  80.             return 1;
  81.     }
  82. }
  83. char *value_name(val, intfmt, islong)
  84. Value val;
  85. char *intfmt;
  86. int islong;
  87. {
  88.     Meaning *mp;
  89.     Type *type = val.type;
  90.     if (type->kind == TK_SUBR)
  91. type = type->basetype;
  92.     switch (type->kind) {
  93.         case TK_INTEGER:
  94.         case TK_SMALLSET:
  95.         case TK_SMALLARRAY:
  96.             if (!intfmt)
  97. intfmt = "%ld";
  98.     if (*intfmt == ''') {
  99. if (val.i >= -'~' && val.i <= -' ') {
  100.     intfmt = format_s("-%s", intfmt);
  101.     val.i = -val.i;
  102. }
  103. if (val.i < ' ' || val.i > '~' || islong)
  104.     intfmt = "%ld";
  105.     }
  106.             if (islong)
  107.                 intfmt = format_s("%sL", intfmt);
  108.             return format_d(intfmt, val.i);
  109.         case TK_REAL:
  110.             return val.s;
  111.         case TK_ARRAY:    /* obsolete */
  112.         case TK_RECORD:   /* obsolete */
  113.             return val.s;
  114.         case TK_STRING:
  115.             return makeCstring(val.s, val.i);
  116.         case TK_BOOLEAN:
  117.             if (!intfmt)
  118.                 if (val.i == 1 && *name_TRUE &&
  119.     strcmp(name_TRUE, "1") && !islong)
  120.                     intfmt = name_TRUE;
  121.                 else if (val.i == 0 && *name_FALSE &&
  122.  strcmp(name_FALSE, "0") && !islong)
  123.                     intfmt = name_FALSE;
  124.                 else
  125.                     intfmt = "%ld";
  126.             if (islong)
  127.                 intfmt = format_s("%sL", intfmt);
  128.             return format_d(intfmt, val.i);
  129.         case TK_CHAR:
  130.             if (islong)
  131.                 return format_d("%ldL", val.i);
  132.     else if ((val.i < 0 || val.i > 127) && highcharints)
  133. return format_d("%ld", val.i);
  134.             else
  135.                 return makeCchar(val.i);
  136.         case TK_POINTER:
  137.             return (*name_NULL) ? name_NULL : "NULL";
  138.         case TK_ENUM:
  139.             mp = val.type->fbase;
  140.             while (mp && mp->val.i != val.i)
  141.                 mp = mp->xnext;
  142.             if (!mp) {
  143.                 intwarning("value_name", "bad enum value [152]");
  144.                 return format_d("%ld", val.i);
  145.             }
  146.             return mp->name;
  147.         default:
  148.             intwarning("value_name", format_s("bad type for constant: %s [153]", 
  149.                                               typekindname(type->kind)));
  150.             return "<spam>";
  151.     }
  152. }
  153. Value value_cast(val, type)
  154. Value val;
  155. Type *type;
  156. {
  157.     char buf[20];
  158.     if (type->kind == TK_SUBR)
  159.         type = type->basetype;
  160.     if (val.type == type)
  161.         return val;
  162.     if (type && val.type) {
  163.         switch (type->kind) {
  164.             case TK_REAL:
  165.                 if (ord_type(val.type)->kind == TK_INTEGER) {
  166.                     sprintf(buf, "%d.0", val.i);
  167.                     val.s = stralloc(buf);
  168.                     val.type = tp_real;
  169.                     return val;
  170.                 }
  171.                 break;
  172.             case TK_CHAR:
  173.                 if (val.type->kind == TK_STRING) {
  174.                     if (val.i != 1)
  175.                         if (val.i > 0)
  176.                             warning("Char constant with more than one character [154]");
  177.                         else
  178.                             warning("Empty char constant [155]");
  179.                     val.i = val.s[0] & 0xff;
  180.                     val.s = NULL;
  181.                     val.type = tp_char;
  182.                     return val;
  183.                 }
  184.             case TK_POINTER:
  185.                 if (val.type == tp_anyptr && castnull != 1) {
  186.                     val.type = type;
  187.                     return val;
  188.                 }
  189.     default:
  190. break;
  191.         }
  192.     }
  193.     val.type = NULL;
  194.     return val;
  195. }
  196. Type *ord_type(tp)
  197. Type *tp;
  198. {
  199.     if (!tp) {
  200.         warning("Expected a constant [127]");
  201.         return tp_integer;
  202.     }
  203.     switch (tp->kind) {
  204.         case TK_SUBR:
  205.             tp = tp->basetype;
  206.             break;
  207.         case TK_STRING:
  208.             if (!CHECKORDEXPR(tp->indextype->smax, 1))
  209.                 tp = tp_char;
  210.             break;
  211. default:
  212.     break;
  213.     }
  214.     return tp;
  215. }
  216. int long_type(tp)
  217. Type *tp;
  218. {
  219.     switch (tp->kind) {
  220.         case TK_INTEGER:
  221.             return (tp != tp_int && tp != tp_uint && tp != tp_sint);
  222.         case TK_SUBR:
  223.             return (findbasetype(tp, 0) == tp_integer);
  224.         default:
  225.             return 0;
  226.     }
  227. }
  228. Value make_ord(type, i)
  229. Type *type;
  230. long i;
  231. {
  232.     Value val;
  233.     if (type->kind == TK_ENUM)
  234.         type = findbasetype(type, 0);
  235.     if (type->kind == TK_SUBR)
  236.         type = type->basetype;
  237.     val.type = type;
  238.     val.i = i;
  239.     val.s = NULL;
  240.     return val;
  241. }
  242. long ord_value(val)
  243. Value val;
  244. {
  245.     switch (val.type->kind) {
  246.         case TK_INTEGER:
  247.         case TK_ENUM:
  248.         case TK_CHAR:
  249.         case TK_BOOLEAN:
  250.             return val.i;
  251.         case TK_STRING:
  252.             if (val.i == 1)
  253.                 return val.s[0] & 0xff;
  254.         /* fall through */
  255.         default:
  256.             warning("Expected an ordinal type [156]");
  257.             return 0;
  258.     }
  259. }
  260. void ord_range_expr(type, smin, smax)
  261. Type *type;
  262. Expr **smin, **smax;
  263. {
  264.     if (!type) {
  265.         warning("Expected a constant [127]");
  266.         type = tp_integer;
  267.     }
  268.     if (type->kind == TK_STRING)
  269.         type = tp_char;
  270.     switch (type->kind) {
  271.         case TK_SUBR:
  272.         case TK_INTEGER:
  273.         case TK_ENUM:
  274.         case TK_CHAR:
  275.         case TK_BOOLEAN:
  276.             if (smin) *smin = type->smin;
  277.             if (smax) *smax = type->smax;
  278.             break;
  279.         default:
  280.             warning("Expected an ordinal type [156]");
  281.             if (smin) *smin = makeexpr_long(0);
  282.             if (smax) *smax = makeexpr_long(1);
  283.             break;
  284.     }
  285. }
  286. int ord_range(type, smin, smax)
  287. Type *type;
  288. long *smin, *smax;
  289. {
  290.     Expr *emin, *emax;
  291.     Value vmin, vmax;
  292.     ord_range_expr(type, &emin, &emax);
  293.     if (smin) {
  294.         vmin = eval_expr(emin);
  295.         if (!vmin.type)
  296.             return 0;
  297.     }
  298.     if (smax) {
  299.         vmax = eval_expr(emax);
  300.         if (!vmax.type)
  301.             return 0;
  302.     }
  303.     if (smin) *smin = ord_value(vmin);
  304.     if (smax) *smax = ord_value(vmax);
  305.     return 1;
  306. }
  307. void freeexpr(ex)
  308. register Expr *ex;
  309. {
  310.     register int i;
  311.     if (ex) {
  312.         for (i = 0; i < ex->nargs; i++)
  313.             freeexpr(ex->args[i]);
  314.         switch (ex->kind) {
  315.             case EK_CONST:
  316.             case EK_LONGCONST:
  317.                 free_value(&ex->val);
  318.                 break;
  319.             case EK_DOT:
  320.             case EK_NAME:
  321.             case EK_BICALL:
  322.                 if (ex->val.s)
  323.                     FREE(ex->val.s);
  324.                 break;
  325.     default:
  326. break;
  327.         }
  328.         FREE(ex);
  329.     }
  330. }
  331. Expr *makeexpr(kind, n)
  332. enum exprkind kind;
  333. int n;
  334. {
  335.     Expr *ex;
  336.     ex = ALLOCV(sizeof(Expr) + (n-1)*sizeof(Expr *), Expr, exprs);
  337.     ex->val.i = 0;
  338.     ex->val.s = NULL;
  339.     ex->kind = kind;
  340.     ex->nargs = n;
  341.     return ex;
  342. }
  343. Expr *makeexpr_un(kind, type, arg1)
  344. enum exprkind kind;
  345. Type *type;
  346. Expr *arg1;
  347. {
  348.     Expr *ex;
  349.     ex = makeexpr(kind, 1);
  350.     ex->val.type = type;
  351.     ex->args[0] = arg1;
  352.     if (debug>2) { fprintf(outf,"makeexpr_un returns "); dumpexpr(ex); fprintf(outf,"n"); }
  353.     return ex;
  354. }
  355. Expr *makeexpr_bin(kind, type, arg1, arg2)
  356. enum exprkind kind;
  357. Type *type;
  358. Expr *arg1, *arg2;
  359. {
  360.     Expr *ex;
  361.     ex = makeexpr(kind, 2);
  362.     ex->val.type = type;
  363.     ex->args[0] = arg1;
  364.     ex->args[1] = arg2;
  365.     if (debug>2) { fprintf(outf,"makeexpr_bin returns "); dumpexpr(ex); fprintf(outf,"n"); }
  366.     return ex;
  367. }
  368. Expr *makeexpr_val(val)
  369. Value val;
  370. {
  371.     Expr *ex;
  372.     if (val.type->kind == TK_INTEGER && 
  373.         (val.i < -32767 || val.i > 32767) &&
  374.         sizeof_int < 32)
  375.         ex = makeexpr(EK_LONGCONST, 0);
  376.     else
  377.         ex = makeexpr(EK_CONST, 0);
  378.     ex->val = val;
  379.     if (debug>2) { fprintf(outf,"makeexpr_val returns "); dumpexpr(ex); fprintf(outf,"n"); }
  380.     return ex;
  381. }
  382. Expr *makeexpr_char(c)
  383. int c;
  384. {
  385.     return makeexpr_val(make_ord(tp_char, c));
  386. }
  387. Expr *makeexpr_long(i)
  388. long i;
  389. {
  390.     return makeexpr_val(make_ord(tp_integer, i));
  391. }
  392. Expr *makeexpr_real(r)
  393. char *r;
  394. {
  395.     Value val;
  396.     val.type = tp_real;
  397.     val.i = 0;
  398.     val.s = stralloc(r);
  399.     return makeexpr_val(val);
  400. }
  401. Expr *makeexpr_lstring(msg, len)
  402. char *msg;
  403. int len;
  404. {
  405.     Value val;
  406.     val.type = tp_str255;
  407.     val.i = len;
  408.     val.s = ALLOC(len+1, char, literals);
  409.     memcpy(val.s, msg, len);
  410.     val.s[len] = 0;
  411.     return makeexpr_val(val);
  412. }
  413. Expr *makeexpr_string(msg)
  414. char *msg;
  415. {
  416.     Value val;
  417.     val.type = tp_str255;
  418.     val.i = strlen(msg);
  419.     val.s = stralloc(msg);
  420.     return makeexpr_val(val);
  421. }
  422. int checkstring(ex, msg)
  423. Expr *ex;
  424. char *msg;
  425. {
  426.     if (!ex || ex->val.type->kind != TK_STRING || ex->kind != EK_CONST)
  427.         return 0;
  428.     if (ex->val.i != strlen(msg))
  429.         return 0;
  430.     return memcmp(ex->val.s, msg, ex->val.i) == 0;
  431. }
  432. Expr *makeexpr_var(mp)
  433. Meaning *mp;
  434. {
  435.     Expr *ex;
  436.     ex = makeexpr(EK_VAR, 0);
  437.     ex->val.i = (long) mp;
  438.     ex->val.type = mp->type;
  439.     if (debug>2) { fprintf(outf,"makeexpr_var returns "); dumpexpr(ex); fprintf(outf,"n"); }
  440.     return ex;
  441. }
  442. Expr *makeexpr_name(name, type)
  443. char *name;
  444. Type *type;
  445. {
  446.     Expr *ex;
  447.     ex = makeexpr(EK_NAME, 0);
  448.     ex->val.s = stralloc(name);
  449.     ex->val.type = type;
  450.     if (debug>2) { fprintf(outf,"makeexpr_name returns "); dumpexpr(ex); fprintf(outf,"n"); }
  451.     return ex;
  452. }
  453. Expr *makeexpr_setbits()
  454. {
  455.     if (*name_SETBITS)
  456.         return makeexpr_name(name_SETBITS, tp_integer);
  457.     else
  458.         return makeexpr_long(setbits);
  459. }
  460. /* Note: BICALL's to the following functions should obey the ANSI standard. */
  461. /*       Non-ANSI transformations occur while writing the expression. */
  462. /*              char *sprintf(buf, fmt, ...)   [returns buf]  */
  463. /*              void *memcpy(dest, src, size)  [returns dest] */
  464. Expr *makeexpr_bicall_0(name, type)
  465. char *name;
  466. Type *type;
  467. {
  468.     Expr *ex;
  469.     if (!name || !*name) {
  470.         intwarning("makeexpr_bicall_0", "Required name of built-in procedure is missing [157]");
  471.         name = "MissingProc";
  472.     }
  473.     ex = makeexpr(EK_BICALL, 0);
  474.     ex->val.s = stralloc(name);
  475.     ex->val.type = type;
  476.     if (debug>2) { fprintf(outf,"makeexpr_bicall returns "); dumpexpr(ex); fprintf(outf,"n"); }
  477.     return ex;
  478. }
  479. Expr *makeexpr_bicall_1(name, type, arg1)
  480. char *name;
  481. Type *type;
  482. Expr *arg1;
  483. {
  484.     Expr *ex;
  485.     if (!name || !*name) {
  486.         intwarning("makeexpr_bicall_1", "Required name of built-in procedure is missing [157]");
  487.         name = "MissingProc";
  488.     }
  489.     ex = makeexpr(EK_BICALL, 1);
  490.     ex->val.s = stralloc(name);
  491.     ex->val.type = type;
  492.     ex->args[0] = arg1;
  493.     if (debug>2) { fprintf(outf,"makeexpr_bicall returns "); dumpexpr(ex); fprintf(outf,"n"); }
  494.     return ex;
  495. }
  496. Expr *makeexpr_bicall_2(name, type, arg1, arg2)
  497. char *name;
  498. Type *type;
  499. Expr *arg1, *arg2;
  500. {
  501.     Expr *ex;
  502.     if (!name || !*name) {
  503.         intwarning("makeexpr_bicall_2", "Required name of built-in procedure is missing [157]");
  504.         name = "MissingProc";
  505.     }
  506.     ex = makeexpr(EK_BICALL, 2);
  507.     if (!strcmp(name, "~SETIO"))
  508.         name = (iocheck_flag) ? "~~SETIO" : name_SETIO;
  509.     ex->val.s = stralloc(name);
  510.     ex->val.type = type;
  511.     ex->args[0] = arg1;
  512.     ex->args[1] = arg2;
  513.     if (debug>2) { fprintf(outf,"makeexpr_bicall returns "); dumpexpr(ex); fprintf(outf,"n"); }
  514.     return ex;
  515. }
  516. Expr *makeexpr_bicall_3(name, type, arg1, arg2, arg3)
  517. char *name;
  518. Type *type;
  519. Expr *arg1, *arg2, *arg3;
  520. {
  521.     Expr *ex;
  522.     if (!name || !*name) {
  523.         intwarning("makeexpr_bicall_3", "Required name of built-in procedure is missing [157]");
  524.         name = "MissingProc";
  525.     }
  526.     ex = makeexpr(EK_BICALL, 3);
  527.     ex->val.s = stralloc(name);
  528.     ex->val.type = type;
  529.     ex->args[0] = arg1;
  530.     ex->args[1] = arg2;
  531.     ex->args[2] = arg3;
  532.     if (debug>2) { fprintf(outf,"makeexpr_bicall returns "); dumpexpr(ex); fprintf(outf,"n"); }
  533.     return ex;
  534. }
  535. Expr *makeexpr_bicall_4(name, type, arg1, arg2, arg3, arg4)
  536. char *name;
  537. Type *type;
  538. Expr *arg1, *arg2, *arg3, *arg4;
  539. {
  540.     Expr *ex;
  541.     if (!name || !*name) {
  542.         intwarning("makeexpr_bicall_4", "Required name of built-in procedure is missing [157]");
  543.         name = "MissingProc";
  544.     }
  545.     ex = makeexpr(EK_BICALL, 4);
  546.     if (!strcmp(name, "~CHKIO"))
  547.         name = (iocheck_flag) ? "~~CHKIO" : name_CHKIO;
  548.     ex->val.s = stralloc(name);
  549.     ex->val.type = type;
  550.     ex->args[0] = arg1;
  551.     ex->args[1] = arg2;
  552.     ex->args[2] = arg3;
  553.     ex->args[3] = arg4;
  554.     if (debug>2) { fprintf(outf,"makeexpr_bicall returns "); dumpexpr(ex); fprintf(outf,"n"); }
  555.     return ex;
  556. }
  557. Expr *makeexpr_bicall_5(name, type, arg1, arg2, arg3, arg4, arg5)
  558. char *name;
  559. Type *type;
  560. Expr *arg1, *arg2, *arg3, *arg4, *arg5;
  561. {
  562.     Expr *ex;
  563.     if (!name || !*name) {
  564.         intwarning("makeexpr_bicall_5", "Required name of built-in procedure is missing [157]");
  565.         name = "MissingProc";
  566.     }
  567.     ex = makeexpr(EK_BICALL, 5);
  568.     ex->val.s = stralloc(name);
  569.     ex->val.type = type;
  570.     ex->args[0] = arg1;
  571.     ex->args[1] = arg2;
  572.     ex->args[2] = arg3;
  573.     ex->args[3] = arg4;
  574.     ex->args[4] = arg5;
  575.     if (debug>2) { fprintf(outf,"makeexpr_bicall returns "); dumpexpr(ex); fprintf(outf,"n"); }
  576.     return ex;
  577. }
  578. Expr *copyexpr(ex)
  579. register Expr *ex;
  580. {
  581.     register int i;
  582.     register Expr *ex2;
  583.     if (ex) {
  584.         ex2 = makeexpr(ex->kind, ex->nargs);
  585.         for (i = 0; i < ex->nargs; i++)
  586.             ex2->args[i] = copyexpr(ex->args[i]);
  587.         switch (ex->kind) {
  588.             case EK_CONST:
  589.             case EK_LONGCONST:
  590.                 ex2->val = copyvalue(ex->val);
  591.                 break;
  592.             case EK_DOT:
  593.             case EK_NAME:
  594.             case EK_BICALL:
  595.                 ex2->val.type = ex->val.type;
  596.                 ex2->val.i = ex->val.i;
  597.                 if (ex->val.s)
  598.                     ex2->val.s = stralloc(ex->val.s);
  599.                 break;
  600.             default:
  601.                 ex2->val = ex->val;
  602.                 break;
  603.         }
  604.         return ex2;
  605.     } else
  606.         return NULL;
  607. }
  608. int exprsame(a, b, strict)
  609. register Expr *a, *b;
  610. int strict;
  611. {
  612.     register int i;
  613.     if (!a)
  614.         return (!b);
  615.     if (!b)
  616.         return 0;
  617.     if (a->val.type != b->val.type && strict != 2) {
  618.         if (strict ||
  619.     !((a->val.type->kind == TK_POINTER &&
  620.        a->val.type->basetype == b->val.type) ||
  621.       (b->val.type->kind == TK_POINTER &&
  622.        b->val.type->basetype == a->val.type)))
  623.         return 0;
  624.     }
  625.     if (a->kind != b->kind || a->nargs != b->nargs)
  626.         return 0;
  627.     switch (a->kind) {
  628.         case EK_CONST:
  629.         case EK_LONGCONST:
  630.             if (!valuesame(a->val, b->val))
  631.                 return 0;
  632.             break;
  633.         case EK_BICALL:
  634.         case EK_NAME:
  635.             if (strcmp(a->val.s, b->val.s))
  636.                 return 0;
  637.             break;
  638.         case EK_VAR:
  639.         case EK_FUNCTION:
  640.         case EK_CTX:
  641.         case EK_MACARG:
  642.             if (a->val.i != b->val.i)
  643.                 return 0;
  644.             break;
  645.         case EK_DOT:
  646.             if (a->val.i != b->val.i ||
  647.                 (!a->val.i && strcmp(a->val.s, b->val.s)))
  648.                 return 0;
  649.             break;
  650. default:
  651.     break;
  652.     }
  653.     i = a->nargs;
  654.     while (--i >= 0)
  655.         if (!exprsame(a->args[i], b->args[i], (strict == 2) ? 1 : strict))
  656.             return 0;
  657.     return 1;
  658. }
  659. int exprequiv(a, b)
  660. register Expr *a, *b;
  661. {
  662.     register int i, j, k;
  663.     enum exprkind kind2;
  664.     if (!a)
  665.         return (!b);
  666.     if (!b)
  667.         return 0;
  668.     switch (a->kind) {
  669.         case EK_PLUS:
  670.         case EK_TIMES:
  671.         case EK_BAND:
  672.         case EK_BOR:
  673.         case EK_BXOR:
  674.         case EK_EQ:
  675.         case EK_NE:
  676.             if (b->kind != a->kind || b->nargs != a->nargs ||
  677.                 b->val.type != a->val.type)
  678.                 return 0;
  679.             if (a->nargs > 3)
  680.                 break;
  681.             for (i = 0; i < b->nargs; i++) {
  682.                 if (exprequiv(a->args[0], b->args[i])) {
  683.                     for (j = 0; j < b->nargs; j++) {
  684.                         if (j != i &&
  685.                             exprequiv(a->args[1], b->args[i])) {
  686.                             if (a->nargs == 2)
  687.                                 return 1;
  688.                             for (k = 0; k < b->nargs; k++) {
  689.                                 if (k != i && k != j &&
  690.                                     exprequiv(a->args[2], b->args[k]))
  691.                                     return 1;
  692.                             }
  693.                         }
  694.                     }
  695.                 }
  696.             }
  697.             break;
  698.         case EK_LT:
  699.         case EK_GT:
  700.         case EK_LE:
  701.         case EK_GE:
  702.             switch (a->kind) {
  703.                 case EK_LT:  kind2 = EK_GT; break;
  704.                 case EK_GT:  kind2 = EK_LT; break;
  705.                 case EK_LE:  kind2 = EK_GE; break;
  706.                 default:     kind2 = EK_LE; break;
  707.             }
  708.             if (b->kind != kind2 || b->val.type != a->val.type)
  709.                 break;
  710.             if (exprequiv(a->args[0], b->args[1]) &&
  711.                 exprequiv(a->args[1], b->args[0])) {
  712.                 return 1;
  713.             }
  714.             break;
  715.         case EK_CONST:
  716.         case EK_LONGCONST:
  717.         case EK_BICALL:
  718.         case EK_NAME:
  719.         case EK_VAR:
  720.         case EK_FUNCTION:
  721.         case EK_CTX:
  722.         case EK_DOT:
  723.             return exprsame(a, b, 0);
  724. default:
  725.     break;
  726.     }
  727.     if (b->kind != a->kind || b->nargs != a->nargs ||
  728.         b->val.type != a->val.type)
  729.         return 0;
  730.     i = a->nargs;
  731.     while (--i >= 0)
  732.         if (!exprequiv(a->args[i], b->args[i]))
  733.             return 0;
  734.     return 1;
  735. }
  736. void deletearg(ex, n)
  737. Expr **ex;
  738. register int n;
  739. {
  740.     register Expr *ex1 = *ex, *ex2;
  741.     register int i;
  742.     if (debug>2) { fprintf(outf,"deletearg("); dumpexpr(*ex); fprintf(outf,", %d)n", n); }
  743.     if (n < 0 || n >= (*ex)->nargs) {
  744.         intwarning("deletearg", "argument number out of range [158]");
  745.         return;
  746.     }
  747.     ex2 = makeexpr(ex1->kind, ex1->nargs-1);
  748.     ex2->val = ex1->val;
  749.     for (i = 0; i < n; i++)
  750.         ex2->args[i] = ex1->args[i];
  751.     for (; i < ex2->nargs; i++)
  752.         ex2->args[i] = ex1->args[i+1];
  753.     *ex = ex2;
  754.     FREE(ex1);
  755.     if (debug>2) { fprintf(outf,"deletearg returns "); dumpexpr(*ex); fprintf(outf,"n"); }
  756. }
  757. void insertarg(ex, n, arg)
  758. Expr **ex;
  759. Expr *arg;
  760. register int n;
  761. {
  762.     register Expr *ex1 = *ex, *ex2;
  763.     register int i;
  764.     if (debug>2) { fprintf(outf,"insertarg("); dumpexpr(*ex); fprintf(outf,", %d)n", n); }
  765.     if (n < 0 || n > (*ex)->nargs) {
  766.         intwarning("insertarg", "argument number out of range [159]");
  767.         return;
  768.     }
  769.     ex2 = makeexpr(ex1->kind, ex1->nargs+1);
  770.     ex2->val = ex1->val;
  771.     for (i = 0; i < n; i++)
  772.         ex2->args[i] = ex1->args[i];
  773.     ex2->args[n] = arg;
  774.     for (; i < ex1->nargs; i++)
  775.         ex2->args[i+1] = ex1->args[i];
  776.     *ex = ex2;
  777.     FREE(ex1);
  778.     if (debug>2) { fprintf(outf,"insertarg returns "); dumpexpr(*ex); fprintf(outf,"n"); }
  779. }
  780. Expr *grabarg(ex, n)
  781. Expr *ex;
  782. int n;
  783. {
  784.     Expr *ex2;
  785.     if (n < 0 || n >= ex->nargs) {
  786.         intwarning("grabarg", "argument number out of range [160]");
  787.         return ex;
  788.     }
  789.     ex2 = ex->args[n];
  790.     ex->args[n] = makeexpr_long(0);   /* placeholder */
  791.     freeexpr(ex);
  792.     return ex2;
  793. }
  794. void delsimparg(ep, n)
  795. Expr **ep;
  796. int n;
  797. {
  798.     if (n < 0 || n >= (*ep)->nargs) {
  799.         intwarning("delsimparg", "argument number out of range [161]");
  800.         return;
  801.     }
  802.     deletearg(ep, n);
  803.     switch ((*ep)->kind) {
  804.         case EK_PLUS:
  805.         case EK_TIMES:
  806.         case EK_COMMA:
  807.             if ((*ep)->nargs == 1)
  808.                 *ep = grabarg(*ep, 0);
  809.             break;
  810. default:
  811.     break;
  812.     }
  813. }
  814. Expr *resimplify(ex)
  815. Expr *ex;
  816. {
  817.     Expr *ex2;
  818.     Type *type;
  819.     int i;
  820.     if (debug>2) { fprintf(outf,"resimplify("); dumpexpr(ex); fprintf(outf,")n"); }
  821.     if (!ex)
  822.         return NULL;
  823.     type = ex->val.type;
  824.     switch (ex->kind) {
  825.         case EK_PLUS:
  826.             ex2 = ex->args[0];
  827.             for (i = 1; i < ex->nargs; i++)
  828.                 ex2 = makeexpr_plus(ex2, ex->args[i]);
  829.             FREE(ex);
  830.             return ex2;
  831.         case EK_TIMES:
  832.             ex2 = ex->args[0];
  833.             for (i = 1; i < ex->nargs; i++)
  834.                 ex2 = makeexpr_times(ex2, ex->args[i]);
  835.             FREE(ex);
  836.             return ex2;
  837.         case EK_NEG:
  838.             ex = makeexpr_neg(grabarg(ex, 0));
  839.             ex->val.type = type;
  840.             return ex;
  841.         case EK_NOT:
  842.             ex = makeexpr_not(grabarg(ex, 0));
  843.             ex->val.type = type;
  844.             return ex;
  845.         case EK_HAT:
  846.             ex = makeexpr_hat(grabarg(ex, 0), 0);
  847.     if (ex->kind == EK_HAT)
  848. ex->val.type = type;
  849.             return ex;
  850.         case EK_ADDR:
  851.             ex = makeexpr_addr(grabarg(ex, 0));
  852.             ex->val.type = type;
  853.             return ex;
  854. case EK_ASSIGN:
  855.     ex2 = makeexpr_assign(ex->args[0], ex->args[1]);
  856.     FREE(ex);
  857.     return ex2;
  858. default:
  859.     break;
  860.     }
  861.     return ex;
  862. }
  863. int realzero(s)
  864. register char *s;
  865. {
  866.     if (*s == '-') s++;
  867.     while (*s == '0' || *s == '.') s++;
  868.     return (!isdigit(*s));
  869. }
  870. int checkconst(ex, val)
  871. Expr *ex;
  872. long val;
  873. {
  874.     Meaning *mp;
  875.     Value exval;
  876.     if (!ex)
  877.         return 0;
  878.     if (ex->kind == EK_CAST || ex->kind == EK_ACTCAST)
  879.         ex = ex->args[0];
  880.     if (ex->kind == EK_CONST || ex->kind == EK_LONGCONST)
  881.         exval = ex->val;
  882.     else if (ex->kind == EK_VAR && 
  883.              (mp = (Meaning *)ex->val.i)->kind == MK_CONST &&
  884.              foldconsts != 0)
  885.         exval = mp->val;
  886.     else
  887.         return 0;
  888.     switch (exval.type->kind) {
  889.         case TK_BOOLEAN:
  890.         case TK_INTEGER:
  891.         case TK_CHAR:
  892.         case TK_ENUM:
  893.         case TK_SUBR:
  894.         case TK_SMALLSET:
  895.         case TK_SMALLARRAY:
  896.             return exval.i == val;
  897.         case TK_POINTER:
  898.         case TK_STRING:
  899.             return (val == 0 && exval.i == 0);
  900.         case TK_REAL:
  901.             return (val == 0 && realzero(exval.s));
  902. default:
  903.     return 0;
  904.     }
  905. }
  906. int isliteralconst(ex, valp)
  907. Expr *ex;
  908. Value *valp;
  909. {
  910.     Meaning *mp;
  911.     if (ex) {
  912.         switch (ex->kind) {
  913.             case EK_CONST:
  914.             case EK_LONGCONST:
  915.                 if (valp)
  916.                     *valp = ex->val;
  917.                 return 2;
  918.             case EK_VAR:
  919.                 mp = (Meaning *)ex->val.i;
  920.                 if (mp->kind == MK_CONST) {
  921.                     if (valp) {
  922.                         if (foldconsts == 0)
  923.                             valp->type = NULL;
  924.                         else
  925.                             *valp = mp->val;
  926.                     }
  927.                     return 1;
  928.                 }
  929.                 break;
  930.     default:
  931. break;
  932.         }
  933.     }
  934.     if (valp)
  935.         valp->type = NULL;
  936.     return 0;
  937. }
  938. int isconstexpr(ex, valp)
  939. Expr *ex;
  940. long *valp;
  941. {
  942.     Value exval;
  943.     if (debug>2) { fprintf(outf,"isconstexpr("); dumpexpr(ex); fprintf(outf,")n"); }
  944.     exval = eval_expr(ex);
  945.     if (exval.type) {
  946.         if (valp)
  947.             *valp = exval.i;
  948.         return 1;
  949.     } else
  950.         return 0;
  951. }
  952. int isconstantexpr(ex)
  953. Expr *ex;
  954. {
  955.     Meaning *mp;
  956.     int i;
  957.     switch (ex->kind) {
  958.         case EK_CONST:
  959.         case EK_LONGCONST:
  960.         case EK_SIZEOF:
  961.             return 1;
  962.         case EK_ADDR:
  963.             if (ex->args[0]->kind == EK_VAR) {
  964.                 mp = (Meaning *)ex->val.i;
  965.                 return (!mp->ctx || mp->ctx->kind == MK_MODULE);
  966.             }
  967.             return 0;
  968.         case EK_VAR:
  969.             mp = (Meaning *)ex->val.i;
  970.             return (mp->kind == MK_CONST);
  971.         case EK_BICALL:
  972.         case EK_FUNCTION:
  973.             if (!deterministic_func(ex))
  974.                 return 0;
  975.         /* fall through */
  976.         case EK_EQ:
  977.         case EK_NE:
  978.         case EK_LT:
  979.         case EK_GT:
  980.         case EK_LE:
  981.         case EK_GE:
  982.         case EK_PLUS:
  983.         case EK_NEG:
  984.         case EK_TIMES:
  985.         case EK_DIVIDE:
  986.         case EK_DIV:
  987.         case EK_MOD:
  988.         case EK_AND:
  989.         case EK_OR:
  990.         case EK_NOT:
  991.         case EK_BAND:
  992.         case EK_BOR:
  993.         case EK_BXOR:
  994.         case EK_BNOT:
  995.         case EK_LSH:
  996.         case EK_RSH:
  997.         case EK_CAST:
  998.         case EK_ACTCAST:
  999.         case EK_COND:
  1000.             for (i = 0; i < ex->nargs; i++) {
  1001.                 if (!isconstantexpr(ex->args[i]))
  1002.                     return 0;
  1003.             }
  1004.             return 1;
  1005.         case EK_COMMA:
  1006.             return isconstantexpr(ex->args[ex->nargs-1]);
  1007. default:
  1008.     return 0;
  1009.     }
  1010. }
  1011. Static Expr *docast(a, type)
  1012. Expr *a;
  1013. Type *type;
  1014. {
  1015.     Value val;
  1016.     Meaning *mp;
  1017.     int i;
  1018.     Expr *ex;
  1019.     if (a->val.type->kind == TK_SMALLSET && type->kind == TK_SET) {
  1020.         mp = makestmttempvar(type, name_SET);
  1021.         return makeexpr_bicall_2(setexpandname, type,
  1022.                                  makeexpr_var(mp),
  1023.                                  makeexpr_arglong(a, 1));
  1024.     } else if (a->val.type->kind == TK_SET && type->kind == TK_SMALLSET) {
  1025.         return packset(a, type);
  1026.     }
  1027.     switch (a->kind) {
  1028.         case EK_VAR:
  1029.             mp = (Meaning *) a->val.i;
  1030.             if (mp->kind == MK_CONST) {
  1031.                 if (mp->val.type->kind == TK_STRING && type->kind == TK_CHAR) {
  1032.                     val = value_cast(mp->val, type);
  1033.                     a->kind = EK_CONST;
  1034.                     a->val = val;
  1035.                     return a;
  1036.                 }
  1037.             }
  1038.             break;
  1039.         case EK_CONST:
  1040.         case EK_LONGCONST:
  1041.             val = value_cast(a->val, type);
  1042.             if (val.type) {
  1043.                 a->val = val;
  1044.                 return a;
  1045.             }
  1046.             break;
  1047.         case EK_PLUS:
  1048.         case EK_NEG:
  1049.         case EK_TIMES:
  1050.             if (type->kind == TK_REAL) {
  1051.                 for (i = 0; i < a->nargs; i++) {
  1052.                     ex = docast(a->args[i], type);
  1053.                     if (ex) {
  1054.                         a->args[i] = ex;
  1055.                         a->val.type = type;
  1056.                         return a;
  1057.                     }
  1058.                 }
  1059.             }
  1060.             break;
  1061. default:
  1062.     break;
  1063.     }
  1064.     return NULL;
  1065. }
  1066. /* Make an "active" cast, i.e., one that performs an explicit operation */
  1067. Expr *makeexpr_actcast(a, type)
  1068. Expr *a;
  1069. Type *type;
  1070. {
  1071.     if (debug>2) { fprintf(outf,"makeexpr_actcast("); dumpexpr(a); fprintf(outf,", "); dumptypename(type, 1); fprintf(outf,")n"); }
  1072.     if (similartypes(a->val.type, type)) {
  1073.         a->val.type = type;
  1074.         return a;
  1075.     }
  1076.     return makeexpr_un(EK_ACTCAST, type, a);
  1077. }
  1078. Expr *makeexpr_cast(a, type)
  1079. Expr *a;
  1080. Type *type;
  1081. {
  1082.     Expr *ex;
  1083.     if (debug>2) { fprintf(outf,"makeexpr_cast("); dumpexpr(a); fprintf(outf,", "); dumptypename(type, 1); fprintf(outf,")n"); }
  1084.     if (a->val.type == type)
  1085.         return a;
  1086.     ex = docast(a, type);
  1087.     if (ex)
  1088.         return ex;
  1089.     if (a->kind == EK_CAST &&
  1090.         a->args[0]->val.type->kind == TK_POINTER &&
  1091.         similartypes(type, a->args[0]->val.type)) {
  1092.         a = grabarg(a, 0);
  1093.         a->val.type = type;
  1094.         return a;
  1095.     }
  1096.     if ((a->kind == EK_CAST &&
  1097.          ((a->val.type->kind == TK_POINTER && type->kind == TK_POINTER) ||
  1098.           (ord_type(a->val.type)->kind == TK_INTEGER && ord_type(type)->kind == TK_INTEGER))) ||
  1099.         similartypes(type, a->val.type)) {
  1100.         a->val.type = type;
  1101.         return a;
  1102.     }
  1103.     return makeexpr_un(EK_CAST, type, a);
  1104. }
  1105. Expr *gentle_cast(a, type)
  1106. Expr *a;
  1107. Type *type;
  1108. {
  1109.     Expr *ex;
  1110.     Type *btype;
  1111.     long smin, smax;
  1112.     if (debug>2) { fprintf(outf,"gentle_cast("); dumpexpr(a); fprintf(outf,", "); dumptypename(type, 1); fprintf(outf,")n"); }
  1113.     if (!type) {
  1114. intwarning("gentle_cast", "type == NULL");
  1115. return a;
  1116.     }
  1117.     if (a->val.type->kind == TK_POINTER && type->kind == TK_POINTER) {
  1118.         if (voidstar && (type == tp_anyptr || a->val.type == tp_anyptr)) {
  1119.             if (type == tp_anyptr && a->kind == EK_CAST &&
  1120.                 a->args[0]->val.type->kind == TK_POINTER)
  1121.                 return a->args[0];    /* remove explicit cast since casting implicitly */
  1122.             return a;                 /* casting to/from "void *" */
  1123.         }
  1124.         return makeexpr_cast(a, type);
  1125.     }
  1126.     if (type->kind == TK_STRING)
  1127.         return makeexpr_stringify(a);
  1128.     if (type->kind == TK_ARRAY && a->val.type->kind == TK_STRING &&
  1129.         a->kind == EK_CONST && ord_range(type->indextype, &smin, &smax)) {
  1130.         smax = smax - smin + 1;
  1131.         if (a->val.i > smax) {
  1132.             warning("Too many characters for packed array of char [162]");
  1133.         } else if (a->val.i < smax) {
  1134.             ex = makeexpr_lstring(a->val.s, smax);
  1135.             while (smax > a->val.i)
  1136.                 ex->val.s[--smax] = ' ';
  1137.             freeexpr(a);
  1138.             return ex;
  1139.         }
  1140.     }
  1141.     btype = (type->kind == TK_SUBR) ? type->basetype : type;
  1142.     if ((a->kind == EK_CAST || a->kind == EK_ACTCAST) && 
  1143.         btype->kind == TK_INTEGER &&
  1144.         ord_type(a->val.type)->kind == TK_INTEGER)
  1145.         return makeexpr_longcast(a, long_type(type));
  1146.     if (a->val.type == btype)
  1147.         return a;
  1148.     ex = docast(a, btype);
  1149.     if (ex)
  1150.         return ex;
  1151.     if (btype->kind == TK_CHAR && a->val.type->kind == TK_STRING)
  1152.         return makeexpr_hat(a, 0);
  1153.     return a;
  1154. }
  1155. Expr *makeexpr_charcast(ex)
  1156. Expr *ex;
  1157. {
  1158.     Meaning *mp;
  1159.     if (ex->kind == EK_CONST && ex->val.type->kind == TK_STRING &&
  1160.         ex->val.i == 1) {
  1161.         ex->val.type = tp_char;
  1162.         ex->val.i = ex->val.s[0] & 0xff;
  1163.         ex->val.s = NULL;
  1164.     }
  1165.     if (ex->kind == EK_VAR &&
  1166. (mp = (Meaning *)ex->val.i)->kind == MK_CONST &&
  1167. mp->val.type->kind == TK_STRING &&
  1168. mp->val.i == 1) {
  1169.       ex->kind = EK_CONST;
  1170.       ex->val.type = tp_char;
  1171.       ex->val.i = mp->val.s[0] & 0xff;
  1172.       ex->val.s = NULL;
  1173.     }
  1174.     return ex;
  1175. }
  1176. Expr *makeexpr_stringcast(ex)
  1177. Expr *ex;
  1178. {
  1179.     char ch;
  1180.     if (ex->kind == EK_CONST && ord_type(ex->val.type)->kind == TK_CHAR) {
  1181.         ch = ex->val.i;
  1182.         freeexpr(ex);
  1183.         ex = makeexpr_lstring(&ch, 1);
  1184.     }
  1185.     return ex;
  1186. }
  1187. /* 0/1 = force to int/long, 2/3 = check if int/long */
  1188. Static Expr *dolongcast(a, tolong)
  1189. Expr *a;
  1190. int tolong;
  1191. {
  1192.     Meaning *mp;
  1193.     Expr *ex;
  1194.     Type *type;
  1195.     int i;
  1196.     switch (a->kind) {
  1197.         case EK_DOT:
  1198.             if (!a->val.i) {
  1199.                 if (long_type(a->val.type) == (tolong&1))
  1200.                     return a;
  1201.                 break;
  1202.             }
  1203.         /* fall through */
  1204.         case EK_VAR:
  1205.             mp = (Meaning *)a->val.i;
  1206.             if (mp->kind == MK_FIELD && mp->val.i) {
  1207.                 if (mp->val.i <= ((sizeof_int > 0) ? sizeof_int : 16) &&
  1208.                     !(tolong&1))
  1209.                     return a;
  1210.             } else if (mp->kind == MK_VAR ||
  1211.                        mp->kind == MK_VARREF ||
  1212.                        mp->kind == MK_PARAM ||
  1213.                        mp->kind == MK_VARPARAM ||
  1214.                        mp->kind == MK_FIELD) {
  1215.                 if (long_type(mp->type) == (tolong&1))
  1216.                     return a;
  1217.             }
  1218.             break;
  1219.         case EK_FUNCTION:
  1220.             mp = (Meaning *)a->val.i;
  1221.             if (long_type(mp->type->basetype) == (tolong&1))
  1222.                 return a;
  1223.             break;
  1224.         case EK_BICALL:
  1225.             if (!strcmp(a->val.s, signextname) && *signextname) {
  1226.                 i = 0;
  1227.                 goto unary;
  1228.             }
  1229.     if (!strcmp(a->val.s, "strlen"))
  1230. goto size_t_case;
  1231.             /* fall through */
  1232.         case EK_HAT:      /* get true type from a->val.type */
  1233.         case EK_INDEX:
  1234.         case EK_SPCALL:
  1235.         case EK_NAME:
  1236.             if (long_type(a->val.type) == (tolong&1))
  1237.                 return a;
  1238.             break;
  1239.         case EK_ASSIGN:   /* destination determines type, */
  1240.         case EK_POSTINC:  /*  but must not be changed */
  1241.         case EK_POSTDEC:
  1242.             return dolongcast(a->args[0], tolong|2);
  1243.         case EK_CAST:
  1244.             if (ord_type(a->val.type)->kind == TK_INTEGER &&
  1245.                  long_type(a->val.type) == (tolong&1))
  1246.                 return a;
  1247.             if (tolong == 0) {
  1248.                 a->val.type = tp_int;
  1249.                 return a;
  1250.             } else if (tolong == 1) {
  1251.                 a->val.type = tp_integer;
  1252.                 return a;
  1253.             }
  1254.             break;
  1255.         case EK_ACTCAST:
  1256.             if (ord_type(a->val.type)->kind == TK_INTEGER &&
  1257.                  long_type(a->val.type) == (tolong&1))
  1258.                 return a;
  1259.             break;
  1260.         case EK_CONST:
  1261.             type = ord_type(a->val.type);
  1262.             if (type->kind == TK_INTEGER || type->kind == TK_SMALLSET) {
  1263.                 if (tolong == 1)
  1264.                     a->kind = EK_LONGCONST;
  1265.                 if (tolong != 3)
  1266.                     return a;
  1267.             }
  1268.             break;
  1269.         case EK_LONGCONST:
  1270.             if (tolong == 0) {
  1271.                 if (a->val.i >= -32767 && a->val.i <= 32767)
  1272.                     a->kind = EK_CONST;
  1273.                 else
  1274.                     return NULL;
  1275.             }
  1276.             if (tolong != 2)
  1277.                 return a;
  1278.             break;
  1279.         case EK_SIZEOF:
  1280. size_t_case:
  1281.             if (size_t_long > 0 && tolong&1)
  1282.                 return a;
  1283.             if (size_t_long == 0 && !(tolong&1))
  1284.                 return a;
  1285.             break;
  1286.         case EK_PLUS:     /* usual arithmetic conversions apply */
  1287.         case EK_TIMES:
  1288.         case EK_DIV:
  1289.         case EK_MOD:
  1290.         case EK_BAND:
  1291.         case EK_BOR:
  1292.         case EK_BXOR:
  1293.         case EK_COND:
  1294.             i = (a->kind == EK_COND) ? 1 : 0;
  1295.             if (tolong&1) {
  1296.                 for (; i < a->nargs; i++) {
  1297.                     ex = dolongcast(a->args[i], tolong);
  1298.                     if (ex) {
  1299.                         a->args[i] = ex;
  1300.                         return a;
  1301.                     }
  1302.                 }
  1303.             } else {
  1304.                 for (; i < a->nargs; i++) {
  1305.                     if (!dolongcast(a->args[i], tolong))
  1306.                         return NULL;
  1307.                 }
  1308.                 return a;
  1309.             }
  1310.             break;
  1311.         case EK_BNOT:     /* single argument defines result type */
  1312.         case EK_NEG:
  1313.         case EK_LSH:
  1314.         case EK_RSH:
  1315.         case EK_COMMA:
  1316.             i = (a->kind == EK_COMMA) ? a->nargs-1 : 0;
  1317. unary:
  1318.             if (tolong&1) {
  1319.                 ex = dolongcast(a->args[i], tolong);
  1320.                 if (ex) {
  1321.                     a->args[i] = ex;
  1322.                     return a;
  1323.                 }
  1324.             } else {
  1325.                 if (dolongcast(a->args[i], tolong))
  1326.                     return a;
  1327.             }
  1328.             break;
  1329.         case EK_AND:  /* operators which always return int */
  1330.         case EK_OR:
  1331.         case EK_EQ:
  1332.         case EK_NE:
  1333.         case EK_LT:
  1334.         case EK_GT:
  1335.         case EK_LE:
  1336.         case EK_GE:
  1337.             if (tolong&1)
  1338.                 break;
  1339.             return a;
  1340. default:
  1341.     break;
  1342.     }
  1343.     return NULL;
  1344. }
  1345. /* Return -1 if short int or plain int, 1 if long, 0 if can't tell */
  1346. int exprlongness(ex)
  1347. Expr *ex;
  1348. {
  1349.     if (sizeof_int >= 32)
  1350.         return -1;
  1351.     return (dolongcast(ex, 3) != NULL) -
  1352.            (dolongcast(ex, 2) != NULL);
  1353. }
  1354. Expr *makeexpr_longcast(a, tolong)
  1355. Expr *a;
  1356. int tolong;
  1357. {
  1358.     Expr *ex;
  1359.     Type *type;
  1360.     if (sizeof_int >= 32)
  1361.         return a;
  1362.     type = ord_type(a->val.type);
  1363.     if (type->kind != TK_INTEGER && type->kind != TK_SMALLSET)
  1364.         return a;
  1365.     a = makeexpr_unlongcast(a);
  1366.     if (tolong) {
  1367.         ex = dolongcast(a, 1);
  1368.     } else {
  1369.         ex = dolongcast(copyexpr(a), 0);
  1370.         if (ex) {
  1371.             if (!dolongcast(ex, 2)) {
  1372.                 freeexpr(ex);
  1373.                 ex = NULL;
  1374.             }
  1375.         }
  1376.     }
  1377.     if (ex)
  1378.         return ex;
  1379.     return makeexpr_un(EK_CAST, (tolong) ? tp_integer : tp_int, a);
  1380. }
  1381. Expr *makeexpr_arglong(a, tolong)
  1382. Expr *a;
  1383. int tolong;
  1384. {
  1385.     int cast = castlongargs;
  1386.     if (cast < 0)
  1387. cast = castargs;
  1388.     if (cast > 0 || (cast < 0 && prototypes == 0)) {
  1389. return makeexpr_longcast(a, tolong);
  1390.     }
  1391.     return a;
  1392. }
  1393. Expr *makeexpr_unlongcast(a)
  1394. Expr *a;
  1395. {
  1396.     switch (a->kind) {
  1397.         case EK_LONGCONST:
  1398.             if (a->val.i >= -32767 && a->val.i <= 32767)
  1399.                 a->kind = EK_CONST;
  1400.             break;
  1401.         case EK_CAST:
  1402.             if ((a->val.type == tp_integer ||
  1403.                  a->val.type == tp_int) &&
  1404.                 ord_type(a->args[0]->val.type)->kind == TK_INTEGER) {
  1405.                 a = grabarg(a, 0);
  1406.             }
  1407.             break;
  1408.         default:
  1409.     break;
  1410.     }
  1411.     return a;
  1412. }
  1413. Expr *makeexpr_forcelongness(a)    /* force a to have a definite longness */
  1414. Expr *a;
  1415. {
  1416.     Expr *ex;
  1417.     ex = makeexpr_unlongcast(copyexpr(a));
  1418.     if (exprlongness(ex)) {
  1419.         freeexpr(a);
  1420.         return ex;
  1421.     }
  1422.     freeexpr(ex);
  1423.     if (exprlongness(a) == 0)
  1424.         return makeexpr_longcast(a, 1);
  1425.     else
  1426.         return a;
  1427. }
  1428. Expr *makeexpr_ord(ex)
  1429. Expr *ex;
  1430. {
  1431.     ex = makeexpr_charcast(ex);
  1432.     switch (ord_type(ex->val.type)->kind) {
  1433.         case TK_ENUM:
  1434.             return makeexpr_cast(ex, tp_int);
  1435.         case TK_CHAR:
  1436.             if (ex->kind == EK_CONST &&
  1437.                 (ex->val.i >= 32 && ex->val.i < 127)) {
  1438.                 insertarg(&ex, 0, makeexpr_name("'%lc'", tp_integer));
  1439.             }
  1440.             ex->val.type = tp_int;
  1441.             return ex;
  1442.         case TK_BOOLEAN:
  1443.             ex->val.type = tp_int;
  1444.             return ex;
  1445.         case TK_POINTER:
  1446.             return makeexpr_cast(ex, tp_integer);
  1447.         default:
  1448.             return ex;
  1449.     }
  1450. }
  1451. /* Tell whether an expression "looks" negative */
  1452. int expr_looks_neg(ex)
  1453. Expr *ex;
  1454. {
  1455.     int i;
  1456.     switch (ex->kind) {
  1457.         case EK_NEG:
  1458.             return 1;
  1459.         case EK_CONST:
  1460.         case EK_LONGCONST:
  1461.             switch (ord_type(ex->val.type)->kind) {
  1462.                 case TK_INTEGER:
  1463.                 case TK_CHAR:
  1464.                     return (ex->val.i < 0);
  1465.                 case TK_REAL:
  1466.                     return (ex->val.s && ex->val.s[0] == '-');
  1467.                 default:
  1468.                     return 0;
  1469.             }
  1470.         case EK_TIMES:
  1471.         case EK_DIVIDE:
  1472.             for (i = 0; i < ex->nargs; i++) {
  1473.                 if (expr_looks_neg(ex->args[i]))
  1474.                     return 1;
  1475.             }
  1476.             return 0;
  1477.         case EK_CAST:
  1478.             return expr_looks_neg(ex->args[0]);
  1479.         default:
  1480.             return 0;
  1481.     }
  1482. }
  1483. /* Tell whether an expression is probably negative */
  1484. int expr_is_neg(ex)
  1485. Expr *ex;
  1486. {
  1487.     int i;
  1488.     i = possiblesigns(ex) & (1|4);
  1489.     if (i == 1)
  1490. return 1;    /* if expression really is negative! */
  1491.     if (i == 4)
  1492. return 0;    /* if expression is definitely positive. */
  1493.     return expr_looks_neg(ex);
  1494. }
  1495. int expr_neg_cost(a)
  1496. Expr *a;
  1497. {
  1498.     int i, c;
  1499.     switch (a->kind) {
  1500.         case EK_CONST:
  1501.         case EK_LONGCONST:
  1502.             switch (ord_type(a->val.type)->kind) {
  1503.                 case TK_INTEGER:
  1504.                 case TK_CHAR:
  1505.                 case TK_REAL:
  1506.                     return 0;
  1507. default:
  1508.     return 1;
  1509.             }
  1510.         case EK_NEG:
  1511.             return -1;
  1512.         case EK_TIMES:
  1513.         case EK_DIVIDE:
  1514.             for (i = 0; i < a->nargs; i++) {
  1515.                 c = expr_neg_cost(a->args[i]);
  1516.                 if (c <= 0)
  1517.                     return c;
  1518.             }
  1519.             return 1;
  1520.         case EK_PLUS:
  1521.             for (i = 0; i < a->nargs; i++) {
  1522.                 if (expr_looks_neg(a->args[i]))
  1523.                     return 0;
  1524.             }
  1525.             return 1;
  1526.         default:
  1527.             return 1;
  1528.     }
  1529. }
  1530. Expr *enum_to_int(a)
  1531. Expr *a;
  1532. {
  1533.     if (ord_type(a->val.type)->kind == TK_ENUM) {
  1534.         if (a->kind == EK_CAST &&
  1535.              ord_type(a->args[0]->val.type)->kind == TK_INTEGER)
  1536.             return grabarg(a, 0);
  1537.         else
  1538.             return makeexpr_cast(a, tp_integer);
  1539.     } else
  1540.         return a;
  1541. }
  1542. Expr *neg_inside_sum(a)
  1543. Expr *a;
  1544. {
  1545.     int i;
  1546.     for (i = 0; i < a->nargs; i++)
  1547.         a->args[i] = makeexpr_neg(a->args[i]);
  1548.     return a;
  1549. }
  1550. Expr *makeexpr_neg(a)
  1551. Expr *a;
  1552. {
  1553.     int i;
  1554.     if (debug>2) { fprintf(outf,"makeexpr_neg("); dumpexpr(a); fprintf(outf,")n"); }
  1555.     a = enum_to_int(a);
  1556.     switch (a->kind) {
  1557.         case EK_CONST:
  1558.         case EK_LONGCONST:
  1559.             switch (ord_type(a->val.type)->kind) {
  1560.                 case TK_INTEGER:
  1561.                 case TK_CHAR:
  1562.                     if (a->val.i == MININT)
  1563.                         valrange();
  1564.                     else
  1565.                         a->val.i = - a->val.i;
  1566.                     return a;
  1567.                 case TK_REAL:
  1568.                     if (!realzero(a->val.s)) {
  1569.                         if (a->val.s[0] == '-')
  1570.                             strchange(&a->val.s, a->val.s+1);
  1571.                         else
  1572.                             strchange(&a->val.s, format_s("-%s", a->val.s));
  1573.                     }
  1574.                     return a;
  1575. default:
  1576.     break;
  1577.             }
  1578.             break;
  1579.         case EK_PLUS:
  1580.             if (expr_neg_cost(a) <= 0)
  1581.                 return neg_inside_sum(a);
  1582.             break;
  1583.         case EK_TIMES:
  1584.         case EK_DIVIDE:
  1585.             for (i = 0; i < a->nargs; i++) {
  1586.                 if (expr_neg_cost(a->args[i]) <= 0) {
  1587.                     a->args[i] = makeexpr_neg(a->args[i]);
  1588.                     return a;
  1589.                 }
  1590.             }
  1591.             break;
  1592.         case EK_CAST:
  1593.             if (a->val.type != tp_unsigned && 
  1594.                  a->val.type != tp_uint &&
  1595.                  a->val.type != tp_ushort &&
  1596.                  a->val.type != tp_ubyte &&
  1597.                  a->args[0]->val.type != tp_unsigned && 
  1598.                  a->args[0]->val.type != tp_uint &&
  1599.                  a->args[0]->val.type != tp_ushort &&
  1600.                  a->args[0]->val.type != tp_ubyte &&
  1601.                  expr_looks_neg(a->args[0])) {
  1602.                 a->args[0] = makeexpr_neg(a->args[0]);
  1603.                 return a;
  1604.             }
  1605.             break;
  1606.         case EK_NEG:
  1607.             return grabarg(a, 0);
  1608. default:
  1609.     break;
  1610.     }
  1611.     return makeexpr_un(EK_NEG, promote_type(a->val.type), a);
  1612. }
  1613. #define ISCONST(kind) ((kind)==EK_CONST || (kind)==EK_LONGCONST)
  1614. #define MOVCONST(ex) (ISCONST((ex)->kind) && (ex)->val.type->kind != TK_STRING)
  1615. #define COMMUTATIVE (kind != EK_COMMA && type->kind != TK_REAL)
  1616. Type *true_type(ex)
  1617. Expr *ex;
  1618. {
  1619.     Meaning *mp;
  1620.     Type *type, *tp;
  1621.     while (ex->kind == EK_CAST)
  1622. ex = ex->args[0];
  1623.     type = ex->val.type;
  1624.     if (ex->kind == EK_VAR || ex->kind == EK_FUNCTION || ex->kind == EK_DOT) {
  1625. mp = (Meaning *)ex->val.i;
  1626. if (mp && mp->type && mp->type->kind != TK_VOID)
  1627.     type = mp->type;
  1628.     }
  1629.     if (ex->kind == EK_INDEX) {
  1630. tp = true_type(ex->args[0]);
  1631. if ((tp->kind == TK_ARRAY || tp->kind == TK_SMALLARRAY ||
  1632.      tp->kind == TK_STRING) &&
  1633.     tp->basetype && tp->basetype->kind != TK_VOID)
  1634.     type = tp->basetype;
  1635.     }
  1636.     if (type->kind == TK_SUBR)
  1637. type = findbasetype(type, 0);
  1638.     return type;
  1639. }
  1640. int ischartype(ex)
  1641. Expr *ex;
  1642. {
  1643.     if (ord_type(ex->val.type)->kind == TK_CHAR)
  1644. return 1;
  1645.     if (true_type(ex)->kind == TK_CHAR)
  1646. return 1;
  1647.     if (ISCONST(ex->kind) && ex->nargs > 0 &&
  1648. ex->args[0]->kind == EK_NAME &&
  1649. ex->args[0]->val.s[0] == ''')
  1650. return 1;
  1651.     return 0;
  1652. }
  1653. Static Expr *commute(a, b, kind)
  1654. Expr *a, *b;
  1655. enum exprkind kind;
  1656. {
  1657.     int i, di;
  1658.     Type *type;
  1659.     if (debug>2) { fprintf(outf,"commute("); dumpexpr(a); fprintf(outf,", "); dumpexpr(b); fprintf(outf,")n"); }
  1660. #if 1
  1661.     type = promote_type_bin(a->val.type, b->val.type);
  1662. #else
  1663.     type = a->val.type;
  1664.     if (b->val.type->kind == TK_REAL)
  1665.         type = b->val.type;
  1666. #endif
  1667.     if (MOVCONST(a) && !MOVCONST(b) && COMMUTATIVE)
  1668.         swapexprs(a, b);                /* put constant last */
  1669.     if (a->kind == kind) {
  1670.         di = (MOVCONST(a->args[a->nargs-1]) && COMMUTATIVE) ? -1 : 0;
  1671.         if (b->kind == kind) {
  1672.             for (i = 0; i < b->nargs; i++)
  1673.                 insertarg(&a, a->nargs + di, b->args[i]);
  1674.             FREE(b);
  1675.         } else
  1676.             insertarg(&a, a->nargs + di, b);
  1677.         a->val.type = type;
  1678.     } else if (b->kind == kind) {
  1679.         if (MOVCONST(a) && COMMUTATIVE)
  1680.             insertarg(&b, b->nargs, a);
  1681.         else
  1682.             insertarg(&b, 0, a);
  1683.         a = b;
  1684.         a->val.type = type;
  1685.     } else {
  1686.         a = makeexpr_bin(kind, type, a, b);
  1687.     }
  1688.     if (debug>2) { fprintf(outf,"commute returns "); dumpexpr(a); fprintf(outf,"n"); }
  1689.     return a;
  1690. }
  1691. Expr *makeexpr_plus(a, b)
  1692. Expr *a, *b;
  1693. {
  1694.     int i, j, k;
  1695.     Type *type;
  1696.     if (debug>2) { fprintf(outf,"makeexpr_plus("); dumpexpr(a); fprintf(outf,", "); dumpexpr(b); fprintf(outf,")n"); }
  1697.     if (!a)
  1698.         return b;
  1699.     if (!b)
  1700.         return a;
  1701.     if (a->kind == EK_NEG && a->args[0]->kind == EK_PLUS)
  1702.         a = neg_inside_sum(grabarg(a, 0));
  1703.     if (b->kind == EK_NEG && b->args[0]->kind == EK_PLUS)
  1704.         b = neg_inside_sum(grabarg(b, 0));
  1705.     a = commute(enum_to_int(a), enum_to_int(b), EK_PLUS);
  1706.     type = NULL;
  1707.     for (i = 0; i < a->nargs; i++) {
  1708.         if (ord_type(a->args[i]->val.type)->kind == TK_CHAR ||
  1709.             a->args[i]->val.type->kind == TK_POINTER ||
  1710.             a->args[i]->val.type->kind == TK_STRING) {   /* for string literals */
  1711.             if (type == ord_type(a->args[i]->val.type))
  1712.                 type = tp_integer;   /* 'z'-'a' and p1-p2 are integers */
  1713.             else
  1714.                 type = ord_type(a->args[i]->val.type);
  1715.         }
  1716.     }
  1717.     if (type)
  1718.         a->val.type = type;
  1719.     for (i = 0; i < a->nargs && !ISCONST(a->args[i]->kind); i++) ;
  1720.     if (i < a->nargs-1) {
  1721.         for (j = i+1; j < a->nargs; j++) {
  1722.             if (ISCONST(a->args[j]->kind)) {
  1723.                 if ((ord_type(a->args[i]->val.type) == ord_type(a->args[j]->val.type) ||
  1724.      ord_type(a->args[i]->val.type)->kind == TK_INTEGER ||
  1725.      ord_type(a->args[j]->val.type)->kind == TK_INTEGER) &&
  1726.     (!ischartype(a->args[i]) || !ischartype(a->args[j])) &&
  1727.                     (a->args[i]->val.type->kind != TK_REAL &&
  1728.                      a->args[i]->val.type->kind != TK_STRING &&
  1729.                      a->args[j]->val.type->kind != TK_REAL &&
  1730.                      a->args[j]->val.type->kind != TK_STRING)) {
  1731.                     a->args[i]->val.i += a->args[j]->val.i;
  1732.                     delfreearg(&a, j);
  1733.                     j--;
  1734.                 } else if (a->args[i]->val.type->kind == TK_STRING &&
  1735.                            ord_type(a->args[j]->val.type)->kind == TK_INTEGER &&
  1736.                            a->args[j]->val.i < 0 &&
  1737.                            a->args[j]->val.i >= -stringleaders) {
  1738.                     /* strictly speaking, the following is illegal pointer arithmetic */
  1739.                     a->args[i] = makeexpr_lstring(a->args[i]->val.s + a->args[j]->val.i,