/* xd.c : hexdump utility with real-time output * Jon Mayo - September 13, 2006 - PUBLIC DOMAIN */ #include #include #include #include #include #include static int verbose=1, /* verbose messages (default) */ fancy=1, /* fancy output */ outbase=16, /* number base for output, 8, 10, or 16 */ hexcase=1, /* select lower(0) or upper(1) case */ max_length=0, skip_offset=0, output_buffering=0; /* should output be flushed constantly? */ static int xd(FILE *in, FILE *out, const char *name, int base) { int len, i, ch; unsigned char buf[16]; int total=0; if(!output_buffering) setvbuf(out, 0, _IONBF, 0); if(skip_offset>0) { if(verbose>1) { fprintf(stderr, "%s:skipping %d bytes.\n", name, skip_offset); } if(fseek(in, SEEK_SET, skip_offset)==-1) { if(errno==EINVAL) { if(verbose) fprintf(stderr, "%s:is a stream skipping by reading... \n", name); while(fgetc(in)!=EOF && base0 && verbose>1) { fprintf(stderr, "%s:limiting length to %d bytes.\n", name, max_length); } ch=EOF; do { for(len=0;len<16 && (!max_length || total1) printf("%s:opening\n", argv[argi]); else if(verbose) fprintf(stderr, "%s:opening\n", argv[argi]); if(!xd(f, stdout, argv[argi], 0)) { fclose(f); return EXIT_FAILURE; } fclose(f); } } return 0; }