/* Copyright 2005 George Peter Staplin */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void *check_alloc (size_t s) {
 void *p = malloc (s);

 if (NULL == p) {
  perror ("check_alloc");
  exit (EXIT_FAILURE);
 }
 memset (p, 0, s);
 return p;
}

typedef struct Obj {
 int used;
 char name[200];
 struct Obj *ptr;
} Obj;

typedef struct PoolHeader {
 struct PoolHeader *left;
 struct PoolHeader *right;
 Obj obj;
} PoolHeader;

typedef struct Pool {
 PoolHeader *freePool;
 PoolHeader *pool;
} Pool;

#define POOL_MAX 40

Pool *create_pool (void) {
 Pool *p;
 int i;
 PoolHeader *header, *right;

 p = check_alloc (sizeof (Pool));
 p->pool = NULL;
 header = p->freePool = check_alloc (sizeof (PoolHeader) * POOL_MAX);
 
 header->left = NULL;
 right = (header + 1);

#if 0
 /* iteration 1 */
 header->right = right;
 right->left = header;
 header = right;
 right = (right + 1);
 
 /* iteration 2 */
 header->right = right;
 right->left = header;
 header = right;
 right = (right + 1);
#endif

 for (i = 0; i < (POOL_MAX - 1); ++i) {
  header->right = right;
  right->left = header;
  header = right;
  right = (right + 1);
 }
 header->right = NULL;

 return p;
}

void collect_objs (Pool *p) {

}

Obj *allocate_obj (Pool *p) {
 return NULL;
}

void traverse_free_pool (Pool *p) {
 PoolHeader *header = p->freePool;
 int i = 1;

 while (header) {
  fprintf (stderr, "%d header %p  ->left %p ->right %p\n", 
   i, header, header->left, header->right);

  header = header->right;
  ++i;
 }
}

int main () { 
 Pool *pool = create_pool ();
 Obj *a;
 Obj *b;

 traverse_free_pool (pool);

return EXIT_SUCCESS;

 a = allocate_obj (pool);
 b = allocate_obj (pool);

 a->ptr = b;

 collect_objs (pool);

 return EXIT_SUCCESS;
}
