Commit 0e465f979bd946d7476c86cfaa912d0737f54682

Vicent Marti 2010-08-12T18:47:32

Add auxiliary method git__hexdump New function in util.c to do a dump of a buffer's contents in hexadecimal to stdout. Signed-off-by: Vicent Marti <tanoku@gmail.com>

diff --git a/src/util.c b/src/util.c
index 84a5237..eda4a4e 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 71d0a2d..5f64725 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)
 {