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