📄 printsym.c
字号:
printouter(f, outer); } fprintf(f, "%s.", symname(s)); }}public printdecl(s)Symbol s;{ Language lang; checkref(s); if (s->language == nil or s->language == primlang) { lang = findlanguage(".s"); } else { lang = s->language; } (*language_op(lang, L_PRINTDECL))(s);}/* * Straight dump of symbol information. */public psym(s)Symbol s;{ printf("name\t%s\n", symname(s)); printf("lang\t%s\n", language_name(s->language)); printf("level\t%d\n", s->level); printf("class\t%s\n", classname(s)); printf("type\t0x%x", s->type); if (s->type != nil and s->type->name != nil) { printf(" (%s)", symname(s->type)); } printf("\nchain\t0x%x", s->chain); if (s->chain != nil and s->chain->name != nil) { printf(" (%s)", symname(s->chain)); } printf("\nblock\t0x%x", s->block); if (s->block != nil and s->block->name != nil) { printf(" ("); printname(stdout, s->block); putchar(')'); } putchar('\n'); switch (s->class) { case TYPE: printf("size\t%d\n", size(s)); break; case VAR: case REF: switch (s->storage) { case INREG: printf("reg\t%d\n", s->symvalue.offset); break; case STK: printf("offset\t%d\n", s->symvalue.offset); break; case EXT: printf("address\t0x%x\n", s->symvalue.offset); break; } printf("size\t%d\n", size(s)); break; case RECORD: case VARNT: printf("size\t%d\n", s->symvalue.offset); break; case FIELD: printf("offset\t%d\n", s->symvalue.field.offset); printf("size\t%d\n", s->symvalue.field.length); break; case PROG: case PROC: case FUNC: printf("address\t0x%x\n", s->symvalue.funcv.beginaddr); if (isinline(s)) { printf("inline procedure\n"); } if (nosource(s)) { printf("does not have source information\n"); } else { printf("has source information\n"); } break; case RANGE: prangetype(s->symvalue.rangev.lowertype); printf("lower\t%d\n", s->symvalue.rangev.lower); prangetype(s->symvalue.rangev.uppertype); printf("upper\t%d\n", s->symvalue.rangev.upper); break; default: /* do nothing */ break; }}private prangetype(r)Rangetype r;{ switch (r) { case R_CONST: printf("CONST"); break; case R_ARG: printf("ARG"); break; case R_TEMP: printf("TEMP"); break; case R_ADJUST: printf("ADJUST"); break; }}/* * Print out the value on top of the stack according to the given type. */public printval(t)Symbol t;{ Symbol s; checkref(t); if (t->class == TYPEREF) { resolveRef(t); } switch (t->class) { case PROC: case FUNC: s = pop(Symbol); printf("%s", symname(s)); break; default: if (t->language == nil or t->language == primlang) { (*language_op(findlanguage(".c"), L_PRINTVAL))(t); } else { (*language_op(t->language, L_PRINTVAL))(t); } break; }}/* * Print out the value of a record, field by field. */public printrecord(s)Symbol s;{ Symbol f; if (s->chain == nil) { error("record has no fields"); } printf("("); sp -= size(s); f = s->chain; if (f != nil) { for (;;) { printfield(f); f = f->chain; if (f == nil) break; printf(", "); } } printf(")");}/* * Print out a field. */private printfield(f)Symbol f;{ Stack *savesp; register int off, len; printf("%s = ", symname(f)); savesp = sp; off = f->symvalue.field.offset; len = f->symvalue.field.length; sp += ((off + len + BITSPERBYTE - 1) div BITSPERBYTE); printval(f); sp = savesp;}/* * Print out the contents of an array. * Haven't quite figured out what the best format is. * * This is rather inefficient. * * The "2*elsize" is there since "printval" drops the stack by elsize. */public printarray(a)Symbol a;{ Stack *savesp, *newsp; Symbol eltype; long elsize; String sep; savesp = sp; sp -= (size(a)); newsp = sp; eltype = rtype(a->type); elsize = size(eltype); printf("("); if (eltype->class == RECORD or eltype->class == ARRAY or eltype->class == VARNT) { sep = "\n"; putchar('\n'); } else { sep = ", "; } for (sp += elsize; sp <= savesp; sp += 2*elsize) { if (sp - elsize != newsp) { fputs(sep, stdout); } printval(eltype); } sp = newsp; if (streq(sep, "\n")) { putchar('\n'); } printf(")");}/* * Print out the value of a real number in Pascal notation. * This is, unfortunately, different than what one gets * from "%g" in printf. */public prtreal(r)double r;{ extern char *index(); char buf[256];# ifdef IRIS sprintf(buf, "%lg", r);# else sprintf(buf, "%g", r);# endif if (buf[0] == '.') { printf("0%s", buf); } else if (buf[0] == '-' and buf[1] == '.') { printf("-0%s", &buf[1]); } else { printf("%s", buf); } if (index(buf, '.') == nil) { printf(".0"); }}/* * Print out a character using ^? notation for unprintables. */public printchar(c)char c;{ if (c == 0) { putchar('\\'); putchar('0'); } else if (c == '\n') { putchar('\\'); putchar('n'); } else if (c > 0 and c < ' ') { putchar('^'); putchar(c - 1 + 'A'); } else if (c >= ' ' && c <= '~') { putchar(c); } else { printf("\\0%o",c&0xff); }}/* * Print out a value for a range type (integer, char, or boolean). */public printRangeVal (val, t)long val;Symbol t;{ if (t == t_boolean->type or istypename(t->type, "boolean")) { if ((boolean) val) { printf("true"); } else { printf("false"); } } else if (t == t_char->type or istypename(t->type, "char")) { if (varIsSet("$hexchars")) { printf("0x%lx", val); } else { putchar('\''); printchar(val); putchar('\''); } } else if (varIsSet("$hexints")) { printf("0x%lx", val); } else if (t->symvalue.rangev.lower >= 0) { printf("%lu", val); } else { printf("%ld", val); }}/* * Print out an enumerated value by finding the corresponding * name in the enumeration list. */public printEnum (i, t)integer i;Symbol t;{ register Symbol e; e = t->chain; while (e != nil and e->symvalue.constval->value.lcon != i) { e = e->chain; } if (e != nil) { printf("%s", symname(e)); } else { printf("%d", i); }}/* * Print out a null-terminated string (pointer to char) * starting at the given address. */public printString (addr, quotes)Address addr;boolean quotes;{ register Address a; register integer i, len; register boolean endofstring; register int unprintables;#define MAXGARBAGE 4 union { char ch[sizeof(Word)]; int word; } u; if (varIsSet("$hexstrings")) { printf("0x%x", addr); } else { if (quotes) { putchar('"'); } a = addr; unprintables = 0; endofstring = false; while (not endofstring) { dread(&u, a, sizeof(u)); i = 0; do { if (u.ch[i] == '\0') { endofstring = true; } else { printchar(u.ch[i]); if (!isascii(u.ch[i]) and ++unprintables > MAXGARBAGE) { endofstring = true; printf("..."); } } ++i; } while (i < sizeof(Word) and not endofstring); a += sizeof(Word); } if (quotes) { putchar('"'); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -