Annotation of 43BSDReno/pgrm/dbx/pascal.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.