|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.