Listing 7 Resizing the Array

/*>>>>>>>>>>>>>>>>>> Resize the AA <<<<<<<<<<<<<<<<<*/
BOOLEAN aa_resize (aa,newsize)
AA * aa;         /* input -- AA definition */
size_t newsize;  /* input -- new size for AA */
{
  BOOLEAN rc=TRUE;
  void **newkeys, **newdata, **oldkeys, **olddata;
  int i, oldsize, index;
  
  newsize=prime_size(newsize); /* insure prime size */
  /* alloc new/enlarged key and data tables */
  newkeys=(void **)calloc(newsize, sizeof(void *));
  newdata=(void **)calloc(newsize, sizeof(void *));
  if ((aa->current_elements < MAXFULL(newsize)) &&
     (newkeys && newdata)) {
    oldkeys=aa->keys;  /* save old table ptrs */
    olddata=aa->data;
    oldsize=aa->max_elements;
    aa->keys=newkeys;  /* put new tables in AA def */
    aa->data=newdata;
    aa->max_elements=newsize;
    
    /* now add/rehash all keys/data into new table */
    for (i=0; i<oldsize; i++) /*scan for valid keys*/
      if (VALID_KEY(oldkeys[i])) {
         index=hashindex(aa,oldkeys[i]);
         aa->keys[index]=oldkeys[i];
         aa->data[index]=olddata[i];
      }
    free((void *)oldkeys); free((void *)olddata);
  } else { /* cleanup on error */
    if (newkeys) free((void *)newkeys);
    if (newdata) free((void *)newdata);
    rc=FALSE;
  }
  return(rc);  /* return status, TRUE if successful */
}
/* End of File */