Annotation of 42BSD/ucb/dbx/pascal.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1982 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)pascal.c 1.2 12/15/82";
                      4: 
                      5: /*
                      6:  * Pascal-dependent symbol routines.
                      7:  */
                      8: 
                      9: #include "defs.h"
                     10: #include "symbols.h"
                     11: #include "pascal.h"
                     12: #include "languages.h"
                     13: #include "tree.h"
                     14: #include "eval.h"
                     15: #include "mappings.h"
                     16: #include "process.h"
                     17: #include "runtime.h"
                     18: #include "machine.h"
                     19: 
                     20: #ifndef public
                     21: #endif
                     22: 
                     23: /*
                     24:  * Initialize Pascal information.
                     25:  */
                     26: 
                     27: public pascal_init()
                     28: {
                     29:     Language lang;
                     30: 
                     31:     lang = language_define("pascal", ".p");
                     32:     language_setop(lang, L_PRINTDECL, pascal_printdecl);
                     33:     language_setop(lang, L_PRINTVAL, pascal_printval);
                     34:     language_setop(lang, L_TYPEMATCH, pascal_typematch);
                     35: }
                     36: 
                     37: /*
                     38:  * Compatible tests if two types are compatible.  The issue
                     39:  * is complicated a bit by ranges.
                     40:  *
                     41:  * Integers and reals are not compatible since they cannot always be mixed.
                     42:  */
                     43: 
                     44: public Boolean pascal_typematch(type1, type2)
                     45: Symbol type1, type2;
                     46: {
                     47:     Boolean b;
                     48:     register Symbol t1, t2;
                     49: 
                     50:     t1 = rtype(t1);
                     51:     t2 = rtype(t2);
                     52:     b = (Boolean)
                     53:        (t1->type == t2->type and (
                     54:            (t1->class == RANGE and t2->class == RANGE) or
                     55:            (t1->class == SCAL and t2->class == CONST) or
                     56:            (t1->class == CONST and t2->class == SCAL) or
                     57:            (t1->type == t_char and t1->class == ARRAY and t2->class == ARRAY)
                     58:        ) or
                     59:        (t1 == t_nil and t2->class == PTR) or
                     60:        (t1->class == PTR and t2 == t_nil)
                     61:     );
                     62:     return b;
                     63: }
                     64: 
                     65: public pascal_printdecl(s)
                     66: Symbol s;
                     67: {
                     68:     register Symbol t;
                     69:     Boolean semicolon;
                     70: 
                     71:     semicolon = true;
                     72:     switch (s->class) {
                     73:        case CONST:
                     74:            if (s->type->class == SCAL) {
                     75:                printf("(enumeration constant, ord %ld)",
                     76:                    s->symvalue.iconval);
                     77:            } else {
                     78:                printf("const %s = ", symname(s));
                     79:                printval(s);
                     80:            }
                     81:            break;
                     82: 
                     83:        case TYPE:
                     84:            printf("type %s = ", symname(s));
                     85:            printtype(s, s->type);
                     86:            break;
                     87: 
                     88:        case VAR:
                     89:            if (isparam(s)) {
                     90:                printf("(parameter) %s : ", symname(s));
                     91:            } else {
                     92:                printf("var %s : ", symname(s));
                     93:            }
                     94:            printtype(s, s->type);
                     95:            break;
                     96: 
                     97:        case REF:
                     98:            printf("(var parameter) %s : ", symname(s));
                     99:            printtype(s, s->type);
                    100:            break;
                    101: 
                    102:        case RANGE:
                    103:        case ARRAY:
                    104:        case RECORD:
                    105:        case VARNT:
                    106:        case PTR:
                    107:            printtype(s, s);
                    108:            semicolon = false;
                    109:            break;
                    110: 
                    111:        case FVAR:
                    112:            printf("(function variable) %s : ", symname(s));
                    113:            printtype(s, s->type);
                    114:            break;
                    115: 
                    116:        case FIELD:
                    117:            printf("(field) %s : ", symname(s));
                    118:            printtype(s, s->type);
                    119:            break;
                    120: 
                    121:        case PROC:
                    122:            printf("procedure %s", symname(s));
                    123:            listparams(s);
                    124:            break;
                    125: 
                    126:        case PROG:
                    127:            printf("program %s", symname(s));
                    128:            t = s->chain;
                    129:            if (t != nil) {
                    130:                printf("(%s", symname(t));
                    131:                for (t = t->chain; t != nil; t = t->chain) {
                    132:                    printf(", %s", symname(t));
                    133:                }
                    134:                printf(")");
                    135:            }
                    136:            break;
                    137: 
                    138:        case FUNC:
                    139:            printf("function %s", symname(s));
                    140:            listparams(s);
                    141:            printf(" : ");
                    142:            printtype(s, s->type);
                    143:            break;
                    144: 
                    145:        default:
                    146:            error("class %s in printdecl", classname(s));
                    147:     }
                    148:     if (semicolon) {
                    149:        putchar(';');
                    150:     }
                    151:     putchar('\n');
                    152: }
                    153: 
                    154: /*
                    155:  * Recursive whiz-bang procedure to print the type portion
                    156:  * of a declaration.  Doesn't work quite right for variant records.
                    157:  *
                    158:  * The symbol associated with the type is passed to allow
                    159:  * searching for type names without getting "type blah = blah".
                    160:  */
                    161: 
                    162: private printtype(s, t)
                    163: Symbol s;
                    164: Symbol t;
                    165: {
                    166:     register Symbol tmp;
                    167: 
                    168:     switch (t->class) {
                    169:        case VAR:
                    170:        case CONST:
                    171:        case FUNC:
                    172:        case PROC:
                    173:            panic("printtype: class %s", classname(t));
                    174:            break;
                    175: 
                    176:        case ARRAY:
                    177:            printf("array[");
                    178:            tmp = t->chain;
                    179:            if (tmp != nil) {
                    180:                for (;;) {
                    181:                    printtype(tmp, tmp);
                    182:                    tmp = tmp->chain;
                    183:                    if (tmp == nil) {
                    184:                        break;
                    185:                    }
                    186:                    printf(", ");
                    187:                }
                    188:            }
                    189:            printf("] of ");
                    190:            printtype(t, t->type);
                    191:            break;
                    192: 
                    193:        case RECORD:
                    194:            printf("record\n");
                    195:            if (t->chain != nil) {
                    196:                printtype(t->chain, t->chain);
                    197:            }
                    198:            printf("end");
                    199:            break;
                    200: 
                    201:        case FIELD:
                    202:            if (t->chain != nil) {
                    203:                printtype(t->chain, t->chain);
                    204:            }
                    205:            printf("\t%s : ", symname(t));
                    206:            printtype(t, t->type);
                    207:            printf(";\n");
                    208:            break;
                    209: 
                    210:        case RANGE: {
                    211:            long r0, r1;
                    212: 
                    213:            r0 = t->symvalue.rangev.lower;
                    214:            r1 = t->symvalue.rangev.upper;
                    215:            if (t == t_char) {
                    216:                if (r0 < 0x20 or r0 > 0x7e) {
                    217:                    printf("%ld..", r0);
                    218:                } else {
                    219:                    printf("'%c'..", (char) r0);
                    220:                }
                    221:                if (r1 < 0x20 or r1 > 0x7e) {
                    222:                    printf("\\%lo", r1);
                    223:                } else {
                    224:                    printf("'%c'", (char) r1);
                    225:                }
                    226:            } else if (r0 > 0 and r1 == 0) {
                    227:                printf("%ld byte real", r0);
                    228:            } else if (r0 >= 0) {
                    229:                printf("%lu..%lu", r0, r1);
                    230:            } else {
                    231:                printf("%ld..%ld", r0, r1);
                    232:            }
                    233:            break;
                    234:        }
                    235: 
                    236:        case PTR:
                    237:            putchar('*');
                    238:            printtype(t, t->type);
                    239:            break;
                    240: 
                    241:        case TYPE:
                    242:            if (symname(t) != nil) {
                    243:                printf("%s", symname(t));
                    244:            } else {
                    245:                printtype(t, t->type);
                    246:            }
                    247:            break;
                    248: 
                    249:        case SCAL:
                    250:            printf("(");
                    251:            t = t->type->chain;
                    252:            if (t != nil) {
                    253:                printf("%s", symname(t));
                    254:                t = t->chain;
                    255:                while (t != nil) {
                    256:                    printf(", %s", symname(t));
                    257:                    t = t->chain;
                    258:                }
                    259:            } else {
                    260:                panic("empty enumeration");
                    261:            }
                    262:            printf(")");
                    263:            break;
                    264: 
                    265:        default:
                    266:            printf("(class %d)", t->class);
                    267:            break;
                    268:     }
                    269: }
                    270: 
                    271: /*
                    272:  * List the parameters of a procedure or function.
                    273:  * No attempt is made to combine like types.
                    274:  */
                    275: 
                    276: private listparams(s)
                    277: Symbol s;
                    278: {
                    279:     Symbol t;
                    280: 
                    281:     if (s->chain != nil) {
                    282:        putchar('(');
                    283:        for (t = s->chain; t != nil; t = t->chain) {
                    284:            switch (t->class) {
                    285:                case REF:
                    286:                    printf("var ");
                    287:                    break;
                    288: 
                    289:                case FPROC:
                    290:                    printf("procedure ");
                    291:                    break;
                    292: 
                    293:                case FFUNC:
                    294:                    printf("function ");
                    295:                    break;
                    296: 
                    297:                case VAR:
                    298:                    break;
                    299: 
                    300:                default:
                    301:                    panic("unexpected class %d for parameter", t->class);
                    302:            }
                    303:            printf("%s : ", symname(t));
                    304:            printtype(t, t->type);
                    305:            if (t->chain != nil) {
                    306:                printf("; ");
                    307:            }
                    308:        }
                    309:        putchar(')');
                    310:     }
                    311: }
                    312: 
                    313: /*
                    314:  * Print out the value on the top of the expression stack
                    315:  * in the format for the type of the given symbol.
                    316:  */
                    317: 
                    318: public pascal_printval(s)
                    319: Symbol s;
                    320: {
                    321:     Symbol t;
                    322:     Address a;
                    323:     int len;
                    324:     double r;
                    325: 
                    326:     if (s->class == REF) {
                    327:        s = s->type;
                    328:     }
                    329:     switch (s->class) {
                    330:        case TYPE:
                    331:            pascal_printval(s->type);
                    332:            break;
                    333: 
                    334:        case ARRAY:
                    335:            t = rtype(s->type);
                    336:            if (t==t_char or (t->class==RANGE and t->type==t_char)) {
                    337:                len = size(s);
                    338:                sp -= len;
                    339:                printf("'%.*s'", len, sp);
                    340:                break;
                    341:            } else {
                    342:                printarray(s);
                    343:            }
                    344:            break;
                    345: 
                    346:        case RECORD:
                    347:            printrecord(s);
                    348:            break;
                    349: 
                    350:        case VARNT:
                    351:            error("can't print out variant records");
                    352:            break;
                    353: 
                    354: 
                    355:        case RANGE:
                    356:            if (s == t_boolean) {
                    357:                printf(((Boolean) popsmall(s)) == true ? "true" : "false");
                    358:            } else if (s == t_char) {
                    359:                printf("'%c'", pop(char));
                    360:            } else if (s->symvalue.rangev.upper == 0 and
                    361:                        s->symvalue.rangev.lower > 0) {
                    362:                switch (s->symvalue.rangev.lower) {
                    363:                    case sizeof(float):
                    364:                        prtreal(pop(float));
                    365:                        break;
                    366: 
                    367:                    case sizeof(double):
                    368:                        prtreal(pop(double));
                    369:                        break;
                    370: 
                    371:                    default:
                    372:                        panic("bad real size %d", s->symvalue.rangev.lower);
                    373:                        break;
                    374:                }
                    375:            } else if (s->symvalue.rangev.lower >= 0) {
                    376:                printf("%lu", popsmall(s));
                    377:            } else {
                    378:                printf("%ld", popsmall(s));
                    379:            }
                    380:            break;
                    381: 
                    382:        case FILET:
                    383:        case PTR: {
                    384:            Address addr;
                    385: 
                    386:            addr = pop(Address);
                    387:            if (addr == 0) {
                    388:                printf("0, (nil)");
                    389:            } else {
                    390:                printf("0x%x, 0%o", addr, addr);
                    391:            }
                    392:            break;
                    393:        }
                    394: 
                    395:        case FIELD:
                    396:            error("missing record specification");
                    397:            break;
                    398: 
                    399:        case SCAL: {
                    400:            int scalar;
                    401:            Boolean found;
                    402: 
                    403:            scalar = popsmall(s);
                    404:            found = false;
                    405:            for (t = s->chain; t != nil; t = t->chain) {
                    406:                if (t->symvalue.iconval == scalar) {
                    407:                    printf("%s", symname(t));
                    408:                    found = true;
                    409:                    break;
                    410:                }
                    411:            }
                    412:            if (not found) {
                    413:                printf("(scalar = %d)", scalar);
                    414:            }
                    415:            break;
                    416:        }
                    417: 
                    418:        case FPROC:
                    419:        case FFUNC:
                    420:        {
                    421:            Address a;
                    422: 
                    423:            a = fparamaddr(pop(long));
                    424:            t = whatblock(a);
                    425:            if (t == nil) {
                    426:                printf("(proc %d)", a);
                    427:            } else {
                    428:                printf("%s", symname(t));
                    429:            }
                    430:            break;
                    431:        }
                    432: 
                    433:        default:
                    434:            if (ord(s->class) < ord(BADUSE) or ord(s->class) > ord(TYPEREF)) {
                    435:                panic("printval: bad class %d", ord(s->class));
                    436:            }
                    437:            error("don't know how to print a %s", classname(s));
                    438:            /* NOTREACHED */
                    439:     }
                    440: }

unix.superglobalmegacorp.com

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