Mercurial > hg > xemacs-beta
diff lib-src/hexl.c @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 972bbb6d6ca2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib-src/hexl.c Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,252 @@ +/* Synched up with: FSF 19.28. */ + +#include <../src/config.h> + +#include <stdio.h> +#include <ctype.h> +#ifdef MSDOS +#include <fcntl.h> +#endif + +#if __STDC__ || defined(STDC_HEADERS) +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#endif + +#define DEFAULT_GROUPING 0x01 +#define DEFAULT_BASE 16 + +#undef TRUE +#undef FALSE +#define TRUE (1) +#define FALSE (0) + +int base = DEFAULT_BASE, un_flag = FALSE, iso_flag = FALSE, endian = 1; +int group_by = DEFAULT_GROUPING; +char *progname; + +void usage (void); + +int +main(argc, argv) + int argc; + char *argv[]; +{ + register long address; + char string[18]; + FILE *fp; + + progname = *argv++; --argc; + + /* + ** -hex hex dump + ** -oct Octal dump + ** -group-by-8-bits + ** -group-by-16-bits + ** -group-by-32-bits + ** -group-by-64-bits + ** -iso iso character set. + ** -big-endian Big Endian + ** -little-endian Little Endian + ** -un || -de from hexl format to binary. + ** -- End switch list. + ** <filename> dump filename + ** - (as filename == stdin) + */ + + while (*argv && *argv[0] == '-' && (*argv)[1]) + { + /* A switch! */ + if (!strcmp (*argv, "--")) + { + --argc; argv++; + break; + } + else if (!strcmp (*argv, "-un") || !strcmp (*argv, "-de")) + { + un_flag = TRUE; + --argc; argv++; + } + else if (!strcmp (*argv, "-hex")) + { + base = 16; + --argc; argv++; + } + else if (!strcmp (*argv, "-iso")) + { + iso_flag = TRUE; + --argc; argv++; + } + else if (!strcmp (*argv, "-oct")) + { + base = 8; + --argc; argv++; + } + else if (!strcmp (*argv, "-big-endian")) + { + endian = 1; + --argc; argv++; + } + else if (!strcmp (*argv, "-little-endian")) + { + endian = 0; + --argc; argv++; + } + else if (!strcmp (*argv, "-group-by-8-bits")) + { + group_by = 0x00; + --argc; argv++; + } + else if (!strcmp (*argv, "-group-by-16-bits")) + { + group_by = 0x01; + --argc; argv++; + } + else if (!strcmp (*argv, "-group-by-32-bits")) + { + group_by = 0x03; + --argc; argv++; + } + else if (!strcmp (*argv, "-group-by-64-bits")) + { + group_by = 0x07; + endian = 0; + --argc; argv++; + } + else + { + (void) fprintf (stderr, "%s: invalid switch: \"%s\".\n", progname, + *argv); + usage (); + } + } + + do + { + if (*argv == NULL) + fp = stdin; + else + { + char *filename = *argv++; + + if (!strcmp (filename, "-")) + fp = stdin; + else if ((fp = fopen (filename, "r")) == NULL) + { + perror (filename); + continue; + } + } + + if (un_flag) + { + char buf[18]; + +#ifdef MSDOS + (stdout)->_flag &= ~_IOTEXT; /* print binary */ + _setmode (fileno (stdout), O_BINARY); +#endif + for (;;) + { + register int i, c, d; + +#define hexchar(x) (isdigit (x) ? x - '0' : x - 'a' + 10) + + fread (buf, 1, 10, fp); /* skip 10 bytes */ + + for (i=0; i < 16; ++i) + { + if ((c = getc (fp)) == ' ' || c == EOF) + break; + + d = getc (fp); + c = hexchar (c) * 0x10 + hexchar (d); + putchar (c); + + if ((i&group_by) == group_by) + getc (fp); + } + + if (c == ' ') + { + while ((c = getc (fp)) != '\n' && c != EOF) + ; + + if (c == EOF) + break; + } + else + { + if (i < 16) + break; + + fread (buf, 1, 18, fp); /* skip 18 bytes */ + } + } + } + else + { +#ifdef MSDOS + (fp)->_flag &= ~_IOTEXT; /* read binary */ + _setmode (fileno (fp), O_BINARY); +#endif + address = 0; + string[0] = ' '; + string[17] = '\0'; + for (;;) + { + register int i, c; + + for (i=0; i < 16; ++i) + { + if ((c = getc (fp)) == EOF) + { + if (!i) + break; + + fputs (" ", stdout); + string[i+1] = '\0'; + } + else + { + if (!i) + (void) printf ("%08lx: ", address); + + if (iso_flag) + string[i+1] = + (c < 0x20 || (c >= 0x7F && c < 0xa0)) ? '.' :c; + else + string[i+1] = (c < 0x20 || c >= 0x7F) ? '.' : c; + + (void) printf ("%02x", c); + } + + if ((i&group_by) == group_by) + putchar (' '); + } + + if (i) + puts (string); + + if (c == EOF) + break; + + address += 0x10; + + } + } + + if (fp != stdin) + (void) fclose (fp); + + } while (*argv != NULL); + return 0; +} + +void +usage () +{ + (void) fprintf (stderr, "usage: %s [-de] [-iso]\n", progname); + exit (1); +}