#include #include #include #include "glob.h" long initialoffset = 0; stars() { write(1, " *\r\n", 7); } dump(handle) { static char last[16]; static char buf[1024]; static char line[80]; register i, j, size; long address=0L; register char *exp; char tick=0; if (initialoffset > 0) { lseek(handle, initialoffset, 0); address=tell(handle); initialoffset = 0; } while ((size=read(handle, buf, 1024)) > 0) for (i=0; i 0 && memcmp(last, buf+i, 16) == 0) { tick = 1; continue; } if (tick) { stars(); tick = 0; } memcpy(last, buf+i, 16); { register d; register long addr = address; for (exp=line, j=0; j<8; j++) *exp++ = '0'; while (addr > 0) { d = addr & 15; addr >>= 4; line[--j] = (d < 10) ? (d+'0') : (d-10+'a'); } } *exp++ = '|'; *exp++ = ' '; for (j=0; j<16; j++) { if (i+j < size) { register d, c; c = buf[i+j]; d = (c >> 4) & 15; *exp++ = (d < 10) ? (d+'0') : (d-10+'a'); d = c & 15; *exp++ = (d < 10) ? (d+'0') : (d-10+'a'); } else { *exp++ = '-'; *exp++ = '-'; } if (j&3 == 3) *exp++ = ' '; } *exp++ = '|'; *exp++ = ' '; for (j=0; j<16; j++) if (i+j < size) *exp++ = ((buf[i+j] >= ' ' && buf[i+j] <= '~') ? buf[i+j] : '.'); else *exp++ = ' '; *exp++ = '|'; *exp++ = '\r'; *exp++ = '\n'; write(1, line, (int)(exp-line)); } } long getoffset(string) register char *string; { register long accum=0; register radix=10; strlwr(string); if (string[1] == '0') { ++string; if (string[1] == 'x') { ++string; radix=16; } else radix=8; } while (*++string) { accum *= radix; if (*string >= '0' && *string <= '9') accum += (*string - '0'); else if (radix == 16 && *string >= 'a' && *string <= 'f') accum += (*string - 'a' + 10); else { write(1, "bad offset-ignored\r\n", 20); return 0L; } } return accum; } main(argc, argv) char **argv; { register i, handle; long terminate; if (argc > 1 && argv[1][0] == '-') { ++argv, --argc; initialoffset = getoffset(*argv); } expand_arglist(argc, argv, (struct args_t*)0); if (myargc < 1) dump(0); else for (i=0; i 2) { write(1, "############\r\n", 14); write(1, myargv[i], strlen(myargv[i])); write(1, "\r\n############\r\n", 16); } dump(handle); close(handle); } }