diff --git a/src/util.c b/src/util.c index 84a5237f8..eda4a4e11 100644 --- a/src/util.c +++ b/src/util.c @@ -121,3 +121,47 @@ int git__basename(char *base, size_t n, char *path) return len; } +void git__hexdump(const char *buffer, size_t len) +{ + static const size_t LINE_WIDTH = 16; + + size_t line_count, last_line, i, j; + const char *line; + + line_count = (len / LINE_WIDTH); + last_line = (len % LINE_WIDTH); + + for (i = 0; i < line_count; ++i) { + line = buffer + (i * LINE_WIDTH); + for (j = 0; j < LINE_WIDTH; ++j, ++line) + printf("%02X ", (unsigned char)*line & 0xFF); + + printf("| "); + + line = buffer + (i * LINE_WIDTH); + for (j = 0; j < LINE_WIDTH; ++j, ++line) + printf("%c", (*line >= 32 && *line <= 126) ? *line : '.'); + + printf("\n"); + } + + if (last_line > 0) { + + line = buffer + (line_count * LINE_WIDTH); + for (j = 0; j < last_line; ++j, ++line) + printf("%02X ", (unsigned char)*line & 0xFF); + + for (j = 0; j < (LINE_WIDTH - last_line); ++j) + printf(" "); + + printf("| "); + + line = buffer + (line_count * LINE_WIDTH); + for (j = 0; j < last_line; ++j, ++line) + printf("%c", (*line >= 32 && *line <= 126) ? *line : '.'); + + printf("\n"); + } + + printf("\n"); +} diff --git a/src/util.h b/src/util.h index 71d0a2d52..5f647253c 100644 --- a/src/util.h +++ b/src/util.h @@ -34,6 +34,8 @@ extern int git__suffixcmp(const char *str, const char *suffix); extern int git__dirname(char *dir, size_t n, char *path); extern int git__basename(char *base, size_t n, char *path); +extern void git__hexdump(const char *buffer, size_t n); + /** @return true if p fits into the range of a size_t */ GIT_INLINE(int) git__is_sizet(off_t p) {