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

📄 sym.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
static	char sccsid[] = "@(#)sym.c 4.1 5/14/81";/* * adb - symbol table routines */#include "defs.h"#include <stab.h>/* * Lookup a symbol by name. */struct nlist *lookup(symstr)	char *symstr;{	register struct nlist *sp;	cursym = 0;	if (symtab)	for (sp = symtab; sp < esymtab; sp++)		/* SHOULD DO SOME OF EQSYM INLINE TO SAVE TIME */		if ((sp->n_type&N_STAB)==0 && eqsym(sp->n_un.n_name, symstr, '_'))			return(cursym = sp);	return (0);}/* * Find the closest symbol to val, and return * the difference between val and the symbol found. * Leave a pointer to the symbol found as cursym. */findsym(val, type)	long val;	int type;{	long diff;	register struct nlist *sp;	cursym = 0;	diff = MAXINT;	if (type == NSYM || symtab == 0)		return (diff);	for (sp = symtab; sp < esymtab; sp++) {		if (sp->n_type&N_STAB || (sp->n_type&N_EXT)==0)			continue;		if (val - sp->n_value < diff && val >= sp->n_value) {			diff = val - sp->n_value;			cursym = sp;			if (diff == 0)				break;		}	}	return (diff);}/* * Advance cursym to the next local variable. * Leave its value in localval as a side effect. * Return 0 at end of file. */localsym(cframe, cargp)	ADDR cframe, cargp;{	register int type;	register struct nlist *sp;	if (cursym)	for (sp = cursym; ++sp < esymtab; ) {		if (sp->n_un.n_name[0] =='_' || sp->n_type == N_FN)			return (0);		type = sp->n_type;		switch (sp->n_type) {		case N_TEXT:		case N_TEXT|N_EXT:		case N_DATA:		case N_DATA|N_EXT:		case N_BSS:		case N_BSS|N_EXT:			localval = sp->n_value;			cursym = sp;			return (1);		case N_LSYM:			localval = cframe - sp->n_value;			cursym = sp;			return (1);		case N_PSYM:			/* code below works since n_value > 0 */		case N_ABS:			if (sp->n_value < 0)				localval = cframe + sp->n_value;			else				localval = cargp + sp->n_value;			cursym = sp;			return (1);		}	}	cursym = 0;	return (0);}/* * Print value v and then the string s. * If v is not zero, then we look for a nearby symbol * and print name+offset if we find a symbol for which * offset is small enough. * * For values which are just into kernel address space * that they match exactly or that they be more than maxoff * bytes into kernel space. */psymoff(v, type, s)	long v;	int type;	char *s;{	long w;	if (v) 		w = findsym(v, type);	if (v==0 || w >= maxoff || (KVTOPH(v) < maxoff && w))		printf(LPRMODE, v);	else {		printf("%s", cursym->n_un.n_name);		if (w)			printf(OFFMODE, w);	}	printf(s);}/* * Print value v symbolically if it has a reasonable * interpretation as name+offset.  If not, print nothing. * Used in printing out registers $r. */valpr(v, idsp)	long v;{	off_t d;	d = findsym(v, idsp);	if (d >= maxoff)		return;	printf("%s", cursym->n_un.n_name);	if (d)		printf(OFFMODE, d);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -