/*====================================================================* * * void hexview (void const * memory, size_t offset, size_t extent, FILE *fp); * * memory.h * * print memory as a hexadecimal dump showing absolute offsets and * an ASCII character display; this function is similar to but not * the same as function hexdump; * * Motley Tools by Charles Maier <cmaier@cmassoc.net>; * Copyright (c) 2001-2006 by Charles Maier Associates; * Licensed under the Internet Software Consortium License; * *--------------------------------------------------------------------*/ #ifndef HEXVIEW_SOURCE #define HEXVIEW_SOURCE #include <stdio.h> #include <ctype.h> #include <stdint.h> #include "../tools/memory.h" #include "../tools/number.h" void hexview (void const * memory, size_t offset, size_t extent, FILE *fp) { byte * origin = (byte *)(memory); unsigned block = 0x10; size_t lower = block * (offset / block); size_t upper = block + lower; size_t index = 0; char buffer [ADDRSIZE + 72]; char * output; while (lower < offset + extent) { output = buffer + ADDRSIZE; for (index = lower; output-- > buffer; index >>= 4) { *output = DIGITS_HEX [index & 0x0F]; } output = buffer + ADDRSIZE; for (index = lower; index < upper; index++) { *output++ = ' '; if (index < offset) { *output++ = ' '; *output++ = ' '; } else if (index < offset + extent) { *output++ = DIGITS_HEX [(origin [index-offset] >> 4) & 0x0F]; *output++ = DIGITS_HEX [(origin [index-offset] >> 0) & 0x0F]; } else { *output++ = ' '; *output++ = ' '; } } *output++ = ' '; for (index = lower; index < upper; index++) { if (index < offset) { *output++ = ' '; } else if (index < offset + extent) { unsigned c = origin [index-offset]; *output++ = isprint (c)? c: '.'; } else { *output++ = ' '; } } *output++ = '\n'; *output++ = '\0'; fputs (buffer, fp); lower += block; upper += block; } fflush (fp); return; } #endif