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

char *hex2bin(const char *);

int main(int argc, char **argv) {
  if (argc == 1) {
    fprintf(stderr, "Usage: %s hex...\n", argv[0]);
    return 1;
  }

  for (argv++; *argv; argv++) {
    char *bin = hex2bin(*argv);
    printf("%s => %s\n", *argv, bin);
  }
  return 0;
}

static char *h2b[16] = { "0000", "0001", "0010", "0011",
                         "0100", "0101", "0110", "0111",
                         "1000", "1001", "1010", "1011",
                         "1100", "1101", "1110", "1111",
};

char *hex2bin(const char *hex) {
  char *r, *rp;
  if (hex == 0) return NULL ;
  rp = r = malloc(strlen(hex) * 4 + 1);
  if (r == 0) return NULL;
  while (*hex) {
    char *q;
    unsigned v = (*hex <= '9' ? *hex - '0' : *hex - 'a' + 10);
    q = h2b[v];
    while (*q) {
      *rp++ = *q++;
    }
    hex++;
  }
  *rp = '\0';
  return r;
}
