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

📄 od.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
/* * od -- octal (also hex, decimal, and character) dump */#include <stdio.h>unsigned short	word[8];unsigned short	lastword[8];int	conv;int	base =	010;int	max;long	addr;main(argc, argv)char **argv;{	register char *p;	register n, f, same;	argv++;	f = 0;	if(argc > 1) {		p = *argv;		if(*p == '-') {			while(*p != '\0') {				switch(*p++) {				case 'o':					conv |= 001;					f = 6;					break;				case 'd':					conv |= 002;					f = 5;					break;				case 'x':				case 'h':					conv |= 010;					f = 4;					break;				case 'c':					conv |= 020;					f = 7;					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 != '+') {		if (freopen(*argv, "r", stdin) == NULL) {			printf("cannot open %s\n", *argv);			exit(1);		}		argv++;		argc--;	}	if(argc > 1)		offset(*argv);	same = -1;	for ( ; (n = fread((char *)word, 1, sizeof(word), stdin)) > 0; addr += n) {		if (same>=0) {			for (f=0; f<8; f++)				if (lastword[f] != word[f])					goto notsame;			if (same==0) {				printf("*\n");				same = 1;			}			continue;		}	notsame:		line(addr, word, (n+sizeof(word[0])-1)/sizeof(word[0]));		same = 0;		for (f=0; f<8; f++)			lastword[f] = word[f];		for (f=0; f<8; f++)			word[f] = 0;	}	putn(addr, base, 7);	putchar('\n');}line(a, w, n)long a;unsigned short *w;{	register i, f, c;	f = 1;	for(c=1; c; c<<=1) {		if((c&conv) == 0)			continue;		if(f) {			putn(a, base, 7);			putchar(' ');			f = 0;		} else			putchar('\t');		for (i=0; i<n; i++) {			putx(w[i], c);			putchar(i==n-1? '\n': ' ');		}	}}putx(n, c)unsigned n;{	switch(c) {	case 001:		pre(6);		putn((long)n, 8, 6);		break;	case 002:		pre(5);		putn((long)n, 10, 5);		break;	case 010:		pre(4);		putn((long)n, 16, 4);		break;	case 020:		pre(7);		{			unsigned short sn = n;			cput(*(char *)&sn);			putchar(' ');			cput(*((char *)&sn + 1));			break;		}	case 040:		pre(7);		{			unsigned short sn = n;			putn((long)(*(char *)&sn)&0377, 8, 3);			putchar(' ');			putn((long)(*((char *)&sn + 1))&0377, 8, 3);			break;		}	}}cput(c){	c &= 0377;	if(c>037 && c<0177) {		printf("  ");		putchar(c);		return;	}	switch(c) {	case '\0':		printf(" \\0");		break;	case '\b':		printf(" \\b");		break;	case '\f':		printf(" \\f");		break;	case '\n':		printf(" \\n");		break;	case '\r':		printf(" \\r");		break;	case '\t':		printf(" \\t");		break;	default:		putn((long)c, 8, 3);	}}putn(n, b, c)long n;{	register d;	if(!c)		return;	putn(n/b, b, c-1);	d = n%b;	if (d > 9)		putchar(d-10+'a');	else		putchar(d+'0');}pre(n){	int i;	for(i=n; i<max; i++)		putchar(' ');}offset(s)register char *s;{	register char *p;	long a;	register int d;	if (*s=='+')		s++;	if (*s=='x') {		s++;		base = 16;	} else if (*s=='0' && s[1]=='x') {		s += 2;		base = 16;	} else if (*s == '0')		base = 8;	p = s;	while(*p) {		if (*p++=='.')			base = 10;	}	for (a=0; *s; s++) {		d = *s;		if(d>='0' && d<='9')			a = a*base + d - '0';		else if (d>='a' && d<='f' && base==16)			a = a*base + d + 10 - 'a';		else			break;	}	if (*s == '.')		s++;	if(*s=='b' || *s=='B')		a *= 512;	fseek(stdin, a, 0);	addr = a;}

⌨️ 快捷键说明

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