/* Copyright 2003 George Peter Staplin
 * Revision 2 
 */

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

#define check_malloc(s) ({void *r = malloc(s); \
 if (NULL == r) { perror ("unable to malloc"); exit (EXIT_FAILURE); } \
 r; })

typedef struct pig_s {
 struct pig_s *ar[256];
 int val;
} Pig;

Pig *create_pig () {
 Pig *p = check_malloc (sizeof (Pig));
 memset (p, 0, sizeof (Pig));
 return p;
}

int pig_get (Pig *p, char *key) {
 while ('\0' != *key) {
  if (NULL == p->ar[*key]) {
   return 0;
  }
  p = p->ar[*key];
  ++key;
 }
 return p->val;
}

void pig_insert (Pig *p, char *key, int val) {
 while ('\0' != *key) {
  if (NULL == p->ar[*key]) {
   p->ar[*key] = create_pig();
  }
  p = p->ar[*key];
  ++key;
 }
 p->val = val;
}

int main () {
 Pig *p; 
 
 p = create_pig (); 

 pig_insert (p, "abc", 123);
 pig_insert (p, "def", 456);
 pig_insert (p, "abc xyz", 444);

 printf ("1 %d 2 %d 3 %d\n", 
  pig_get (p, "abc"), 
  pig_get (p, "def"), 
  pig_get (p, "abc xyz"));

 return EXIT_SUCCESS; 
}
