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

📄 od.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
int	word[16];char	gbuf[512];int	fi;int	conv;int	base	010;int	basem	01000;int	max;int	gidx;int	gcnt;int	eof;int	addr[2];int	from[2];int	key;int	flag;int	nword	8;main(argc, argv)char **argv;{	extern fout;	int f, k, w, i, a[2];	char *p;	fout = dup(1);	argv++;	if(argc > 1) {		p = *argv;		if(*p == '-') {			while((i = *p++) != '\0') {				switch(i) {				case 'o':					conv =| 001;					f = 6;					break;				case 'd':					conv =| 002;					f = 5;					break;				case 'a':					conv =| 004;					f = 4;					break;				case 'h':					conv =| 010;					f = 4;					break;				case 'c':					conv =| 020;					f = 5;					break;				case 'b':					conv =| 040;					f = 7;					break;				}				if(f > max)					max = f;			}			argc--;			argv++;		}	}	if(!conv) {		max = 6;		conv = 1;	}	if(argc > 1)	if(**argv != '+') {		fi = open(*argv, 0);		if(fi < 0) {			printf("cannot open %s\n", *argv);			goto done;		}		argv++;		argc--;	}	if(argc > 1)		offset(*argv);loop:	f = 1;	a[0] = addr[0];	a[1] = addr[1];	for(i=0; i<nword; i++) {		w = getw();		if(eof)			break;		word[i] = w;		if(i)			f =& w==k; else			k = w;	}	if(i)	if(f && !eof) {		if(!(flag && k==key)) {			dupl();			key = k;			from[0] = a[0];			from[1] = a[1];		}		flag =+ i;	} else {		dupl();		line(a, word, i);	}	if(!eof)		goto loop;	puta(addr);	putchar('\n');done:	flush();}dupl(){	if(flag) {		flag = 0;		line(from, &key, 1);	}}puta(a)int a[2];{	putn(a[0], base, 4);	putn(a[1], base, 3);	putchar(' ');}line(a, w, n)int w[];{	int i, f, c;	f = 1;	for(c=1; c; c=+c) {		if((c&conv) == 0)			continue;		if(f) {			puta(a);			f = 0;		} else			for(i=0; i<8; i++)				putchar(' ');		for(i=0; i<n; i++) {			putx(w[i], c);			putchar(i==n-1? '\n': ' ');		}	}}putx(n, c){	switch(c) {	case 001:		pre(6);		putn(n, 8, 6);		break;	case 002:		pre(5);		putn(n, 10, 5);		break;	case 004:		pre(4);		putop(n);		break;	case 010:		pre(4);		putn(n, 16, 4);		break;	case 020:		pre(5);		putc(n);		putchar(' ');		putc(n>>8);		break;	case 040:		pre(7);		putn(n&0377, 8, 3);		putchar(' ');		putn((n>>8)&0377, 8, 3);		break;	}}getw(){	int b1, b2;	b1 = getc();	if(b1 == -1) {		eof = 1;		return(0);	}	b2 = getc();	if(b2 == -1)		b2 = 0;	return(b1|(b2<<8));}getc(){	if(gidx >= gcnt) {		gcnt = read(fi, gbuf, 512);		if(gcnt <= 0)			return(-1);		gidx = 0;	}	if(++addr[1] >= basem) {		addr[0]++;		addr[1] = 0;	}	return(gbuf[gidx++]&0377);}putc(c){	c =& 0377;	if(c>037 && c<0177 && c!='\\') {		putchar(' ');		putchar(c);		return;	}	putchar('\\');	switch(c) {	case '\0':		putchar('0');		break;	case '\n':		putchar('n');		break;	case '\\':		putchar('\\');		break;	case '\t':		putchar('t');		break;	default:		putchar('?');	}}putn(n, b, c){	if(!c)		return;	putn(ldiv(0,n,b),b,c-1);	if((n=lrem(0,n,b)) > 9)		putchar(n-10+'a'); else		putchar(n+'0');}pre(n){	int i;	for(i=n; i<max; i++)		putchar(' ');}offset(s)char s[];{	char *p;	int a[2], d, i, j, b;	p = s;	while(*p++);	i = p-s-1;	b = 0;	if(i > 0)		if(p[-2] == 'b') {			i--;			b++;			p--;		}	if(i > 0)		if(p[-2] == '.') {			i--;			base = 10;			basem = 1000;		}	a[0] = 0;	for(j=0; i-j>3; j++) {		d = s[j];		if(d>='0' && d<='9')			a[0] = a[0]*base + d-'0';	}	a[1] = 0;	for(; i-j>0; j++) {		d = s[j];		if(d>='0' && d<='9')			a[1] = a[1]*base + d-'0';	}	if(b) {		i = a[0]*basem+a[1];		a[0] = 0;		a[1] = 0;		while(i--) {			a[1] =+ 512;			while(a[1] >= basem) {				a[1] =- basem;				a[0]++;			}		}	}	i = 0;	while(a[0] > addr[0]+1) {		addr[1] =+ 512;		while(addr[1] >= basem) {			addr[1] =- basem;			addr[0]++;		}		i++;	}	seek(fi, i, 3);	while(a[0]!=addr[0] || a[1]!=addr[1])		if(getc() == -1)			break;}putop(n){	char *p;	int i, c;	p = getop(n);	for(i=0; (c = *p++) != '\0'; i++)		putchar(c);	for(; i<4; i++)		putchar(' ');}getop(n){	switch(n&0170000)	{	case 0000000:		switch(n&0177000)		{		case 0004000:			return("jsr");		case 0077000:			return("sob");		}		switch(n&0177400)		{		case 0000400:			return("br");		case 0001000:			return("bne");		case 0001400:			return("beq");		case 0002000:			return("bge");		case 0002400:			return("blt");		case 0003000:			return("bgt");		case 0003400:			return("ble");		}		switch(n&0177700)		{		case 0000100:			return("jmp");		case 0000300:			return("swab");		case 0005000:			return("clr");		case 0005100:			return("com");		case 0005200:			return("inc");		case 0005300:			return("dec");		case 0005400:			return("neg");		case 0005500:			return("adc");		case 0005600:			return("sbc");		case 0005700:			return("tst");		case 0006000:			return("ror");		case 0006100:			return("rol");		case 0006200:			return("asr");		case 0006300:			return("asl");		case 0006400:			return("mark");		case 0006500:			return("mfpi");		case 0006600:			return("mtpi");		case 0006700:			return("sxt");		}		switch(n&0177740)		{		case 0000240:			return("flag");		}		switch(n&0177770)		{		case 0000200:			return("rts");		case 0000230:			return("spl");		}		switch(n&0177777)		{		case 0000000:			return("halt");		case 0000001:			return("wait");		case 0000002:			return("rti");		case 0000003:			return("bpt");		case 0000004:			return("iot");		case 0000005:			return("rset");		case 0000006:			return("rtt");		}		break;	case 0010000:		return("mov ");	case 0020000:		return("cmp");	case 0030000:		return("bit");	case 0040000:		return("bic");	case 0050000:		return("bis");	case 0060000:		return("add");	case 0070000:		switch(n&0177000)		{		case 0070000:			return("mul");		case 0071000:			return("div");		case 0072000:			return("ash");		case 0073000:			return("ashc");		case 0074000:			return("xor");		}		break;	case 0100000:		switch(n&0177400)		{		case 0100000:			return("bpl");		case 0100400:			return("bmi");		case 0101000:			return("bhi");		case 0101400:			return("blos");		case 0102000:			return("bvc");		case 0102400:			return("bvs");		case 0103000:			return("bhis");		case 0103400:			return("blo");		case 0104000:			return("emt");		case 0104400:			return("sys");		}		switch(n&0177700)		{		case 0105000:			return("clrb");		case 0105100:			return("comb");		case 0105200:			return("incb");		case 0105300:			return("decb");		case 0105400:			return("negb");		case 0105500:			return("adcb");		case 0105600:			return("sbcb");		case 0105700:			return("tstb");		case 0106000:			return("rorb");		case 0106100:			return("rolb");		case 0106200:			return("asrb");		case 0106300:			return("aslb");		case 0106500:			return("mfpd");		case 0106600:			return("mfpd");		}		break;	case 0110000:		return("movb");	case 0120000:		return("cmpb");	case 0130000:		return("bitb");	case 0140000:		return("bicb");	case 0150000:		return("bisb");	case 0160000:		return("sub");	case 0170000:		switch(n&01777000)		{		case 0:0;		}		break;	}	return("???");}

⌨️ 快捷键说明

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