Merge hexdump(9) to userland as hexdump(3) in libutil. I'm tired of doing

this by hand in userland utilities.

MFC after:	1 month
This commit is contained in:
John Baldwin 2008-07-01 22:30:57 +00:00
parent c1871fe5ec
commit e1355b07ee
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=180161
4 changed files with 201 additions and 3 deletions

View File

@ -9,9 +9,9 @@ LIB= util
SHLIB_MAJOR= 7
SRCS= _secure_path.c auth.c gr_util.c expand_number.c flopen.c fparseln.c \
humanize_number.c kld.c login.c login_auth.c login_cap.c login_class.c \
login_crypt.c login_ok.c login_times.c login_tty.c logout.c \
logwtmp.c pidfile.c property.c pty.c pw_util.c realhostname.c \
hexdump.c humanize_number.c kld.c login.c login_auth.c login_cap.c \
login_class.c login_crypt.c login_ok.c login_times.c login_tty.c \
logout.c logwtmp.c pidfile.c property.c pty.c pw_util.c realhostname.c \
stub.c trimdomain.c uucplock.c
INCS= libutil.h login_cap.h

94
lib/libutil/hexdump.3 Normal file
View File

@ -0,0 +1,94 @@
.\" -*- nroff -*-
.\"
.\" Copyright (c) 2003 Scott Long
.\"
.\" All rights reserved.
.\"
.\" This program is free software.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
.\" $FreeBSD$
.\"
.Dd July 1, 2008
.Os
.Dt HEXDUMP 3
.Sh NAME
.Nm hexdump
.Nd "dump a block of bytes to standard out in hexadecimal form"
.Sh SYNOPSIS
.In libutil.h
.Ft void
.Fn hexdump "void *ptr" "int length" "const char *hdr" "int flags"
.Sh DESCRIPTION
The
.Fn hexdump
function prints an array of bytes to standard out in hexadecimal form,
along with the
.Tn ASCII
representation of the bytes, if possible.
By default, each line of
output will start with an offset count, followed by 16 hexadecimal values,
followed by 16
.Tn ASCII
characters.
.Bl -tag -width indent
.It Fa ptr
Pointer to the array of bytes to print.
It does not need to be
.Dv NUL Ns
-terminated.
.It Fa length
Number of bytes to print.
.It Fa hdr
Pointer to a
.Dv NUL Ns
-terminated character string that will be prepended to each
line of output.
A value of
.Dv NULL
implies that no header will be printed.
.It Fa flags
Flags for controlling the formatting of the output.
.Bl -tag -width ".Dv HD_OMIT_COUNT"
.It Bits 0-7
Integer value of the number of bytes to display on each line.
A value of 0 implies that the default value of 16 will be used.
.It Bits 8-15
Character
.Tn ASCII
value to use as the separator for the hexadecimal output.
A value of 0 implies that the default value of 32
.Tn ( ASCII
space) will be used.
.It Dv HD_OMIT_COUNT
Do not print the offset column at the beginning of each line.
.It Dv HD_OMIT_HEX
Do not print the hexadecimal values on each line.
.It Dv HD_OMIT_CHARS
Do not print the character values on each line.
.El
.El
.Sh SEE ALSO
.Xr ascii 7
.Sh AUTHORS
This manual page was written by
.An Scott Long .

96
lib/libutil/hexdump.c Normal file
View File

@ -0,0 +1,96 @@
/*-
* Copyright (c) 1986, 1988, 1991, 1993
* The Regents of the University of California. All rights reserved.
* (c) UNIX System Laboratories, Inc.
* All or some portions of this file are derived from material licensed
* to the University of California by American Telephone and Telegraph
* Co. or Unix System Laboratories, Inc. and are reproduced herein with
* the permission of UNIX System Laboratories, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)subr_prf.c 8.3 (Berkeley) 1/21/94
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <libutil.h>
#include <stdio.h>
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)
printf("%s", hdr);
if ((flags & HD_OMIT_COUNT) == 0)
printf("%04x ", i);
if ((flags & HD_OMIT_HEX) == 0) {
for (j = 0; j < cols; j++) {
k = i + j;
if (k < length)
printf("%c%02x", delim, cp[k]);
else
printf(" ");
}
}
if ((flags & HD_OMIT_CHARS) == 0) {
printf(" |");
for (j = 0; j < cols; j++) {
k = i + j;
if (k >= length)
printf(" ");
else if (cp[k] >= ' ' && cp[k] <= '~')
printf("%c", cp[k]);
else
printf(".");
}
printf("|");
}
printf("\n");
}
}

View File

@ -71,6 +71,7 @@ void clean_environment(const char * const *_white,
int extattr_namespace_to_string(int _attrnamespace, char **_string);
int extattr_string_to_namespace(const char *_string, int *_attrnamespace);
int flopen(const char *_path, int _flags, ...);
void hexdump(const void *ptr, int length, const char *hdr, int flags);
void login(struct utmp *_ut);
int login_tty(int _fd);
int logout(const char *_line);
@ -171,4 +172,11 @@ __END_DECLS
#define HN_GETSCALE 0x10
#define HN_AUTOSCALE 0x20
/* hexdump(3) */
#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)
#endif /* !_LIBUTIL_H_ */