#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void hexdump(int p, int q, char *s)
{
  int i;
  fprintf(stdout, "%08x:", q);
  for (i = 0; i < p; i++) {
    fprintf(stdout, " %02x", (int)s[i]&255);
  }
  for (i = p; i < 16; i++) {
    fprintf(stdout, "   ");
  }
  fprintf(stdout, "  : ");
  for (i = 0; i < p; i++) {
    if (isprint(s[i])) {
      fprintf(stdout, "%c", s[i]);
    } else {
      fprintf(stdout, ".");
    }
  }
  for (i = p; i < 16; i++) {
    fprintf(stdout, " ");
  }
  fprintf(stdout, "\n");
}

int main(int argc, char **argv)
{
  FILE *f;
  char row[16];
  int i, j, c;

  if (argc != 2) {
    fprintf(stderr, "syntax: hexdump <filename> {0xSTART 0xFINISH}\n");
    exit(0);
  }
  f = fopen(argv[1], "rb");
  j = 0;
  for (;;) {
    for (i = 0; i < 16; i++) {
      c = fgetc(f);
      if (c == EOF) break;
      row[i] = c;
    }
    if ((c == EOF) && (i == 0)) break;
    hexdump(i, j, row);
    if (c == EOF) break;
    j += 16;
  }
}

