Listing 3 Creating the Array

/*>>>> Create associative array (AA) definition <<<<*/
AA *aa_create (type,key_size,data_size,size,user_hashf)
enum AA_KEYTYPE type; /* input -- key type */
size_t key_size;      /* input -- max binary key size */
size_t data_size;     /* input -- max data size */
size_t size;          /* input -- initial size */
int (*user_hashf)();  /* input -- optional hash func */
{
  AA * aa;

  /* all AA information stored in structure */
  if (aa=(AA *)malloc(sizeof(AA))) {
     size=prime_size(size);
     aa->keys=(void **)calloc(size, sizeof(void *));
     aa->data=(void **)calloc(size, sizeof(void *));
     if (aa->keys && aa->data) { /*if allocation ok*/
        aa->type=type;
        aa->key_size=key_size;
        aa->max_elements=size;
        aa->current_elements=0;
        aa->data_size=data_size;
        if ((aa->hash_function=user_hashf) == NULL)
           aa->hash_function=&hash_function;
     } else { /* failure, release memory */
        if (aa->keys) free((void *)aa->keys);
        if (aa->data) free((void *)aa->data);
        free((void *)aa);
        aa=NULL;  /* return NULL on failure */
     }
  }
  return(aa); /* return AA definition */
}

/*>>>> Get 1st prime larger than request size <<<<*/
static size_t prime_size(size)
size_t size;  /* start search for prime at size*/
{
  int divisor,i=(size<5 ? 5 : size);
  i=(i % 2) ? i : i + 1; /* start on odd number */
  do {
     /* try each number which could be exact divisor */
     for (divisor=3; divisor <= i/divisor; divisor+=2)
        if ((i % divisor) == 0) break; /* if !prime */
     if (divisor > (i/divisor)) break; /* if prime */
  } while (i+=2);   /* try next odd number */
  return(i);  /* return prime number */
}

/* End of File */