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

📄 od.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
	printf(d->df_fmt, icvt(*n, d->df_radix, d->df_signed, d->df_field));	return(d->df_size);}d_put(f, d)double	*f;struct dfmt *d;{	char fbuf[24];	struct l { long n[2]; };#if	vax	if ((((struct l *)f)->n[0] & 0xff00) == 0x8000)	/* Vax illegal f.p. */		sprintf(fbuf, "    %08x %08x",			((struct l *)f)->n[0], ((struct l *)f)->n[1]);	else#endif		sprintf(fbuf, "%21.14e", *f);	printf(d->df_fmt, fbuf);	return(d->df_size);}f_put(f, d)float	*f;struct dfmt *d;{	char fbuf[16];#if	vax	if ((*(long *)f & 0xff00) == 0x8000)	/* Vax illegal f.p. form */		sprintf(fbuf, "      %08x", *(long *)f);	else#endif		sprintf(fbuf, "%14.7e", *f);	printf(d->df_fmt, fbuf);	return(d->df_size);}char	asc_name[34][4] = {/* 000 */	"nul",	"soh",	"stx",	"etx",	"eot",	"enq",	"ack",	"bel",/* 010 */	" bs",	" ht",	" nl",	" vt",	" ff",	" cr",	" so",	" si",/* 020 */	"dle",	"dc1",	"dc2",	"dc3",	"dc4",	"nak",	"syn",	"etb",/* 030 */	"can",	" em",	"sub",	"esc",	" fs",	" gs",	" rs",	" us",/* 040 */	" sp",	"del"};a_put(cc, d)char	*cc;struct dfmt *d;{	int c = *cc;	register char *s = "   ";	register pbit = parity((int)c & 0377);	c &= 0177;	if (isgraphic(c))	{		s[2] = c;		if (pbit == _parity)			printf(d->df_fmt, underline(s));		else			printf(d->df_fmt, s);	}	else	{		if (c == 0177)			c = ' ' + 1;		if (pbit == _parity)			printf(d->df_fmt, underline(asc_name[c]));		else			printf(d->df_fmt, asc_name[c]);	}	return(1);}parity(word)int	word;{	register int p = 0;	register int w = word;	if (w)		do		{			p ^= 1;		} while(w &= (~(-w)));	return (p? ODD:EVEN);}char *underline(s)char	*s;{	static char ulbuf[16];	register char *u = ulbuf;	while (*s)	{		if (*s != ' ')		{			*u++ = '_';			*u++ = '\b';		}		*u++ = *s++;	}	*u = '\0';	return(ulbuf);}b_put(b, d)char	*b;struct dfmt *d;{	printf(d->df_fmt, icvt((long)*b & 0377, d->df_radix, d->df_signed, d->df_field));	return(1);}c_put(cc, d)char	*cc;struct dfmt *d;{	register char	*s;	register int	n;	register int	c = *cc & 0377;	s = scvt(c, d);	for (n = d->df_field - strlen(s); n > 0; n--)		putchar(' ');	printf(d->df_fmt, s);	return(1);}char *scvt(c, d)int	c;struct dfmt	*d;{	static char s[2];	switch(c)	{		case '\0':			return("\\0");		case '\b':			return("\\b");		case '\f':			return("\\f");		case '\n':			return("\\n");		case '\r':			return("\\r");		case '\t':			return("\\t");		default:			if (isprint(c))			{				s[0] = c;				return(s);			}			return(icvt((long)c, d->df_radix, d->df_signed, d->df_field));	}}/* * Look for strings. * A string contains bytes > 037 && < 177, and ends with a null. * The minimum length is given in the dfmt structure. */#define CNULL		'\0'#define S_EMPTY	0#define S_FILL	1#define	S_CONT	2#define SBUFSIZE	1024static char	str_buf[SBUFSIZE];static int	str_mode = S_EMPTY;static char	*str_ptr;static long	str_addr;static long	str_label;st_put(cc, d)char	*cc;struct dfmt	*d;{	register int	c;	if (cc == 0)	{		pr_sbuf(d, YES);		return(1);	}	c = (*cc & 0377);	if (str_mode & S_FILL)	{		if (isascii(c))			put_sbuf(c, d);		else		{			*str_ptr = CNULL;			if (c == NULL)				pr_sbuf(d, YES);			str_mode = S_EMPTY;		}	}	else if (isascii(c))	{		str_mode = S_FILL;		str_addr = addr + (cc - dbuf);	  /* ugly */		if ((str_label = label) >= 0)			str_label += (cc - dbuf); /*  ''  */		str_ptr = str_buf;		put_sbuf(c, d);	}	return(1);}put_sbuf(c, d)int	c;struct dfmt	*d;{	*str_ptr++ = c;	if (str_ptr >= (str_buf + SBUFSIZE))	{		pr_sbuf(d, NO);		str_ptr = str_buf;		str_mode |= S_CONT;	}}pr_sbuf(d, end)struct dfmt	*d;int	end;{	register char	*p = str_buf;	if (str_mode == S_EMPTY	    || (!(str_mode & S_CONT) && (str_ptr - str_buf) < d->df_size))		return;	if (!(str_mode & S_CONT))		put_addr(str_addr, str_label, ' ');	while (p < str_ptr)		fputs(scvt(*p++, d), stdout);	if (end)		putchar('\n');}/* * integer to ascii conversion * * This code has been rearranged to produce optimized runtime code. */#define MAXINTLENGTH	32static char	_digit[] = "0123456789abcdef";static char	_icv_buf[MAXINTLENGTH+1];static long	_mask = 0x7fffffff;char *icvt (value, radix, issigned, ndigits)long	value;int	radix;int	issigned;int	ndigits;{	register long	val = value;	register long	rad = radix;	register char	*b = &_icv_buf[MAXINTLENGTH];	register char	*d = _digit;	register long	tmp1;	register long	tmp2;	long	rem;	long	kludge;	int	sign;	if (val == 0)	{		*--b = '0';		sign = 0;		goto done; /*return(b);*/	}	if (issigned && (sign = (val < 0)))	/* signed conversion */	{		/*		 * It is necessary to do the first divide		 * before the absolute value, for the case -2^31		 *		 * This is actually what is being done...		 * tmp1 = (int)(val % rad);		 * val /= rad;		 * val = -val		 * *--b = d[-tmp1];		 */		tmp1 = val / rad;		*--b = d[(tmp1 * rad) - val];		val = -tmp1;	}	else				/* unsigned conversion */	{		sign = 0;		if (val < 0)		{	/* ALL THIS IS TO SIMULATE UNSIGNED LONG MOD & DIV */			kludge = _mask - (rad - 1);			val &= _mask;			/*			 * This is really what's being done...			 * rem = (kludge % rad) + (val % rad);			 * val = (kludge / rad) + (val / rad) + (rem / rad) + 1;			 * *--b = d[rem % rad];			 */			tmp1 = kludge / rad;			tmp2 = val / rad;			rem = (kludge - (tmp1 * rad)) + (val - (tmp2 * rad));			val = ++tmp1 + tmp2;			tmp1 = rem / rad;			val += tmp1;			*--b = d[rem - (tmp1 * rad)];		}	}	while (val)	{		/*		 * This is really what's being done ...		 * *--b = d[val % rad];		 * val /= rad;		 */		tmp1 = val / rad;		*--b = d[val - (tmp1 * rad)];		val = tmp1;	}done:	if (sign)		*--b = '-';	tmp1 = ndigits - (&_icv_buf[MAXINTLENGTH] - b);	tmp2 = issigned? ' ':'0';	while (tmp1 > 0)	{		*--b = tmp2;		tmp1--;	}	return(b);}long get_addr(s)register char *s;{	register char *p;	register long a;	register int d;	if (*s=='+')		s++;	if (*s=='x')	{		s++;		addr_base = 16;	}	else if (*s=='0' && s[1]=='x')	{		s += 2;		addr_base = 16;	}	else if (*s == '0')		addr_base = 8;	p = s;	while(*p)	{		if (*p++=='.')			addr_base = 10;	}	for (a=0; *s; s++)	{		d = *s;		if(isdigit(d))			a = a*addr_base + d - '0';		else if (ishex(d) && addr_base==16)			a = a*addr_base + d + 10 - 'a';		else			break;	}	if (*s == '.')		s++;	if(*s=='b')		a *= 512;	if(*s=='B')		a *= 1024;	return(a);}offset(a)long	a;{	if (canseek(stdin))	{		/*		 * in case we're accessing a raw disk,		 * we have to seek in multiples of a physical block.		 */		fseek(stdin, a & 0xfffffe00L, 0);		a &= 0x1ffL;	}	dumbseek(stdin, a);}dumbseek(s, offset)FILE	*s;long	offset;{	char	buf[BUFSIZ];	int	n;	int	nr;	while (offset > 0)	{		nr = (offset > BUFSIZ) ? BUFSIZ : (int)offset;		if ((n = fread(buf, 1, nr, s)) != nr)		{			fprintf(stderr, "EOF\n");			exit(1);		}		offset -= n;	}}#include <sys/types.h>#include <sys/stat.h>canseek(f)FILE	*f;{	struct stat statb;	return( (fstat(fileno(f),&statb)==0) &&		(statb.st_nlink > 0) &&		/*!pipe*/		(!isatty(fileno(f))) );}

⌨️ 快捷键说明

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