> Date: Tue, 08 Apr 2008 18:58:25 +0200 > From: [EMAIL PROTECTED] > > > Sorry. The hash function I was thinking about is in the hash-pjw > module in the gnulib: > > /* Compute a hash code for a NUL-terminated string starting at X, > and return the hash code modulo TABLESIZE. > The result is platform dependent: it depends on the size of the 'size_t' > type and on the signedness of the 'char' type. */ > extern size_t hash_pjw (void const *x, size_t tablesize); >
Perfect. > And it is inspired in a method described by Bruno Haible: > http://www.haible.de/bruno/hashfunc.html > > So if needed would not be hard to write our own version if to use > hash_pjw with gl_listelement_hashcode_fn proves to be problematic. I think It won't be problematic. Now, I'll send the patch for the final Hash Module API that I'm planing to implement. A question first. Regarding "pdf_hash_iterator_next()" that is supposed to return each key of a hash table, do you think we should keep track of each string key and free() them when "pdf_hash_iterator_free()" is called or leave the user that job. It is a memory used over complexity trade-off. Patch, ## Index: doc/gnupdf.texi =================================================================== RCS file: /sources/pdf/libgnupdf/doc/gnupdf.texi,v retrieving revision 1.40 diff -u -r1.40 gnupdf.texi --- doc/gnupdf.texi 8 Apr 2008 10:21:29 -0000 1.40 +++ doc/gnupdf.texi 9 Apr 2008 21:03:03 -0000 @@ -888,36 +888,351 @@ @menu * Hash Table Types:: * Creating and Destroying Hash Tables:: +* Hash Table properties:: +* Working with keys:: +* Adding and removing elements:: +* Searching elements:: +* Working with iterators:: @end menu @node Hash Table Types @subsection Hash Table Types [EMAIL PROTECTED] {Data Type} {enum pdf_hash_value_type_e} - -Enumeration of supported value types in a hash variable: - [EMAIL PROTECTED] @code [EMAIL PROTECTED] PDF_HASH_VAL_BOOL [EMAIL PROTECTED] PDF_HASH_VAL_U32 [EMAIL PROTECTED] PDF_HASH_VAL_I32 [EMAIL PROTECTED] PDF_HASH_VAL_REAL [EMAIL PROTECTED] PDF_HASH_VAL_STR [EMAIL PROTECTED] PDF_HASH_VAL_TEXT [EMAIL PROTECTED] PDF_HASH_VAL_HASH [EMAIL PROTECTED] PDF_HASH_VAL_LIST [EMAIL PROTECTED] table [EMAIL PROTECTED] deftp - @deftp {Data Type} pdf_hash_t A Hash Table able to store key/value pairs. A key may be any NULL-terminated string. @end deftp [EMAIL PROTECTED] {Data Type} pdf_hash_iterator_t + +An iterator over the keys of a Hash Table. [EMAIL PROTECTED] deftp + + @node Creating and Destroying Hash Tables @subsection Creating and Destroying Hash Tables [EMAIL PROTECTED] pdf_status_t pdf_hash_create (pdf_hash_dispose_fn_t @var{dispose_fn}, pdf_hash_t @var{*table}) + +Create a new empty hash table. When some element is removed @var{dispose_fn} is called. Can be NULL. + [EMAIL PROTECTED] @strong [EMAIL PROTECTED] Parameters [EMAIL PROTECTED] @var [EMAIL PROTECTED] dispose_fn +A pointer to a hash table dispose function. [EMAIL PROTECTED] table +A pointer to a hash table. [EMAIL PROTECTED] table [EMAIL PROTECTED] Returns +A pdf status value: [EMAIL PROTECTED] @code [EMAIL PROTECTED] PDF_OK +The operation succeeded. [EMAIL PROTECTED] PDF_ENOMEM +Not enough memory. [EMAIL PROTECTED] PDF_EBADDATA +Invalid @var{table} pointer. [EMAIL PROTECTED] table [EMAIL PROTECTED] Usage example [EMAIL PROTECTED] +XXX [EMAIL PROTECTED] example [EMAIL PROTECTED] table [EMAIL PROTECTED] deftypefun + [EMAIL PROTECTED] pdf_status_t pdf_hash_destroy (pdf_hash_t @var{table}) + +Destroy a hash table. The elements of the table are disposed first. + [EMAIL PROTECTED] @strong [EMAIL PROTECTED] Parameters [EMAIL PROTECTED] @var [EMAIL PROTECTED] table +A hash table. [EMAIL PROTECTED] table [EMAIL PROTECTED] Returns +A pdf status value: [EMAIL PROTECTED] @code [EMAIL PROTECTED] PDF_OK +The operation succeeded. [EMAIL PROTECTED] table [EMAIL PROTECTED] Usage example [EMAIL PROTECTED] +XXX [EMAIL PROTECTED] example [EMAIL PROTECTED] table [EMAIL PROTECTED] deftypefun + + + [EMAIL PROTECTED] Hash Table properties [EMAIL PROTECTED] Hash Table properties + [EMAIL PROTECTED] pdf_size_t pdf_hash_size (pdf_hash_t @var{table}) + +Returns the number of entries in @var{table}. + [EMAIL PROTECTED] @strong [EMAIL PROTECTED] Parameters [EMAIL PROTECTED] @var [EMAIL PROTECTED] table +A hash table. [EMAIL PROTECTED] table [EMAIL PROTECTED] Returns +The number of entries. [EMAIL PROTECTED] Usage example [EMAIL PROTECTED] +XXX [EMAIL PROTECTED] example [EMAIL PROTECTED] table [EMAIL PROTECTED] deftypefun + [EMAIL PROTECTED] Working with keys [EMAIL PROTECTED] Working with keys + [EMAIL PROTECTED] pdf_bool_t pdf_hash_key_p (pdf_hash_t @var{table}, const char [EMAIL PROTECTED]) + +Returns a boolean value indicating whether an element with key @var{key} exists in @var{table}. + [EMAIL PROTECTED] @strong [EMAIL PROTECTED] Parameters [EMAIL PROTECTED] @var [EMAIL PROTECTED] table +A hash table. [EMAIL PROTECTED] key +A valid key string. [EMAIL PROTECTED] table [EMAIL PROTECTED] Returns +A pdf boolean value: [EMAIL PROTECTED] @code [EMAIL PROTECTED] PDF_TRUE +An element associated with @var{key} exists. [EMAIL PROTECTED] PDF_FALSE +There is no element associated with @var{key}. [EMAIL PROTECTED] table [EMAIL PROTECTED] Usage example [EMAIL PROTECTED] +XXX [EMAIL PROTECTED] example [EMAIL PROTECTED] table [EMAIL PROTECTED] deftypefun + [EMAIL PROTECTED] pdf_status_t pdf_hash_rename (pdf_hash_t @var{table}, const char @var{*key}, const char @var{*new_key}) + +Renames the key @var{key} to @var{new_key} in @var{table}. + [EMAIL PROTECTED] @strong [EMAIL PROTECTED] Parameters [EMAIL PROTECTED] @var [EMAIL PROTECTED] table +A hash table. [EMAIL PROTECTED] key +A valid key string. [EMAIL PROTECTED] new_key +A valid key string. [EMAIL PROTECTED] table [EMAIL PROTECTED] Returns +A pdf status value: [EMAIL PROTECTED] @code [EMAIL PROTECTED] PDF_OK +The operation succeded. [EMAIL PROTECTED] PDF_ENOMEM +Not enough memory. [EMAIL PROTECTED] PDF_ERROR +The @var{key} is not associated with any element in @var{table}. [EMAIL PROTECTED] PDF_EBADDATA +Either @var{table} or a key string is invalid or NULL. [EMAIL PROTECTED] table [EMAIL PROTECTED] Usage example [EMAIL PROTECTED] +XXX [EMAIL PROTECTED] example [EMAIL PROTECTED] table [EMAIL PROTECTED] deftypefun + [EMAIL PROTECTED] Adding and removing elements [EMAIL PROTECTED] Adding and removing elements + [EMAIL PROTECTED] pdf_status_t pdf_hash_add (pdf_hash_t @var{table}, const char @var{*key}, void @var{*element}) + +Adds the element @var{element} with the associated key @var{key} to @var{table}. If @var{key} already exists nothing is done. + [EMAIL PROTECTED] @strong [EMAIL PROTECTED] Parameters [EMAIL PROTECTED] @var [EMAIL PROTECTED] table +A hash table. [EMAIL PROTECTED] key +A valid key string. [EMAIL PROTECTED] element +A pointer to the element being added. [EMAIL PROTECTED] table [EMAIL PROTECTED] Returns +A pdf status value: [EMAIL PROTECTED] @code [EMAIL PROTECTED] PDF_OK +The operation succeeded. [EMAIL PROTECTED] PDF_ENOMEM +Not enough memory. [EMAIL PROTECTED] PDF_EBADDATA +Either @var{table}, @var{key} or @var{element} is invalid. [EMAIL PROTECTED] table [EMAIL PROTECTED] Usage example [EMAIL PROTECTED] +XXX [EMAIL PROTECTED] example [EMAIL PROTECTED] table [EMAIL PROTECTED] deftypefun + [EMAIL PROTECTED] pdf_status_t pdf_hash_remove (pdf_hash_t @var{table}, const char @var{*key}) + +Removes the element associated with @var{key} from @var{table}. The element is disposed first. + [EMAIL PROTECTED] @strong [EMAIL PROTECTED] Parameters [EMAIL PROTECTED] @var [EMAIL PROTECTED] table +A hash table. [EMAIL PROTECTED] key +A valid key string. [EMAIL PROTECTED] table [EMAIL PROTECTED] Returns +A pdf status value: [EMAIL PROTECTED] @code [EMAIL PROTECTED] PDF_OK +The operation succeeded. [EMAIL PROTECTED] PDF_EBADDATA +Invalid @var{table} or @var{key}. [EMAIL PROTECTED] PDF_ERROR +The @var{key} wasn't found. [EMAIL PROTECTED] table [EMAIL PROTECTED] Usage example [EMAIL PROTECTED] +XXX [EMAIL PROTECTED] example [EMAIL PROTECTED] table [EMAIL PROTECTED] deftypefun + [EMAIL PROTECTED] Searching elements [EMAIL PROTECTED] Searching elements + [EMAIL PROTECTED] pdf_status_t pdf_hash_search (pdf_hash_t @var{table}, const char @var{*key}, void [EMAIL PROTECTED]) + +Searches for the element associated with the given @var{key} in @var{table} and store it in @var{elem_pointer}. + [EMAIL PROTECTED] @strong [EMAIL PROTECTED] Parameters [EMAIL PROTECTED] @var [EMAIL PROTECTED] table +A hash table. [EMAIL PROTECTED] key +A valid null-terminated string key. [EMAIL PROTECTED] elem_pointer +A pointer where to store the element. [EMAIL PROTECTED] table [EMAIL PROTECTED] Returns +A pdf status value: [EMAIL PROTECTED] @code [EMAIL PROTECTED] PDF_OK +The operation succeeded. [EMAIL PROTECTED] PDF_EBADDATA +Either @var{elem_pointer} is NULL, @var{key} or the @var{table} is invalid. [EMAIL PROTECTED] PDF_ERROR +The @var{key} wasn't found. [EMAIL PROTECTED] table [EMAIL PROTECTED] Usage example [EMAIL PROTECTED] +XXX [EMAIL PROTECTED] example [EMAIL PROTECTED] table [EMAIL PROTECTED] deftypefun + [EMAIL PROTECTED] Working with iterators [EMAIL PROTECTED] Working with iterators + [EMAIL PROTECTED] pdf_status_t pdf_hash_iterator (pdf_hash_t @var{table}, pdf_hash_iterator_t @var{*iterator}) + +Creates an iterator over the keys of @var{table} and saves it in @var{iterator}. Keys composed only by numbers are returned first followed by keys in the order imposed by the ``strcmp()'' function. + [EMAIL PROTECTED] @strong [EMAIL PROTECTED] Parameters [EMAIL PROTECTED] @var [EMAIL PROTECTED] table +A hash table. [EMAIL PROTECTED] iterator +A pointer to an iterator. [EMAIL PROTECTED] table [EMAIL PROTECTED] Returns +A pdf status value: [EMAIL PROTECTED] @code [EMAIL PROTECTED] PDF_OK +The operation succeeded. [EMAIL PROTECTED] PDF_EBADDATA +Either @var{iterator} is NULL or @var{table} is invalid. [EMAIL PROTECTED] table [EMAIL PROTECTED] Usage example [EMAIL PROTECTED] +XXX [EMAIL PROTECTED] example [EMAIL PROTECTED] table [EMAIL PROTECTED] deftypefun + [EMAIL PROTECTED] pdf_status_t pdf_hash_iterator_next (pdf_hash_iterator_t @var{iterator}, const char [EMAIL PROTECTED]) + +Retrieves the next key from @var{iterator}. + [EMAIL PROTECTED] @strong [EMAIL PROTECTED] Parameters [EMAIL PROTECTED] @var [EMAIL PROTECTED] iterator +A Hash Table iterator. [EMAIL PROTECTED] key +A pointer where to save the key. [EMAIL PROTECTED] table [EMAIL PROTECTED] Returns +A pdf status value: [EMAIL PROTECTED] @code [EMAIL PROTECTED] PDF_OK +The operation succeeded. [EMAIL PROTECTED] PDF_EBADDATA +Either @var{iterator} is invalid or @var{key} is NULL. [EMAIL PROTECTED] PDF_ERROR +There are no more keys to traverse over. [EMAIL PROTECTED] PDF_ENOMEM +Not enough memory. [EMAIL PROTECTED] table [EMAIL PROTECTED] Usage example [EMAIL PROTECTED] +XXX [EMAIL PROTECTED] example [EMAIL PROTECTED] table [EMAIL PROTECTED] deftypefun + [EMAIL PROTECTED] pdf_status_t pdf_hash_iterator_free (pdf_hash_iterator_t @var{iterator}) + +Free all resources used by @var{iterator}. + [EMAIL PROTECTED] @strong [EMAIL PROTECTED] Parameters [EMAIL PROTECTED] @var [EMAIL PROTECTED] table +A Hash Table iterator. [EMAIL PROTECTED] table [EMAIL PROTECTED] Returns +A pdf status value: [EMAIL PROTECTED] @code [EMAIL PROTECTED] PDF_OK +The operation succeeded. [EMAIL PROTECTED] table [EMAIL PROTECTED] Usage example [EMAIL PROTECTED] +XXX [EMAIL PROTECTED] example [EMAIL PROTECTED] table [EMAIL PROTECTED] deftypefun + @node Lists @section Lists ### cheers -gerel
