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 + -
显示快捷键?