1*48093Sbostic /*- 2*48093Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48093Sbostic * All rights reserved. 4*48093Sbostic * 5*48093Sbostic * %sccs.include.redist.c% 622523Sdist */ 75526Slinton 822523Sdist #ifndef lint 9*48093Sbostic static char sccsid[] = "@(#)attributes.c 5.2 (Berkeley) 04/16/91"; 10*48093Sbostic #endif /* not lint */ 115526Slinton 125526Slinton /* 135526Slinton * Functions to return the attributes of a symbol. 145526Slinton */ 155526Slinton 165526Slinton #include "defs.h" 175526Slinton #include "sym.h" 185526Slinton #include "process.h" 195526Slinton #include "btypes.h" 205526Slinton #include "classes.h" 215526Slinton #include "sym.rep" 225526Slinton 235526Slinton char *name(s) 245526Slinton SYM *s; 255526Slinton { 265526Slinton return s->symbol; 275526Slinton } 285526Slinton 295526Slinton int toknum(s) 305526Slinton SYM *s; 315526Slinton { 325526Slinton return s->symvalue.token.toknum; 335526Slinton } 345526Slinton 355526Slinton int tokval(s) 365526Slinton SYM *s; 375526Slinton { 385526Slinton return s->symvalue.token.tokval; 395526Slinton } 405526Slinton 415526Slinton ADDRESS codeloc(f) 425526Slinton SYM *f; 435526Slinton { 445526Slinton if (f == NIL) { 455526Slinton panic("codeloc: nil symbol"); 465526Slinton } 475526Slinton if (!isblock(f)) { 485526Slinton panic("codeloc: %s is not a block", f->symbol); 495526Slinton } 505526Slinton return f->symvalue.funcv.codeloc; 515526Slinton } 525526Slinton 535526Slinton /* 545526Slinton * Rtype returns the "reduced type" given a variable. 555526Slinton * The idea is to remove type names so we can check the class. 565526Slinton */ 575526Slinton 585526Slinton SYM *rtype(t) 595526Slinton register SYM *t; 605526Slinton { 615526Slinton while (t->class == TYPE) { 625526Slinton t = t->type; 635526Slinton } 645526Slinton return t; 655526Slinton } 665526Slinton 675526Slinton /* 685526Slinton * Return the SYM that contains the given SYM. 695526Slinton */ 705526Slinton 715526Slinton SYM *container(s) 725526Slinton SYM *s; 735526Slinton { 745526Slinton return s->func; 755526Slinton } 765526Slinton 775526Slinton /* 785526Slinton * Return a pointer to the string for the name of the class that 795526Slinton * the given symbol belongs to. 805526Slinton */ 815526Slinton 825526Slinton LOCAL char *clname[] = { 835526Slinton "bad use", "constant", "type", "variable", "array", "fileptr", 845526Slinton "record", "field", "procedure", "function", "funcvar", 855526Slinton "ref", "pointer", "file", "set", "range", "label", "withptr", 865526Slinton "scalar", "string", "program", "improper", "variant", 875526Slinton "procparam", "funcparam", 885526Slinton }; 895526Slinton 905526Slinton char *classname(s) 915526Slinton SYM *s; 925526Slinton { 935526Slinton return clname[s->class]; 945526Slinton } 955526Slinton 965526Slinton /* 975526Slinton * size finds the size in bytes of the given type 985526Slinton */ 995526Slinton 1005526Slinton #define MINCHAR -128 1015526Slinton #define MAXCHAR 127 1025526Slinton #define MINSHORT -32768 1035526Slinton #define MAXSHORT 32767 1045526Slinton 1055526Slinton int size(t) 1065526Slinton register SYM *t; 1075526Slinton { 1085526Slinton long lower, upper; 1095526Slinton 1105526Slinton t = rtype(t); 1115526Slinton if (t == t_real) { 1125526Slinton return sizeof(double); 1135526Slinton } 1145526Slinton switch(t->class) { 1155526Slinton case RANGE: 1165526Slinton lower = t->symvalue.rangev.lower; 1175526Slinton upper = t->symvalue.rangev.upper; 1185526Slinton if (lower >= MINCHAR && upper <= MAXCHAR) { 1195526Slinton return sizeof(char); 1205526Slinton } else if (lower >= MINSHORT && upper <= MAXSHORT) { 1215526Slinton return sizeof(short); 1225526Slinton } else { 1235526Slinton return sizeof(long); 1245526Slinton } 1255526Slinton /* NOTREACHED */ 1265526Slinton 1275526Slinton case ARRAY: { 1285526Slinton register int nel, elsize; 1295526Slinton register SYM *s; 1305526Slinton 1315526Slinton elsize = size(t->type); 1325526Slinton nel = 1; 1335526Slinton for (t = t->chain; t != NIL; t = t->chain) { 1345526Slinton s = rtype(t); 1355526Slinton lower = s->symvalue.rangev.lower; 1365526Slinton upper = s->symvalue.rangev.upper; 1375526Slinton nel *= (upper-lower+1); 1385526Slinton } 1395526Slinton return nel*elsize; 1405526Slinton } 1415526Slinton 1425526Slinton case CONST: 1435526Slinton case VAR: 1445526Slinton case FVAR: 1455526Slinton case FIELD: 1465526Slinton return size(t->type); 1475526Slinton 1485526Slinton case RECORD: 1495526Slinton return t->symvalue.offset; 1505526Slinton 1515526Slinton case PTR: 1525526Slinton case REF: 1535526Slinton case FILET: 1545526Slinton return sizeof(int); 1555526Slinton 1565526Slinton case SCAL: 1575526Slinton if (t->symvalue.iconval > 255) { 1585526Slinton return sizeof(short); 1595526Slinton } else { 1605526Slinton return sizeof(char); 1615526Slinton } 1625526Slinton /* NOTREACHED */ 1635526Slinton 1645526Slinton case FPROC: 1655526Slinton case FFUNC: 1665526Slinton return sizeof(ADDRESS *); 1675526Slinton 1685526Slinton default: 1695526Slinton if (t->class < BADUSE || t->class > FFUNC) { 1705526Slinton panic("size: bad class (%d)", t->class); 1715526Slinton } else { 1725526Slinton error("improper operation on a %s", classname(t)); 1735526Slinton } 1745526Slinton /* NOTREACHED */ 1755526Slinton } 1765526Slinton } 177