hexl.c 5.26 KB
Newer Older
1
/* Convert files for Emacs Hexl mode.
2
   Copyright (C) 1989, 2001-2011  Free Software Foundation, Inc.
3 4 5

Author: Keith Gabryelski
(according to authors.el)
6 7 8

This file is not considered part of GNU Emacs.

9
This program is free software: you can redistribute it and/or modify
10
it under the terms of the GNU General Public License as published by
11 12
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
13 14 15 16 17 18 19

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
20 21
along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

22

23 24 25 26
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

Jim Blandy's avatar
Jim Blandy committed
27 28
#include <stdio.h>
#include <ctype.h>
29
#ifdef DOS_NT
30
#include <fcntl.h>
31 32 33
#if __DJGPP__ >= 2
#include <io.h>
#endif
34
#endif
35 36 37
#ifdef WINDOWSNT
#include <io.h>
#endif
Jim Blandy's avatar
Jim Blandy committed
38 39 40 41 42 43 44 45 46 47 48 49 50

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

51
void usage(void) NO_RETURN;
52 53

int
54
main (int argc, char **argv)
Jim Blandy's avatar
Jim Blandy committed
55
{
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
  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)
   */
Pavel Janík's avatar
Pavel Janík committed
77

78
  while (*argv && *argv[0] == '-' && (*argv)[1])
Jim Blandy's avatar
Jim Blandy committed
79
    {
80 81
      /* A switch! */
      if (!strcmp (*argv, "--"))
Jim Blandy's avatar
Jim Blandy committed
82
	{
83 84 85 86
	  --argc; argv++;
	  break;
	}
      else if (!strcmp (*argv, "-un") || !strcmp (*argv, "-de"))
Jim Blandy's avatar
Jim Blandy committed
87
	{
88 89 90 91
	  un_flag = TRUE;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-hex"))
Jim Blandy's avatar
Jim Blandy committed
92
	{
93 94 95 96
	  base = 16;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-iso"))
Jim Blandy's avatar
Jim Blandy committed
97
	{
98 99 100 101
	  iso_flag = TRUE;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-oct"))
Jim Blandy's avatar
Jim Blandy committed
102
	{
103 104 105 106
	  base = 8;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-big-endian"))
Jim Blandy's avatar
Jim Blandy committed
107
	{
108 109 110 111
	  endian = 1;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-little-endian"))
Jim Blandy's avatar
Jim Blandy committed
112
	{
113 114 115 116
	  endian = 0;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-group-by-8-bits"))
Jim Blandy's avatar
Jim Blandy committed
117
	{
118 119 120 121
	  group_by = 0x00;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-group-by-16-bits"))
Jim Blandy's avatar
Jim Blandy committed
122
	{
123 124 125 126
	  group_by = 0x01;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-group-by-32-bits"))
Jim Blandy's avatar
Jim Blandy committed
127
	{
128 129 130 131
	  group_by = 0x03;
	  --argc; argv++;
	}
      else if (!strcmp (*argv, "-group-by-64-bits"))
Jim Blandy's avatar
Jim Blandy committed
132
	{
133 134 135 136 137
	  group_by = 0x07;
	  endian = 0;
	  --argc; argv++;
	}
      else
Jim Blandy's avatar
Jim Blandy committed
138
	{
139 140 141
	  fprintf (stderr, "%s: invalid switch: \"%s\".\n", progname,
		   *argv);
	  usage ();
Jim Blandy's avatar
Jim Blandy committed
142 143 144
	}
    }

145
  do
Jim Blandy's avatar
Jim Blandy committed
146
    {
147 148 149
      if (*argv == NULL)
	fp = stdin;
      else
Jim Blandy's avatar
Jim Blandy committed
150
	{
151
	  char *filename = *argv++;
Jim Blandy's avatar
Jim Blandy committed
152

153 154 155 156 157 158 159
	  if (!strcmp (filename, "-"))
	    fp = stdin;
	  else if ((fp = fopen (filename, "r")) == NULL)
	    {
	      perror (filename);
	      continue;
	    }
Jim Blandy's avatar
Jim Blandy committed
160 161
	}

162
      if (un_flag)
Jim Blandy's avatar
Jim Blandy committed
163
	{
164
	  char buf[18];
Jim Blandy's avatar
Jim Blandy committed
165

166 167
#ifdef DOS_NT
#if (__DJGPP__ >= 2) || (defined WINDOWSNT)
168 169
          if (!isatty (fileno (stdout)))
	    setmode (fileno (stdout), O_BINARY);
170
#else
171 172
	  (stdout)->_flag &= ~_IOTEXT; /* print binary */
	  _setmode (fileno (stdout), O_BINARY);
173
#endif
174 175
#endif
	  for (;;)
Jim Blandy's avatar
Jim Blandy committed
176
	    {
177
	      register int i, c = 0, d;
Jim Blandy's avatar
Jim Blandy committed
178

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

181 182 183
	      /* Skip 10 bytes.  */
	      if (fread (buf, 1, 10, fp) != 10)
		break;
Jim Blandy's avatar
Jim Blandy committed
184

185
	      for (i=0; i < 16; ++i)
Jim Blandy's avatar
Jim Blandy committed
186
		{
187 188
		  if ((c = getc (fp)) == ' ' || c == EOF)
		    break;
Jim Blandy's avatar
Jim Blandy committed
189

190 191 192
		  d = getc (fp);
		  c = hexchar (c) * 0x10 + hexchar (d);
		  putchar (c);
Jim Blandy's avatar
Jim Blandy committed
193

194 195
		  if ((i&group_by) == group_by)
		    getc (fp);
Jim Blandy's avatar
Jim Blandy committed
196 197
		}

198
	      if (c == ' ')
Jim Blandy's avatar
Jim Blandy committed
199
		{
200 201
		  while ((c = getc (fp)) != '\n' && c != EOF)
		    ;
Jim Blandy's avatar
Jim Blandy committed
202

203 204
		  if (c == EOF)
		    break;
Jim Blandy's avatar
Jim Blandy committed
205
		}
206
	      else
Jim Blandy's avatar
Jim Blandy committed
207
		{
208 209
		  if (i < 16)
		    break;
Jim Blandy's avatar
Jim Blandy committed
210

211 212 213
		  /* Skip 18 bytes.  */
		  if (fread (buf, 1, 18, fp) != 18)
		    break;
Jim Blandy's avatar
Jim Blandy committed
214 215 216
		}
	    }
	}
217
      else
Jim Blandy's avatar
Jim Blandy committed
218
	{
219 220
#ifdef DOS_NT
#if (__DJGPP__ >= 2) || (defined WINDOWSNT)
221 222
          if (!isatty (fileno (fp)))
	    setmode (fileno (fp), O_BINARY);
223
#else
224 225
	  (fp)->_flag &= ~_IOTEXT; /* read binary */
	  _setmode (fileno (fp), O_BINARY);
226
#endif
227 228 229 230 231
#endif
	  address = 0;
	  string[0] = ' ';
	  string[17] = '\0';
	  for (;;)
Jim Blandy's avatar
Jim Blandy committed
232
	    {
233
	      register int i, c = 0;
Jim Blandy's avatar
Jim Blandy committed
234

235
	      for (i=0; i < 16; ++i)
Jim Blandy's avatar
Jim Blandy committed
236
		{
237
		  if ((c = getc (fp)) == EOF)
Jim Blandy's avatar
Jim Blandy committed
238
		    {
239 240
		      if (!i)
			break;
Jim Blandy's avatar
Jim Blandy committed
241

242 243
		      fputs ("  ", stdout);
		      string[i+1] = '\0';
Jim Blandy's avatar
Jim Blandy committed
244
		    }
245
		  else
Jim Blandy's avatar
Jim Blandy committed
246
		    {
247
		      if (!i)
248
			printf ("%08lx: ", address);
Jim Blandy's avatar
Jim Blandy committed
249

250 251 252 253 254
		      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
255

256
		      printf ("%02x", c);
Jim Blandy's avatar
Jim Blandy committed
257 258
		    }

259 260
		  if ((i&group_by) == group_by)
		    putchar (' ');
Jim Blandy's avatar
Jim Blandy committed
261 262
		}

263 264
	      if (i)
		puts (string);
Jim Blandy's avatar
Jim Blandy committed
265

266 267
	      if (c == EOF)
		break;
Jim Blandy's avatar
Jim Blandy committed
268

269
	      address += 0x10;
Jim Blandy's avatar
Jim Blandy committed
270 271 272 273

	    }
	}

274 275
      if (fp != stdin)
	fclose (fp);
Jim Blandy's avatar
Jim Blandy committed
276 277

    } while (*argv != NULL);
278
  return EXIT_SUCCESS;
Jim Blandy's avatar
Jim Blandy committed
279 280
}

281
void
282
usage (void)
Jim Blandy's avatar
Jim Blandy committed
283
{
284
  fprintf (stderr, "usage: %s [-de] [-iso]\n", progname);
285
  exit (EXIT_FAILURE);
Jim Blandy's avatar
Jim Blandy committed
286
}
Miles Bader's avatar
Miles Bader committed
287

288 289

/* hexl.c ends here */