|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that: (1) source distributions retain this entire copyright ! 7: * notice and comment, and (2) distributions including binaries display ! 8: * the following acknowledgement: ``This product includes software ! 9: * developed by the University of California, Berkeley and its contributors'' ! 10: * in the documentation or other materials provided with the distribution ! 11: * and in all advertising materials mentioning features or use of this ! 12: * software. Neither the name of the University nor the names of its ! 13: * contributors may be used to endorse or promote products derived ! 14: * from this software without specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char sccsid[] = "@(#)pascal.c 5.3 (Berkeley) 6/1/90"; ! 22: #endif /* not lint */ ! 23: ! 24: /* ! 25: * Pascal-dependent symbol routines. ! 26: */ ! 27: ! 28: #include "defs.h" ! 29: #include "symbols.h" ! 30: #include "pascal.h" ! 31: #include "languages.h" ! 32: #include "tree.h" ! 33: #include "eval.h" ! 34: #include "mappings.h" ! 35: #include "process.h" ! 36: #include "runtime.h" ! 37: #include "machine.h" ! 38: ! 39: #ifndef public ! 40: #endif ! 41: ! 42: private Language pasc; ! 43: private boolean initialized; ! 44: ! 45: /* ! 46: * Initialize Pascal information. ! 47: */ ! 48: ! 49: public pascal_init() ! 50: { ! 51: pasc = language_define("pascal", ".p"); ! 52: language_setop(pasc, L_PRINTDECL, pascal_printdecl); ! 53: language_setop(pasc, L_PRINTVAL, pascal_printval); ! 54: language_setop(pasc, L_TYPEMATCH, pascal_typematch); ! 55: language_setop(pasc, L_BUILDAREF, pascal_buildaref); ! 56: language_setop(pasc, L_EVALAREF, pascal_evalaref); ! 57: language_setop(pasc, L_MODINIT, pascal_modinit); ! 58: language_setop(pasc, L_HASMODULES, pascal_hasmodules); ! 59: language_setop(pasc, L_PASSADDR, pascal_passaddr); ! 60: initialized = false; ! 61: } ! 62: ! 63: /* ! 64: * Typematch tests if two types are compatible. The issue ! 65: * is a bit complicated, so several subfunctions are used for ! 66: * various kinds of compatibility. ! 67: */ ! 68: ! 69: private boolean builtinmatch (t1, t2) ! 70: register Symbol t1, t2; ! 71: { ! 72: boolean b; ! 73: ! 74: b = (boolean) ( ! 75: ( ! 76: t2 == t_int->type and ! 77: t1->class == RANGE and istypename(t1->type, "integer") ! 78: ) or ( ! 79: t2 == t_char->type and ! 80: t1->class == RANGE and istypename(t1->type, "char") ! 81: ) or ( ! 82: t2 == t_real->type and ! 83: t1->class == RANGE and istypename(t1->type, "real") ! 84: ) or ( ! 85: t2 == t_boolean->type and ! 86: t1->class == RANGE and istypename(t1->type, "boolean") ! 87: ) ! 88: ); ! 89: return b; ! 90: } ! 91: ! 92: private boolean rangematch (t1, t2) ! 93: register Symbol t1, t2; ! 94: { ! 95: boolean b; ! 96: register Symbol rt1, rt2; ! 97: ! 98: if (t1->class == RANGE and t2->class == RANGE) { ! 99: rt1 = rtype(t1->type); ! 100: rt2 = rtype(t2->type); ! 101: b = (boolean) (rt1->type == rt2->type); ! 102: } else { ! 103: b = false; ! 104: } ! 105: return b; ! 106: } ! 107: ! 108: private boolean nilMatch (t1, t2) ! 109: register Symbol t1, t2; ! 110: { ! 111: boolean b; ! 112: ! 113: b = (boolean) ( ! 114: (t1 == t_nil and t2->class == PTR) or ! 115: (t1->class == PTR and t2 == t_nil) ! 116: ); ! 117: return b; ! 118: } ! 119: ! 120: private boolean enumMatch (t1, t2) ! 121: register Symbol t1, t2; ! 122: { ! 123: boolean b; ! 124: ! 125: b = (boolean) ( ! 126: (t1->class == SCAL and t2->class == CONST and t2->type == t1) or ! 127: (t1->class == CONST and t2->class == SCAL and t1->type == t2) ! 128: ); ! 129: return b; ! 130: } ! 131: ! 132: private boolean isConstString (t) ! 133: register Symbol t; ! 134: { ! 135: boolean b; ! 136: ! 137: b = (boolean) ( ! 138: t->language == primlang and t->class == ARRAY and t->type == t_char ! 139: ); ! 140: return b; ! 141: } ! 142: ! 143: private boolean stringArrayMatch (t1, t2) ! 144: register Symbol t1, t2; ! 145: { ! 146: boolean b; ! 147: ! 148: b = (boolean) ( ! 149: ( ! 150: isConstString(t1) and ! 151: t2->class == ARRAY and compatible(t2->type, t_char->type) ! 152: ) or ( ! 153: isConstString(t2) and ! 154: t1->class == ARRAY and compatible(t1->type, t_char->type) ! 155: ) ! 156: ); ! 157: return b; ! 158: } ! 159: ! 160: public boolean pascal_typematch (type1, type2) ! 161: Symbol type1, type2; ! 162: { ! 163: boolean b; ! 164: Symbol t1, t2, tmp; ! 165: ! 166: t1 = rtype(type1); ! 167: t2 = rtype(type2); ! 168: if (t1 == t2) { ! 169: b = true; ! 170: } else { ! 171: if (t1 == t_char->type or t1 == t_int->type or ! 172: t1 == t_real->type or t1 == t_boolean->type ! 173: ) { ! 174: tmp = t1; ! 175: t1 = t2; ! 176: t2 = tmp; ! 177: } ! 178: b = (Boolean) ( ! 179: builtinmatch(t1, t2) or rangematch(t1, t2) or ! 180: nilMatch(t1, t2) or enumMatch(t1, t2) or ! 181: stringArrayMatch(t1, t2) ! 182: ); ! 183: } ! 184: return b; ! 185: } ! 186: ! 187: /* ! 188: * Indent n spaces. ! 189: */ ! 190: ! 191: private indent (n) ! 192: int n; ! 193: { ! 194: if (n > 0) { ! 195: printf("%*c", n, ' '); ! 196: } ! 197: } ! 198: ! 199: public pascal_printdecl (s) ! 200: Symbol s; ! 201: { ! 202: register Symbol t; ! 203: Boolean semicolon; ! 204: ! 205: semicolon = true; ! 206: if (s->class == TYPEREF) { ! 207: resolveRef(t); ! 208: } ! 209: switch (s->class) { ! 210: case CONST: ! 211: if (s->type->class == SCAL) { ! 212: semicolon = false; ! 213: printf("enum constant, ord "); ! 214: eval(s->symvalue.constval); ! 215: pascal_printval(s); ! 216: } else { ! 217: printf("const %s = ", symname(s)); ! 218: eval(s->symvalue.constval); ! 219: pascal_printval(s); ! 220: } ! 221: break; ! 222: ! 223: case TYPE: ! 224: printf("type %s = ", symname(s)); ! 225: printtype(s, s->type, 0); ! 226: break; ! 227: ! 228: case TYPEREF: ! 229: printf("type %s", symname(s)); ! 230: break; ! 231: ! 232: case VAR: ! 233: if (isparam(s)) { ! 234: printf("(parameter) %s : ", symname(s)); ! 235: } else { ! 236: printf("var %s : ", symname(s)); ! 237: } ! 238: printtype(s, s->type, 0); ! 239: break; ! 240: ! 241: case REF: ! 242: printf("(var parameter) %s : ", symname(s)); ! 243: printtype(s, s->type, 0); ! 244: break; ! 245: ! 246: case RANGE: ! 247: case ARRAY: ! 248: case RECORD: ! 249: case VARNT: ! 250: case PTR: ! 251: case FILET: ! 252: printtype(s, s, 0); ! 253: semicolon = false; ! 254: break; ! 255: ! 256: case FVAR: ! 257: printf("(function variable) %s : ", symname(s)); ! 258: printtype(s, s->type, 0); ! 259: break; ! 260: ! 261: case FIELD: ! 262: printf("(field) %s : ", symname(s)); ! 263: printtype(s, s->type, 0); ! 264: break; ! 265: ! 266: case PROC: ! 267: printf("procedure %s", symname(s)); ! 268: listparams(s); ! 269: break; ! 270: ! 271: case PROG: ! 272: printf("program %s", symname(s)); ! 273: listparams(s); ! 274: break; ! 275: ! 276: case FUNC: ! 277: printf("function %s", symname(s)); ! 278: listparams(s); ! 279: printf(" : "); ! 280: printtype(s, s->type, 0); ! 281: break; ! 282: ! 283: case MODULE: ! 284: printf("module %s", symname(s)); ! 285: break; ! 286: ! 287: /* ! 288: * the parameter list of the following should be printed ! 289: * eventually ! 290: */ ! 291: case FPROC: ! 292: printf("procedure %s()", symname(s)); ! 293: break; ! 294: ! 295: case FFUNC: ! 296: printf("function %s()", symname(s)); ! 297: break; ! 298: ! 299: default: ! 300: printf("%s : (class %s)", symname(s), classname(s)); ! 301: break; ! 302: } ! 303: if (semicolon) { ! 304: putchar(';'); ! 305: } ! 306: putchar('\n'); ! 307: } ! 308: ! 309: /* ! 310: * Recursive whiz-bang procedure to print the type portion ! 311: * of a declaration. ! 312: * ! 313: * The symbol associated with the type is passed to allow ! 314: * searching for type names without getting "type blah = blah". ! 315: */ ! 316: ! 317: private printtype (s, t, n) ! 318: Symbol s; ! 319: Symbol t; ! 320: int n; ! 321: { ! 322: register Symbol tmp; ! 323: ! 324: if (t->class == TYPEREF) { ! 325: resolveRef(t); ! 326: } ! 327: switch (t->class) { ! 328: case VAR: ! 329: case CONST: ! 330: case FUNC: ! 331: case PROC: ! 332: panic("printtype: class %s", classname(t)); ! 333: break; ! 334: ! 335: case ARRAY: ! 336: printf("array["); ! 337: tmp = t->chain; ! 338: if (tmp != nil) { ! 339: for (;;) { ! 340: printtype(tmp, tmp, n); ! 341: tmp = tmp->chain; ! 342: if (tmp == nil) { ! 343: break; ! 344: } ! 345: printf(", "); ! 346: } ! 347: } ! 348: printf("] of "); ! 349: printtype(t, t->type, n); ! 350: break; ! 351: ! 352: case RECORD: ! 353: printRecordDecl(t, n); ! 354: break; ! 355: ! 356: case FIELD: ! 357: if (t->chain != nil) { ! 358: printtype(t->chain, t->chain, n); ! 359: } ! 360: printf("\t%s : ", symname(t)); ! 361: printtype(t, t->type, n); ! 362: printf(";\n"); ! 363: break; ! 364: ! 365: case RANGE: ! 366: printRangeDecl(t); ! 367: break; ! 368: ! 369: case PTR: ! 370: printf("^"); ! 371: printtype(t, t->type, n); ! 372: break; ! 373: ! 374: case TYPE: ! 375: if (t->name != nil and ident(t->name)[0] != '\0') { ! 376: printname(stdout, t); ! 377: } else { ! 378: printtype(t, t->type, n); ! 379: } ! 380: break; ! 381: ! 382: case SCAL: ! 383: printEnumDecl(t, n); ! 384: break; ! 385: ! 386: case SET: ! 387: printf("set of "); ! 388: printtype(t, t->type, n); ! 389: break; ! 390: ! 391: case FILET: ! 392: printf("file of "); ! 393: printtype(t, t->type, n); ! 394: break; ! 395: ! 396: case TYPEREF: ! 397: break; ! 398: ! 399: case FPROC: ! 400: printf("procedure"); ! 401: break; ! 402: ! 403: case FFUNC: ! 404: printf("function"); ! 405: break; ! 406: ! 407: default: ! 408: printf("(class %d)", t->class); ! 409: break; ! 410: } ! 411: } ! 412: ! 413: /* ! 414: * Print out a record declaration. ! 415: */ ! 416: ! 417: private printRecordDecl (t, n) ! 418: Symbol t; ! 419: int n; ! 420: { ! 421: register Symbol f; ! 422: ! 423: if (t->chain == nil) { ! 424: printf("record end"); ! 425: } else { ! 426: printf("record\n"); ! 427: for (f = t->chain; f != nil; f = f->chain) { ! 428: indent(n+4); ! 429: printf("%s : ", symname(f)); ! 430: printtype(f->type, f->type, n+4); ! 431: printf(";\n"); ! 432: } ! 433: indent(n); ! 434: printf("end"); ! 435: } ! 436: } ! 437: ! 438: /* ! 439: * Print out the declaration of a range type. ! 440: */ ! 441: ! 442: private printRangeDecl (t) ! 443: Symbol t; ! 444: { ! 445: long r0, r1; ! 446: ! 447: r0 = t->symvalue.rangev.lower; ! 448: r1 = t->symvalue.rangev.upper; ! 449: if (t == t_char or istypename(t, "char")) { ! 450: if (r0 < 0x20 or r0 > 0x7e) { ! 451: printf("%ld..", r0); ! 452: } else { ! 453: printf("'%c'..", (char) r0); ! 454: } ! 455: if (r1 < 0x20 or r1 > 0x7e) { ! 456: printf("\\%lo", r1); ! 457: } else { ! 458: printf("'%c'", (char) r1); ! 459: } ! 460: } else if (r0 > 0 and r1 == 0) { ! 461: printf("%ld byte real", r0); ! 462: } else if (r0 >= 0) { ! 463: printf("%lu..%lu", r0, r1); ! 464: } else { ! 465: printf("%ld..%ld", r0, r1); ! 466: } ! 467: } ! 468: ! 469: /* ! 470: * Print out an enumeration declaration. ! 471: */ ! 472: ! 473: private printEnumDecl (e, n) ! 474: Symbol e; ! 475: int n; ! 476: { ! 477: Symbol t; ! 478: ! 479: printf("("); ! 480: t = e->chain; ! 481: if (t != nil) { ! 482: printf("%s", symname(t)); ! 483: t = t->chain; ! 484: while (t != nil) { ! 485: printf(", %s", symname(t)); ! 486: t = t->chain; ! 487: } ! 488: } ! 489: printf(")"); ! 490: } ! 491: ! 492: /* ! 493: * List the parameters of a procedure or function. ! 494: * No attempt is made to combine like types. ! 495: */ ! 496: ! 497: private listparams(s) ! 498: Symbol s; ! 499: { ! 500: Symbol t; ! 501: ! 502: if (s->chain != nil) { ! 503: putchar('('); ! 504: for (t = s->chain; t != nil; t = t->chain) { ! 505: switch (t->class) { ! 506: case REF: ! 507: printf("var "); ! 508: break; ! 509: ! 510: case VAR: ! 511: break; ! 512: ! 513: default: ! 514: panic("unexpected class %d for parameter", t->class); ! 515: } ! 516: printf("%s : ", symname(t)); ! 517: printtype(t, t->type); ! 518: if (t->chain != nil) { ! 519: printf("; "); ! 520: } ! 521: } ! 522: putchar(')'); ! 523: } ! 524: } ! 525: ! 526: /* ! 527: * Print out the value on the top of the expression stack ! 528: * in the format for the type of the given symbol. ! 529: */ ! 530: ! 531: public pascal_printval (s) ! 532: Symbol s; ! 533: { ! 534: prval(s, size(s)); ! 535: } ! 536: ! 537: private prval (s, n) ! 538: Symbol s; ! 539: integer n; ! 540: { ! 541: Symbol t; ! 542: Address a; ! 543: integer len; ! 544: double r; ! 545: integer i; ! 546: ! 547: if (s->class == TYPEREF) { ! 548: resolveRef(s); ! 549: } ! 550: switch (s->class) { ! 551: case CONST: ! 552: case TYPE: ! 553: case REF: ! 554: case VAR: ! 555: case FVAR: ! 556: case TAG: ! 557: prval(s->type, n); ! 558: break; ! 559: ! 560: case FIELD: ! 561: prval(s->type, n); ! 562: break; ! 563: ! 564: case ARRAY: ! 565: t = rtype(s->type); ! 566: if (t == t_char->type or ! 567: (t->class == RANGE and istypename(t->type, "char")) ! 568: ) { ! 569: len = size(s); ! 570: sp -= len; ! 571: printf("'%.*s'", len, sp); ! 572: break; ! 573: } else { ! 574: printarray(s); ! 575: } ! 576: break; ! 577: ! 578: case RECORD: ! 579: printrecord(s); ! 580: break; ! 581: ! 582: case VARNT: ! 583: printf("[variant]"); ! 584: break; ! 585: ! 586: case RANGE: ! 587: printrange(s, n); ! 588: break; ! 589: ! 590: case FILET: ! 591: a = pop(Address); ! 592: if (a == 0) { ! 593: printf("nil"); ! 594: } else { ! 595: printf("0x%x", a); ! 596: } ! 597: break; ! 598: ! 599: case PTR: ! 600: a = pop(Address); ! 601: if (a == 0) { ! 602: printf("nil"); ! 603: } else { ! 604: printf("0x%x", a); ! 605: } ! 606: break; ! 607: ! 608: case SCAL: ! 609: i = 0; ! 610: popn(n, &i); ! 611: if (s->symvalue.iconval < 256) { ! 612: i &= 0xff; ! 613: } else if (s->symvalue.iconval < 65536) { ! 614: i &= 0xffff; ! 615: } ! 616: printEnum(i, s); ! 617: break; ! 618: ! 619: case FPROC: ! 620: case FFUNC: ! 621: a = pop(long); ! 622: t = whatblock(a); ! 623: if (t == nil) { ! 624: printf("(proc 0x%x)", a); ! 625: } else { ! 626: printf("%s", symname(t)); ! 627: } ! 628: break; ! 629: ! 630: case SET: ! 631: printSet(s); ! 632: break; ! 633: ! 634: default: ! 635: if (ord(s->class) < ord(BADUSE) or ord(s->class) > ord(TYPEREF)) { ! 636: panic("printval: bad class %d", ord(s->class)); ! 637: } ! 638: printf("[%s]", classname(s)); ! 639: break; ! 640: } ! 641: } ! 642: ! 643: /* ! 644: * Print out the value of a scalar (non-enumeration) type. ! 645: */ ! 646: ! 647: private printrange (s, n) ! 648: Symbol s; ! 649: integer n; ! 650: { ! 651: double d; ! 652: float f; ! 653: integer i; ! 654: ! 655: if (s->symvalue.rangev.upper == 0 and s->symvalue.rangev.lower > 0) { ! 656: if (n == sizeof(float)) { ! 657: popn(n, &f); ! 658: d = f; ! 659: } else { ! 660: popn(n, &d); ! 661: } ! 662: prtreal(d); ! 663: } else { ! 664: i = 0; ! 665: popn(n, &i); ! 666: printRangeVal(i, s); ! 667: } ! 668: } ! 669: ! 670: /* ! 671: * Print out a set. ! 672: */ ! 673: ! 674: private printSet (s) ! 675: Symbol s; ! 676: { ! 677: Symbol t; ! 678: integer nbytes; ! 679: ! 680: nbytes = size(s); ! 681: t = rtype(s->type); ! 682: printf("["); ! 683: sp -= nbytes; ! 684: if (t->class == SCAL) { ! 685: printSetOfEnum(t); ! 686: } else if (t->class == RANGE) { ! 687: printSetOfRange(t); ! 688: } else { ! 689: error("internal error: expected range or enumerated base type for set"); ! 690: } ! 691: printf("]"); ! 692: } ! 693: ! 694: /* ! 695: * Print out a set of an enumeration. ! 696: */ ! 697: ! 698: private printSetOfEnum (t) ! 699: Symbol t; ! 700: { ! 701: register Symbol e; ! 702: register integer i, j, *p; ! 703: boolean first; ! 704: ! 705: p = (int *) sp; ! 706: i = *p; ! 707: j = 0; ! 708: e = t->chain; ! 709: first = true; ! 710: while (e != nil) { ! 711: if ((i&1) == 1) { ! 712: if (first) { ! 713: first = false; ! 714: printf("%s", symname(e)); ! 715: } else { ! 716: printf(", %s", symname(e)); ! 717: } ! 718: } ! 719: i >>= 1; ! 720: ++j; ! 721: if (j >= sizeof(integer)*BITSPERBYTE) { ! 722: j = 0; ! 723: ++p; ! 724: i = *p; ! 725: } ! 726: e = e->chain; ! 727: } ! 728: } ! 729: ! 730: /* ! 731: * Print out a set of a subrange type. ! 732: */ ! 733: ! 734: private printSetOfRange (t) ! 735: Symbol t; ! 736: { ! 737: register integer i, j, *p; ! 738: long v; ! 739: boolean first; ! 740: ! 741: p = (int *) sp; ! 742: i = *p; ! 743: j = 0; ! 744: v = t->symvalue.rangev.lower; ! 745: first = true; ! 746: while (v <= t->symvalue.rangev.upper) { ! 747: if ((i&1) == 1) { ! 748: if (first) { ! 749: first = false; ! 750: printf("%ld", v); ! 751: } else { ! 752: printf(", %ld", v); ! 753: } ! 754: } ! 755: i >>= 1; ! 756: ++j; ! 757: if (j >= sizeof(integer)*BITSPERBYTE) { ! 758: j = 0; ! 759: ++p; ! 760: i = *p; ! 761: } ! 762: ++v; ! 763: } ! 764: } ! 765: ! 766: /* ! 767: * Construct a node for subscripting. ! 768: */ ! 769: ! 770: public Node pascal_buildaref (a, slist) ! 771: Node a, slist; ! 772: { ! 773: register Symbol t; ! 774: register Node p; ! 775: Symbol etype, atype, eltype; ! 776: Node esub, r; ! 777: ! 778: t = rtype(a->nodetype); ! 779: if (t->class != ARRAY) { ! 780: beginerrmsg(); ! 781: prtree(stderr, a); ! 782: fprintf(stderr, " is not an array"); ! 783: enderrmsg(); ! 784: } else { ! 785: r = a; ! 786: eltype = t->type; ! 787: p = slist; ! 788: t = t->chain; ! 789: for (; p != nil and t != nil; p = p->value.arg[1], t = t->chain) { ! 790: esub = p->value.arg[0]; ! 791: etype = rtype(esub->nodetype); ! 792: atype = rtype(t); ! 793: if (not compatible(atype, etype)) { ! 794: beginerrmsg(); ! 795: fprintf(stderr, "subscript "); ! 796: prtree(stderr, esub); ! 797: fprintf(stderr, " is the wrong type"); ! 798: enderrmsg(); ! 799: } ! 800: r = build(O_INDEX, r, esub); ! 801: r->nodetype = eltype; ! 802: } ! 803: if (p != nil or t != nil) { ! 804: beginerrmsg(); ! 805: if (p != nil) { ! 806: fprintf(stderr, "too many subscripts for "); ! 807: } else { ! 808: fprintf(stderr, "not enough subscripts for "); ! 809: } ! 810: prtree(stderr, a); ! 811: enderrmsg(); ! 812: } ! 813: } ! 814: return r; ! 815: } ! 816: ! 817: /* ! 818: * Evaluate a subscript index. ! 819: */ ! 820: ! 821: public pascal_evalaref (s, base, i) ! 822: Symbol s; ! 823: Address base; ! 824: long i; ! 825: { ! 826: Symbol t; ! 827: long lb, ub; ! 828: ! 829: t = rtype(s); ! 830: s = rtype(t->chain); ! 831: findbounds(s, &lb, &ub); ! 832: if (i < lb or i > ub) { ! 833: error("subscript %d out of range [%d..%d]", i, lb, ub); ! 834: } ! 835: push(long, base + (i - lb) * size(t->type)); ! 836: } ! 837: ! 838: /* ! 839: * Initial Pascal type information. ! 840: */ ! 841: ! 842: #define NTYPES 4 ! 843: ! 844: private Symbol inittype[NTYPES + 1]; ! 845: ! 846: private addType (n, s, lower, upper) ! 847: integer n; ! 848: String s; ! 849: long lower, upper; ! 850: { ! 851: register Symbol t; ! 852: ! 853: if (n > NTYPES) { ! 854: panic("initial Pascal type number too large for '%s'", s); ! 855: } ! 856: t = insert(identname(s, true)); ! 857: t->language = pasc; ! 858: t->class = TYPE; ! 859: t->type = newSymbol(nil, 0, RANGE, t, nil); ! 860: t->type->symvalue.rangev.lower = lower; ! 861: t->type->symvalue.rangev.upper = upper; ! 862: t->type->language = pasc; ! 863: inittype[n] = t; ! 864: } ! 865: ! 866: private initTypes () ! 867: { ! 868: addType(1, "boolean", 0L, 1L); ! 869: addType(2, "char", 0L, 255L); ! 870: addType(3, "integer", 0x80000000L, 0x7fffffffL); ! 871: addType(4, "real", 8L, 0L); ! 872: initialized = true; ! 873: } ! 874: ! 875: /* ! 876: * Initialize typetable. ! 877: */ ! 878: ! 879: public pascal_modinit (typetable) ! 880: Symbol typetable[]; ! 881: { ! 882: register integer i; ! 883: ! 884: if (not initialized) { ! 885: initTypes(); ! 886: initialized = true; ! 887: } ! 888: for (i = 1; i <= NTYPES; i++) { ! 889: typetable[i] = inittype[i]; ! 890: } ! 891: } ! 892: ! 893: public boolean pascal_hasmodules () ! 894: { ! 895: return false; ! 896: } ! 897: ! 898: public boolean pascal_passaddr (param, exprtype) ! 899: Symbol param, exprtype; ! 900: { ! 901: return false; ! 902: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.