]> code.delx.au - gnu-emacs/blobdiff - lib-src/hexl.c
2002-08-04 Andrew Choi <akochoi@shaw.ca>
[gnu-emacs] / lib-src / hexl.c
index 8b28880ea79c0b4a52590bf9bb5f4379674b8869..cbab66a2a1789d870c2b17268f279931d2f6fea5 100644 (file)
@@ -1,5 +1,37 @@
+/* Convert files for Emacs Hexl mode.
+   Copyright (C) 1989 Free Software Foundation, Inc
+
+This file is not considered part of GNU Emacs.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+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
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <stdio.h>
 #include <ctype.h>
+#ifdef DOS_NT
+#include <fcntl.h>
+#if __DJGPP__ >= 2
+#include <io.h>
+#endif
+#endif
+#ifdef WINDOWSNT
+#include <io.h>
+#endif
 
 #define DEFAULT_GROUPING       0x01
 #define DEFAULT_BASE           16
 #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[];
+void usage();
+
+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])
+  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, "--"))
+      /* A switch! */
+      if (!strcmp (*argv, "--"))
        {
-           --argc; argv++;
-           break;
-       } else if (!strcmp(*argv, "-un") || !strcmp(*argv, "-de"))
+         --argc; argv++;
+         break;
+       }
+      else if (!strcmp (*argv, "-un") || !strcmp (*argv, "-de"))
        {
-           un_flag = TRUE;
-           --argc; argv++;
-       } else if (!strcmp(*argv, "-hex"))
+         un_flag = TRUE;
+         --argc; argv++;
+       }
+      else if (!strcmp (*argv, "-hex"))
        {
-           base = 16;
-           --argc; argv++;
-       } else if (!strcmp(*argv, "-iso"))
+         base = 16;
+         --argc; argv++;
+       }
+      else if (!strcmp (*argv, "-iso"))
        {
-           iso_flag = TRUE;
-           --argc; argv++;
-       } else if (!strcmp(*argv, "-oct"))
+         iso_flag = TRUE;
+         --argc; argv++;
+       }
+      else if (!strcmp (*argv, "-oct"))
        {
-           base = 8;
-           --argc; argv++;
-       } else if (!strcmp(*argv, "-big-endian"))
+         base = 8;
+         --argc; argv++;
+       }
+      else if (!strcmp (*argv, "-big-endian"))
        {
-           endian = 1;
-           --argc; argv++;
-       } else if (!strcmp(*argv, "-little-endian"))
+         endian = 1;
+         --argc; argv++;
+       }
+      else if (!strcmp (*argv, "-little-endian"))
        {
-           endian = 0;
-           --argc; argv++;
-       } else if (!strcmp(*argv, "-group-by-8-bits"))
+         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 = 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 = 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 = 0x03;
+         --argc; argv++;
+       }
+      else if (!strcmp (*argv, "-group-by-64-bits"))
        {
-           group_by = 0x07;
-           endian = 0;
-           --argc; argv++;
-       } else
+         group_by = 0x07;
+         endian = 0;
+         --argc; argv++;
+       }
+      else
        {
-           (void) fprintf(stderr, "%s: invalid switch: \"%s\".\n", progname,
-                          *argv);
-           usage();
+         fprintf (stderr, "%s: invalid switch: \"%s\".\n", progname,
+                  *argv);
+         usage ();
        }
     }
 
-    do
+  do
     {
-       if (*argv == NULL)
-           fp = stdin;
-       else
+      if (*argv == NULL)
+       fp = stdin;
+      else
        {
-           char *filename = *argv++;
+         char *filename = *argv++;
 
-           if (!strcmp(filename, "-"))
-               fp = stdin;
-           else
-               if ((fp = fopen(filename, "r")) == NULL)
-               {
-                   perror(filename);
-                   continue;
-               }
+         if (!strcmp (filename, "-"))
+           fp = stdin;
+         else if ((fp = fopen (filename, "r")) == NULL)
+           {
+             perror (filename);
+             continue;
+           }
        }
 
-       if (un_flag)
+      if (un_flag)
        {
-           char buf[18];
+         char buf[18];
 
-           for (;;)
+#ifdef DOS_NT
+#if (__DJGPP__ >= 2) || (defined WINDOWSNT)
+          if (!isatty (fileno (stdout)))
+           setmode (fileno (stdout), O_BINARY);
+#else
+         (stdout)->_flag &= ~_IOTEXT; /* print binary */
+         _setmode (fileno (stdout), O_BINARY);
+#endif
+#endif
+         for (;;)
            {
-               register int i, c, d;
+             register int i, c, d;
 
-#define hexchar(x) (isdigit(x) ? x - '0' : x - 'a' + 10)
+#define hexchar(x) (isdigit (x) ? x - '0' : x - 'a' + 10)
 
-               (void) fread(buf, 1, 10, fp); /* skip 10 bytes */
+             fread (buf, 1, 10, fp); /* skip 10 bytes */
 
-               for (i=0; i < 16; ++i)
+             for (i=0; i < 16; ++i)
                {
-                   if ((c = getc(fp)) == ' ' || c == EOF)
-                       break;
+                 if ((c = getc (fp)) == ' ' || c == EOF)
+                   break;
 
-                   d = getc(fp);
-                   c = hexchar(c) * 0x10 + hexchar(d);
-                   (void) putchar(c);
+                 d = getc (fp);
+                 c = hexchar (c) * 0x10 + hexchar (d);
+                 putchar (c);
 
-                   if ((i&group_by) == group_by)
-                       (void) getc(fp);
+                 if ((i&group_by) == group_by)
+                   getc (fp);
                }
 
-               if (c == ' ')
+             if (c == ' ')
                {
-                   while ((c = getc(fp)) != '\n' && c != EOF)
-                       ;
+                 while ((c = getc (fp)) != '\n' && c != EOF)
+                   ;
 
-                   if (c == EOF)
-                       break;
+                 if (c == EOF)
+                   break;
                }
-               else
+             else
                {
-                   if (i < 16)
-                       break;
+                 if (i < 16)
+                   break;
 
-                   (void) fread(buf, 1, 18, fp); /* skip 18 bytes */
+                 fread (buf, 1, 18, fp); /* skip 18 bytes */
                }
            }
        }
-       else
+      else
        {
-           address = 0;
-           string[0] = ' ';
-           string[17] = '\0';
-           for (;;)
+#ifdef DOS_NT
+#if (__DJGPP__ >= 2) || (defined WINDOWSNT)
+          if (!isatty (fileno (fp)))
+           setmode (fileno (fp), O_BINARY);
+#else
+         (fp)->_flag &= ~_IOTEXT; /* read binary */
+         _setmode (fileno (fp), O_BINARY);
+#endif
+#endif
+         address = 0;
+         string[0] = ' ';
+         string[17] = '\0';
+         for (;;)
            {
-               register int i, c;
+             register int i, c;
 
-               for (i=0; i < 16; ++i)
+             for (i=0; i < 16; ++i)
                {
-                   if ((c = getc(fp)) == EOF)
+                 if ((c = getc (fp)) == EOF)
                    {
-                       if (!i)
-                           break;
+                     if (!i)
+                       break;
 
-                       (void) fputs("  ", stdout);
-                       string[i+1] = '\0';
+                     fputs ("  ", stdout);
+                     string[i+1] = '\0';
                    }
-                   else
+                 else
                    {
-                       if (!i)
-                           (void) printf("%08x: ", address);
+                     if (!i)
+                       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;
+                     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);
+                     printf ("%02x", c);
                    }
 
-                   if ((i&group_by) == group_by)
-                       (void) putchar(' ');
+                 if ((i&group_by) == group_by)
+                   putchar (' ');
                }
 
-               if (i)
-                   (void) puts(string);
+             if (i)
+               puts (string);
 
-               if (c == EOF)
-                   break;
+             if (c == EOF)
+               break;
 
-               address += 0x10;
+             address += 0x10;
 
            }
        }
 
-       if (fp != stdin)
-           (void) close(fp);
+      if (fp != stdin)
+       fclose (fp);
 
     } while (*argv != NULL);
-    return 0;
+  return 0;
 }
 
-usage()
+void
+usage ()
 {
-    (void) fprintf(stderr, "usage: %s [-de] [-iso]\n", progname);
-    exit(1);
+  fprintf (stderr, "usage: %s [-de] [-iso]\n", progname);
+  exit (1);
 }