|
|
1.1 ! root 1: #include "defs.h" ! 2: #include "data.h" ! 3: ! 4: ! 5: ! 6: /* global variables */ ! 7: ! 8: flag overlapflag; ! 9: ! 10: ! 11: ! 12: /* local variables */ ! 13: ! 14: LOCAL char rstatus; ! 15: LOCAL ftnint rvalue; ! 16: LOCAL dovars *dvlist; ! 17: LOCAL int dataerror; ! 18: LOCAL vallist *grvals; ! 19: LOCAL int datafile; ! 20: LOCAL int chkfile; ! 21: LOCAL long base; ! 22: ! 23: ! 24: ! 25: /* Copied from expr.c */ ! 26: ! 27: LOCAL letter(c) ! 28: register int c; ! 29: { ! 30: if( isupper(c) ) ! 31: c = tolower(c); ! 32: return(c - 'a'); ! 33: } ! 34: ! 35: ! 36: ! 37: vexpr * ! 38: cpdvalue(dp) ! 39: vexpr *dp; ! 40: { ! 41: register dvalue *p; ! 42: ! 43: if (dp->tag != DVALUE) ! 44: badtag("cpdvalue", dp->tag); ! 45: ! 46: p = ALLOC(Dvalue); ! 47: p->tag = DVALUE; ! 48: p->status = dp->dvalue.status; ! 49: p->value = dp->dvalue.value; ! 50: ! 51: return ((vexpr *) p); ! 52: } ! 53: ! 54: ! 55: ! 56: frvexpr(vp) ! 57: register vexpr *vp; ! 58: { ! 59: if (vp != NULL) ! 60: { ! 61: if (vp->tag == DNAME) ! 62: free(vp->dname.repr); ! 63: else if (vp->tag == DEXPR) ! 64: { ! 65: frvexpr(vp->dexpr.left); ! 66: frvexpr(vp->dexpr.right); ! 67: } ! 68: ! 69: free((char *) vp); ! 70: } ! 71: ! 72: return; ! 73: } ! 74: ! 75: ! 76: ! 77: frvlist(vp) ! 78: register vlist *vp; ! 79: { ! 80: register vlist *t; ! 81: ! 82: while (vp) ! 83: { ! 84: t = vp->next; ! 85: frvexpr(vp->val); ! 86: free((char *) vp); ! 87: vp = t; ! 88: } ! 89: ! 90: return; ! 91: } ! 92: ! 93: ! 94: ! 95: frelist(ep) ! 96: elist *ep; ! 97: { ! 98: register elist *p; ! 99: register elist *t; ! 100: register aelt *ap; ! 101: register dolist *dp; ! 102: ! 103: p = ep; ! 104: ! 105: while (p != NULL) ! 106: { ! 107: if (p->elt->tag == SIMPLE) ! 108: { ! 109: ap = (aelt *) p->elt; ! 110: frvlist(ap->subs); ! 111: if (ap->range != NULL) ! 112: { ! 113: frvexpr(ap->range->low); ! 114: frvexpr(ap->range->high); ! 115: free((char *) ap->range); ! 116: } ! 117: free((char *) ap); ! 118: } ! 119: else ! 120: { ! 121: dp = (dolist *) p->elt; ! 122: frvexpr(dp->dovar); ! 123: frvexpr(dp->init); ! 124: frvexpr(dp->limit); ! 125: frvexpr(dp->step); ! 126: frelist(dp->elts); ! 127: free((char *) dp); ! 128: } ! 129: ! 130: t = p; ! 131: p = p->next; ! 132: free((char *) t); ! 133: } ! 134: ! 135: return; ! 136: } ! 137: ! 138: ! 139: ! 140: frvallist(vp) ! 141: vallist *vp; ! 142: { ! 143: register vallist *p; ! 144: register vallist *t; ! 145: ! 146: p = vp; ! 147: while (p != NULL) ! 148: { ! 149: frexpr((tagptr) p->value); ! 150: t = p; ! 151: p = p->next; ! 152: free((char *) t); ! 153: } ! 154: ! 155: return; ! 156: } ! 157: ! 158: ! 159: ! 160: elist *revelist(ep) ! 161: register elist *ep; ! 162: { ! 163: register elist *next; ! 164: register elist *t; ! 165: ! 166: if (ep != NULL) ! 167: { ! 168: next = ep->next; ! 169: ep->next = NULL; ! 170: ! 171: while (next) ! 172: { ! 173: t = next->next; ! 174: next->next = ep; ! 175: ep = next; ! 176: next = t; ! 177: } ! 178: } ! 179: ! 180: return (ep); ! 181: } ! 182: ! 183: ! 184: ! 185: vlist *revvlist(vp) ! 186: vlist *vp; ! 187: { ! 188: register vlist *p; ! 189: register vlist *next; ! 190: register vlist *t; ! 191: ! 192: if (vp == NULL) ! 193: p = NULL; ! 194: else ! 195: { ! 196: p = vp; ! 197: next = p->next; ! 198: p->next = NULL; ! 199: ! 200: while (next) ! 201: { ! 202: t = next->next; ! 203: next->next = p; ! 204: p = next; ! 205: next = t; ! 206: } ! 207: } ! 208: ! 209: return (p); ! 210: } ! 211: ! 212: ! 213: ! 214: vallist * ! 215: revrvals(vp) ! 216: vallist *vp; ! 217: { ! 218: register vallist *p; ! 219: register vallist *next; ! 220: register vallist *t; ! 221: ! 222: if (vp == NULL) ! 223: p = NULL; ! 224: else ! 225: { ! 226: p = vp; ! 227: next = p->next; ! 228: p->next = NULL; ! 229: while (next) ! 230: { ! 231: t = next->next; ! 232: next->next = p; ! 233: p = next; ! 234: next = t; ! 235: } ! 236: } ! 237: ! 238: return (p); ! 239: } ! 240: ! 241: ! 242: ! 243: vlist *prepvexpr(tail, head) ! 244: vlist *tail; ! 245: vexpr *head; ! 246: { ! 247: register vlist *p; ! 248: ! 249: p = ALLOC(Vlist); ! 250: p->next = tail; ! 251: p->val = head; ! 252: ! 253: return (p); ! 254: } ! 255: ! 256: ! 257: ! 258: elist *preplval(tail, head) ! 259: elist *tail; ! 260: delt* head; ! 261: { ! 262: register elist *p; ! 263: p = ALLOC(Elist); ! 264: p->next = tail; ! 265: p->elt = head; ! 266: ! 267: return (p); ! 268: } ! 269: ! 270: ! 271: ! 272: delt *mkdlval(name, subs, range) ! 273: vexpr *name; ! 274: vlist *subs; ! 275: rpair *range; ! 276: { ! 277: register aelt *p; ! 278: ! 279: p = ALLOC(Aelt); ! 280: p->tag = SIMPLE; ! 281: p->var = mkname(name->dname.len, name->dname.repr); ! 282: p->subs = subs; ! 283: p->range = range; ! 284: ! 285: return ((delt *) p); ! 286: } ! 287: ! 288: ! 289: ! 290: delt *mkdatado(lvals, dovar, params) ! 291: elist *lvals; ! 292: vexpr *dovar; ! 293: vlist *params; ! 294: { ! 295: static char *toofew = "missing loop parameters"; ! 296: static char *toomany = "too many loop parameters"; ! 297: ! 298: register dolist *p; ! 299: register vlist *vp; ! 300: register int pcnt; ! 301: register dvalue *one; ! 302: ! 303: p = ALLOC(DoList); ! 304: p->tag = NESTED; ! 305: p->elts = revelist(lvals); ! 306: p->dovar = dovar; ! 307: ! 308: vp = params; ! 309: pcnt = 0; ! 310: while (vp) ! 311: { ! 312: pcnt++; ! 313: vp = vp->next; ! 314: } ! 315: ! 316: if (pcnt != 2 && pcnt != 3) ! 317: { ! 318: if (pcnt < 2) ! 319: err(toofew); ! 320: else ! 321: err(toomany); ! 322: ! 323: p->init = (vexpr *) ALLOC(Derror); ! 324: p->init->tag = DERROR; ! 325: ! 326: p->limit = (vexpr *) ALLOC(Derror); ! 327: p->limit->tag = DERROR; ! 328: ! 329: p->step = (vexpr *) ALLOC(Derror); ! 330: p->step->tag = DERROR; ! 331: } ! 332: else ! 333: { ! 334: vp = params; ! 335: ! 336: if (pcnt == 2) ! 337: { ! 338: one = ALLOC(Dvalue); ! 339: one->tag = DVALUE; ! 340: one->status = NORMAL; ! 341: one->value = 1; ! 342: p->step = (vexpr *) one; ! 343: } ! 344: else ! 345: { ! 346: p->step = vp->val; ! 347: vp->val = NULL; ! 348: vp = vp->next; ! 349: } ! 350: ! 351: p->limit = vp->val; ! 352: vp->val = NULL; ! 353: vp = vp->next; ! 354: ! 355: p->init = vp->val; ! 356: vp->val = NULL; ! 357: } ! 358: ! 359: frvlist(params); ! 360: return ((delt *) p); ! 361: } ! 362: ! 363: ! 364: ! 365: rpair *mkdrange(lb, ub) ! 366: vexpr *lb, *ub; ! 367: { ! 368: register rpair *p; ! 369: ! 370: p = ALLOC(Rpair); ! 371: p->low = lb; ! 372: p->high = ub; ! 373: ! 374: return (p); ! 375: } ! 376: ! 377: ! 378: ! 379: vallist *mkdrval(repl, val) ! 380: vexpr *repl; ! 381: expptr val; ! 382: { ! 383: static char *badtag = "bad tag in mkdrval"; ! 384: static char *negrepl = "negative replicator"; ! 385: static char *zerorepl = "zero replicator"; ! 386: static char *toobig = "replicator too large"; ! 387: static char *nonconst = "%s is not a constant"; ! 388: ! 389: register vexpr *vp; ! 390: register vallist *p; ! 391: register int status; ! 392: register ftnint value; ! 393: register int copied; ! 394: ! 395: copied = 0; ! 396: ! 397: if (repl->tag == DNAME) ! 398: { ! 399: vp = evaldname(repl); ! 400: copied = 1; ! 401: } ! 402: else ! 403: vp = repl; ! 404: ! 405: p = ALLOC(ValList); ! 406: p->next = NULL; ! 407: p->value = (Constp) val; ! 408: ! 409: if (vp->tag == DVALUE) ! 410: { ! 411: status = vp->dvalue.status; ! 412: value = vp->dvalue.value; ! 413: ! 414: if ((status == NORMAL && value < 0) || status == MINLESS1) ! 415: { ! 416: err(negrepl); ! 417: p->status = ERRVAL; ! 418: } ! 419: else if (status == NORMAL) ! 420: { ! 421: if (value == 0) ! 422: warn(zerorepl); ! 423: p->status = NORMAL; ! 424: p->repl = value; ! 425: } ! 426: else if (status == MAXPLUS1) ! 427: { ! 428: err(toobig); ! 429: p->status = ERRVAL; ! 430: } ! 431: else ! 432: p->status = ERRVAL; ! 433: } ! 434: else if (vp->tag == DNAME) ! 435: { ! 436: errnm(nonconst, vp->dname.len, vp->dname.repr); ! 437: p->status = ERRVAL; ! 438: } ! 439: else if (vp->tag == DERROR) ! 440: p->status = ERRVAL; ! 441: else ! 442: fatal(badtag); ! 443: ! 444: if (copied) frvexpr(vp); ! 445: return (p); ! 446: } ! 447: ! 448: ! 449: ! 450: /* Evicon returns the value of the integer constant */ ! 451: /* pointed to by token. */ ! 452: ! 453: vexpr *evicon(len, token) ! 454: register int len; ! 455: register char *token; ! 456: { ! 457: static char *badconst = "bad integer constant"; ! 458: static char *overflow = "integer constant too large"; ! 459: ! 460: register int i; ! 461: register ftnint val; ! 462: register int digit; ! 463: register dvalue *p; ! 464: ! 465: if (len <= 0) ! 466: fatal(badconst); ! 467: ! 468: p = ALLOC(Dvalue); ! 469: p->tag = DVALUE; ! 470: ! 471: i = 0; ! 472: val = 0; ! 473: while (i < len) ! 474: { ! 475: if (val > MAXINT/10) ! 476: { ! 477: err(overflow); ! 478: p->status = ERRVAL; ! 479: goto ret; ! 480: } ! 481: val = 10*val; ! 482: digit = token[i++]; ! 483: if (!isdigit(digit)) ! 484: fatal(badconst); ! 485: digit = digit - '0'; ! 486: if (MAXINT - val >= digit) ! 487: val = val + digit; ! 488: else ! 489: if (i == len && MAXINT - val + 1 == digit) ! 490: { ! 491: p->status = MAXPLUS1; ! 492: goto ret; ! 493: } ! 494: else ! 495: { ! 496: err(overflow); ! 497: p->status = ERRVAL; ! 498: goto ret; ! 499: } ! 500: } ! 501: ! 502: p->status = NORMAL; ! 503: p->value = val; ! 504: ! 505: ret: ! 506: return ((vexpr *) p); ! 507: } ! 508: ! 509: ! 510: ! 511: /* Ivaltoicon converts a dvalue into a constant block. */ ! 512: ! 513: expptr ivaltoicon(vp) ! 514: register vexpr *vp; ! 515: { ! 516: static char *badtag = "bad tag in ivaltoicon"; ! 517: static char *overflow = "integer constant too large"; ! 518: ! 519: register int vs; ! 520: register expptr p; ! 521: ! 522: if (vp->tag == DERROR) ! 523: return(errnode()); ! 524: else if (vp->tag != DVALUE) ! 525: fatal(badtag); ! 526: ! 527: vs = vp->dvalue.status; ! 528: if (vs == NORMAL) ! 529: p = mkintcon(vp->dvalue.value); ! 530: else if ((MAXINT + MININT == -1) && vs == MINLESS1) ! 531: p = mkintcon(MININT); ! 532: else if (vs == MAXPLUS1 || vs == MINLESS1) ! 533: { ! 534: err(overflow); ! 535: p = errnode(); ! 536: } ! 537: else ! 538: p = errnode(); ! 539: ! 540: return (p); ! 541: } ! 542: ! 543: ! 544: ! 545: /* Mkdname stores an identifier as a dname */ ! 546: ! 547: vexpr *mkdname(len, str) ! 548: int len; ! 549: register char *str; ! 550: { ! 551: register dname *p; ! 552: register int i; ! 553: register char *s; ! 554: ! 555: s = (char *) ckalloc(len + 1); ! 556: i = len; ! 557: s[i] = '\0'; ! 558: ! 559: while (--i >= 0) ! 560: s[i] = str[i]; ! 561: ! 562: p = ALLOC(Dname); ! 563: p->tag = DNAME; ! 564: p->len = len; ! 565: p->repr = s; ! 566: ! 567: return ((vexpr *) p); ! 568: } ! 569: ! 570: ! 571: ! 572: /* Getname gets the symbol table information associated with */ ! 573: /* a name. Getname differs from mkname in that it will not */ ! 574: /* add the name to the symbol table if it is not already */ ! 575: /* present. */ ! 576: ! 577: Namep getname(l, s) ! 578: int l; ! 579: register char *s; ! 580: { ! 581: struct Hashentry *hp; ! 582: int hash; ! 583: register Namep q; ! 584: register int i; ! 585: char n[VL]; ! 586: ! 587: hash = 0; ! 588: for (i = 0; i < l && *s != '\0'; ++i) ! 589: { ! 590: hash += *s; ! 591: n[i] = *s++; ! 592: } ! 593: ! 594: while (i < VL) ! 595: n[i++] = ' '; ! 596: ! 597: hash %= maxhash; ! 598: hp = hashtab + hash; ! 599: ! 600: while (q = hp->varp) ! 601: if (hash == hp->hashval ! 602: && eqn(VL, n, q->varname)) ! 603: goto ret; ! 604: else if (++hp >= lasthash) ! 605: hp = hashtab; ! 606: ! 607: ret: ! 608: return (q); ! 609: } ! 610: ! 611: ! 612: ! 613: /* Evparam returns the value of the constant named by name. */ ! 614: ! 615: expptr evparam(np) ! 616: register vexpr *np; ! 617: { ! 618: static char *badtag = "bad tag in evparam"; ! 619: static char *undefined = "%s is undefined"; ! 620: static char *nonconst = "%s is not constant"; ! 621: ! 622: register struct Paramblock *tp; ! 623: register expptr p; ! 624: register int len; ! 625: register char *repr; ! 626: ! 627: if (np->tag != DNAME) ! 628: fatal(badtag); ! 629: ! 630: len = np->dname.len; ! 631: repr = np->dname.repr; ! 632: ! 633: tp = (struct Paramblock *) getname(len, repr); ! 634: ! 635: if (tp == NULL) ! 636: { ! 637: errnm(undefined, len, repr); ! 638: p = errnode(); ! 639: } ! 640: else if (tp->vclass != CLPARAM || !ISCONST(tp->paramval)) ! 641: { ! 642: if (tp->paramval->tag != TERROR) ! 643: errnm(nonconst, len, repr); ! 644: p = errnode(); ! 645: } ! 646: else ! 647: p = (expptr) cpexpr(tp->paramval); ! 648: ! 649: return (p); ! 650: } ! 651: ! 652: ! 653: ! 654: vexpr *evaldname(dp) ! 655: vexpr *dp; ! 656: { ! 657: static char *undefined = "%s is undefined"; ! 658: static char *nonconst = "%s is not a constant"; ! 659: static char *nonint = "%s is not an integer"; ! 660: ! 661: register dvalue *p; ! 662: register struct Paramblock *tp; ! 663: register int len; ! 664: register char *repr; ! 665: ! 666: p = ALLOC(Dvalue); ! 667: p->tag = DVALUE; ! 668: ! 669: len = dp->dname.len; ! 670: repr = dp->dname.repr; ! 671: ! 672: tp = (struct Paramblock *) getname(len, repr); ! 673: ! 674: if (tp == NULL) ! 675: { ! 676: errnm(undefined, len, repr); ! 677: p->status = ERRVAL; ! 678: } ! 679: else if (tp->vclass != CLPARAM || !ISCONST(tp->paramval)) ! 680: { ! 681: if (tp->paramval->tag != TERROR) ! 682: errnm(nonconst, len, repr); ! 683: p->status = ERRVAL; ! 684: } ! 685: else if (!ISINT(tp->paramval->constblock.vtype)) ! 686: { ! 687: errnm(nonint, len, repr); ! 688: p->status = ERRVAL; ! 689: } ! 690: else ! 691: { ! 692: if ((MAXINT + MININT == -1) ! 693: && tp->paramval->constblock.const.ci == MININT) ! 694: p->status = MINLESS1; ! 695: else ! 696: { ! 697: p->status = NORMAL; ! 698: p->value = tp->paramval->constblock.const.ci; ! 699: } ! 700: } ! 701: ! 702: return ((vexpr *) p); ! 703: } ! 704: ! 705: ! 706: ! 707: vexpr *mkdexpr(op, l, r) ! 708: register int op; ! 709: register vexpr *l; ! 710: register vexpr *r; ! 711: { ! 712: static char *badop = "bad operator in mkdexpr"; ! 713: ! 714: register vexpr *p; ! 715: ! 716: switch (op) ! 717: { ! 718: default: ! 719: fatal(badop); ! 720: ! 721: case OPNEG: ! 722: case OPPLUS: ! 723: case OPMINUS: ! 724: case OPSTAR: ! 725: case OPSLASH: ! 726: case OPPOWER: ! 727: break; ! 728: } ! 729: ! 730: if ((l != NULL && l->tag == DERROR) || r->tag == DERROR) ! 731: { ! 732: frvexpr(l); ! 733: frvexpr(r); ! 734: p = (vexpr *) ALLOC(Derror); ! 735: p->tag = DERROR; ! 736: } ! 737: else if (op == OPNEG && r->tag == DVALUE) ! 738: { ! 739: p = negival(r); ! 740: frvexpr(r); ! 741: } ! 742: else if (op != OPNEG && l->tag == DVALUE && r->tag == DVALUE) ! 743: { ! 744: switch (op) ! 745: { ! 746: case OPPLUS: ! 747: p = addivals(l, r); ! 748: break; ! 749: ! 750: case OPMINUS: ! 751: p = subivals(l, r); ! 752: break; ! 753: ! 754: case OPSTAR: ! 755: p = mulivals(l, r); ! 756: break; ! 757: ! 758: case OPSLASH: ! 759: p = divivals(l, r); ! 760: break; ! 761: ! 762: case OPPOWER: ! 763: p = powivals(l, r); ! 764: break; ! 765: } ! 766: ! 767: frvexpr(l); ! 768: frvexpr(r); ! 769: } ! 770: else ! 771: { ! 772: p = (vexpr *) ALLOC(Dexpr); ! 773: p->tag = DEXPR; ! 774: p->dexpr.opcode = op; ! 775: p->dexpr.left = l; ! 776: p->dexpr.right = r; ! 777: } ! 778: ! 779: return (p); ! 780: } ! 781: ! 782: ! 783: ! 784: vexpr *addivals(l, r) ! 785: vexpr *l; ! 786: vexpr *r; ! 787: { ! 788: static char *badtag = "bad tag in addivals"; ! 789: static char *overflow = "integer value too large"; ! 790: ! 791: register int ls, rs; ! 792: register ftnint lv, rv; ! 793: register dvalue *p; ! 794: register ftnint k; ! 795: ! 796: if (l->tag != DVALUE || r->tag != DVALUE) ! 797: fatal(badtag); ! 798: ! 799: ls = l->dvalue.status; ! 800: lv = l->dvalue.value; ! 801: rs = r->dvalue.status; ! 802: rv = r->dvalue.value; ! 803: ! 804: p = ALLOC(Dvalue); ! 805: p->tag = DVALUE; ! 806: ! 807: if (ls == ERRVAL || rs == ERRVAL) ! 808: p->status = ERRVAL; ! 809: ! 810: else if (ls == NORMAL && rs == NORMAL) ! 811: { ! 812: addints(lv, rv); ! 813: if (rstatus == ERRVAL) ! 814: err(overflow); ! 815: p->status = rstatus; ! 816: p->value = rvalue; ! 817: } ! 818: ! 819: else ! 820: { ! 821: if (rs == MAXPLUS1 || rs == MINLESS1) ! 822: { ! 823: rs = ls; ! 824: rv = lv; ! 825: ls = r->dvalue.status; ! 826: } ! 827: ! 828: if (rs == NORMAL && rv == 0) ! 829: p->status = ls; ! 830: else if (ls == MAXPLUS1) ! 831: { ! 832: if (rs == NORMAL && rv < 0) ! 833: { ! 834: p->status = NORMAL; ! 835: k = MAXINT + rv; ! 836: p->value = k + 1; ! 837: } ! 838: else if (rs == MINLESS1) ! 839: { ! 840: p->status = NORMAL; ! 841: p->value = 0; ! 842: } ! 843: else ! 844: { ! 845: err(overflow); ! 846: p->status = ERRVAL; ! 847: } ! 848: } ! 849: else ! 850: { ! 851: if (rs == NORMAL && rv > 0) ! 852: { ! 853: p->status = NORMAL; ! 854: k = ( -MAXINT ) + rv; ! 855: p->value = k - 1; ! 856: } ! 857: else if (rs == MAXPLUS1) ! 858: { ! 859: p->status = NORMAL; ! 860: p->value = 0; ! 861: } ! 862: else ! 863: { ! 864: err(overflow); ! 865: p->status = ERRVAL; ! 866: } ! 867: } ! 868: } ! 869: ! 870: return ((vexpr *) p); ! 871: } ! 872: ! 873: ! 874: ! 875: vexpr *negival(vp) ! 876: vexpr *vp; ! 877: { ! 878: static char *badtag = "bad tag in negival"; ! 879: ! 880: register int vs; ! 881: register dvalue *p; ! 882: ! 883: if (vp->tag != DVALUE) ! 884: fatal(badtag); ! 885: ! 886: vs = vp->dvalue.status; ! 887: ! 888: p = ALLOC(Dvalue); ! 889: p->tag = DVALUE; ! 890: ! 891: if (vs == ERRVAL) ! 892: p->status = ERRVAL; ! 893: else if (vs == NORMAL) ! 894: { ! 895: p->status = NORMAL; ! 896: p->value = -(vp->dvalue.value); ! 897: } ! 898: else if (vs == MAXPLUS1) ! 899: p->status = MINLESS1; ! 900: else ! 901: p->status = MAXPLUS1; ! 902: ! 903: return ((vexpr *) p); ! 904: } ! 905: ! 906: ! 907: ! 908: vexpr *subivals(l, r) ! 909: vexpr *l; ! 910: vexpr *r; ! 911: { ! 912: static char *badtag = "bad tag in subivals"; ! 913: ! 914: register vexpr *p; ! 915: register vexpr *t; ! 916: ! 917: if (l->tag != DVALUE || r->tag != DVALUE) ! 918: fatal(badtag); ! 919: ! 920: t = negival(r); ! 921: p = addivals(l, t); ! 922: frvexpr(t); ! 923: ! 924: return (p); ! 925: } ! 926: ! 927: ! 928: ! 929: vexpr *mulivals(l, r) ! 930: vexpr *l; ! 931: vexpr *r; ! 932: { ! 933: static char *badtag = "bad tag in mulivals"; ! 934: static char *overflow = "integer value too large"; ! 935: ! 936: register int ls, rs; ! 937: register ftnint lv, rv; ! 938: register dvalue *p; ! 939: ! 940: if (l->tag != DVALUE || r->tag != DVALUE) ! 941: fatal(badtag); ! 942: ! 943: ls = l->dvalue.status; ! 944: lv = l->dvalue.value; ! 945: rs = r->dvalue.status; ! 946: rv = r->dvalue.value; ! 947: ! 948: p = ALLOC(Dvalue); ! 949: p->tag = DVALUE; ! 950: ! 951: if (ls == ERRVAL || rs == ERRVAL) ! 952: p->status = ERRVAL; ! 953: ! 954: else if (ls == NORMAL && rs == NORMAL) ! 955: { ! 956: mulints(lv, rv); ! 957: if (rstatus == ERRVAL) ! 958: err(overflow); ! 959: p->status = rstatus; ! 960: p->value = rvalue; ! 961: } ! 962: else ! 963: { ! 964: if (rs == MAXPLUS1 || rs == MINLESS1) ! 965: { ! 966: rs = ls; ! 967: rv = lv; ! 968: ls = r->dvalue.status; ! 969: } ! 970: ! 971: if (rs == NORMAL && rv == 0) ! 972: { ! 973: p->status = NORMAL; ! 974: p->value = 0; ! 975: } ! 976: else if (rs == NORMAL && rv == 1) ! 977: p->status = ls; ! 978: else if (rs == NORMAL && rv == -1) ! 979: if (ls == MAXPLUS1) ! 980: p->status = MINLESS1; ! 981: else ! 982: p->status = MAXPLUS1; ! 983: else ! 984: { ! 985: err(overflow); ! 986: p->status = ERRVAL; ! 987: } ! 988: } ! 989: ! 990: return ((vexpr *) p); ! 991: } ! 992: ! 993: ! 994: ! 995: vexpr *divivals(l, r) ! 996: vexpr *l; ! 997: vexpr *r; ! 998: { ! 999: static char *badtag = "bad tag in divivals"; ! 1000: static char *zerodivide = "division by zero"; ! 1001: ! 1002: register int ls, rs; ! 1003: register ftnint lv, rv; ! 1004: register dvalue *p; ! 1005: register ftnint k; ! 1006: register int sign; ! 1007: ! 1008: if (l->tag != DVALUE && r->tag != DVALUE) ! 1009: fatal(badtag); ! 1010: ! 1011: ls = l->dvalue.status; ! 1012: lv = l->dvalue.value; ! 1013: rs = r->dvalue.status; ! 1014: rv = r->dvalue.value; ! 1015: ! 1016: p = ALLOC(Dvalue); ! 1017: p->tag = DVALUE; ! 1018: ! 1019: if (ls == ERRVAL || rs == ERRVAL) ! 1020: p->status = ERRVAL; ! 1021: else if (rs == NORMAL) ! 1022: { ! 1023: if (rv == 0) ! 1024: { ! 1025: err(zerodivide); ! 1026: p->status = ERRVAL; ! 1027: } ! 1028: else if (ls == NORMAL) ! 1029: { ! 1030: p->status = NORMAL; ! 1031: p->value = lv / rv; ! 1032: } ! 1033: else if (rv == 1) ! 1034: p->status = ls; ! 1035: else if (rv == -1) ! 1036: if (ls == MAXPLUS1) ! 1037: p->status = MINLESS1; ! 1038: else ! 1039: p->status = MAXPLUS1; ! 1040: else ! 1041: { ! 1042: p->status = NORMAL; ! 1043: ! 1044: if (ls == MAXPLUS1) ! 1045: sign = 1; ! 1046: else ! 1047: sign = -1; ! 1048: ! 1049: if (rv < 0) ! 1050: { ! 1051: rv = -rv; ! 1052: sign = -sign; ! 1053: } ! 1054: ! 1055: k = MAXINT - rv; ! 1056: p->value = sign * ((k + 1)/rv + 1); ! 1057: } ! 1058: } ! 1059: else ! 1060: { ! 1061: p->status = NORMAL; ! 1062: if (ls == NORMAL) ! 1063: p->value = 0; ! 1064: else if ((ls == MAXPLUS1 && rs == MAXPLUS1) ! 1065: || (ls == MINLESS1 && rs == MINLESS1)) ! 1066: p->value = 1; ! 1067: else ! 1068: p->value = -1; ! 1069: } ! 1070: ! 1071: return ((vexpr *) p); ! 1072: } ! 1073: ! 1074: ! 1075: ! 1076: vexpr *powivals(l, r) ! 1077: vexpr *l; ! 1078: vexpr *r; ! 1079: { ! 1080: static char *badtag = "bad tag in powivals"; ! 1081: static char *zerozero = "zero raised to the zero-th power"; ! 1082: static char *zeroneg = "zero raised to a negative power"; ! 1083: static char *overflow = "integer value too large"; ! 1084: ! 1085: register int ls, rs; ! 1086: register ftnint lv, rv; ! 1087: register dvalue *p; ! 1088: ! 1089: if (l->tag != DVALUE || r->tag != DVALUE) ! 1090: fatal(badtag); ! 1091: ! 1092: ls = l->dvalue.status; ! 1093: lv = l->dvalue.value; ! 1094: rs = r->dvalue.status; ! 1095: rv = r->dvalue.value; ! 1096: ! 1097: p = ALLOC(Dvalue); ! 1098: p->tag = DVALUE; ! 1099: ! 1100: if (ls == ERRVAL || rs == ERRVAL) ! 1101: p->status = ERRVAL; ! 1102: ! 1103: else if (ls == NORMAL) ! 1104: { ! 1105: if (lv == 1) ! 1106: { ! 1107: p->status = NORMAL; ! 1108: p->value = 1; ! 1109: } ! 1110: else if (lv == 0) ! 1111: { ! 1112: if (rs == MAXPLUS1 || (rs == NORMAL && rv > 0)) ! 1113: { ! 1114: p->status = NORMAL; ! 1115: p->value = 0; ! 1116: } ! 1117: else if (rs == NORMAL && rv == 0) ! 1118: { ! 1119: warn(zerozero); ! 1120: p->status = NORMAL; ! 1121: p->value = 1; ! 1122: } ! 1123: else ! 1124: { ! 1125: err(zeroneg); ! 1126: p->status = ERRVAL; ! 1127: } ! 1128: } ! 1129: else if (lv == -1) ! 1130: { ! 1131: p->status = NORMAL; ! 1132: if (rs == NORMAL) ! 1133: { ! 1134: if (rv < 0) rv = -rv; ! 1135: if (rv % 2 == 0) ! 1136: p->value = 1; ! 1137: else ! 1138: p->value = -1; ! 1139: } ! 1140: else ! 1141: # if (MAXINT % 2 == 1) ! 1142: p->value = 1; ! 1143: # else ! 1144: p->value = -1; ! 1145: # endif ! 1146: } ! 1147: else ! 1148: { ! 1149: if (rs == NORMAL && rv > 0) ! 1150: { ! 1151: rstatus = NORMAL; ! 1152: rvalue = lv; ! 1153: while (--rv && rstatus == NORMAL) ! 1154: mulints(rvalue, lv); ! 1155: if (rv == 0 && rstatus != ERRVAL) ! 1156: { ! 1157: p->status = rstatus; ! 1158: p->value = rvalue; ! 1159: } ! 1160: else ! 1161: { ! 1162: err(overflow); ! 1163: p->status = ERRVAL; ! 1164: } ! 1165: } ! 1166: else if (rs == MAXPLUS1) ! 1167: { ! 1168: err(overflow); ! 1169: p->status = ERRVAL; ! 1170: } ! 1171: else if (rs == NORMAL && rv == 0) ! 1172: { ! 1173: p->status = NORMAL; ! 1174: p->value = 1; ! 1175: } ! 1176: else ! 1177: { ! 1178: p->status = NORMAL; ! 1179: p->value = 0; ! 1180: } ! 1181: } ! 1182: } ! 1183: ! 1184: else ! 1185: { ! 1186: if (rs == MAXPLUS1 || (rs == NORMAL && rv > 1)) ! 1187: { ! 1188: err(overflow); ! 1189: p->status = ERRVAL; ! 1190: } ! 1191: else if (rs == NORMAL && rv == 1) ! 1192: p->status = ls; ! 1193: else if (rs == NORMAL && rv == 0) ! 1194: { ! 1195: p->status = NORMAL; ! 1196: p->value = 1; ! 1197: } ! 1198: else ! 1199: { ! 1200: p->status = NORMAL; ! 1201: p->value = 0; ! 1202: } ! 1203: } ! 1204: ! 1205: return ((vexpr *) p); ! 1206: } ! 1207: ! 1208: ! 1209: ! 1210: /* Addints adds two integer values. */ ! 1211: ! 1212: addints(i, j) ! 1213: register ftnint i, j; ! 1214: { ! 1215: register ftnint margin; ! 1216: ! 1217: if (i == 0) ! 1218: { ! 1219: rstatus = NORMAL; ! 1220: rvalue = j; ! 1221: } ! 1222: else if (i > 0) ! 1223: { ! 1224: margin = MAXINT - i; ! 1225: if (j <= margin) ! 1226: { ! 1227: rstatus = NORMAL; ! 1228: rvalue = i + j; ! 1229: } ! 1230: else if (j == margin + 1) ! 1231: rstatus = MAXPLUS1; ! 1232: else ! 1233: rstatus = ERRVAL; ! 1234: } ! 1235: else ! 1236: { ! 1237: margin = ( -MAXINT ) - i; ! 1238: if (j >= margin) ! 1239: { ! 1240: rstatus = NORMAL; ! 1241: rvalue = i + j; ! 1242: } ! 1243: else if (j == margin - 1) ! 1244: rstatus = MINLESS1; ! 1245: else ! 1246: rstatus = ERRVAL; ! 1247: } ! 1248: ! 1249: return; ! 1250: } ! 1251: ! 1252: ! 1253: ! 1254: /* Mulints multiplies two integer values */ ! 1255: ! 1256: mulints(i, j) ! 1257: register ftnint i, j; ! 1258: { ! 1259: register ftnint sign; ! 1260: register ftnint margin; ! 1261: ! 1262: if (i == 0 || j == 0) ! 1263: { ! 1264: rstatus = NORMAL; ! 1265: rvalue = 0; ! 1266: } ! 1267: else ! 1268: { ! 1269: if ((i > 0 && j > 0) || (i < 0 && j < 0)) ! 1270: sign = 1; ! 1271: else ! 1272: sign = -1; ! 1273: ! 1274: if (i < 0) i = -i; ! 1275: if (j < 0) j = -j; ! 1276: ! 1277: margin = MAXINT - i; ! 1278: margin = (margin + 1) / i; ! 1279: ! 1280: if (j <= margin) ! 1281: { ! 1282: rstatus = NORMAL; ! 1283: rvalue = i * j * sign; ! 1284: } ! 1285: else if (j - 1 == margin) ! 1286: { ! 1287: margin = i*margin - 1; ! 1288: if (margin == MAXINT - i) ! 1289: if (sign > 0) ! 1290: rstatus = MAXPLUS1; ! 1291: else ! 1292: rstatus = MINLESS1; ! 1293: else ! 1294: { ! 1295: rstatus = NORMAL; ! 1296: rvalue = i * j * sign; ! 1297: } ! 1298: } ! 1299: else ! 1300: rstatus = ERRVAL; ! 1301: } ! 1302: ! 1303: return; ! 1304: } ! 1305: ! 1306: ! 1307: ! 1308: vexpr * ! 1309: evalvexpr(ep) ! 1310: vexpr *ep; ! 1311: { ! 1312: register vexpr *p; ! 1313: register vexpr *l, *r; ! 1314: ! 1315: switch (ep->tag) ! 1316: { ! 1317: case DVALUE: ! 1318: p = cpdvalue(ep); ! 1319: break; ! 1320: ! 1321: case DVAR: ! 1322: p = cpdvalue((vexpr *) ep->dvar.valp); ! 1323: break; ! 1324: ! 1325: case DNAME: ! 1326: p = evaldname(ep); ! 1327: break; ! 1328: ! 1329: case DEXPR: ! 1330: if (ep->dexpr.left == NULL) ! 1331: l = NULL; ! 1332: else ! 1333: l = evalvexpr(ep->dexpr.left); ! 1334: ! 1335: if (ep->dexpr.right == NULL) ! 1336: r = NULL; ! 1337: else ! 1338: r = evalvexpr(ep->dexpr.right); ! 1339: ! 1340: switch (ep->dexpr.opcode) ! 1341: { ! 1342: case OPNEG: ! 1343: p = negival(r); ! 1344: break; ! 1345: ! 1346: case OPPLUS: ! 1347: p = addivals(l, r); ! 1348: break; ! 1349: ! 1350: case OPMINUS: ! 1351: p = subivals(l, r); ! 1352: break; ! 1353: ! 1354: case OPSTAR: ! 1355: p = mulivals(l, r); ! 1356: break; ! 1357: ! 1358: case OPSLASH: ! 1359: p = divivals(l, r); ! 1360: break; ! 1361: ! 1362: case OPPOWER: ! 1363: p = powivals(l, r); ! 1364: break; ! 1365: } ! 1366: ! 1367: frvexpr(l); ! 1368: frvexpr(r); ! 1369: break; ! 1370: ! 1371: case DERROR: ! 1372: p = (vexpr *) ALLOC(Dvalue); ! 1373: p->tag = DVALUE; ! 1374: p->dvalue.status = ERRVAL; ! 1375: break; ! 1376: } ! 1377: ! 1378: return (p); ! 1379: } ! 1380: ! 1381: ! 1382: ! 1383: vexpr * ! 1384: refrigdname(vp) ! 1385: vexpr *vp; ! 1386: { ! 1387: register vexpr *p; ! 1388: register int len; ! 1389: register char *repr; ! 1390: register int found; ! 1391: register dovars *dvp; ! 1392: ! 1393: len = vp->dname.len; ! 1394: repr = vp->dname.repr; ! 1395: ! 1396: found = NO; ! 1397: dvp = dvlist; ! 1398: while (found == NO && dvp != NULL) ! 1399: { ! 1400: if (len == dvp->len && eqn(len, repr, dvp->repr)) ! 1401: found = YES; ! 1402: else ! 1403: dvp = dvp->next; ! 1404: } ! 1405: ! 1406: if (found == YES) ! 1407: { ! 1408: p = (vexpr *) ALLOC(Dvar); ! 1409: p->tag = DVAR; ! 1410: p->dvar.valp = dvp->valp; ! 1411: } ! 1412: else ! 1413: { ! 1414: p = evaldname(vp); ! 1415: if (p->dvalue.status == ERRVAL) ! 1416: dataerror = YES; ! 1417: } ! 1418: ! 1419: return (p); ! 1420: } ! 1421: ! 1422: ! 1423: ! 1424: refrigvexpr(vpp) ! 1425: vexpr **vpp; ! 1426: { ! 1427: register vexpr *vp; ! 1428: ! 1429: vp = *vpp; ! 1430: ! 1431: switch (vp->tag) ! 1432: { ! 1433: case DVALUE: ! 1434: case DVAR: ! 1435: case DERROR: ! 1436: break; ! 1437: ! 1438: case DEXPR: ! 1439: refrigvexpr( &(vp->dexpr.left) ); ! 1440: refrigvexpr( &(vp->dexpr.right) ); ! 1441: break; ! 1442: ! 1443: case DNAME: ! 1444: *(vpp) = refrigdname(vp); ! 1445: frvexpr(vp); ! 1446: break; ! 1447: } ! 1448: ! 1449: return; ! 1450: } ! 1451: ! 1452: ! 1453: ! 1454: int ! 1455: chkvar(np, sname) ! 1456: Namep np; ! 1457: char *sname; ! 1458: { ! 1459: static char *nonvar = "%s is not a variable"; ! 1460: static char *arginit = "attempt to initialize a dummy argument: %s"; ! 1461: static char *autoinit = "attempt to initialize an automatic variable: %s"; ! 1462: static char *badclass = "bad class in chkvar"; ! 1463: ! 1464: register int status; ! 1465: register struct Dimblock *dp; ! 1466: register int i; ! 1467: ! 1468: status = YES; ! 1469: ! 1470: if (np->vclass == CLUNKNOWN ! 1471: || (np->vclass == CLVAR && !np->vdcldone)) ! 1472: vardcl(np); ! 1473: ! 1474: if (np->vclass != CLVAR) ! 1475: { ! 1476: errstr(nonvar, sname); ! 1477: dataerror = YES; ! 1478: status = NO; ! 1479: } ! 1480: else if (np->vstg == STGARG) ! 1481: { ! 1482: errstr(arginit, sname); ! 1483: dataerror = YES; ! 1484: status = NO; ! 1485: } ! 1486: else if (np->vstg == STGAUTO) ! 1487: { ! 1488: errstr(autoinit, sname); ! 1489: dataerror = YES; ! 1490: status = NO; ! 1491: } ! 1492: else if (np->vstg != STGBSS && np->vstg != STGINIT ! 1493: && np->vstg != STGCOMMON && np->vstg != STGEQUIV) ! 1494: { ! 1495: fatal(badclass); ! 1496: } ! 1497: else ! 1498: { ! 1499: switch (np->vtype) ! 1500: { ! 1501: case TYERROR: ! 1502: status = NO; ! 1503: dataerror = YES; ! 1504: break; ! 1505: ! 1506: case TYSHORT: ! 1507: case TYLONG: ! 1508: case TYREAL: ! 1509: case TYDREAL: ! 1510: case TYCOMPLEX: ! 1511: case TYDCOMPLEX: ! 1512: case TYLOGICAL: ! 1513: case TYCHAR: ! 1514: dp = np->vdim; ! 1515: if (dp != NULL) ! 1516: { ! 1517: if (dp->nelt == NULL || !ISICON(dp->nelt)) ! 1518: { ! 1519: status = NO; ! 1520: dataerror = YES; ! 1521: } ! 1522: } ! 1523: break; ! 1524: ! 1525: default: ! 1526: badtype("chkvar", np->vtype); ! 1527: } ! 1528: } ! 1529: ! 1530: return (status); ! 1531: } ! 1532: ! 1533: ! 1534: ! 1535: refrigsubs(ap, sname) ! 1536: aelt *ap; ! 1537: char *sname; ! 1538: { ! 1539: static char *nonarray = "subscripts on a simple variable: %s"; ! 1540: static char *toofew = "not enough subscripts on %s"; ! 1541: static char *toomany = "too many subscripts on %s"; ! 1542: ! 1543: register vlist *subp; ! 1544: register int nsubs; ! 1545: register Namep np; ! 1546: register struct Dimblock *dp; ! 1547: register int i; ! 1548: ! 1549: np = ap->var; ! 1550: dp = np->vdim; ! 1551: ! 1552: if (ap->subs != NULL) ! 1553: { ! 1554: if (np->vdim == NULL) ! 1555: { ! 1556: errstr(nonarray, sname); ! 1557: dataerror = YES; ! 1558: } ! 1559: else ! 1560: { ! 1561: nsubs = 0; ! 1562: subp = ap->subs; ! 1563: while (subp != NULL) ! 1564: { ! 1565: nsubs++; ! 1566: refrigvexpr( &(subp->val) ); ! 1567: subp = subp->next; ! 1568: } ! 1569: ! 1570: if (dp->ndim != nsubs) ! 1571: { ! 1572: if (np->vdim->ndim < nsubs) ! 1573: errstr(toofew, sname); ! 1574: else ! 1575: errstr(toomany, sname); ! 1576: dataerror = YES; ! 1577: } ! 1578: else if (dp->baseoffset == NULL || !ISICON(dp->baseoffset)) ! 1579: dataerror = YES; ! 1580: else ! 1581: { ! 1582: i = dp->ndim; ! 1583: while (i-- > 0) ! 1584: { ! 1585: if (dp->dims[i].dimsize == NULL ! 1586: || !ISICON(dp->dims[i].dimsize)) ! 1587: dataerror = YES; ! 1588: } ! 1589: } ! 1590: } ! 1591: } ! 1592: ! 1593: return; ! 1594: } ! 1595: ! 1596: ! 1597: ! 1598: refrigrange(ap, sname) ! 1599: aelt *ap; ! 1600: char *sname; ! 1601: { ! 1602: static char *nonstr = "substring of a noncharacter variable: %s"; ! 1603: static char *array = "substring applied to an array: %s"; ! 1604: ! 1605: register Namep np; ! 1606: register dvalue *t; ! 1607: register rpair *rp; ! 1608: ! 1609: if (ap->range != NULL) ! 1610: { ! 1611: np = ap->var; ! 1612: if (np->vtype != TYCHAR) ! 1613: { ! 1614: errstr(nonstr, sname); ! 1615: dataerror = YES; ! 1616: } ! 1617: else if (ap->subs == NULL && np->vdim != NULL) ! 1618: { ! 1619: errstr(array, sname); ! 1620: dataerror = YES; ! 1621: } ! 1622: else ! 1623: { ! 1624: rp = ap->range; ! 1625: ! 1626: if (rp->low != NULL) ! 1627: refrigvexpr( &(rp->low) ); ! 1628: else ! 1629: { ! 1630: t = ALLOC(Dvalue); ! 1631: t->tag = DVALUE; ! 1632: t->status = NORMAL; ! 1633: t->value = 1; ! 1634: rp->low = (vexpr *) t; ! 1635: } ! 1636: ! 1637: if (rp->high != NULL) ! 1638: refrigvexpr( &(rp->high) ); ! 1639: else ! 1640: { ! 1641: if (!ISICON(np->vleng)) ! 1642: { ! 1643: rp->high = (vexpr *) ALLOC(Derror); ! 1644: rp->high->tag = DERROR; ! 1645: } ! 1646: else ! 1647: { ! 1648: t = ALLOC(Dvalue); ! 1649: t->tag = DVALUE; ! 1650: t->status = NORMAL; ! 1651: t->value = np->vleng->constblock.const.ci; ! 1652: rp->high = (vexpr *) t; ! 1653: } ! 1654: } ! 1655: } ! 1656: } ! 1657: ! 1658: return; ! 1659: } ! 1660: ! 1661: ! 1662: ! 1663: refrigaelt(ap) ! 1664: aelt *ap; ! 1665: { ! 1666: register Namep np; ! 1667: register char *bp, *sp; ! 1668: register int len; ! 1669: char buff[VL+1]; ! 1670: ! 1671: np = ap->var; ! 1672: ! 1673: len = 0; ! 1674: bp = buff; ! 1675: sp = np->varname; ! 1676: while (len < VL && *sp != ' ' && *sp != '\0') ! 1677: { ! 1678: *bp++ = *sp++; ! 1679: len++; ! 1680: } ! 1681: *bp = '\0'; ! 1682: ! 1683: if (chkvar(np, buff)) ! 1684: { ! 1685: refrigsubs(ap, buff); ! 1686: refrigrange(ap, buff); ! 1687: } ! 1688: ! 1689: return; ! 1690: } ! 1691: ! 1692: ! 1693: ! 1694: refrigdo(dp) ! 1695: dolist *dp; ! 1696: { ! 1697: static char *duplicates = "implied DO variable %s redefined"; ! 1698: static char *nonvar = "%s is not a variable"; ! 1699: static char *nonint = "%s is not integer"; ! 1700: ! 1701: register int len; ! 1702: register char *repr; ! 1703: register int found; ! 1704: register dovars *dvp; ! 1705: register Namep np; ! 1706: register dovars *t; ! 1707: ! 1708: refrigvexpr( &(dp->init) ); ! 1709: refrigvexpr( &(dp->limit) ); ! 1710: refrigvexpr( &(dp->step) ); ! 1711: ! 1712: len = dp->dovar->dname.len; ! 1713: repr = dp->dovar->dname.repr; ! 1714: ! 1715: found = NO; ! 1716: dvp = dvlist; ! 1717: while (found == NO && dvp != NULL) ! 1718: if (len == dvp->len && eqn(len, repr, dvp->repr)) ! 1719: found = YES; ! 1720: else ! 1721: dvp = dvp->next; ! 1722: ! 1723: if (found == YES) ! 1724: { ! 1725: errnm(duplicates, len, repr); ! 1726: dataerror = YES; ! 1727: } ! 1728: else ! 1729: { ! 1730: np = getname(len, repr); ! 1731: if (np == NULL) ! 1732: { ! 1733: if (!ISINT(impltype[letter(*repr)])) ! 1734: warnnm(nonint, len, repr); ! 1735: } ! 1736: else ! 1737: { ! 1738: if (np->vclass == CLUNKNOWN) ! 1739: vardcl(np); ! 1740: if (np->vclass != CLVAR) ! 1741: warnnm(nonvar, len, repr); ! 1742: else if (!ISINT(np->vtype)) ! 1743: warnnm(nonint, len, repr); ! 1744: } ! 1745: } ! 1746: ! 1747: t = ALLOC(DoVars); ! 1748: t->next = dvlist; ! 1749: t->len = len; ! 1750: t->repr = repr; ! 1751: t->valp = ALLOC(Dvalue); ! 1752: t->valp->tag = DVALUE; ! 1753: dp->dovar = (vexpr *) t->valp; ! 1754: ! 1755: dvlist = t; ! 1756: ! 1757: refriglvals(dp->elts); ! 1758: ! 1759: dvlist = t->next; ! 1760: free((char *) t); ! 1761: ! 1762: return; ! 1763: } ! 1764: ! 1765: ! 1766: ! 1767: refriglvals(lvals) ! 1768: elist *lvals; ! 1769: { ! 1770: register elist *top; ! 1771: ! 1772: top = lvals; ! 1773: ! 1774: while (top != NULL) ! 1775: { ! 1776: if (top->elt->tag == SIMPLE) ! 1777: refrigaelt((aelt *) top->elt); ! 1778: else ! 1779: refrigdo((dolist *) top->elt); ! 1780: ! 1781: top = top->next; ! 1782: } ! 1783: ! 1784: return; ! 1785: } ! 1786: ! 1787: ! 1788: ! 1789: /* Refrig freezes name/value bindings in the DATA name list */ ! 1790: ! 1791: ! 1792: refrig(lvals) ! 1793: elist *lvals; ! 1794: { ! 1795: dvlist = NULL; ! 1796: refriglvals(lvals); ! 1797: return; ! 1798: } ! 1799: ! 1800: ! 1801: ! 1802: ftnint ! 1803: indexer(ap) ! 1804: aelt *ap; ! 1805: { ! 1806: static char *badvar = "bad variable in indexer"; ! 1807: static char *boundserror = "subscript out of bounds"; ! 1808: ! 1809: register ftnint index; ! 1810: register vlist *sp; ! 1811: register Namep np; ! 1812: register struct Dimblock *dp; ! 1813: register int i; ! 1814: register dvalue *vp; ! 1815: register ftnint size; ! 1816: ftnint sub[MAXDIM]; ! 1817: ! 1818: sp = ap->subs; ! 1819: if (sp == NULL) return (0); ! 1820: ! 1821: np = ap->var; ! 1822: dp = np->vdim; ! 1823: ! 1824: if (dp == NULL) ! 1825: fatal(badvar); ! 1826: ! 1827: i = 0; ! 1828: while (sp != NULL) ! 1829: { ! 1830: vp = (dvalue *) evalvexpr(sp->val); ! 1831: ! 1832: if (vp->status == NORMAL) ! 1833: sub[i++] = vp->value; ! 1834: else if ((MININT + MAXINT == -1) && vp->status == MINLESS1) ! 1835: sub[i++] = MININT; ! 1836: else ! 1837: { ! 1838: frvexpr((vexpr *) vp); ! 1839: return (-1); ! 1840: } ! 1841: ! 1842: frvexpr((vexpr *) vp); ! 1843: sp = sp->next; ! 1844: } ! 1845: ! 1846: index = sub[--i]; ! 1847: while (i-- > 0) ! 1848: { ! 1849: size = dp->dims[i].dimsize->constblock.const.ci; ! 1850: index = sub[i] + index * size; ! 1851: } ! 1852: ! 1853: index -= dp->baseoffset->constblock.const.ci; ! 1854: ! 1855: if (index < 0 || index >= dp->nelt->constblock.const.ci) ! 1856: { ! 1857: err(boundserror); ! 1858: return (-1); ! 1859: } ! 1860: ! 1861: return (index); ! 1862: } ! 1863: ! 1864: ! 1865: ! 1866: savedata(lvals, rvals) ! 1867: elist *lvals; ! 1868: vallist *rvals; ! 1869: { ! 1870: static char *toomany = "more data values than data items"; ! 1871: ! 1872: register elist *top; ! 1873: ! 1874: dataerror = NO; ! 1875: badvalue = NO; ! 1876: ! 1877: lvals = revelist(lvals); ! 1878: grvals = revrvals(rvals); ! 1879: ! 1880: refrig(lvals); ! 1881: ! 1882: if (!dataerror) ! 1883: outdata(lvals); ! 1884: ! 1885: frelist(lvals); ! 1886: ! 1887: while (grvals != NULL && dataerror == NO) ! 1888: { ! 1889: if (grvals->status != NORMAL) ! 1890: dataerror = YES; ! 1891: else if (grvals->repl <= 0) ! 1892: grvals = grvals->next; ! 1893: else ! 1894: { ! 1895: err(toomany); ! 1896: dataerror = YES; ! 1897: } ! 1898: } ! 1899: ! 1900: frvallist(grvals); ! 1901: ! 1902: return; ! 1903: } ! 1904: ! 1905: ! 1906: ! 1907: setdfiles(np) ! 1908: register Namep np; ! 1909: { ! 1910: register struct Extsym *cp; ! 1911: register struct Equivblock *ep; ! 1912: register int stg; ! 1913: register int type; ! 1914: register ftnint typelen; ! 1915: register ftnint nelt; ! 1916: register ftnint varsize; ! 1917: ! 1918: stg = np->vstg; ! 1919: ! 1920: if (stg == STGBSS || stg == STGINIT) ! 1921: { ! 1922: datafile = vdatafile; ! 1923: chkfile = vchkfile; ! 1924: if (np->init == YES) ! 1925: base = np->initoffset; ! 1926: else ! 1927: { ! 1928: np->init = YES; ! 1929: np->initoffset = base = vdatahwm; ! 1930: if (np->vdim != NULL) ! 1931: nelt = np->vdim->nelt->constblock.const.ci; ! 1932: else ! 1933: nelt = 1; ! 1934: type = np->vtype; ! 1935: if (type == TYCHAR) ! 1936: typelen = np->vleng->constblock.const.ci; ! 1937: else if (type == TYLOGICAL) ! 1938: typelen = typesize[tylogical]; ! 1939: else ! 1940: typelen = typesize[type]; ! 1941: varsize = nelt * typelen; ! 1942: vdatahwm += varsize; ! 1943: } ! 1944: } ! 1945: else if (stg == STGEQUIV) ! 1946: { ! 1947: datafile = vdatafile; ! 1948: chkfile = vchkfile; ! 1949: ep = &eqvclass[np->vardesc.varno]; ! 1950: if (ep->init == YES) ! 1951: base = ep->initoffset; ! 1952: else ! 1953: { ! 1954: ep->init = YES; ! 1955: ep->initoffset = base = vdatahwm; ! 1956: vdatahwm += ep->eqvleng; ! 1957: } ! 1958: base += np->voffset; ! 1959: } ! 1960: else if (stg == STGCOMMON) ! 1961: { ! 1962: datafile = cdatafile; ! 1963: chkfile = cchkfile; ! 1964: cp = &extsymtab[np->vardesc.varno]; ! 1965: if (cp->init == YES) ! 1966: base = cp->initoffset; ! 1967: else ! 1968: { ! 1969: cp->init = YES; ! 1970: cp->initoffset = base = cdatahwm; ! 1971: cdatahwm += cp->maxleng; ! 1972: } ! 1973: base += np->voffset; ! 1974: } ! 1975: ! 1976: return; ! 1977: } ! 1978: ! 1979: ! 1980: ! 1981: wrtdata(offset, repl, len, const) ! 1982: long offset; ! 1983: ftnint repl; ! 1984: ftnint len; ! 1985: char *const; ! 1986: { ! 1987: static char *badoffset = "bad offset in wrtdata"; ! 1988: static char *toomuch = "too much data"; ! 1989: static char *readerror = "read error on tmp file"; ! 1990: static char *writeerror = "write error on tmp file"; ! 1991: static char *seekerror = "seek error on tmp file"; ! 1992: ! 1993: register ftnint k; ! 1994: long lastbyte; ! 1995: int bitpos; ! 1996: long chkoff; ! 1997: long lastoff; ! 1998: long chklen; ! 1999: long pos; ! 2000: int n; ! 2001: ftnint nbytes; ! 2002: int mask; ! 2003: register int i; ! 2004: char overlap; ! 2005: char allzero; ! 2006: char buff[BUFSIZ]; ! 2007: ! 2008: if (offset < 0) ! 2009: fatal(badoffset); ! 2010: ! 2011: overlap = NO; ! 2012: ! 2013: k = repl * len; ! 2014: lastbyte = offset + k - 1; ! 2015: if (lastbyte < 0) ! 2016: { ! 2017: err(toomuch); ! 2018: dataerror = YES; ! 2019: return; ! 2020: } ! 2021: ! 2022: bitpos = offset % BYTESIZE; ! 2023: chkoff = offset/BYTESIZE; ! 2024: lastoff = lastbyte/BYTESIZE; ! 2025: chklen = lastoff - chkoff + 1; ! 2026: ! 2027: pos = lseek(chkfile, chkoff, 0); ! 2028: if (pos == -1) ! 2029: { ! 2030: err(seekerror); ! 2031: done(1); ! 2032: } ! 2033: ! 2034: while (k > 0) ! 2035: { ! 2036: if (chklen <= BUFSIZ) ! 2037: n = chklen; ! 2038: else ! 2039: { ! 2040: n = BUFSIZ; ! 2041: chklen -= BUFSIZ; ! 2042: } ! 2043: ! 2044: nbytes = read(chkfile, buff, n); ! 2045: if (nbytes < 0) ! 2046: { ! 2047: err(readerror); ! 2048: done(1); ! 2049: } ! 2050: ! 2051: if (nbytes == 0) ! 2052: buff[0] = '\0'; ! 2053: ! 2054: if (nbytes < n) ! 2055: buff[ n-1 ] = '\0'; ! 2056: ! 2057: i = 0; ! 2058: ! 2059: if (bitpos > 0) ! 2060: { ! 2061: while (k > 0 && bitpos < BYTESIZE) ! 2062: { ! 2063: mask = 1 << bitpos; ! 2064: ! 2065: if (mask & buff[0]) ! 2066: overlap = YES; ! 2067: else ! 2068: buff[0] |= mask; ! 2069: ! 2070: k--; ! 2071: bitpos++; ! 2072: } ! 2073: ! 2074: if (bitpos == BYTESIZE) ! 2075: { ! 2076: bitpos = 0; ! 2077: i++; ! 2078: } ! 2079: } ! 2080: ! 2081: while (i < nbytes && overlap == NO) ! 2082: { ! 2083: if (buff[i] == 0 && k >= BYTESIZE) ! 2084: { ! 2085: buff[i++] = MAXBYTE; ! 2086: k -= BYTESIZE; ! 2087: } ! 2088: else if (k < BYTESIZE) ! 2089: { ! 2090: while (k-- > 0) ! 2091: { ! 2092: mask = 1 << k; ! 2093: if (mask & buff[i]) ! 2094: overlap = YES; ! 2095: else ! 2096: buff[i] |= mask; ! 2097: } ! 2098: i++; ! 2099: } ! 2100: else ! 2101: { ! 2102: overlap = YES; ! 2103: buff[i++] = MAXBYTE; ! 2104: k -= BYTESIZE; ! 2105: } ! 2106: } ! 2107: ! 2108: while (i < n) ! 2109: { ! 2110: if (k >= BYTESIZE) ! 2111: { ! 2112: buff[i++] = MAXBYTE; ! 2113: k -= BYTESIZE; ! 2114: } ! 2115: else ! 2116: { ! 2117: while (k-- > 0) ! 2118: { ! 2119: mask = 1 << k; ! 2120: buff[i] |= mask; ! 2121: } ! 2122: i++; ! 2123: } ! 2124: } ! 2125: ! 2126: pos = lseek(chkfile, -nbytes, 1); ! 2127: if (pos == -1) ! 2128: { ! 2129: err(seekerror); ! 2130: done(1); ! 2131: } ! 2132: ! 2133: nbytes = write(chkfile, buff, n); ! 2134: if (nbytes != n) ! 2135: { ! 2136: err(writeerror); ! 2137: done(1); ! 2138: } ! 2139: } ! 2140: ! 2141: if (overlap == NO) ! 2142: { ! 2143: allzero = YES; ! 2144: k = len; ! 2145: ! 2146: while (k > 0 && allzero != NO) ! 2147: if (const[--k] != 0) allzero = NO; ! 2148: ! 2149: if (allzero == YES) ! 2150: return; ! 2151: } ! 2152: ! 2153: pos = lseek(datafile, offset, 0); ! 2154: if (pos == -1) ! 2155: { ! 2156: err(seekerror); ! 2157: done(1); ! 2158: } ! 2159: ! 2160: k = repl; ! 2161: while (k-- > 0) ! 2162: { ! 2163: nbytes = write(datafile, const, len); ! 2164: if (nbytes != len) ! 2165: { ! 2166: err(writeerror); ! 2167: done(1); ! 2168: } ! 2169: } ! 2170: ! 2171: if (overlap) overlapflag = YES; ! 2172: ! 2173: return; ! 2174: } ! 2175: ! 2176: ! 2177: ! 2178: Constp ! 2179: getdatum() ! 2180: { ! 2181: static char *toofew = "more data items than data values"; ! 2182: ! 2183: register vallist *t; ! 2184: ! 2185: while (grvals != NULL) ! 2186: { ! 2187: if (grvals->status != NORMAL) ! 2188: { ! 2189: dataerror = YES; ! 2190: return (NULL); ! 2191: } ! 2192: else if (grvals->repl > 0) ! 2193: { ! 2194: grvals->repl--; ! 2195: return (grvals->value); ! 2196: } ! 2197: else ! 2198: { ! 2199: badvalue = 0; ! 2200: frexpr ((tagptr) grvals->value); ! 2201: t = grvals; ! 2202: grvals = t->next; ! 2203: free((char *) t); ! 2204: } ! 2205: } ! 2206: ! 2207: err(toofew); ! 2208: dataerror = YES; ! 2209: return (NULL); ! 2210: } ! 2211: ! 2212: ! 2213: ! 2214: outdata(lvals) ! 2215: elist *lvals; ! 2216: { ! 2217: register elist *top; ! 2218: ! 2219: top = lvals; ! 2220: ! 2221: while (top != NULL && dataerror == NO) ! 2222: { ! 2223: if (top->elt->tag == SIMPLE) ! 2224: outaelt((aelt *) top->elt); ! 2225: else ! 2226: outdolist((dolist *) top->elt); ! 2227: ! 2228: top = top->next; ! 2229: } ! 2230: ! 2231: return; ! 2232: } ! 2233: ! 2234: ! 2235: ! 2236: outaelt(ap) ! 2237: aelt *ap; ! 2238: { ! 2239: static char *toofew = "more data items than data values"; ! 2240: static char *boundserror = "substring expression out of bounds"; ! 2241: static char *order = "substring expressions out of order"; ! 2242: ! 2243: register Namep np; ! 2244: register long soffset; ! 2245: register dvalue *lwb; ! 2246: register dvalue *upb; ! 2247: register Constp const; ! 2248: register int k; ! 2249: register vallist *t; ! 2250: register int type; ! 2251: register ftnint typelen; ! 2252: register ftnint repl; ! 2253: ! 2254: extern char *packbytes(); ! 2255: ! 2256: np = ap->var; ! 2257: setdfiles(np); ! 2258: ! 2259: type = np->vtype; ! 2260: ! 2261: if (type == TYCHAR) ! 2262: typelen = np->vleng->constblock.const.ci; ! 2263: else if (type == TYLOGICAL) ! 2264: typelen = typesize[tylogical]; ! 2265: else ! 2266: typelen = typesize[type]; ! 2267: ! 2268: if (ap->subs != NULL || np->vdim == NULL) ! 2269: { ! 2270: soffset = indexer(ap); ! 2271: if (soffset == -1) ! 2272: { ! 2273: dataerror = YES; ! 2274: return; ! 2275: } ! 2276: ! 2277: soffset = soffset * typelen; ! 2278: ! 2279: if (ap->range != NULL) ! 2280: { ! 2281: lwb = (dvalue *) evalvexpr(ap->range->low); ! 2282: upb = (dvalue *) evalvexpr(ap->range->high); ! 2283: if (lwb->status == ERRVAL || upb->status == ERRVAL) ! 2284: { ! 2285: frvexpr((vexpr *) lwb); ! 2286: frvexpr((vexpr *) upb); ! 2287: dataerror = YES; ! 2288: return; ! 2289: } ! 2290: ! 2291: if (lwb->status != NORMAL || ! 2292: lwb->value < 1 || ! 2293: lwb->value > typelen || ! 2294: upb->status != NORMAL || ! 2295: upb->value < 1 || ! 2296: upb->value > typelen) ! 2297: { ! 2298: err(boundserror); ! 2299: frvexpr((vexpr *) lwb); ! 2300: frvexpr((vexpr *) upb); ! 2301: dataerror = YES; ! 2302: return; ! 2303: } ! 2304: ! 2305: if (lwb->value > upb->value) ! 2306: { ! 2307: err(order); ! 2308: frvexpr((vexpr *) lwb); ! 2309: frvexpr((vexpr *) upb); ! 2310: dataerror = YES; ! 2311: return; ! 2312: } ! 2313: ! 2314: soffset = soffset + lwb->value - 1; ! 2315: typelen = upb->value - lwb->value + 1; ! 2316: frvexpr((vexpr *) lwb); ! 2317: frvexpr((vexpr *) upb); ! 2318: } ! 2319: ! 2320: const = getdatum(); ! 2321: if (const == NULL || !ISCONST(const)) ! 2322: return; ! 2323: ! 2324: const = (Constp) convconst(type, typelen, const); ! 2325: if (const == NULL || !ISCONST(const)) ! 2326: { ! 2327: frexpr((tagptr) const); ! 2328: return; ! 2329: } ! 2330: ! 2331: if (type == TYCHAR) ! 2332: wrtdata(base + soffset, 1, typelen, const->const.ccp); ! 2333: else ! 2334: wrtdata(base + soffset, 1, typelen, packbytes(const)); ! 2335: ! 2336: frexpr((tagptr) const); ! 2337: } ! 2338: else ! 2339: { ! 2340: soffset = 0; ! 2341: k = np->vdim->nelt->constblock.const.ci; ! 2342: while (k > 0 && dataerror == NO) ! 2343: { ! 2344: if (grvals == NULL) ! 2345: { ! 2346: err(toofew); ! 2347: dataerror = YES; ! 2348: } ! 2349: else if (grvals->status != NORMAL) ! 2350: dataerror = YES; ! 2351: else if (grvals-> repl <= 0) ! 2352: { ! 2353: badvalue = 0; ! 2354: frexpr((tagptr) grvals->value); ! 2355: t = grvals; ! 2356: grvals = t->next; ! 2357: free((char *) t); ! 2358: } ! 2359: else ! 2360: { ! 2361: const = grvals->value; ! 2362: if (const == NULL || !ISCONST(const)) ! 2363: { ! 2364: dataerror = YES; ! 2365: } ! 2366: else ! 2367: { ! 2368: const = (Constp) convconst(type, typelen, const); ! 2369: if (const == NULL || !ISCONST(const)) ! 2370: { ! 2371: dataerror = YES; ! 2372: frexpr((tagptr) const); ! 2373: } ! 2374: else ! 2375: { ! 2376: if (k > grvals->repl) ! 2377: repl = grvals->repl; ! 2378: else ! 2379: repl = k; ! 2380: ! 2381: grvals->repl -= repl; ! 2382: k -= repl; ! 2383: ! 2384: if (type == TYCHAR) ! 2385: wrtdata(base+soffset, repl, typelen, const->const.ccp); ! 2386: else ! 2387: wrtdata(base+soffset, repl, typelen, packbytes(const)); ! 2388: ! 2389: soffset = soffset + repl * typelen; ! 2390: ! 2391: frexpr((tagptr) const); ! 2392: } ! 2393: } ! 2394: } ! 2395: } ! 2396: } ! 2397: ! 2398: return; ! 2399: } ! 2400: ! 2401: ! 2402: ! 2403: outdolist(dp) ! 2404: dolist *dp; ! 2405: { ! 2406: static char *zerostep = "zero step in implied-DO"; ! 2407: static char *order = "zero iteration count in implied-DO"; ! 2408: ! 2409: register dvalue *e1, *e2, *e3; ! 2410: register int direction; ! 2411: register dvalue *dv; ! 2412: register int done; ! 2413: register int addin; ! 2414: register int ts; ! 2415: register ftnint tv; ! 2416: ! 2417: e1 = (dvalue *) evalvexpr(dp->init); ! 2418: e2 = (dvalue *) evalvexpr(dp->limit); ! 2419: e3 = (dvalue *) evalvexpr(dp->step); ! 2420: ! 2421: if (e1->status == ERRVAL || ! 2422: e2->status == ERRVAL || ! 2423: e3->status == ERRVAL) ! 2424: { ! 2425: dataerror = YES; ! 2426: goto ret; ! 2427: } ! 2428: ! 2429: if (e1->status == NORMAL) ! 2430: { ! 2431: if (e2->status == NORMAL) ! 2432: { ! 2433: if (e1->value < e2->value) ! 2434: direction = 1; ! 2435: else if (e1->value > e2->value) ! 2436: direction = -1; ! 2437: else ! 2438: direction = 0; ! 2439: } ! 2440: else if (e2->status == MAXPLUS1) ! 2441: direction = 1; ! 2442: else ! 2443: direction = -1; ! 2444: } ! 2445: else if (e1->status == MAXPLUS1) ! 2446: { ! 2447: if (e2->status == MAXPLUS1) ! 2448: direction = 0; ! 2449: else ! 2450: direction = -1; ! 2451: } ! 2452: else ! 2453: { ! 2454: if (e2->status == MINLESS1) ! 2455: direction = 0; ! 2456: else ! 2457: direction = 1; ! 2458: } ! 2459: ! 2460: if (e3->status == NORMAL && e3->value == 0) ! 2461: { ! 2462: err(zerostep); ! 2463: dataerror = YES; ! 2464: goto ret; ! 2465: } ! 2466: else if (e3->status == MAXPLUS1 || ! 2467: (e3->status == NORMAL && e3->value > 0)) ! 2468: { ! 2469: if (direction == -1) ! 2470: { ! 2471: warn(order); ! 2472: goto ret; ! 2473: } ! 2474: } ! 2475: else ! 2476: { ! 2477: if (direction == 1) ! 2478: { ! 2479: warn(order); ! 2480: goto ret; ! 2481: } ! 2482: } ! 2483: ! 2484: dv = (dvalue *) dp->dovar; ! 2485: dv->status = e1->status; ! 2486: dv->value = e1->value; ! 2487: ! 2488: done = NO; ! 2489: while (done == NO && dataerror == NO) ! 2490: { ! 2491: outdata(dp->elts); ! 2492: ! 2493: if (e3->status == NORMAL && dv->status == NORMAL) ! 2494: { ! 2495: addints(e3->value, dv->value); ! 2496: dv->status = rstatus; ! 2497: dv->value = rvalue; ! 2498: } ! 2499: else ! 2500: { ! 2501: if (e3->status != NORMAL) ! 2502: { ! 2503: if (e3->status == MAXPLUS1) ! 2504: addin = MAXPLUS1; ! 2505: else ! 2506: addin = MINLESS1; ! 2507: ts = dv->status; ! 2508: tv = dv->value; ! 2509: } ! 2510: else ! 2511: { ! 2512: if (dv->status == MAXPLUS1) ! 2513: addin = MAXPLUS1; ! 2514: else ! 2515: addin = MINLESS1; ! 2516: ts = e3->status; ! 2517: tv = e3->value; ! 2518: } ! 2519: ! 2520: if (addin == MAXPLUS1) ! 2521: { ! 2522: if (ts == MAXPLUS1 || (ts == NORMAL && tv > 0)) ! 2523: dv->status = ERRVAL; ! 2524: else if (ts == NORMAL && tv == 0) ! 2525: dv->status = MAXPLUS1; ! 2526: else if (ts == NORMAL) ! 2527: { ! 2528: dv->status = NORMAL; ! 2529: dv->value = tv + MAXINT; ! 2530: dv->value++; ! 2531: } ! 2532: else ! 2533: { ! 2534: dv->status = NORMAL; ! 2535: dv->value = 0; ! 2536: } ! 2537: } ! 2538: else ! 2539: { ! 2540: if (ts == MINLESS1 || (ts == NORMAL && tv < 0)) ! 2541: dv->status = ERRVAL; ! 2542: else if (ts == NORMAL && tv == 0) ! 2543: dv->status = MINLESS1; ! 2544: else if (ts == NORMAL) ! 2545: { ! 2546: dv->status = NORMAL; ! 2547: dv->value = tv - MAXINT; ! 2548: dv->value--; ! 2549: } ! 2550: else ! 2551: { ! 2552: dv->status = NORMAL; ! 2553: dv->value = 0; ! 2554: } ! 2555: } ! 2556: } ! 2557: ! 2558: if (dv->status == ERRVAL) ! 2559: done = YES; ! 2560: else if (direction > 0) ! 2561: { ! 2562: if (e2->status == NORMAL) ! 2563: { ! 2564: if (dv->status == MAXPLUS1 || ! 2565: (dv->status == NORMAL && dv->value > e2->value)) ! 2566: done = YES; ! 2567: } ! 2568: } ! 2569: else if (direction < 0) ! 2570: { ! 2571: if (e2->status == NORMAL) ! 2572: { ! 2573: if (dv->status == MINLESS1 || ! 2574: (dv->status == NORMAL && dv->value < e2->value)) ! 2575: done = YES; ! 2576: } ! 2577: } ! 2578: else ! 2579: done = YES; ! 2580: } ! 2581: ! 2582: ret: ! 2583: frvexpr((vexpr *) e1); ! 2584: frvexpr((vexpr *) e2); ! 2585: frvexpr((vexpr *) e3); ! 2586: return; ! 2587: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.