view lib-src/hexl.c @ 1436:e7c5faab6571

* xterm.c (compose_status): New variable. (XTread_socket): Pass it by reference to XLookupString. * xterm.c: Clean up some of the caps lock handling: (x_shift_lock_mask): New variable. (x_find_modifier_mappings): Set it, based on the modifier mappings. (x_convert_modifiers): Use x_shift_lock_mask, instead of assuming that the lock bit always means to shift the character. (XTread_socket): When handling KeyPress events, don't pass an XComposeStatus structure along to XLookupString. When handling MappingNotify events, call XRefreshKeyboardMapping for both MappingModifier and MappingKeyboard events, not just the latter.
author Jim Blandy <jimb@redhat.com>
date Mon, 19 Oct 1992 18:31:34 +0000
parents 7c9f757a985a
children 44e193cc8f49
line wrap: on
line source

#include <stdio.h>
#include <ctype.h>

#define DEFAULT_GROUPING	0x01
#define DEFAULT_BASE		16

#undef TRUE
#undef FALSE
#define TRUE  (1)
#define FALSE (0)

extern void exit(), perror();

int base = DEFAULT_BASE, un_flag = FALSE, iso_flag = FALSE, endian = 1;
int group_by = DEFAULT_GROUPING;
char *progname;

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];

	    for (;;)
	    {
		register int i, c, d;

#define hexchar(x) (isdigit(x) ? x - '0' : x - 'a' + 10)

		(void) 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);
		    (void) putchar(c);

		    if ((i&group_by) == group_by)
			(void) getc(fp);
		}

		if (c == ' ')
		{
		    while ((c = getc(fp)) != '\n' && c != EOF)
			;

		    if (c == EOF)
			break;
		}
		else
		{
		    if (i < 16)
			break;

		    (void) fread(buf, 1, 18, fp); /* skip 18 bytes */
		}
	    }
	}
	else
	{
	    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;

			(void) fputs("  ", stdout);
			string[i+1] = '\0';
		    }
		    else
		    {
			if (!i)
			    (void) printf("%08x: ", 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)
			(void) putchar(' ');
		}

		if (i)
		    (void) puts(string);

		if (c == EOF)
		    break;

		address += 0x10;

	    }
	}

	if (fp != stdin)
	    (void) close(fp);

    } while (*argv != NULL);
    return 0;
}

usage()
{
    (void) fprintf(stderr, "usage: %s [-de] [-iso]\n", progname);
    exit(1);
}