/*>>>> 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 */