xref: /openbsd/sys/lib/libsa/hexdump.c (revision d89ec533)
1 /*	$OpenBSD: hexdump.c,v 1.1 2019/11/28 00:17:13 bluhm Exp $	*/
2 /*
3  * Copyright (c) 2019 Alexander Bluhm <bluhm@openbsd.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #include <sys/types.h>
19 
20 #include "stand.h"
21 
22 void
23 hexdump(const void *addr, size_t size)
24 {
25 	const unsigned char *line, *end;
26 	int byte;
27 
28 	end = (const char *)addr + size;
29 	for (line = addr; line < end; line += 16) {
30 		printf("%08lx  ", line);
31 		for (byte = 0; byte < 16; byte++) {
32 			if (&line[byte] < end)
33 				printf("%02x ", line[byte]);
34 			else
35 				printf("   ");
36 			if (byte == 7)
37 				printf(" ");
38 		}
39 		printf(" |");
40 		for (byte = 0; byte < 16; byte++) {
41 			if (&line[byte] < end) {
42 				if (line[byte] >= ' ' && line[byte] <= '~')
43 					printf("%c", line[byte]);
44 				else
45 					printf(".");
46 			} else
47 				break;
48 		}
49 		printf("|\n");
50 	}
51 	printf("%08lx\n", end);
52 }
53