From: Sascha Wildner Date: Mon, 29 Nov 2010 02:38:14 +0000 (+0100) Subject: kernel: Bring in hexdump() from FreeBSD. X-Git-Tag: v2.11.0~551 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/37f44315535530316b6d3875c6697a1075fab385 kernel: Bring in hexdump() from FreeBSD. --- diff --git a/sys/kern/subr_prf.c b/sys/kern/subr_prf.c index 68df895d03..3859b3f32a 100644 --- a/sys/kern/subr_prf.c +++ b/sys/kern/subr_prf.c @@ -1181,3 +1181,57 @@ DB_SHOW_COMMAND(msgbuf, db_show_msgbuf) } #endif /* DDB */ + + +void +hexdump(const void *ptr, int length, const char *hdr, int flags) +{ + int i, j, k; + int cols; + const unsigned char *cp; + char delim; + + if ((flags & HD_DELIM_MASK) != 0) + delim = (flags & HD_DELIM_MASK) >> 8; + else + delim = ' '; + + if ((flags & HD_COLUMN_MASK) != 0) + cols = flags & HD_COLUMN_MASK; + else + cols = 16; + + cp = ptr; + for (i = 0; i < length; i+= cols) { + if (hdr != NULL) + kprintf("%s", hdr); + + if ((flags & HD_OMIT_COUNT) == 0) + kprintf("%04x ", i); + + if ((flags & HD_OMIT_HEX) == 0) { + for (j = 0; j < cols; j++) { + k = i + j; + if (k < length) + kprintf("%c%02x", delim, cp[k]); + else + kprintf(" "); + } + } + + if ((flags & HD_OMIT_CHARS) == 0) { + kprintf(" |"); + for (j = 0; j < cols; j++) { + k = i + j; + if (k >= length) + kprintf(" "); + else if (cp[k] >= ' ' && cp[k] <= '~') + kprintf("%c", cp[k]); + else + kprintf("."); + } + kprintf("|"); + } + kprintf("\n"); + } +} diff --git a/sys/sys/systm.h b/sys/sys/systm.h index 8342057643..40a48d9e6e 100644 --- a/sys/sys/systm.h +++ b/sys/sys/systm.h @@ -202,6 +202,12 @@ int kvasnrprintf (char **, size_t, int, const char *, int kvsprintf (char *buf, const char *, __va_list) __printflike(2, 0); int ttyprintf (struct tty *, const char *, ...) __printflike(2, 3); +void hexdump (const void *ptr, int length, const char *hdr, int flags); +#define HD_COLUMN_MASK 0xff +#define HD_DELIM_MASK 0xff00 +#define HD_OMIT_COUNT (1 << 16) +#define HD_OMIT_HEX (1 << 17) +#define HD_OMIT_CHARS (1 << 18) int ksscanf (const char *, char const *, ...) __scanflike(2, 3); int kvsscanf (const char *, char const *, __va_list) __scanflike(2, 0); void kvasfree(char **);