Annotation of 42BSD/ucb/pascal/pdx/sym/printval.c, revision 1.1

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

unix.superglobalmegacorp.com

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