turner@imagen.UUCP (08/09/86)
this is a hack of the xod.c program posted to the net, compile with
-DBSD4.2 for bsd and SYS5 to use it for SVR2. it has one more option
-snnn which specifices a decimal offset from the beginning of the
file from which the dump is to begin. as alway bugs > /dev/me
this is not a shar file=================
static char *SCCS_id = "@(#) xod.c (1.2) 8/3/86 21:35:14";
/*
* xod.c - hex/octal/decimal dump utility
*
* xod [-xodwv] file ...
* x selects hex base
* o selects octal base
* d selects decimal base
* s sets the beginnig offset in the file (decimal)
*
* Displays file(s) in the following format
*
* offset: ......numeric...... |...ascii...|
*
* where the offset and numeric sections are in the specified base
* 'record' length is the same as the chose base (e.i., hex prints
* 16 bytes per line, octal prints 8 bytes per line, decimal
* prints 10 bytes per line.
*/
#include <stdio.h>
#ifdef SYS5
#include <memory.h>
#endif
#define TRUE 1
#define FALSE 0
FILE *infile;
unsigned char inrec[16];
unsigned char savrec[16];
unsigned recno;
long offset;
int duplicate;
int base = 16; /* default to hexadecimal */
main(argc, argv)
int argc;
char *argv[];
{
#ifdef BSD4.2
char *memset(),*memcpy();
#endif
extern int optind;
extern char *optarg;
int c;
offset = 0;
while ((c = getopt(argc,argv,"xods:")) != EOF) {
switch (c) {
case 'x':
base = 16;
break;
case 'o':
base = 8;
break;
case 'd':
base = 10;
break;
case 's':
if(!strlen(optarg))
exit(1);
offset = atol(optarg);
break;
default:
fprintf(stderr,"%s: unknown option (%c)\n",
argv[0], c);
fprintf(stderr,"Usage: xod [-x -o -d -snnn] fn\n");
fprintf(stderr,"\twhere nnn is a decimal starting offset into the file\n");
exit(1);
}
}
if (optind == argc && offset) {
fprintf(stderr,"-s option invalid with stdin\n");
exit(1);
}
if (optind == argc) {
infile = stdin;
printf("\n\nDump: standard input\n\n");
dump(stdin);
}
else {
for ( ; optind < argc; optind++) {
if ((infile = fopen(argv[optind], "r")) == NULL) {
fprintf(stderr,
"Unable to open %s\n\n", argv[optind]);
continue;
}
printf("\n\nDump: %s\n\n", argv[optind]);
if(offset)
fseek(infile,offset,0);
dump(infile);
if (duplicate) {
printrec(savrec);
duplicate = FALSE;
}
fclose(infile);
}
}
}
printrec(rec)
unsigned char *rec;
{
unsigned char *i;
switch (base) {
case 16:
printf("%08x: ", recno);
break;
case 8:
printf("%012o: ", recno);
break;
case 10:
printf("%10d: ", recno);
break;
}
for (i=rec; i<&rec[base]; i++) {
switch (base) {
case 16:
printf("%02x ", *i);
break;
case 8:
printf(" %03o ", *i);
break;
case 10:
printf("%3d ", *i);
break;
}
}
printf("| ");
for(i=rec; i<&rec[base]; i++) {
if (*i > 0x1f && *i < 0x7f)
printf("%c", *i);
else
printf(".");
}
printf(" |\n");
}
dump(src)
FILE *src;
{
recno = offset;
switch (base) {
case 16:
printf(
"Offset: 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef\n\n");
break;
case 8:
printf(
"Offset: 0 1 2 3 4 5 6 7 01234567\n\n");
break;
case 10:
printf(
"Offset: 0 1 2 3 4 5 6 7 8 9 0123456789\n\n");
break;
}
while (fread(inrec, 1, base, src) != 0) {
if (memcmp(inrec,savrec,base) == 0) {
duplicate = TRUE;
recno += base;
continue;
}
if (duplicate) {
printf("*\n");
duplicate = FALSE;
}
printrec(inrec);
recno += base;
memcpy(savrec,inrec,base);
memset(inrec,'\0',base);
}
}
#ifdef BSD4.2
int memcmp(s1,s2,n)
char *s1,*s2;
int n;
{
register int i,j;
for(i = 0; i < n && !(j = (*(s1+i) - *(s2+i))); i++);
return(j);
}
char *memcpy(s1,s2,n)
char *s1,*s2;
int n;
{
register int i;
for(i=0; i < n; i++)
*(s1+i) = *(s2+i);
return(s1);
}
char *memset(s,c,n)
char *s;
int c,n;
{
register int i;
for(i=0; i < n; i++)
*(s+i) = c;
return(s);
}
#endif
--
----
"I ain't gay, but there are sure times when i wish i could say
that i wasn't straight"
Name: James M. Turner
Mail: Imagen Corp. 2650 San Tomas Expressway, P.O. Box 58101
Santa Clara, CA 95052-8101
AT&T: (408) 986-9400
UUCP: ...{decvax,ucbvax}!decwrl!imagen!turner
CompuServe: 76327,1575
GEnie : D-ARCANGEL