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

int main(int c, char **argv)
{
  FILE *fp;
  union {
    unsigned long l;
    unsigned short s[2];
    unsigned char c[4];
  } in;
  struct {
    unsigned long l;
    unsigned short s;
    unsigned char c;
  } checksum = { 0, };
  int count = 0;

  assert(sizeof(in) == 4);

  if(!argv[1])
    fp = stdin;

  if(!(fp = fopen(argv[1], "r")))
    return perror(argv[1]), -1;

  while(!feof(fp))
    {
      in.l = 0;
      count += fread(&in, sizeof(in), 1, fp);
      checksum.l += in.l;
      checksum.s += (in.s[1] + in.s[2]);
      checksum.c += 0xff & (in.c[1] + in.c[2] + in.c[3] + in.c[4]);
    }

  if(count)
    printf("length:\t%x (%u)\n"
	   "long:\t%#010x (%u)\n"
	   "short:\t%#06x (%u)\n"
	   "char:\t%#04x (%u)\n",
	   count, count,
	   checksum.l, checksum.l,
	   checksum.s, checksum.s,
	   checksum.c, checksum.c);

  return 0;
}
