view rvinterf/libprint/hexdump.c @ 936:f4e6f6b6548e

rvinterf TM log: decode ETM_CORE commands
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 24 May 2023 04:00:18 +0000
parents 65953c172f24
children
line wrap: on
line source

/*
 * The function contained in this module implements hex dump functionality:
 * an arbitrary binary packet is dumped in hex, line by line, calling an output
 * function for each line.
 */

#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>

void
packet_hex_dump(src, srclen, outfunc)
	u_char *src;
	unsigned srclen;
	void (*outfunc)();
{
	u_char *sp = src;
	unsigned remain = srclen;
	unsigned offset = 0;
	unsigned chunk;
	char line[80], *dp;
	int i, c;

	while (remain) {
		sprintf(line, "%04X:  ", offset);
		dp = line + 7;
		chunk = remain;
		if (chunk > 16)
			chunk = 16;
		for (i = 0; i < 16; i++) {
			if (i < chunk)
				sprintf(dp, "%02X ", sp[i]);
			else
				strcpy(dp, "   ");
			dp += 3;
			if (i == 7 || i == 15)
				*dp++ = ' ';
		}
		for (i = 0; i < chunk; i++) {
			c = sp[i];
			if (c < ' ' || c > '~')
				c = '.';
			*dp++ = c;
		}
		*dp = '\0';
		outfunc(line);
		sp += chunk;
		remain -= chunk;
		offset += chunk;
	}
}