hexl.c 4.03 KB
Newer Older
Jim Blandy's avatar
Jim Blandy committed
1 2
#include <stdio.h>
#include <ctype.h>
3 4 5
#ifdef MSDOS
#include <fcntl.h>
#endif
Jim Blandy's avatar
Jim Blandy committed
6 7 8 9 10 11 12 13 14

#define DEFAULT_GROUPING	0x01
#define DEFAULT_BASE		16

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

15 16
#ifndef MSDOS
/* Defined volatile by std.h in MsDos.  */
17
extern void exit (), perror ();
18
#endif
Jim Blandy's avatar
Jim Blandy committed
19 20 21 22 23

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

24 25 26
main (argc, argv)
     int argc;
     char *argv[];
Jim Blandy's avatar
Jim Blandy committed
27
{
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
  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)
   */
Jim Blandy's avatar
Jim Blandy committed
49
    
50
  while (*argv && *argv[0] == '-' && (*argv)[1])
Jim Blandy's avatar
Jim Blandy committed
51
    {
52 53
      /* A switch! */
      if (!strcmp (*argv, "--"))
Jim Blandy's avatar
Jim Blandy committed
54
	{
55 56 57 58
	  --argc; argv++;
	  break;
	}
      else if (!strcmp (*argv, "-un") || !strcmp (*argv, "-de"))
Jim Blandy's avatar
Jim Blandy committed
59
	{
60 61 62 63
	  un_flag = TRUE;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-hex"))
Jim Blandy's avatar
Jim Blandy committed
64
	{
65 66 67 68
	  base = 16;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-iso"))
Jim Blandy's avatar
Jim Blandy committed
69
	{
70 71 72 73
	  iso_flag = TRUE;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-oct"))
Jim Blandy's avatar
Jim Blandy committed
74
	{
75 76 77 78
	  base = 8;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-big-endian"))
Jim Blandy's avatar
Jim Blandy committed
79
	{
80 81 82 83
	  endian = 1;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-little-endian"))
Jim Blandy's avatar
Jim Blandy committed
84
	{
85 86 87 88
	  endian = 0;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-group-by-8-bits"))
Jim Blandy's avatar
Jim Blandy committed
89
	{
90 91 92 93
	  group_by = 0x00;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-group-by-16-bits"))
Jim Blandy's avatar
Jim Blandy committed
94
	{
95 96 97 98
	  group_by = 0x01;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-group-by-32-bits"))
Jim Blandy's avatar
Jim Blandy committed
99
	{
100 101 102 103
	  group_by = 0x03;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-group-by-64-bits"))
Jim Blandy's avatar
Jim Blandy committed
104
	{
105 106 107 108 109
	  group_by = 0x07;
	  endian = 0;
	  --argc; argv++;
	}
      else
Jim Blandy's avatar
Jim Blandy committed
110
	{
111 112 113
	  fprintf (stderr, "%s: invalid switch: \"%s\".\n", progname,
		   *argv);
	  usage ();
Jim Blandy's avatar
Jim Blandy committed
114 115 116
	}
    }

117
  do
Jim Blandy's avatar
Jim Blandy committed
118
    {
119 120 121
      if (*argv == NULL)
	fp = stdin;
      else
Jim Blandy's avatar
Jim Blandy committed
122
	{
123
	  char *filename = *argv++;
Jim Blandy's avatar
Jim Blandy committed
124

125 126 127 128 129 130 131
	  if (!strcmp (filename, "-"))
	    fp = stdin;
	  else if ((fp = fopen (filename, "r")) == NULL)
	    {
	      perror (filename);
	      continue;
	    }
Jim Blandy's avatar
Jim Blandy committed
132 133
	}

134
      if (un_flag)
Jim Blandy's avatar
Jim Blandy committed
135
	{
136
	  char buf[18];
Jim Blandy's avatar
Jim Blandy committed
137

138 139 140 141 142
#ifdef MSDOS
	  (stdout)->_flag &= ~_IOTEXT; /* print binary */
	  _setmode (fileno (stdout), O_BINARY);
#endif
	  for (;;)
Jim Blandy's avatar
Jim Blandy committed
143
	    {
144
	      register int i, c, d;
Jim Blandy's avatar
Jim Blandy committed
145

146
#define hexchar(x) (isdigit (x) ? x - '0' : x - 'a' + 10)
Jim Blandy's avatar
Jim Blandy committed
147

148
	      fread (buf, 1, 10, fp); /* skip 10 bytes */
Jim Blandy's avatar
Jim Blandy committed
149

150
	      for (i=0; i < 16; ++i)
Jim Blandy's avatar
Jim Blandy committed
151
		{
152 153
		  if ((c = getc (fp)) == ' ' || c == EOF)
		    break;
Jim Blandy's avatar
Jim Blandy committed
154

155 156 157
		  d = getc (fp);
		  c = hexchar (c) * 0x10 + hexchar (d);
		  putchar (c);
Jim Blandy's avatar
Jim Blandy committed
158

159 160
		  if ((i&group_by) == group_by)
		    getc (fp);
Jim Blandy's avatar
Jim Blandy committed
161 162
		}

163
	      if (c == ' ')
Jim Blandy's avatar
Jim Blandy committed
164
		{
165 166
		  while ((c = getc (fp)) != '\n' && c != EOF)
		    ;
Jim Blandy's avatar
Jim Blandy committed
167

168 169
		  if (c == EOF)
		    break;
Jim Blandy's avatar
Jim Blandy committed
170
		}
171
	      else
Jim Blandy's avatar
Jim Blandy committed
172
		{
173 174
		  if (i < 16)
		    break;
Jim Blandy's avatar
Jim Blandy committed
175

176
		  fread (buf, 1, 18, fp); /* skip 18 bytes */
Jim Blandy's avatar
Jim Blandy committed
177 178 179
		}
	    }
	}
180
      else
Jim Blandy's avatar
Jim Blandy committed
181
	{
182 183 184 185 186 187 188 189
#ifdef MSDOS
	  (fp)->_flag &= ~_IOTEXT; /* read binary */
	  _setmode (fileno (fp), O_BINARY);
#endif
	  address = 0;
	  string[0] = ' ';
	  string[17] = '\0';
	  for (;;)
Jim Blandy's avatar
Jim Blandy committed
190
	    {
191
	      register int i, c;
Jim Blandy's avatar
Jim Blandy committed
192

193
	      for (i=0; i < 16; ++i)
Jim Blandy's avatar
Jim Blandy committed
194
		{
195
		  if ((c = getc (fp)) == EOF)
Jim Blandy's avatar
Jim Blandy committed
196
		    {
197 198
		      if (!i)
			break;
Jim Blandy's avatar
Jim Blandy committed
199

200 201
		      fputs ("  ", stdout);
		      string[i+1] = '\0';
Jim Blandy's avatar
Jim Blandy committed
202
		    }
203
		  else
Jim Blandy's avatar
Jim Blandy committed
204
		    {
205 206
		      if (!i)
			printf ("%08x: ", address);
Jim Blandy's avatar
Jim Blandy committed
207

208 209 210 211 212
		      if (iso_flag)
			string[i+1] =
			  (c < 0x20 || (c >= 0x7F && c < 0xa0)) ? '.' :c;
		      else
			string[i+1] = (c < 0x20 || c >= 0x7F) ? '.' : c;
Jim Blandy's avatar
Jim Blandy committed
213

214
		      printf ("%02x", c);
Jim Blandy's avatar
Jim Blandy committed
215 216
		    }

217 218
		  if ((i&group_by) == group_by)
		    putchar (' ');
Jim Blandy's avatar
Jim Blandy committed
219 220
		}

221 222
	      if (i)
		puts (string);
Jim Blandy's avatar
Jim Blandy committed
223

224 225
	      if (c == EOF)
		break;
Jim Blandy's avatar
Jim Blandy committed
226

227
	      address += 0x10;
Jim Blandy's avatar
Jim Blandy committed
228 229 230 231

	    }
	}

232 233
      if (fp != stdin)
	fclose (fp);
Jim Blandy's avatar
Jim Blandy committed
234 235

    } while (*argv != NULL);
236
  return 0;
Jim Blandy's avatar
Jim Blandy committed
237 238
}

239
usage ()
Jim Blandy's avatar
Jim Blandy committed
240
{
241 242
  fprintf (stderr, "usage: %s [-de] [-iso]\n", progname);
  exit (1);
Jim Blandy's avatar
Jim Blandy committed
243
}