📄 od.c
字号:
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 + -