Annotation of 43BSDReno/pgrm/pascal/pdx/sym/printval.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 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[] = "@(#)printval.c 5.2 (Berkeley) 4/7/87";
                      9: #endif not lint
                     10: 
                     11: /*
                     12:  * Print out the value at the top of the stack using the given type.
                     13:  */
                     14: 
                     15: #include "defs.h"
                     16: #include "sym.h"
                     17: #include "btypes.h"
                     18: #include "classes.h"
                     19: #include "tree.h"
                     20: #include "process.h"
                     21: #include "mappings.h"
                     22: #include "sym.rep"
                     23: 
                     24: printval(s)
                     25: SYM *s;
                     26: {
                     27:     SYM *t;
                     28:     ADDRESS a;
                     29:     int len;
                     30:     double r;
                     31: 
                     32:     if (s->class == REF) {
                     33:        s = s->type;
                     34:     }
                     35:     switch (s->class) {
                     36:        case ARRAY:
                     37:            t = rtype(s->type);
                     38:            if (t == t_char || (t->class == RANGE && t->type == t_char)) {
                     39:                len = size(s);
                     40:                sp -= len;
                     41: #ifdef tahoe
                     42:                downalignstack();
                     43: #endif
                     44:                printf("'%.*s'", len, sp);
                     45:                break;
                     46:            } else {
                     47:                printarray(s);
                     48:            }
                     49:            break;
                     50: 
                     51:        case RECORD:
                     52:            printrecord(s);
                     53:            break;
                     54: 
                     55:        case VARNT:
                     56:            error("can't print out variant records");
                     57:            break;
                     58: 
                     59:        case RANGE:
                     60:            if (s == t_real) {
                     61:                prtreal(pop(double));
                     62:            } else {
                     63:                printordinal(popsmall(s), rtype(s->type));
                     64:            }
                     65:            break;
                     66: 
                     67:        case FILET:
                     68:        case PTR:
                     69:            a = pop(ADDRESS);
                     70:            if (a == 0) {
                     71:                printf("nil");
                     72:            } else {
                     73:                printf("0%o", a);
                     74:            }
                     75:            break;
                     76: 
                     77:        case FIELD:
                     78:            error("missing record specification");
                     79:            break;
                     80: 
                     81:        case SCAL:
                     82:            printordinal(popsmall(s), s);
                     83:            break;
                     84: 
                     85:        case FPROC:
                     86:        case FFUNC:
                     87:            a = fparamaddr(pop(long));
                     88:            t = whatblock(a);
                     89:            if (t == NIL) {
                     90:                printf("(proc %d)", a);
                     91:            } else {
                     92:                printf("%s", t->symbol);
                     93:            }
                     94:            break;
                     95: 
                     96:        default:
                     97:            if (s->class < BADUSE || s->class > VARNT) {
                     98:                panic("printval: bad class %d", s->class);
                     99:            }
                    100:            error("don't know how to print a %s", classname(s));
                    101:            /* NOTREACHED */
                    102:     }
                    103: }
                    104: 
                    105: /*
                    106:  * Print out an ordinal value (either an integer, character, or
                    107:  * an enumeration constant).
                    108:  */
                    109: 
                    110: printordinal(v, t)
                    111: long v;
                    112: SYM *t;
                    113: {
                    114:     SYM *c;
                    115:     int iv;
                    116: 
                    117:     iv = v;
                    118:     if (t->class == SCAL) {
                    119:        c = t->chain;
                    120:        while (c != NIL && c->symvalue.iconval != iv) {
                    121:            c = c->chain;
                    122:        }
                    123:        if (c == NIL) {
                    124:            printf("(scalar = %d)", iv);
                    125:        } else {
                    126:            printf("%s", c->symbol);
                    127:        }
                    128:     } else if (t == t_char) {
                    129:        printf("'%c'", iv);
                    130:     } else if (t == t_boolean) {
                    131:        printf("%s", (iv == TRUE) ? "true" : "false");
                    132:     } else {
                    133:        printf("%ld", v);
                    134:     }
                    135: }
                    136: 
                    137: /*
                    138:  * Print out the value of a record, field by field.
                    139:  */
                    140: 
                    141: LOCAL printrecord(s)
                    142: SYM *s;
                    143: {
                    144:     SYM *t;
                    145: 
                    146:     if ((t = s->chain) == NIL) {
                    147:        error("record has no fields");
                    148:     }
                    149:     printf("(");
                    150:     sp -= size(s);
                    151: #ifdef tahoe
                    152:     downalignstack();
                    153: #endif
                    154:     printfield(t);
                    155:     printf(")");
                    156: }
                    157: 
                    158: /*
                    159:  * Print out a field, first printing out other fields.
                    160:  * This is done because the fields are chained together backwards.
                    161:  */
                    162: 
                    163: LOCAL printfield(s)
                    164: SYM *s;
                    165: {
                    166:     STACK *savesp;
                    167: 
                    168:     if (s->chain != NIL) {
                    169:        printfield(s->chain);
                    170:        printf(", ");
                    171:     }
                    172:     printf("%s = ", s->symbol);
                    173:     savesp = sp;
                    174:     sp += (s->symvalue.offset + size(s->type));
                    175: #ifdef tahoe
                    176:     alignstack();
                    177: #endif
                    178:     printval(s->type);
                    179:     sp = savesp;
                    180: }
                    181: 
                    182: /*
                    183:  * Print out the contents of an array.
                    184:  * Haven't quite figured out what the best format is.
                    185:  *
                    186:  * This is rather inefficient.
                    187:  *
                    188:  * The "2*elsize" is there since "printval" drops the stack by elsize.
                    189:  */
                    190: 
                    191: #ifdef tahoe
                    192: LOCAL printarray(a)
                    193: SYM *a;
                    194: {
                    195:     STACK *savesp, *newsp;
                    196:     SYM *eltype;
                    197:     long elsize;
                    198: 
                    199:     savesp = (STACK *)(((int)sp + 3) & ~3);
                    200:     eltype = a->type;
                    201:     printf("(");
                    202:     elsize = size(eltype);
                    203:     if (eltype->class == ARRAY)
                    204:        savesp += elsize;
                    205:     if (elsize < sizeof(int)) {
                    206:        register char *cp = sp - ((size(a) + 3) & ~3);
                    207:        int psh;
                    208:        register char *cp1, *end = cp + size(a);
                    209:        register int savestack;
                    210: 
                    211:        while (cp < end) {
                    212:            psh = 0;
                    213:            cp1 = (char *)&psh + sizeof(int) - elsize;
                    214:            while (cp1 < (char *)&psh + sizeof psh)
                    215:                *cp1++ = *cp++;
                    216:            if (end - size(a) != cp - elsize) {
                    217:                printf(", ");
                    218:            }
                    219:            switch (elsize) {
                    220:                case sizeof(char):
                    221:                    savestack = *(char *)sp;
                    222:                    push(char, psh);
                    223:                    printval(eltype);
                    224:                    *(char *)sp = savestack;
                    225:                    break;
                    226:                case sizeof(short):
                    227:                    savestack = *(short *)sp;
                    228:                    push(short, psh);
                    229:                    printval(eltype);
                    230:                    *(short *)sp = savestack;
                    231:                    break;
                    232:                default:
                    233:                   panic("bad size on runtime stack");
                    234:            }
                    235:        }
                    236:     } else {
                    237:        sp -= size(a);
                    238:        downalignstack();
                    239:        newsp = sp;
                    240:        for (sp += elsize, alignstack(); sp <= savesp; sp += 2*elsize) {
                    241:            if (sp - 2*elsize >= newsp) {
                    242:                printf(", ");
                    243:            }
                    244:            printval(eltype);
                    245:            if (eltype->class == ARRAY) {
                    246:                sp -= elsize;
                    247:            }
                    248:        }
                    249:        sp = newsp;
                    250:     }
                    251:     printf(")");
                    252: }
                    253: #else
                    254: 
                    255: LOCAL printarray(a)
                    256: SYM *a;
                    257: {
                    258:     STACK *savesp, *newsp;
                    259:     SYM *eltype;
                    260:     long elsize;
                    261: 
                    262:     savesp = sp;
                    263:     eltype = a->type;
                    264:     elsize = size(eltype);
                    265:     sp -= size(a);
                    266:     newsp = sp;
                    267:     printf("(");
                    268:     for (sp += elsize; sp <= savesp; sp += 2*elsize) {
                    269:        if (sp - elsize != newsp) {
                    270:            printf(", ");
                    271:        }
                    272:        printval(eltype);
                    273:     }
                    274:     sp = newsp;
                    275:     printf(")");
                    276: }
                    277: #endif tahoe
                    278: 
                    279: /*
                    280:  * Print out the value of a real number.
                    281:  * Pascal notation is somewhat different that what one gets
                    282:  * from "%g" in printf.
                    283:  */
                    284: 
                    285: LOCAL prtreal(r)
                    286: double r;
                    287: {
                    288:     extern char *index();
                    289:     char buf[256];
                    290: 
                    291:     sprintf(buf, "%g", r);
                    292:     if (buf[0] == '.') {
                    293:        printf("0%s", buf);
                    294:     } else if (buf[0] == '-' && buf[1] == '.') {
                    295:        printf("-0%s", &buf[1]);
                    296:     } else {
                    297:        printf("%s", buf);
                    298:     }
                    299:     if (index(buf, '.') == NIL) {
                    300:        printf(".0");
                    301:     }
                    302: }

unix.superglobalmegacorp.com

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