⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 printsym.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	    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 + -