summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/hexdump.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/hexdump.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/hexdump.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/hexdump.c b/reference/C/CONTRIB/SNIP/hexdump.c
new file mode 100755
index 0000000..bb90b7a
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/hexdump.c
@@ -0,0 +1,88 @@
+/*
+** HEXDUMP.C - Dump a file.
+**
+** This Program Written By Paul Edwards w/ modifications by Bob Stout
+** Released to the public domain
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+static void dodump(FILE *fp, long start, long count);
+static void skipb(FILE *fp, long start);
+
+main(int argc, char **argv)
+{
+ FILE *fp;
+ long start, count;
+
+ if (argc < 2)
+ {
+ puts("Usage: HEXDUMP file_name [start] [length]");
+ return (EXIT_FAILURE);
+ }
+ if (argc > 2)
+ start = atol(*(argv + 2));
+ else start = 0L;
+ if (argc > 3)
+ count = atol(*(argv + 3));
+ else count = -1L;
+ fp = fopen(*(argv + 1), "rb");
+ if (fp == NULL)
+ {
+ printf("unable to open file %s for input\n", *(argv+1));
+ return (EXIT_FAILURE);
+ }
+ skipb(fp, start);
+ dodump(fp, start, count);
+ return (EXIT_SUCCESS);
+}
+
+static void dodump(FILE *fp, long start, long count)
+{
+ int c, pos1, pos2;
+ long x = 0L;
+ char prtln[100];
+
+ while (((c = fgetc(fp)) != EOF) && (x != count))
+ {
+ if (x%16 == 0)
+ {
+ memset(prtln,' ',sizeof prtln);
+ sprintf(prtln,"%0.6X ", start + x);
+ pos1 = 8;
+ pos2 = 45;
+ }
+ sprintf(prtln + pos1, "%0.2X", c);
+ if (isprint(c))
+ sprintf(prtln + pos2, "%c", c);
+ else sprintf(prtln + pos2, ".");
+ pos1 += 2;
+ *(prtln+pos1) = ' ';
+ pos2++;
+ if (x % 4 == 3)
+ *(prtln + pos1++) = ' ';
+ if (x % 16 == 15)
+ printf("%s\n", prtln);
+ x++;
+ }
+ if (x % 16 != 15)
+ printf("%s\n", prtln);
+ return;
+}
+
+static void skipb(FILE *fp, long start)
+{
+ long x = 0;
+
+ if (start == 0)
+ return;
+ while (x < start)
+ {
+ fgetc(fp);
+ x++;
+ }
+ return;
+}