merge from gcc

This commit is contained in:
DJ Delorie
2002-06-06 12:55:24 +00:00
parent 7217313c59
commit 1889369086
6 changed files with 124 additions and 65 deletions

View File

@@ -158,8 +158,42 @@ eq_pointer (p1, p2)
/* This function creates table with length slightly longer than given
source length. Created hash table is initiated as empty (all the
hash table entries are EMPTY_ENTRY). The function returns the
created hash table. Memory allocation must not fail. */
created hash table, or NULL if memory allocation fails. */
htab_t
htab_create_alloc (size, hash_f, eq_f, del_f, alloc_f, free_f)
size_t size;
htab_hash hash_f;
htab_eq eq_f;
htab_del del_f;
htab_alloc alloc_f;
htab_free free_f;
{
htab_t result;
size = higher_prime_number (size);
result = (htab_t) (*alloc_f) (1, sizeof (struct htab));
if (result == NULL)
return NULL;
result->entries = (PTR *) (*alloc_f) (size, sizeof (PTR));
if (result->entries == NULL)
{
if (free_f != NULL)
(*free_f) (result);
return NULL;
}
result->size = size;
result->hash_f = hash_f;
result->eq_f = eq_f;
result->del_f = del_f;
result->alloc_f = alloc_f;
result->free_f = free_f;
return result;
}
/* These functions exist solely for backward compatibility. */
#undef htab_create
htab_t
htab_create (size, hash_f, eq_f, del_f)
size_t size;
@@ -167,24 +201,9 @@ htab_create (size, hash_f, eq_f, del_f)
htab_eq eq_f;
htab_del del_f;
{
htab_t result;
size = higher_prime_number (size);
result = (htab_t) xcalloc (1, sizeof (struct htab));
result->entries = (PTR *) xcalloc (size, sizeof (PTR));
result->size = size;
result->hash_f = hash_f;
result->eq_f = eq_f;
result->del_f = del_f;
result->return_allocation_failure = 0;
return result;
return htab_create_alloc (size, hash_f, eq_f, del_f, xcalloc, free);
}
/* This function creates table with length slightly longer than given
source length. The created hash table is initiated as empty (all the
hash table entries are EMPTY_ENTRY). The function returns the created
hash table. Memory allocation may fail; it may return NULL. */
htab_t
htab_try_create (size, hash_f, eq_f, del_f)
size_t size;
@@ -192,26 +211,7 @@ htab_try_create (size, hash_f, eq_f, del_f)
htab_eq eq_f;
htab_del del_f;
{
htab_t result;
size = higher_prime_number (size);
result = (htab_t) calloc (1, sizeof (struct htab));
if (result == NULL)
return NULL;
result->entries = (PTR *) calloc (size, sizeof (PTR));
if (result->entries == NULL)
{
free (result);
return NULL;
}
result->size = size;
result->hash_f = hash_f;
result->eq_f = eq_f;
result->del_f = del_f;
result->return_allocation_failure = 1;
return result;
return htab_create_alloc (size, hash_f, eq_f, del_f, calloc, free);
}
/* This function frees all memory allocated for given hash table.
@@ -229,8 +229,11 @@ htab_delete (htab)
&& htab->entries[i] != DELETED_ENTRY)
(*htab->del_f) (htab->entries[i]);
free (htab->entries);
free (htab);
if (htab->free_f != NULL)
{
(*htab->free_f) (htab->entries);
(*htab->free_f) (htab);
}
}
/* This function clears all entries in the given hash table. */
@@ -302,21 +305,17 @@ htab_expand (htab)
PTR *oentries;
PTR *olimit;
PTR *p;
PTR *nentries;
oentries = htab->entries;
olimit = oentries + htab->size;
htab->size = higher_prime_number (htab->size * 2);
if (htab->return_allocation_failure)
{
PTR *nentries = (PTR *) calloc (htab->size, sizeof (PTR *));
if (nentries == NULL)
return 0;
htab->entries = nentries;
}
else
htab->entries = (PTR *) xcalloc (htab->size, sizeof (PTR *));
nentries = (PTR *) (*htab->alloc_f) (htab->size, sizeof (PTR *));
if (nentries == NULL)
return 0;
htab->entries = nentries;
htab->n_elements -= htab->n_deleted;
htab->n_deleted = 0;
@@ -337,7 +336,8 @@ htab_expand (htab)
}
while (p < olimit);
free (oentries);
if (htab->free_f != NULL)
(*htab->free_f) (oentries);
return 1;
}