diff --git a/include/common/standard.h b/include/common/standard.h index e16b30414f..68244dbe79 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -990,6 +991,11 @@ char *env_expand(char *in); */ #define fddebug(msg...) do { char *_m = NULL; memprintf(&_m, ##msg); if (_m) write(-1, _m, strlen(_m)); free(_m); } while (0) +/* displays a long memory block at , assuming first byte of + * has address . The output is emitted to file . + */ +void debug_hexdump(FILE *out, char *buf, unsigned int baseaddr, int len); + /* used from everywhere just to drain results we don't want to read and which * recent versions of gcc increasingly and annoyingly complain about. */ diff --git a/src/standard.c b/src/standard.c index 079aef8f75..910e1c298b 100644 --- a/src/standard.c +++ b/src/standard.c @@ -3765,6 +3765,51 @@ int dump_text_line(struct chunk *out, const char *buf, int bsize, int len, return ptr; } +/* displays a long memory block at , assuming first byte of + * has address . The output is emitted to file . + */ +void debug_hexdump(FILE *out, char *buf, unsigned int baseaddr, int len) +{ + unsigned int i, j; + int b; + + for (i = 0; i < (len + (baseaddr & 15)); i += 16) { + b = i - (baseaddr & 15); + fprintf(out, "%08x: ", i + (baseaddr & ~15)); + for (j = 0; j < 8; j++) { + if (b + j >= 0 && b + j < len) + fprintf(out, "%02x ", (unsigned char)buf[b + j]); + else + fprintf(out, " "); + } + + if (b + j >= 0 && b + j < len) + fputc('-', out); + else + fputc(' ', out); + + for (j = 8; j < 16; j++) { + if (b + j >= 0 && b + j < len) + fprintf(out, " %02x", (unsigned char)buf[b + j]); + else + fprintf(out, " "); + } + + fprintf(out, " "); + for (j = 0; j < 16; j++) { + if (b + j >= 0 && b + j < len) { + if (isprint((unsigned char)buf[b + j])) + fputc((unsigned char)buf[b + j], out); + else + fputc('.', out); + } + else + fputc(' ', out); + } + fputc('\n', out); + } +} + /* * Local variables: * c-indent-level: 8