include/
* hashtab.h (htab_alloc_with_arg, htab_free_with_arg): Add new types. (struct htab): Add alloc_arg, alloc_with_arg_f, free_with_arg_f. (htab_create_alloc_ex): New prototype. (htab_set_functions_ex): New prototype. libiberty/ * hashtab.c (htab_create_alloc_ex): New function. (hatab_set_functions_ex): New function. (htab_delete, htab_expand): Support alternate allocation functions.
This commit is contained in:
parent
cad81edc07
commit
5f9624e37e
4 changed files with 106 additions and 4 deletions
|
@ -1,3 +1,10 @@
|
|||
2003-01-26 Daniel Jacobowitz <drow@mvista.com>
|
||||
|
||||
* hashtab.h (htab_alloc_with_arg, htab_free_with_arg): Add new types.
|
||||
(struct htab): Add alloc_arg, alloc_with_arg_f, free_with_arg_f.
|
||||
(htab_create_alloc_ex): New prototype.
|
||||
(htab_set_functions_ex): New prototype.
|
||||
|
||||
2003-01-25 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* elf/sparc.h: Add TLS relocs. Move R_SPARC_REV32 to 252.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* An expandable hash tables datatype.
|
||||
Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
|
||||
Contributed by Vladimir Makarov (vmakarov@cygnus.com).
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
@ -76,10 +76,16 @@ typedef PTR (*htab_alloc) PARAMS ((size_t, size_t));
|
|||
/* We also need a free() routine. */
|
||||
typedef void (*htab_free) PARAMS ((PTR));
|
||||
|
||||
/* Memory allocation and deallocation; variants which take an extra
|
||||
argument. */
|
||||
typedef PTR (*htab_alloc_with_arg) PARAMS ((void *, size_t, size_t));
|
||||
typedef void (*htab_free_with_arg) PARAMS ((void *, void *));
|
||||
|
||||
/* Hash tables are of the following type. The structure
|
||||
(implementation) of this type is not needed for using the hash
|
||||
tables. All work with hash table should be executed only through
|
||||
functions mentioned below. */
|
||||
functions mentioned below. The size of this structure is subject to
|
||||
change. */
|
||||
|
||||
struct htab GTY(())
|
||||
{
|
||||
|
@ -115,6 +121,11 @@ struct htab GTY(())
|
|||
/* Pointers to allocate/free functions. */
|
||||
htab_alloc alloc_f;
|
||||
htab_free free_f;
|
||||
|
||||
/* Alternate allocate/free functions, which take an extra argument. */
|
||||
PTR GTY((skip (""))) alloc_arg;
|
||||
htab_alloc_with_arg alloc_with_arg_f;
|
||||
htab_free_with_arg free_with_arg_f;
|
||||
};
|
||||
|
||||
typedef struct htab *htab_t;
|
||||
|
@ -128,10 +139,20 @@ extern htab_t htab_create_alloc PARAMS ((size_t, htab_hash,
|
|||
htab_eq, htab_del,
|
||||
htab_alloc, htab_free));
|
||||
|
||||
extern htab_t htab_create_alloc_ex PARAMS ((size_t, htab_hash,
|
||||
htab_eq, htab_del,
|
||||
PTR, htab_alloc_with_arg,
|
||||
htab_free_with_arg));
|
||||
|
||||
/* Backward-compatibility functions. */
|
||||
extern htab_t htab_create PARAMS ((size_t, htab_hash, htab_eq, htab_del));
|
||||
extern htab_t htab_try_create PARAMS ((size_t, htab_hash, htab_eq, htab_del));
|
||||
|
||||
extern void htab_set_functions_ex PARAMS ((htab_t, htab_hash,
|
||||
htab_eq, htab_del,
|
||||
PTR, htab_alloc_with_arg,
|
||||
htab_free_with_arg));
|
||||
|
||||
extern void htab_delete PARAMS ((htab_t));
|
||||
extern void htab_empty PARAMS ((htab_t));
|
||||
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2003-01-26 Daniel Jacobowitz <drow@mvista.com>
|
||||
|
||||
* hashtab.c (htab_create_alloc_ex): New function.
|
||||
(hatab_set_functions_ex): New function.
|
||||
(htab_delete, htab_expand): Support alternate allocation functions.
|
||||
|
||||
2003-01-24 Christopher Faylor <cgf@redhat.com>
|
||||
|
||||
* configure.in: Remove special pex-cygwin consideration.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* An expandable hash tables datatype.
|
||||
Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
Contributed by Vladimir Makarov (vmakarov@cygnus.com).
|
||||
|
||||
This file is part of the libiberty library.
|
||||
|
@ -191,6 +191,63 @@ htab_create_alloc (size, hash_f, eq_f, del_f, alloc_f, free_f)
|
|||
return result;
|
||||
}
|
||||
|
||||
/* As above, but use the variants of alloc_f and free_f which accept
|
||||
an extra argument. */
|
||||
|
||||
htab_t
|
||||
htab_create_alloc_ex (size, hash_f, eq_f, del_f, alloc_arg, alloc_f,
|
||||
free_f)
|
||||
size_t size;
|
||||
htab_hash hash_f;
|
||||
htab_eq eq_f;
|
||||
htab_del del_f;
|
||||
PTR alloc_arg;
|
||||
htab_alloc_with_arg alloc_f;
|
||||
htab_free_with_arg free_f;
|
||||
{
|
||||
htab_t result;
|
||||
|
||||
size = higher_prime_number (size);
|
||||
result = (htab_t) (*alloc_f) (alloc_arg, 1, sizeof (struct htab));
|
||||
if (result == NULL)
|
||||
return NULL;
|
||||
result->entries = (PTR *) (*alloc_f) (alloc_arg, size, sizeof (PTR));
|
||||
if (result->entries == NULL)
|
||||
{
|
||||
if (free_f != NULL)
|
||||
(*free_f) (alloc_arg, result);
|
||||
return NULL;
|
||||
}
|
||||
result->size = size;
|
||||
result->hash_f = hash_f;
|
||||
result->eq_f = eq_f;
|
||||
result->del_f = del_f;
|
||||
result->alloc_arg = alloc_arg;
|
||||
result->alloc_with_arg_f = alloc_f;
|
||||
result->free_with_arg_f = free_f;
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Update the function pointers and allocation parameter in the htab_t. */
|
||||
|
||||
void
|
||||
htab_set_functions_ex (htab, hash_f, eq_f, del_f, alloc_arg, alloc_f, free_f)
|
||||
htab_t htab;
|
||||
htab_hash hash_f;
|
||||
htab_eq eq_f;
|
||||
htab_del del_f;
|
||||
PTR alloc_arg;
|
||||
htab_alloc_with_arg alloc_f;
|
||||
htab_free_with_arg free_f;
|
||||
{
|
||||
htab->hash_f = hash_f;
|
||||
htab->eq_f = eq_f;
|
||||
htab->del_f = del_f;
|
||||
htab->alloc_arg = alloc_arg;
|
||||
htab->alloc_with_arg_f = alloc_f;
|
||||
htab->free_with_arg_f = free_f;
|
||||
}
|
||||
|
||||
/* These functions exist solely for backward compatibility. */
|
||||
|
||||
#undef htab_create
|
||||
|
@ -234,6 +291,11 @@ htab_delete (htab)
|
|||
(*htab->free_f) (htab->entries);
|
||||
(*htab->free_f) (htab);
|
||||
}
|
||||
else if (htab->free_with_arg_f != NULL)
|
||||
{
|
||||
(*htab->free_with_arg_f) (htab->alloc_arg, htab->entries);
|
||||
(*htab->free_with_arg_f) (htab->alloc_arg, htab);
|
||||
}
|
||||
}
|
||||
|
||||
/* This function clears all entries in the given hash table. */
|
||||
|
@ -313,7 +375,11 @@ htab_expand (htab)
|
|||
|
||||
nsize = higher_prime_number (htab->size * 2);
|
||||
|
||||
nentries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR));
|
||||
if (htab->alloc_with_arg_f != NULL)
|
||||
nentries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize,
|
||||
sizeof (PTR *));
|
||||
else
|
||||
nentries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR *));
|
||||
if (nentries == NULL)
|
||||
return 0;
|
||||
htab->entries = nentries;
|
||||
|
@ -340,6 +406,8 @@ htab_expand (htab)
|
|||
|
||||
if (htab->free_f != NULL)
|
||||
(*htab->free_f) (oentries);
|
||||
else if (htab->free_with_arg_f != NULL)
|
||||
(*htab->free_with_arg_f) (htab->alloc_arg, oentries);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue