sym.c

来自「unix v7是最后一个广泛发布的研究型UNIX版本」· C语言 代码 · 共 165 行

C
165
字号
#/* * *	UNIX debugger * */#include "defs.h"MSG		BADFIL;SYMTAB		symbol;BOOL		localok;INT		lastframe;SYMSLAVE		*symvec;POS		maxoff;L_INT		maxstor;/* symbol management */L_INT		symbas;L_INT		symcnt;L_INT		symnum;L_INT		localval;char		symrqd -1;SYMTAB		symbuf[SYMSIZ];SYMPTR		symnxt;SYMPTR		symend;INT		fsym;STRING		errflg;POS		findsym();/* symbol table and file handling service routines */longseek(f, a)L_INT a;{	return(lseek(f,a,0) != -1);}valpr(v,idsp){	POS		d;	d = findsym(v,idsp);	IF d < maxoff	THEN	printf("%.8s", symbol.symc);		IF d		THEN	printf(OFFMODE, d);		FI	FI}localsym(cframe)L_INT cframe;{	INT symflg;	WHILE nextsym() ANDF localok		ANDF symbol.symc[0]!='~'		ANDF (symflg=symbol.symf)!=037	DO IF symflg>=2 ANDF symflg<=4	   THEN localval=symbol.symv;		return(TRUE);	   ELIF symflg==1	   THEN localval=leng(shorten(cframe)+symbol.symv);		return(TRUE);	   ELIF symflg==20 ANDF lastframe	   THEN localval=leng(lastframe+2*symbol.symv-10);		return(TRUE);	   FI	OD	return(FALSE);}psymoff(v,type,s)L_INT v; int type; char *s;{	POS		w;	w = findsym(shorten(v),type);	IF w >= maxoff	THEN printf(LPRMODE,v);	ELSE printf("%.8s", symbol.symc);	     IF w THEN printf(OFFMODE,w); FI	FI	printf(s);}POS	findsym(svalue,type)POS	svalue;INT	type;{	L_INT		diff, value, symval, offset;	INT		symtyp;	REG SYMSLAVE	*symptr;	SYMSLAVE	*symsav;	value=svalue; diff = 0377777L; symsav=0;	IF type!=NSYM ANDF (symptr=symvec)	THEN	WHILE diff ANDF (symtyp=symptr->typslave)!=ESYM		DO  IF symtyp==type		    THEN symval=leng(symptr->valslave);			 IF value-symval<diff			    ANDF value>=symval			 THEN diff = value-symval;			      symsav=symptr;			 FI		    FI		    symptr++;		OD		IF symsav		THEN	offset=leng(symsav-symvec);			symcnt=symnum-offset;			longseek(fsym, symbas+offset*SYMTABSIZ);			read(fsym,&symbol,SYMTABSIZ);		FI	FI	return(shorten(diff));}nextsym(){	IF (--symcnt)<0	THEN	return(FALSE);	ELSE	return(longseek(fsym, symbas+(symnum-symcnt)*SYMTABSIZ)!=0 ANDF			read(fsym,&symbol,SYMTABSIZ)==SYMTABSIZ);	FI}/* sequential search through file */symset(){	symcnt = symnum;	symnxt = symbuf;	IF symrqd	THEN	longseek(fsym, symbas);		symread(); symrqd=FALSE;	ELSE	longseek(fsym, symbas+sizeof symbuf);	FI}SYMPTR	symget(){	REG INT	rc;	IF symnxt >= symend	THEN	rc=symread(); symrqd=TRUE;	ELSE	rc=TRUE;	FI	IF --symcnt>0 ANDF rc==0 THEN errflg=BADFIL; FI	return( (symcnt>=0 && rc) ? symnxt++ : 0);}symread(){	INT		symlen;	IF (symlen=read(fsym,symbuf,sizeof symbuf))>=SYMTABSIZ	THEN	symnxt = symbuf;		symend = &symbuf[symlen/SYMTABSIZ];		return(TRUE);	ELSE	return(FALSE);	FI}

⌨️ 快捷键说明

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