Annotation of 43BSD/ucb/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.1 (Berkeley) 6/6/85";
                      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:                printf("'%.*s'", len, sp);
                     42:                break;
                     43:            } else {
                     44:                printarray(s);
                     45:            }
                     46:            break;
                     47: 
                     48:        case RECORD:
                     49:            printrecord(s);
                     50:            break;
                     51: 
                     52:        case VARNT:
                     53:            error("can't print out variant records");
                     54:            break;
                     55: 
                     56:        case RANGE:
                     57:            if (s == t_real) {
                     58:                prtreal(pop(double));
                     59:            } else {
                     60:                printordinal(popsmall(s), rtype(s->type));
                     61:            }
                     62:            break;
                     63: 
                     64:        case FILET:
                     65:        case PTR:
                     66:            a = pop(ADDRESS);
                     67:            if (a == 0) {
                     68:                printf("nil");
                     69:            } else {
                     70:                printf("0%o", a);
                     71:            }
                     72:            break;
                     73: 
                     74:        case FIELD:
                     75:            error("missing record specification");
                     76:            break;
                     77: 
                     78:        case SCAL:
                     79:            printordinal(popsmall(s), s);
                     80:            break;
                     81: 
                     82:        case FPROC:
                     83:        case FFUNC:
                     84:            a = fparamaddr(pop(long));
                     85:            t = whatblock(a);
                     86:            if (t == NIL) {
                     87:                printf("(proc %d)", a);
                     88:            } else {
                     89:                printf("%s", t->symbol);
                     90:            }
                     91:            break;
                     92: 
                     93:        default:
                     94:            if (s->class < BADUSE || s->class > VARNT) {
                     95:                panic("printval: bad class %d", s->class);
                     96:            }
                     97:            error("don't know how to print a %s", classname(s));
                     98:            /* NOTREACHED */
                     99:     }
                    100: }
                    101: 
                    102: /*
                    103:  * Print out an ordinal value (either an integer, character, or
                    104:  * an enumeration constant).
                    105:  */
                    106: 
                    107: printordinal(v, t)
                    108: long v;
                    109: SYM *t;
                    110: {
                    111:     BOOLEAN found;
                    112:     SYM *c;
                    113:     int iv;
                    114: 
                    115:     iv = v;
                    116:     if (t->class == SCAL) {
                    117:        c = t->chain;
                    118:        while (c != NIL && c->symvalue.iconval != iv) {
                    119:            c = c->chain;
                    120:        }
                    121:        if (c == NIL) {
                    122:            printf("(scalar = %d)", iv);
                    123:        } else {
                    124:            printf("%s", c->symbol);
                    125:        }
                    126:     } else if (t == t_char) {
                    127:        printf("'%c'", iv);
                    128:     } else if (t == t_boolean) {
                    129:        printf("%s", (iv == TRUE) ? "true" : "false");
                    130:     } else {
                    131:        printf("%ld", v);
                    132:     }
                    133: }
                    134: 
                    135: /*
                    136:  * Print out the value of a record, field by field.
                    137:  */
                    138: 
                    139: LOCAL printrecord(s)
                    140: SYM *s;
                    141: {
                    142:     SYM *t;
                    143: 
                    144:     if ((t = s->chain) == NIL) {
                    145:        error("record has no fields");
                    146:     }
                    147:     printf("(");
                    148:     sp -= size(s);
                    149:     printfield(t);
                    150:     printf(")");
                    151: }
                    152: 
                    153: /*
                    154:  * Print out a field, first printing out other fields.
                    155:  * This is done because the fields are chained together backwards.
                    156:  */
                    157: 
                    158: LOCAL printfield(s)
                    159: SYM *s;
                    160: {
                    161:     STACK *savesp;
                    162: 
                    163:     if (s->chain != NIL) {
                    164:        printfield(s->chain);
                    165:        printf(", ");
                    166:     }
                    167:     printf("%s = ", s->symbol);
                    168:     savesp = sp;
                    169:     sp += (s->symvalue.offset + size(s->type));
                    170:     printval(s->type);
                    171:     sp = savesp;
                    172: }
                    173: 
                    174: /*
                    175:  * Print out the contents of an array.
                    176:  * Haven't quite figured out what the best format is.
                    177:  *
                    178:  * This is rather inefficient.
                    179:  *
                    180:  * The "2*elsize" is there since "printval" drops the stack by elsize.
                    181:  */
                    182: 
                    183: LOCAL printarray(a)
                    184: SYM *a;
                    185: {
                    186:     STACK *savesp, *newsp;
                    187:     SYM *eltype;
                    188:     long elsize;
                    189: 
                    190:     savesp = sp;
                    191:     sp -= size(a);
                    192:     newsp = sp;
                    193:     eltype = a->type;
                    194:     elsize = size(eltype);
                    195:     printf("(");
                    196:     for (sp += elsize; sp <= savesp; sp += 2*elsize) {
                    197:        if (sp - elsize != newsp) {
                    198:            printf(", ");
                    199:        }
                    200:        printval(eltype);
                    201:     }
                    202:     sp = newsp;
                    203:     printf(")");
                    204: }
                    205: 
                    206: /*
                    207:  * Print out the value of a real number.
                    208:  * Pascal notation is somewhat different that what one gets
                    209:  * from "%g" in printf.
                    210:  */
                    211: 
                    212: LOCAL prtreal(r)
                    213: double r;
                    214: {
                    215:     extern char *index();
                    216:     char *p, buf[256];
                    217: 
                    218:     sprintf(buf, "%g", r);
                    219:     if (buf[0] == '.') {
                    220:        printf("0%s", buf);
                    221:     } else if (buf[0] == '-' && buf[1] == '.') {
                    222:        printf("-0%s", &buf[1]);
                    223:     } else {
                    224:        printf("%s", buf);
                    225:     }
                    226:     if (index(buf, '.') == NIL) {
                    227:        printf(".0");
                    228:     }
                    229: }

unix.superglobalmegacorp.com

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