Annotation of 43BSDTahoe/lib/old_compiler/dbx/pascal.c, revision 1.1

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

unix.superglobalmegacorp.com

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