/* * mydump.c * * Create a hex dump in the format preferred by hpa * */ #include #include #define BLOCK_SIZE 4096 static int my_isprint(unsigned char ch) { return ( (ch & 0x60) && ch != 0x7f && ch != 0xa0 ); } void dump_file(FILE *in, FILE *out, unsigned long offset) { unsigned char buffer[BLOCK_SIZE], *lptr, *dptr; int nb, nl, i; long addr; if ( offset ) fseek(in, offset, SEEK_SET); addr = ftell(in); if ( addr == -1 ) addr = 0; while ( (nb = fread(buffer, 1, BLOCK_SIZE, in)) > 0 ) { dptr = buffer; while ( nb ) { fprintf(out, "%08lx ", addr); nl = ( nb < 16 ) ? nb : 16; addr += nl; nb -= nl; lptr = dptr; for ( i = 0 ; i < 16 ; i++ ) { if ( i >= nl ) fprintf(out, " "); else fprintf(out, "%02x", *dptr++); putc(i == 7 ? '-' : ' ', out); } dptr = lptr; fprintf(out, " "); for ( i = 0 ; i < 16 ; i++ ) { if ( i >= nl ) putc(' ', out); else if ( my_isprint(*dptr) ) putc(*dptr, out); else putc('.', out); dptr++; } putc('\n', out); } } } int main(int argc, char *argv[]) { FILE *f; int i; unsigned long offset = 0; if ( argc > 1 ) { for ( i = 1 ; i < argc ; i++ ) { if ( argv[i][0] == '-' ) { if ( argv[i][1] == 'o' && i < argc-1 ) { offset = strtoul(argv[++i], NULL, 0); } } else { if ( !(f = fopen(argv[i], "rb")) ) perror(argv[i]); else { printf("\n--- %s\n", argv[i]); dump_file(f,stdout,offset); fclose(f); } } } } else { dump_file(stdin, stdout, 0); } return 0; }