1/*-
2 * Copyright (c) 1986, 1988, 1991, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 * (c) UNIX System Laboratories, Inc.
5 * All or some portions of this file are derived from material licensed
6 * to the University of California by American Telephone and Telegraph
7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8 * the permission of UNIX System Laboratories, Inc.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 * 4. Neither the name of the University nor the names of its contributors
19 *    may be used to endorse or promote products derived from this software
20 *    without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 *
34 *	@(#)subr_prf.c	8.3 (Berkeley) 1/21/94
35 */
36
37#include <sys/cdefs.h>
38__FBSDID("$FreeBSD$");
39
40#include <sys/types.h>
41#include <libutil.h>
42#include <stdio.h>
43
44void
45hexdump(const void *ptr, int length, const char *hdr, int flags)
46{
47	int i, j, k;
48	int cols;
49	const unsigned char *cp;
50	char delim;
51
52	if ((flags & HD_DELIM_MASK) != 0)
53		delim = (flags & HD_DELIM_MASK) >> 8;
54	else
55		delim = ' ';
56
57	if ((flags & HD_COLUMN_MASK) != 0)
58		cols = flags & HD_COLUMN_MASK;
59	else
60		cols = 16;
61
62	cp = ptr;
63	for (i = 0; i < length; i+= cols) {
64		if (hdr != NULL)
65			printf("%s", hdr);
66
67		if ((flags & HD_OMIT_COUNT) == 0)
68			printf("%04x  ", i);
69
70		if ((flags & HD_OMIT_HEX) == 0) {
71			for (j = 0; j < cols; j++) {
72				k = i + j;
73				if (k < length)
74					printf("%c%02x", delim, cp[k]);
75				else
76					printf("   ");
77			}
78		}
79
80		if ((flags & HD_OMIT_CHARS) == 0) {
81			printf("  |");
82			for (j = 0; j < cols; j++) {
83				k = i + j;
84				if (k >= length)
85					printf(" ");
86				else if (cp[k] >= ' ' && cp[k] <= '~')
87					printf("%c", cp[k]);
88				else
89					printf(".");
90			}
91			printf("|");
92		}
93		printf("\n");
94	}
95}
96
97