home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume21 / p2c / part26 < prev    next >
Text File  |  1990-04-05  |  53KB  |  2,163 lines

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