|
|
1.1 ! root 1: /* Copyright (c) 1982 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)attributes.c 1.1 1/18/82"; ! 4: ! 5: /* ! 6: * Functions to return the attributes of a symbol. ! 7: */ ! 8: ! 9: #include "defs.h" ! 10: #include "sym.h" ! 11: #include "process.h" ! 12: #include "btypes.h" ! 13: #include "classes.h" ! 14: #include "sym.rep" ! 15: ! 16: char *name(s) ! 17: SYM *s; ! 18: { ! 19: return s->symbol; ! 20: } ! 21: ! 22: int toknum(s) ! 23: SYM *s; ! 24: { ! 25: return s->symvalue.token.toknum; ! 26: } ! 27: ! 28: int tokval(s) ! 29: SYM *s; ! 30: { ! 31: return s->symvalue.token.tokval; ! 32: } ! 33: ! 34: ADDRESS codeloc(f) ! 35: SYM *f; ! 36: { ! 37: if (f == NIL) { ! 38: panic("codeloc: nil symbol"); ! 39: } ! 40: if (!isblock(f)) { ! 41: panic("codeloc: %s is not a block", f->symbol); ! 42: } ! 43: return f->symvalue.funcv.codeloc; ! 44: } ! 45: ! 46: /* ! 47: * Rtype returns the "reduced type" given a variable. ! 48: * The idea is to remove type names so we can check the class. ! 49: */ ! 50: ! 51: SYM *rtype(t) ! 52: register SYM *t; ! 53: { ! 54: while (t->class == TYPE) { ! 55: t = t->type; ! 56: } ! 57: return t; ! 58: } ! 59: ! 60: /* ! 61: * Return the SYM that contains the given SYM. ! 62: */ ! 63: ! 64: SYM *container(s) ! 65: SYM *s; ! 66: { ! 67: return s->func; ! 68: } ! 69: ! 70: /* ! 71: * Return a pointer to the string for the name of the class that ! 72: * the given symbol belongs to. ! 73: */ ! 74: ! 75: LOCAL char *clname[] = { ! 76: "bad use", "constant", "type", "variable", "array", "fileptr", ! 77: "record", "field", "procedure", "function", "funcvar", ! 78: "ref", "pointer", "file", "set", "range", "label", "withptr", ! 79: "scalar", "string", "program", "improper", "variant", ! 80: "procparam", "funcparam", ! 81: }; ! 82: ! 83: char *classname(s) ! 84: SYM *s; ! 85: { ! 86: return clname[s->class]; ! 87: } ! 88: ! 89: /* ! 90: * size finds the size in bytes of the given type ! 91: */ ! 92: ! 93: #define MINCHAR -128 ! 94: #define MAXCHAR 127 ! 95: #define MINSHORT -32768 ! 96: #define MAXSHORT 32767 ! 97: ! 98: int size(t) ! 99: register SYM *t; ! 100: { ! 101: long lower, upper; ! 102: ! 103: t = rtype(t); ! 104: if (t == t_real) { ! 105: return sizeof(double); ! 106: } ! 107: switch(t->class) { ! 108: case RANGE: ! 109: lower = t->symvalue.rangev.lower; ! 110: upper = t->symvalue.rangev.upper; ! 111: if (lower >= MINCHAR && upper <= MAXCHAR) { ! 112: return sizeof(char); ! 113: } else if (lower >= MINSHORT && upper <= MAXSHORT) { ! 114: return sizeof(short); ! 115: } else { ! 116: return sizeof(long); ! 117: } ! 118: /* NOTREACHED */ ! 119: ! 120: case ARRAY: { ! 121: register int nel, elsize; ! 122: register SYM *s; ! 123: ! 124: elsize = size(t->type); ! 125: nel = 1; ! 126: for (t = t->chain; t != NIL; t = t->chain) { ! 127: s = rtype(t); ! 128: lower = s->symvalue.rangev.lower; ! 129: upper = s->symvalue.rangev.upper; ! 130: nel *= (upper-lower+1); ! 131: } ! 132: return nel*elsize; ! 133: } ! 134: ! 135: case CONST: ! 136: case VAR: ! 137: case FVAR: ! 138: case FIELD: ! 139: return size(t->type); ! 140: ! 141: case RECORD: ! 142: return t->symvalue.offset; ! 143: ! 144: case PTR: ! 145: case REF: ! 146: case FILET: ! 147: return sizeof(int); ! 148: ! 149: case SCAL: ! 150: if (t->symvalue.iconval > 255) { ! 151: return sizeof(short); ! 152: } else { ! 153: return sizeof(char); ! 154: } ! 155: /* NOTREACHED */ ! 156: ! 157: case FPROC: ! 158: case FFUNC: ! 159: return sizeof(ADDRESS *); ! 160: ! 161: default: ! 162: if (t->class < BADUSE || t->class > FFUNC) { ! 163: panic("size: bad class (%d)", t->class); ! 164: } else { ! 165: error("improper operation on a %s", classname(t)); ! 166: } ! 167: /* NOTREACHED */ ! 168: } ! 169: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.