/*
 *   Hex dump files
 */

#include <stdio.h>

int numbytes = 16;

main(argc, argv)
int argc;
char *argv[];
{
	FILE *fp, *fopen();

	if ((argc > 1) && !strcmp(argv[1], "-2")) {
		numbytes = 32;
		--argc; ++argv;
	}
	if (argc == 1) /* no args; copy standard input */
		 filecopy(stdin);
	else
		 while (--argc > 0)
			if ((fp = fopen(*++argv, "r")) == NULL) {
				fprintf(stderr,
						"hd: can't open %s\n", *argv);
			} else {
				filecopy(fp);
				fclose(fp);
			}
	exit(0);
}

filecopy(fp)	/* copy file fp to standard output */
FILE *fp;
{
	int plen, len, i, c, offset = 0;
	char sbuf[256], buf[256], cbuf[256], line[256];
	short *p;

	while (1) {
		len = fread(buf, 1, numbytes, fp);
		if (len <= 0) break;

		p = (short *)buf;
		plen = (len + 1) / 2;

		for (i = 0; i < len; ++i) {
			c = buf[i];
			if ((c < ' ') || (c >= 0x7f))
				cbuf[i] = ' ';
			else
				cbuf[i] = buf[i];
		}
		for (  ; i < numbytes; ++i) {
			cbuf[i] = ' ';
		}
		cbuf[i] = 0;

		*line = 0;
		for (i = 0; i < numbytes / 2; ++i) {
			if (i >= plen)
				sprintf(sbuf, "     ");
			else
				if ((i == plen-1) && (len & 1))
					sprintf(sbuf, "  %02x ", p[i] & 0xff);
				else
					sprintf(sbuf, "%04x ", p[i] & 0xffff);
			strcat(line, sbuf);
		}

		printf("%08x: %s|%s|\n", offset, line, cbuf);
		offset += len;
	}
}
