treed@dasys1.UUCP (Timothy Reed) (06/01/89)
Subject: gemacs binary editing mode?
The following are responses from my inquiry regarding editing
binary files and executables with emacs.
Thanks for all the responses - the yunexus!mike's is the one I've used
so far, tho' I plan on examining the hex dumpers soon.
Timothy Reed
Acme Data Corp.
..!uunet!slcpi!treed
From uunet!utai!yunexus!mike Mon May 29 14:54:58 1989
Greetings...
Just find-file and write-file will do fine.
There's no special mode.
You may want to set the variable require-final-newline to nil though.
Mike
Mike Marques | Usenet: ......!utzoo!yunexus!mike
York University (Computing Services) | mike@nexus.yorku.ca
-------------------------------------| Bitnet: mike@libra.yorku.ca
Only visiting this planet... | Voice: (416) 736-5257
From uunet!ernie.Berkeley.EDU!andy Mon May 29 14:55:38 1989
Subject: No personal expe with this yet... (hex.el)
HAve fun, please inform of any improv's you might make.
Andrew
/*
* Andrew kindly mailed me lisp source for hex.el version 1.0. which is
* pretty long. I will happily email it to any and all interested parties.
* Please send email to ..!uunet!slcpi!treed or treed@shearson.com.
*
* thanks - tim
*
*/
From uunet!NMSU.Edu!ted Mon May 29 18:48:25 1989
Subject: gemacs binary editing mode?
here is an invertible hex dump package. i use these programs for
patching when necessary by hex dumping, editing, and then un hex
dumping. no guarantees. please send corrections to me at
ted@nmsu.edu
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# hd.c
# unhd.c
# This archive created: Mon May 29 16:32:09 MDT 1989
if test -f 'hd.c'
then
echo shar: will not over-write existing file 'hd.c'
else
sed -e '1,$s/^X//' << 'SHAR_EOF' > hd.c
X#include <stdio.h>
X#include <ctype.h>
X
X/* reasonably good hex dumper */
X
X/*
Xusage is:
Xhd [option-list] [files]
Xoption-list is a string with a leading '-' followed by
Xzero or more of the following
X
X a output addresses
X h output hex codes
X t output sanitized ascii representation (text)
X
Xa '-' alone is the same as -h
Xif no options are given -aht is assumed.
X
Xfiles is a list of file names to be dumped. if no files are
Xspecified, then the standard input is used. a '-' in place of a file
Xname specifies the standard input.
X
Xthe hex codes are surrounded by ( and ) so that unhd can find them.
X*/
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X int addresses, hex, text; /* flags for options */
X int bytes; /* number of bytes to show on a line */
X int i; /* handy for loops */
X int width; /* width of useable line */
X FILE *file;
X
X /* no flags defaults for everything */
X addresses = text = hex = 1;
X
X if (argc == 1) {
X }
X /* check for flags */
X else if (argv[1][0] == '-') {
X addresses = text = hex = 0;
X
X /* scan a resonable number of characters */
X for (i=1;i<5 && argv[1][i];i++) {
X switch (argv[1][i]) {
X
X /* turn on address field */
X case 'a':
X addresses = 1;
X break;
X
X /* turn on hex dump */
X case 'h':
X hex = 1;
X break;
X
X /* turn on ascii dump */
X case 't':
X text = 1;
X break;
X }
X }
X }
X
X /* set up the number of bytes to display on each line */
X if (hex) {
X bytes = 16;
X }
X else if (text) {
X bytes = 64;
X }
X else {
X fprintf(stderr,"must use either -h or -t");
X exit(1);
X }
X
X /* if no files */
X if (argc == 1 || (argc == 2 && argv[1][0] == '-')) {
X copy(addresses,hex,text,bytes,stdin);
X }
X else {
X /* or for all files that are specified */
X for (i=(argv[1][0] == '-')+1;i<argc;i++) {
X if (argv[i][0] != '-') {
X file = fopen(argv[i],"r");
X if (file) copy(addresses,hex,text,bytes,file);
X fclose(file);
X }
X else {
X copy(addresses,hex,text,bytes,stdin);
X }
X }
X }
X}
X
X/* arguments to copy are the 3 flags, the number of bytes to
X print per line, and the input file */
Xcopy(a,h,t,b,in)
Xint a,h,t,b;
XFILE *in;
X{
X long add; /* address of this byte */
X int n; /* counter within a line */
X int i; /* loop counter */
X int c; /* current byte */
X char buf[64]; /* where to stash chars for ascii dump */
X
X /* initialize some counters and get the first character */
X add = 0;
X n = 0;
X c = getc(in);
X
X while (c != EOF) {
X /* print the address field if need be */
X if (!(add%b)) {
X if (a) printf("%6x ",add);
X if (h) printf("( ");
X else printf("(...) ");
X n = 0;
X }
X /* print a hex byte */
X if (h) {
X printf("%02x ",0xff & c);
X }
X
X /* perhaps save that byte */
X if (t) {
X buf[n] = c;
X }
X
X /* check for end of line time */
X if (n == b-1) {
X if (h) { /* finish the hex bytes */
X printf(")");
X }
X
X if (t) { /* should we display the text?? */
X /* do we need a gutter after the hex dump part? */
X if (h) printf(" ");
X
X /* print the characters */
X for (i=0;i<=n;i++) {
X /* if we can */
X if (isascii(buf[i]) && isprint(buf[i]))
X putchar(buf[i]);
X
X /* otherwise print something else */
X else putchar('.');
X }
X }
X /* end of line always gets this */
X putchar('\n');
X n = 0;
X }
X else { /* not end of line */
X n++;
X }
X
X c = getc(in);
X add++;
X }
X
X /* pretty much done, may have started a partial line */
X if (n) {
X if (h) {
X for (i=n;i<b;i++) printf(" ");
X printf(")");
X
X /* put in the gutter if we had a hex dump */
X if (h) printf(" ");
X }
X
X /* print any text dump that is needed */
X if (t) {
X /* and print the printable chars */
X for (i=0;i<n;i++) {
X if (isascii(buf[i]) && isprint(buf[i]))
X putchar(buf[i]);
X else putchar('.');
X }
X }
X
X /* even partial lines get this */
X putchar('\n');
X }
X}
SHAR_EOF
echo recreated hd.c
chmod u=rw hd.c
chmod g=r hd.c
chmod o=r hd.c
fi
if test -f 'unhd.c'
then
echo shar: will not over-write existing file 'unhd.c'
else
sed -e '1,$s/^X//' << 'SHAR_EOF' > unhd.c
X#include <stdio.h>
X#include <ctype.h>
X
X/* the hex UN-dumper....takes a stream of hexadecimal numbers and
X converts them to bytes....usage is:
Xunhd files
X
Xwhere files is a list of files to be undumped. if files is null, then
Xthe standard input is undumped. only things in parentheses are
Xconverted. this program is an inverse of hd.
X
X*/
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X int i;
X FILE *file;
X
X if (argc == 1) undump(stdin);
X else {
X for (i=1;i<argc;i++) {
X file = fopen(argv[i],"r");
X if (file) undump(file);
X fclose(file);
X }
X }
X}
X
Xint unhex(c)
Xint c;
X{
X if (isdigit(c)) return c-'0';
X else return c-'a'+10;
X}
X
Xundump(in)
XFILE *in;
X{
X int c;
X int byte;
X
X c = getc(in);
X while (c != EOF) { /* do each line */
X /* skip to the real stuff */
X while (c != EOF && c != '(' && c != '\n') c = getc(in);
X
X if (c == '\n') { /* empty line? */
X c = getc(in); /* go on to the next one */
X }
X else {
X /* eat the ( */
X if (c != EOF) c = getc(in);
X
X /* skip any fluffy whitespace */
X while (c != EOF && isspace(c)) c = getc(in);
X
X /* convert this line */
X while (c != ')') {
X /* can't have any garbage in the hex part */
X if (c == EOF || !isxdigit(c)) {
X fprintf(stderr,"not in unhd format!!\n");
X exit(1);
X }
X
X /* we know we see a hex digit */
X byte = unhex(c);
X c = getc(in);
X if (c != EOF && isxdigit(c)) {
X byte = byte*16+unhex(c);
X c = getc(in);
X }
X putchar(byte);
X
X while (c != EOF && isspace(c)) c = getc(in);
X }
X /* eat to the end of the line */
X while (c != EOF && c != '\n') c = getc(in);
X if (c != EOF) c = getc(in);
X }
X }
X}
SHAR_EOF
echo recreated unhd.c
chmod u=rw unhd.c
chmod g=r unhd.c
chmod o=r unhd.c
fi
# End of shell archive
--
name(Timothy Reed);
phone(718-797-4634);
UUCP(..!uunet!slcpi!treed | treed@shearson.com);
Mail(300 Union St^MBkyn, NY^M11231);