pdf-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[pdf-devel] Patch for FS#56 and FS#57


From: gerel
Subject: [pdf-devel] Patch for FS#56 and FS#57
Date: Thu, 24 Jul 2008 16:28:21 -0700 (PDT)

Ok, finally I have a patch for both tasks.

Hope all is ok.

##

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: address@hidden
# target_branch: file:///home/gerel/PROJECTS/libgnupdf/trunk/
# testament_sha1: 20903cb86e206daadda1b6cbd98a29c059cd2156
# timestamp: 2008-07-24 20:10:20 -0300
# base_revision_id: address@hidden
# 
# Begin patch
=== modified file 'ChangeLog'
--- ChangeLog   2008-07-25 01:02:23 +0000
+++ ChangeLog   2008-07-24 23:09:09 +0000
@@ -8,6 +8,46 @@
        the pointer argument.
        (pdf_realloc): Idem.
 
+2008-07-24  gerel  <address@hidden>
+
+       * src/base/pdf-hash-helper.[ch]: added helper functions.
+
+       * doc/gnupdf.texi: same.
+
+2008-07-23  gerel  <address@hidden>
+
+       * src/base/pdf-hash.c: changed API to allow the specification of
+       memory disposal functions in entry insertion time and removed
+       table-wide disposal function.
+       
+       * src/base/pdf-hash.h: same.
+
+       * src/base/pdf-fsys.c: fixed to conform API modifications.
+       
+       * torture/unit/base/hash/pdf-hash-add.c: same.
+
+       * torture/unit/base/hash/pdf-hash-create.c: same.
+
+       * torture/unit/base/hash/pdf-hash-destroy.c: same.
+
+       * torture/unit/base/hash/pdf-hash-iterator-free.c: same.
+
+       * torture/unit/base/hash/pdf-hash-iterator-next.c: same.
+
+       * torture/unit/base/hash/pdf-hash-iterator.c: same.
+
+       * torture/unit/base/hash/pdf-hash-key-p.c: same.
+
+       * torture/unit/base/hash/pdf-hash-remove.c: same.
+
+       * torture/unit/base/hash/pdf-hash-rename.c: same.
+
+       * torture/unit/base/hash/pdf-hash-search.c: same.
+
+       * torture/unit/base/hash/pdf-hash-size.c: same.
+
+       * doc/gnupdf.texi: same.
+
 2008-07-22  Daniel Vidal  <address@hidden>
 
        * src/base/pdf-types.c:  Fixed negative number handling in some 
functions. Also error handling issues fixed.

=== modified file 'doc/gnupdf.texi'
--- doc/gnupdf.texi     2008-07-18 07:41:04 +0000
+++ doc/gnupdf.texi     2008-07-24 22:59:22 +0000
@@ -1258,6 +1258,8 @@
 * Adding and removing elements::
 * Searching elements::
 * Working with iterators::
+* Basic dispose functions::
+* Hash helper functions::
 @end menu
 
 @node Hash Table Types
@@ -1285,17 +1287,15 @@
 @node Creating and Destroying Hash Tables
 @subsection Creating and Destroying Hash Tables
 
address@hidden pdf_status_t pdf_hash_create (pdf_hash_key_dispose_fn_t 
@var{dispose_key_fn}, pdf_hash_element_dispose_fn_t @var{dispose_fn}, 
pdf_hash_t @var{*table})
address@hidden pdf_status_t pdf_hash_create (pdf_hash_key_dispose_fn_t 
@var{dispose_key_fn}, pdf_hash_t @var{*table})
 
-Create a new empty hash table. When some element is removed @var{dispose_fn} 
and @var{dispose_key_fn} are called, can be NULL.
+Create a new empty hash table. When some element is removed 
@var{dispose_key_fn} are called, can be NULL.
 
 @table @strong
 @item Parameters
 @table @var
 @item dispose_key_fn
 A pointer to a hash table element key dispose function or NULL.
address@hidden dispose_fn
-A pointer to a hash table element dispose function or NULL.
 @item table
 A pointer to a hash table.
 @end table
@@ -1427,7 +1427,7 @@
 @node Adding and removing elements
 @subsection Adding and removing elements
 
address@hidden pdf_status_t pdf_hash_add (pdf_hash_t @var{table}, const char 
@var{*key}, const void @var{*element}) 
address@hidden pdf_status_t pdf_hash_add (pdf_hash_t @var{table}, const char 
@var{*key}, const void @var{*element}, pdf_hash_element_dispose_fn_t 
@var{disp_fn} ) 
 
 Adds the element @var{element} with the associated key @var{key} to 
@var{table}. If @var{key} already exists nothing is done.
 
@@ -1440,6 +1440,8 @@
 A valid key string.
 @item element
 A pointer to the element being added.
address@hidden disp_fn
+A function called when @var{element} is removed. If NULL is given nothing is 
done.
 @end table
 @item Returns
 A pdf status value:
@@ -1606,6 +1608,220 @@
 @end deftypefun
 
 
address@hidden Basic dispose functions
address@hidden Basic dispose functions
+
+These are the basic function implementations to free elements and
+keys. They should only be used if you allocated elements/keys with
+pdf_alloc() and don't need to free any other resource.
+
address@hidden void pdf_hash_element_dealloc_fn (const void * @var{elt})
+
+Deallocates @var{elt} with pdf_dealloc(). 
+
address@hidden @strong
address@hidden Parameters
address@hidden @var
address@hidden elt
+A pointer to the element being freed.
address@hidden table
address@hidden Returns
+Nothing.
address@hidden Usage example
address@hidden
+XXX
address@hidden example
address@hidden table
address@hidden deftypefun
+
address@hidden void pdf_hash_key_dealloc_fn (const void * @var{elt})
+
+Deallocates @var{elt} with pdf_dealloc(). 
+
address@hidden @strong
address@hidden Parameters
address@hidden @var
address@hidden elt
+A pointer to the element being freed.
address@hidden table
address@hidden Returns
+Nothing.
address@hidden Usage example
address@hidden
+XXX
address@hidden example
address@hidden table
address@hidden deftypefun
+
+
address@hidden Hash helper functions
address@hidden Hash helper functions
+
+These are specific functions for adding different types of elements (types 
defined by the library). They guarantee that when an element of one of these 
types is removed from a hash table the correct disposal function is called.
+
+NOTE: If you are going to use the element after the table containing the 
element is destroyed, in that case don't use these functions.
+
address@hidden pdf_status_t pdf_hash_add_text (pdf_hash_t @var{table}, const 
char @var{*key}, const pdf_text_t @var{*elt})
+
+Adds the text @var{elt} with the associated key @var{key} to @var{table}. If 
@var{key} already exists nothing is done.
+
address@hidden @strong
address@hidden Parameters
address@hidden @var
address@hidden table
+A hash table.
address@hidden key
+A valid key string.
address@hidden elt
+A pointer to the element being added.
address@hidden table
address@hidden Returns
+A pdf status value:
address@hidden @code
address@hidden PDF_OK
+The operation succeeded.
address@hidden PDF_ENOMEM
+Not enough memory.
address@hidden PDF_EBADDATA
+Either @var{table}, @var{key} or @var{elt} is invalid.
address@hidden table
address@hidden Usage example
address@hidden
+XXX
address@hidden example
address@hidden table
address@hidden deftypefun
+
+
address@hidden pdf_status_t pdf_hash_add_time (pdf_hash_t @var{table}, const 
char @var{*key}, const pdf_time_t @var{*elt})
+
+Adds the time @var{elt} with the associated key @var{key} to @var{table}. If 
@var{key} already exists nothing is done.
+
address@hidden @strong
address@hidden Parameters
address@hidden @var
address@hidden table
+A hash table.
address@hidden key
+A valid key string.
address@hidden elt
+A pointer to the element being added.
address@hidden table
address@hidden Returns
+A pdf status value:
address@hidden @code
address@hidden PDF_OK
+The operation succeeded.
address@hidden PDF_ENOMEM
+Not enough memory.
address@hidden PDF_EBADDATA
+Either @var{table}, @var{key} or @var{elt} is invalid.
address@hidden table
address@hidden Usage example
address@hidden
+XXX
address@hidden example
address@hidden table
address@hidden deftypefun
+
+
+
address@hidden pdf_status_t pdf_hash_add_list (pdf_hash_t @var{table}, const 
char @var{*key}, const pdf_list_t @var{*elt})
+
+Adds the list @var{elt} with the associated key @var{key} to @var{table}. If 
@var{key} already exists nothing is done.
+
address@hidden @strong
address@hidden Parameters
address@hidden @var
address@hidden table
+A hash table.
address@hidden key
+A valid key string.
address@hidden elt
+A pointer to the element being added.
address@hidden table
address@hidden Returns
+A pdf status value:
address@hidden @code
address@hidden PDF_OK
+The operation succeeded.
address@hidden PDF_ENOMEM
+Not enough memory.
address@hidden PDF_EBADDATA
+Either @var{table}, @var{key} or @var{elt} is invalid.
address@hidden table
address@hidden Usage example
address@hidden
+XXX
address@hidden example
address@hidden table
address@hidden deftypefun
+
+
address@hidden pdf_status_t pdf_hash_add_hash (pdf_hash_t @var{table}, const 
char @var{*key}, const pdf_hash_t @var{*elt})
+
+Adds the hash table @var{elt} with the associated key @var{key} to 
@var{table}. If @var{key} already exists nothing is done.
+
address@hidden @strong
address@hidden Parameters
address@hidden @var
address@hidden table
+A hash table.
address@hidden key
+A valid key string.
address@hidden elt
+A pointer to the element being added.
address@hidden table
address@hidden Returns
+A pdf status value:
address@hidden @code
address@hidden PDF_OK
+The operation succeeded.
address@hidden PDF_ENOMEM
+Not enough memory.
address@hidden PDF_EBADDATA
+Either @var{table}, @var{key} or @var{elt} is invalid.
address@hidden table
address@hidden Usage example
address@hidden
+XXX
address@hidden example
address@hidden table
address@hidden deftypefun
+
address@hidden pdf_status_t pdf_hash_add_stm (pdf_hash_t @var{table}, const 
char @var{*key}, const pdf_stm_t @var{*elt})
+
+Adds the stream @var{elt} with the associated key @var{key} to @var{table}. If 
@var{key} already exists nothing is done.
+
address@hidden @strong
address@hidden Parameters
address@hidden @var
address@hidden table
+A hash table.
address@hidden key
+A valid key string.
address@hidden elt
+A pointer to the element being added.
address@hidden table
address@hidden Returns
+A pdf status value:
address@hidden @code
address@hidden PDF_OK
+The operation succeeded.
address@hidden PDF_ENOMEM
+Not enough memory.
address@hidden PDF_EBADDATA
+Either @var{table}, @var{key} or @var{elt} is invalid.
address@hidden table
address@hidden Usage example
address@hidden
+XXX
address@hidden example
address@hidden table
address@hidden deftypefun
+
+
+
 @node Lists
 @section Lists
 

=== modified file 'src/Makefile.am'
--- src/Makefile.am     2008-06-25 21:46:57 +0000
+++ src/Makefile.am     2008-07-24 19:42:01 +0000
@@ -25,7 +25,8 @@
 
 LIST_MODULE_SOURCES = base/pdf-list.c base/pdf-list.h
 
-HASH_MODULE_SOURCES = base/pdf-hash.c base/pdf-hash.h
+HASH_MODULE_SOURCES = base/pdf-hash.c base/pdf-hash.h \
+                      base/pdf-hash-helper.c base/pdf-hash-helper.h
 
 ALLOC_MODULE_SOURCES = base/pdf-alloc.c base/pdf-alloc.h
 
@@ -122,8 +123,8 @@
               base/pdf-stm-f-pred.h \
               base/pdf-stm-f-rl.h \
               base/pdf-stm-file.h \
-              base/pdf-stm.h
-
+              base/pdf-stm.h \
+              base/pdf-hash-helper.h 
 
 pdf.h : $(PUBLIC_HDRS)
        chmod +x $(top_srcdir)/src/extract-public-hdr

=== modified file 'src/base/pdf-fsys.c'
--- src/base/pdf-fsys.c 2008-06-17 18:24:43 +0000
+++ src/base/pdf-fsys.c 2008-07-23 11:39:04 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-06-17 13:12:16 gerel"
+/* -*- mode: C -*- Time-stamp: "2008-07-23 08:35:40 gerel"
  *
  *       File:         pdf-fsys.c
  *       Date:         Thu May 22 15:51:13 2008
@@ -209,57 +209,68 @@
   *version_minor = item_props.version_minor;
 
   /* Associate values with hash keys */
-  if (pdf_hash_add (props_hash, "isHidden", (void *) is_hidden) !=
-      PDF_OK)
-    {
-      return PDF_ERROR;
-    }
-  if (pdf_hash_add (props_hash, "isReadOnly", (void *) is_read_only) !=
-      PDF_OK)
-    {
-      return PDF_ERROR;
-    }
-  if (pdf_hash_add (props_hash, "isCheckedOut", (void *) is_checked_out) !=
-      PDF_OK)
-    {
-      return PDF_ERROR;
-    }
-  if (pdf_hash_add (props_hash, "isPublished", (void *) is_published) !=
-      PDF_OK)
-    {
-      return PDF_ERROR;
-    }
-  if (pdf_hash_add (props_hash, "fileSizeHigh", (void *) file_size_high) !=
-      PDF_OK)
-    {
-      return PDF_ERROR;
-    }
-  if (pdf_hash_add (props_hash, "fileSizeLow", (void *) file_size_low) !=
-      PDF_OK)
-    {
-      return PDF_ERROR;
-    }
-  if (pdf_hash_add (props_hash, "folderSize", (void *) folder_size) !=
-      PDF_OK)
-    {
-      return PDF_ERROR;
-    }
-  if (pdf_hash_add (props_hash, "creatorCode", (void *) creator_code) !=
-      PDF_OK)
-    {
-      return PDF_ERROR;
-    }
-  if (pdf_hash_add (props_hash, "typeCode", (void *) type_code) !=
-      PDF_OK)
-    {
-      return PDF_ERROR;
-    }
-  if (pdf_hash_add (props_hash, "versionMajor", (void *) version_major) !=
-      PDF_OK)
-    {
-      return PDF_ERROR;
-    }
-  if (pdf_hash_add (props_hash, "versionMinor", (void *) version_minor) !=
+  if (pdf_hash_add (props_hash, "isHidden", (void *) is_hidden,
+                    pdf_hash_element_dealloc_fn) !=
+      PDF_OK)
+    {
+      return PDF_ERROR;
+    }
+  if (pdf_hash_add (props_hash, "isReadOnly", (void *) is_read_only,
+                    pdf_hash_element_dealloc_fn) !=
+      PDF_OK)
+    {
+      return PDF_ERROR;
+    }
+  if (pdf_hash_add (props_hash, "isCheckedOut", (void *) is_checked_out,
+                    pdf_hash_element_dealloc_fn) !=
+      PDF_OK)
+    {
+      return PDF_ERROR;
+    }
+  if (pdf_hash_add (props_hash, "isPublished", (void *) is_published,
+                    pdf_hash_element_dealloc_fn) !=
+      PDF_OK)
+    {
+      return PDF_ERROR;
+    }
+  if (pdf_hash_add (props_hash, "fileSizeHigh", (void *) file_size_high,
+                    pdf_hash_element_dealloc_fn) !=
+      PDF_OK)
+    {
+      return PDF_ERROR;
+    }
+  if (pdf_hash_add (props_hash, "fileSizeLow", (void *) file_size_low,
+                    pdf_hash_element_dealloc_fn) !=
+      PDF_OK)
+    {
+      return PDF_ERROR;
+    }
+  if (pdf_hash_add (props_hash, "folderSize", (void *) folder_size,
+                    pdf_hash_element_dealloc_fn) !=
+      PDF_OK)
+    {
+      return PDF_ERROR;
+    }
+  if (pdf_hash_add (props_hash, "creatorCode", (void *) creator_code,
+                    pdf_hash_element_dealloc_fn) !=
+      PDF_OK)
+    {
+      return PDF_ERROR;
+    }
+  if (pdf_hash_add (props_hash, "typeCode", (void *) type_code,
+                    pdf_hash_element_dealloc_fn) !=
+      PDF_OK)
+    {
+      return PDF_ERROR;
+    }
+  if (pdf_hash_add (props_hash, "versionMajor", (void *) version_major,
+                    pdf_hash_element_dealloc_fn) !=
+      PDF_OK)
+    {
+      return PDF_ERROR;
+    }
+  if (pdf_hash_add (props_hash, "versionMinor", (void *) version_minor,
+                    pdf_hash_element_dealloc_fn) !=
       PDF_OK)
     {
       return PDF_ERROR;

=== added file 'src/base/pdf-hash-helper.c'
--- src/base/pdf-hash-helper.c  1970-01-01 00:00:00 +0000
+++ src/base/pdf-hash-helper.c  2008-07-24 22:59:22 +0000
@@ -0,0 +1,107 @@
+/* -*- mode: C -*- Time-stamp: "2008-07-24 19:19:09 gerel"
+ *
+ *       File:         pdf-hash-helper.c
+ *       Date:         Thu Jul 24 21:05:05 2008
+ *
+ *       GNU PDF Library - Hash helper functions
+ *
+ */
+
+/* Copyright (C) 2008 Free Software Foundation, Inc. */
+
+/* This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <pdf-hash-helper.h>
+
+
+static void text_dispose_fn (const void *elt);
+static void time_dispose_fn (const void *elt);
+static void list_dispose_fn (const void *elt);
+static void hash_dispose_fn (const void *elt);
+static void stm_dispose_fn (const void *elt);
+
+
+pdf_status_t
+pdf_hash_add_text (pdf_hash_t table, const char *key, const pdf_text_t *elt)
+{
+  return (pdf_hash_add(table,key,elt,text_dispose_fn));
+}
+
+pdf_status_t
+pdf_hash_add_time (pdf_hash_t table, const char *key, const pdf_time_t *elt)
+{
+  return (pdf_hash_add(table,key,elt,time_dispose_fn));
+}
+
+
+pdf_status_t
+pdf_hash_add_list (pdf_hash_t table, const char *key, const pdf_list_t *elt)
+{
+  return (pdf_hash_add(table,key,elt,list_dispose_fn));
+}
+
+
+pdf_status_t
+pdf_hash_add_hash (pdf_hash_t table, const char *key, const pdf_hash_t *elt)
+{
+  return (pdf_hash_add(table,key,elt,hash_dispose_fn));
+}
+
+
+pdf_status_t
+pdf_hash_add_stm (pdf_hash_t table, const char *key, const pdf_stm_t *elt)
+{
+  return (pdf_hash_add(table,key,elt,stm_dispose_fn));
+}
+
+
+static void
+text_dispose_fn (const void *elt)
+{
+  pdf_text_t *destroyed = (pdf_text_t*) elt;
+  pdf_text_destroy(*destroyed);
+}
+
+static void
+time_dispose_fn (const void *elt)
+{
+  pdf_time_t * destroyed = (pdf_time_t*) elt;
+  pdf_time_destroy(*destroyed);
+}
+
+static void
+list_dispose_fn (const void *elt)
+{
+  pdf_list_t * destroyed = (pdf_list_t*) elt;
+  pdf_list_destroy(*destroyed);
+}
+
+static void
+hash_dispose_fn (const void *elt)
+{
+  pdf_hash_destroy ((pdf_hash_t*)elt);
+}
+
+static void
+stm_dispose_fn (const void *elt)
+{
+  pdf_stm_t * stm = (pdf_stm_t*) elt;
+  pdf_stm_flush(*stm);
+  pdf_stm_close(*stm);
+}
+
+
+/* End of pdf-hash-helper.c */

=== added file 'src/base/pdf-hash-helper.h'
--- src/base/pdf-hash-helper.h  1970-01-01 00:00:00 +0000
+++ src/base/pdf-hash-helper.h  2008-07-24 22:59:22 +0000
@@ -0,0 +1,59 @@
+/* -*- mode: C -*- Time-stamp: "2008-07-24 19:30:24 gerel"
+ *
+ *       File:         pdf-hash-helper.h
+ *       Date:         Thu Jul 24 21:05:05 2008
+ *
+ *       GNU PDF Library - Hash helper functions
+ *
+ */
+
+/* Copyright (C) 2008 Free Software Foundation, Inc. */
+
+/* This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PDF_HASH_HELPER_H
+#define PDF_HASH_HELPER_H
+
+#include <pdf-hash.h>
+#include <pdf-text.h>
+#include <pdf-time.h>
+#include <pdf-list.h>
+#include <pdf-fp.h>
+#include <pdf-stm.h>
+
+/* BEGIN PUBLIC */
+
+pdf_status_t
+pdf_hash_add_text (pdf_hash_t table, const char *key, const pdf_text_t *elt);
+
+pdf_status_t
+pdf_hash_add_time (pdf_hash_t table, const char *key, const pdf_time_t *elt);
+
+pdf_status_t
+pdf_hash_add_list (pdf_hash_t table, const char *key, const pdf_list_t *elt);
+
+pdf_status_t
+pdf_hash_add_hash (pdf_hash_t table, const char *key, const pdf_hash_t *elt);
+
+pdf_status_t
+pdf_hash_add_stm (pdf_hash_t table, const char *key, const pdf_stm_t *elt);
+
+
+/* END PUBLIC */
+
+#endif /* !PDF_HASH_HELPER_H */
+
+/* End of pdf-hash-helper.h */
+

=== modified file 'src/base/pdf-hash.c'
--- src/base/pdf-hash.c 2008-05-06 20:53:43 +0000
+++ src/base/pdf-hash.c 2008-07-24 15:06:22 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-05-06 14:44:35 gerel"
+/* -*- mode: C -*- Time-stamp: "2008-07-24 12:00:22 gerel"
  *
  *       File:         pdf-hash.c
  *       Date:         Sat Apr  12 12:22:05 2008
@@ -62,8 +62,7 @@
 static int key_compare (const void *key1, const void *key2);
 
 pdf_status_t
-pdf_hash_create (pdf_hash_key_dispose_fn_t dispose_key_fn,
-                 pdf_hash_element_dispose_fn_t dispose_fn, pdf_hash_t *table)
+pdf_hash_create (pdf_hash_key_dispose_fn_t dispose_key_fn, pdf_hash_t *table)
 {
   pdf_status_t st;
 
@@ -71,7 +70,6 @@
 
   if (table != NULL)
     {
-      table->dispose_fn = dispose_fn;
       table->elements = gl_list_create_empty (GL_LINKEDHASH_LIST,
                                               elem_key_equal, hash_pjw,
                                               NULL, 0);
@@ -103,9 +101,10 @@
       itr = gl_list_iterator ((gl_list_t)table->elements);
       while (gl_list_iterator_next (&itr, &elt, NULL))
         {
-          if (table->dispose_fn != NULL)
+          if (((pdf_hash_element_t*)elt)->disp_fn != NULL)
             {
-              table->dispose_fn ((void*) ((pdf_hash_element_t*)elt)->value);
+              ((pdf_hash_element_t*)elt)->
+                disp_fn ((void*) ((pdf_hash_element_t*)elt)->value);
             }
           pdf_dealloc((pdf_hash_element_t*)elt);
         }
@@ -182,7 +181,8 @@
 
 
 pdf_status_t
-pdf_hash_add (pdf_hash_t table, const char *key, const void *element)
+pdf_hash_add (pdf_hash_t table, const char *key, const void *element,
+              pdf_hash_element_dispose_fn_t disp_fn)
 {
   pdf_status_t st;
   pdf_hash_element_t *newelt;
@@ -195,6 +195,7 @@
         {
           newelt->key = key;
           newelt->value = element;
+          newelt->disp_fn = disp_fn;
           gl_list_add_first ((gl_list_t)table.elements, newelt);
           gl_sortedlist_add ((gl_list_t)table.keys, key_compare, key);
         }
@@ -232,10 +233,12 @@
           pdf_hash_element_t *removed;
           removed = (pdf_hash_element_t*)
                     gl_list_node_value((gl_list_t)table.elements, node);
-          if (table.dispose_fn != NULL)
+
+          if (removed->disp_fn != NULL)
             {
-              table.dispose_fn (removed->value);
+              removed->disp_fn (removed->value);
             }
+
           pdf_dealloc(removed);
           gl_list_remove_node ((gl_list_t)table.elements, node);
           gl_sortedlist_remove ((gl_list_t)table.keys, key_compare, key);
@@ -357,6 +360,10 @@
   return PDF_OK;
 }
 
+
+
+
+
 static size_t
 hash_pjw (const void *elt)
 {
@@ -373,6 +380,20 @@
 }
 
 
+void
+pdf_hash_element_dealloc_fn (const void * elt)
+{
+  pdf_dealloc(elt);
+}
+
+
+void
+pdf_hash_key_dealloc_fn (const void * elt)
+{
+  pdf_dealloc(elt);
+}
+
+
 static bool
 elem_key_equal (const void *elt1, const void *elt2)
 {

=== modified file 'src/base/pdf-hash.h'
--- src/base/pdf-hash.h 2008-05-06 20:53:43 +0000
+++ src/base/pdf-hash.h 2008-07-24 15:06:22 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-05-06 14:44:21 gerel"
+/* -*- mode: C -*- Time-stamp: "2008-07-24 11:58:07 gerel"
  *
  *       File:         pdf-hash.h
  *       Date:         Sat Apr  12 12:22:05 2008
@@ -29,24 +29,28 @@
 #include <stdio.h>
 #include <pdf-list.h>
 
+
+/* BEGIN PUBLIC */
+typedef void (*pdf_hash_element_dispose_fn_t) (const void *elt);
+/* END PUBLIC */
+
 struct pdf_hash_element_s
 {
   const char * key;
   const void * value;
+  pdf_hash_element_dispose_fn_t disp_fn;
 };
 
 typedef struct pdf_hash_element_s pdf_hash_element_t;
 
 /* BEGIN PUBLIC */
 
-typedef void (*pdf_hash_element_dispose_fn_t) (const void *elt);
 typedef void (*pdf_hash_key_dispose_fn_t) (const void *key);
 
 struct pdf_hash_s
 {
   /* Both are gl_lists */
   void *elements, *keys;
-  pdf_hash_element_dispose_fn_t dispose_fn;
 };
 
 struct pdf_hash_iterator_s
@@ -61,8 +65,7 @@
 /* Creating and Destroying Hash Tables */
 
 pdf_status_t
-pdf_hash_create (pdf_hash_key_dispose_fn_t dispose_key_fn,
-                 pdf_hash_element_dispose_fn_t dispose_fn, pdf_hash_t *table);
+pdf_hash_create (pdf_hash_key_dispose_fn_t dispose_key_fn, pdf_hash_t *table);
 
 pdf_status_t
 pdf_hash_destroy (pdf_hash_t *table);
@@ -86,7 +89,8 @@
  /* Adding and removing elements */
 
 pdf_status_t
-pdf_hash_add (pdf_hash_t table, const char *key, const void *element);
+pdf_hash_add (pdf_hash_t table, const char *key, const void *element,
+              pdf_hash_element_dispose_fn_t disp_fn);
 
 pdf_status_t
 pdf_hash_remove (pdf_hash_t table, const char *key);
@@ -109,6 +113,14 @@
 pdf_status_t
 pdf_hash_iterator_free (pdf_hash_iterator_t *iterator);
 
+/* Basic dispose functions */
+
+void
+pdf_hash_element_dealloc_fn (const void * elt);
+
+void
+pdf_hash_key_dealloc_fn (const void * elt);
+
 
 
 /* END PUBLIC */

=== modified file 'torture/unit/base/hash/pdf-hash-add.c'
--- torture/unit/base/hash/pdf-hash-add.c       2008-04-18 03:50:23 +0000
+++ torture/unit/base/hash/pdf-hash-add.c       2008-07-23 11:39:04 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-04-16 20:29:44 gerel"
+/* -*- mode: C -*- Time-stamp: "2008-07-23 08:12:36 gerel"
  *
  *       File:         pdf-hash-add.c
  *       Date:         Wed Mar  12 12:43:00 2008
@@ -41,9 +41,9 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
+  pdf_hash_create ( NULL, &table);
 
-  fail_if (pdf_hash_add (table, "key", "val") != PDF_OK);
+  fail_if (pdf_hash_add (table, "key", "val", NULL) != PDF_OK);
 
   pdf_hash_destroy (&table);
 }
@@ -61,9 +61,9 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
+  pdf_hash_create (NULL, &table);
 
-  fail_if (pdf_hash_add (table, NULL, "val") != PDF_EBADDATA);
+  fail_if (pdf_hash_add (table, NULL, "val",NULL) != PDF_EBADDATA);
 
   pdf_hash_destroy (&table);
 }
@@ -81,9 +81,9 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
+  pdf_hash_create (NULL, &table);
 
-  fail_if (pdf_hash_add (table, "key", NULL) != PDF_EBADDATA);
+  fail_if (pdf_hash_add (table, "key", NULL,NULL) != PDF_EBADDATA);
 
   pdf_hash_destroy (&table);
 }

=== modified file 'torture/unit/base/hash/pdf-hash-create.c'
--- torture/unit/base/hash/pdf-hash-create.c    2008-04-18 03:50:23 +0000
+++ torture/unit/base/hash/pdf-hash-create.c    2008-07-23 11:39:04 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-04-16 20:16:29 gerel"
+/* -*- mode: C -*- Time-stamp: "2008-07-23 08:11:50 gerel"
  *
  *       File:         pdf-hash-create.c
  *       Date:         Wed Mar  12 12:43:00 2008
@@ -42,7 +42,7 @@
 {
   pdf_hash_t table;
 
-  fail_if (pdf_hash_create (NULL, NULL, &table) != PDF_OK);
+  fail_if (pdf_hash_create (NULL, &table) != PDF_OK);
 
   pdf_hash_destroy (&table);
 }
@@ -57,7 +57,7 @@
  */
 START_TEST (pdf_hash_create_002)
 {
-  fail_if (pdf_hash_create (NULL, NULL, NULL) != PDF_EBADDATA);
+  fail_if (pdf_hash_create (NULL, NULL) != PDF_EBADDATA);
 }
 END_TEST
 

=== modified file 'torture/unit/base/hash/pdf-hash-destroy.c'
--- torture/unit/base/hash/pdf-hash-destroy.c   2008-04-18 03:50:23 +0000
+++ torture/unit/base/hash/pdf-hash-destroy.c   2008-07-23 11:39:04 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-04-16 20:25:16 gerel"
+/* -*- mode: C -*- Time-stamp: "2008-07-23 08:12:52 gerel"
  *
  *       File:         pdf-hash-destroy.c
  *       Date:         Wed Mar  12 12:43:00 2008
@@ -41,7 +41,7 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
+  pdf_hash_create (NULL, &table);
 
   fail_if (pdf_hash_destroy (&table) != PDF_OK);
 }

=== modified file 'torture/unit/base/hash/pdf-hash-iterator-free.c'
--- torture/unit/base/hash/pdf-hash-iterator-free.c     2008-04-18 03:50:23 
+0000
+++ torture/unit/base/hash/pdf-hash-iterator-free.c     2008-07-23 11:39:04 
+0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-04-16 20:30:15 gerel"
+/* -*- mode: C -*- Time-stamp: "2008-07-23 08:13:00 gerel"
  *
  *       File:         pdf-hash-iterator-free.c
  *       Date:         Wed Mar  12 12:43:00 2008
@@ -42,7 +42,7 @@
   pdf_hash_t table;
   pdf_hash_iterator_t itr;
 
-  pdf_hash_create (NULL, NULL, &table);
+  pdf_hash_create (NULL, &table);
   pdf_hash_iterator (table, &itr);
 
   fail_if (pdf_hash_iterator_free (&itr) != PDF_OK);

=== modified file 'torture/unit/base/hash/pdf-hash-iterator-next.c'
--- torture/unit/base/hash/pdf-hash-iterator-next.c     2008-04-23 22:35:35 
+0000
+++ torture/unit/base/hash/pdf-hash-iterator-next.c     2008-07-23 11:39:04 
+0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/04/18 21:22:47 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-07-23 08:13:17 gerel"
  *
  *       File:         pdf-hash-iterator-next.c
  *       Date:         Wed Mar  12 12:43:00 2008
@@ -44,8 +44,8 @@
   pdf_hash_iterator_t itr;
   char *key;
   
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val",NULL);
   pdf_hash_iterator (table, &itr);
 
   fail_if (pdf_hash_iterator_next (&itr, (void *) &key) != PDF_OK);
@@ -68,8 +68,8 @@
   pdf_hash_t table;
   char *key;
   
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val",NULL);
 
   fail_if (pdf_hash_iterator_next (NULL, (void *) &key) != PDF_EBADDATA);
 
@@ -91,8 +91,8 @@
   pdf_hash_t table;
   pdf_hash_iterator_t itr;
  
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val",NULL);
   pdf_hash_iterator (table, &itr);
 
   fail_if (pdf_hash_iterator_next (&itr, NULL) != PDF_EBADDATA);

=== modified file 'torture/unit/base/hash/pdf-hash-iterator.c'
--- torture/unit/base/hash/pdf-hash-iterator.c  2008-04-23 22:35:35 +0000
+++ torture/unit/base/hash/pdf-hash-iterator.c  2008-07-23 11:39:04 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-04-16 20:30:29 gerel"
+/* -*- mode: C -*- Time-stamp: "2008-07-23 08:13:29 gerel"
  *
  *       File:         pdf-hash-iterator.c
  *       Date:         Wed Mar  12 12:43:00 2008
@@ -42,7 +42,7 @@
   pdf_hash_t table;
   pdf_hash_iterator_t itr;
   
-  pdf_hash_create (NULL, NULL, &table);
+  pdf_hash_create (NULL, &table);
 
   fail_if (pdf_hash_iterator (table, &itr) != PDF_OK);
 
@@ -64,7 +64,7 @@
 {
   pdf_hash_t table;
   
-  pdf_hash_create (NULL, NULL, &table);
+  pdf_hash_create (NULL, &table);
 
   fail_if (pdf_hash_iterator (table, NULL) != PDF_EBADDATA);
 

=== modified file 'torture/unit/base/hash/pdf-hash-key-p.c'
--- torture/unit/base/hash/pdf-hash-key-p.c     2008-04-18 03:50:23 +0000
+++ torture/unit/base/hash/pdf-hash-key-p.c     2008-07-23 11:39:04 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-04-16 20:30:36 gerel"
+/* -*- mode: C -*- Time-stamp: "2008-07-23 08:13:40 gerel"
  *
  *       File:         pdf-hash-key-p.c
  *       Date:         Wed Mar  12 12:43:00 2008
@@ -41,8 +41,8 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val", NULL);
  
   fail_if (pdf_hash_key_p (table, "key") != PDF_TRUE);
 
@@ -62,8 +62,8 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val", NULL);
  
   fail_if (pdf_hash_key_p (table, "ke") != PDF_FALSE);
 

=== modified file 'torture/unit/base/hash/pdf-hash-remove.c'
--- torture/unit/base/hash/pdf-hash-remove.c    2008-04-18 03:50:23 +0000
+++ torture/unit/base/hash/pdf-hash-remove.c    2008-07-23 11:39:04 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-04-16 20:30:42 gerel"
+/* -*- mode: C -*- Time-stamp: "2008-07-23 08:13:51 gerel"
  *
  *       File:         pdf-hash-remove.c
  *       Date:         Wed Mar  12 12:43:00 2008
@@ -41,8 +41,8 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val",NULL);
 
   fail_if (pdf_hash_remove (table, "key") != PDF_OK);
 
@@ -63,8 +63,8 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val",NULL);
 
   fail_if (pdf_hash_remove (table, "ke") != PDF_ERROR);
 
@@ -84,8 +84,8 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val",NULL);
 
   fail_if (pdf_hash_remove (table, NULL) != PDF_EBADDATA);
 

=== modified file 'torture/unit/base/hash/pdf-hash-rename.c'
--- torture/unit/base/hash/pdf-hash-rename.c    2008-04-18 03:50:23 +0000
+++ torture/unit/base/hash/pdf-hash-rename.c    2008-07-23 11:39:04 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-04-16 20:30:47 gerel"
+/* -*- mode: C -*- Time-stamp: "2008-07-23 08:14:08 gerel"
  *
  *       File:         pdf-hash-rename.c
  *       Date:         Wed Mar  12 12:43:00 2008
@@ -41,8 +41,8 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val",NULL);
 
   fail_if (pdf_hash_rename (table, "key", "ke") != PDF_OK);
   fail_if (pdf_hash_key_p (table, "ke") != PDF_TRUE);
@@ -62,8 +62,8 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val",NULL);
 
   fail_if (pdf_hash_rename (table, "ke", "key") != PDF_ERROR);
 
@@ -82,7 +82,7 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
+  pdf_hash_create (NULL, &table);
 
   fail_if (pdf_hash_rename (table, NULL, "ke") != PDF_EBADDATA);
 
@@ -101,7 +101,7 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
+  pdf_hash_create (NULL, &table);
 
   fail_if (pdf_hash_rename (table, "key", NULL) != PDF_EBADDATA);
 

=== modified file 'torture/unit/base/hash/pdf-hash-search.c'
--- torture/unit/base/hash/pdf-hash-search.c    2008-04-22 22:16:14 +0000
+++ torture/unit/base/hash/pdf-hash-search.c    2008-07-23 11:39:04 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/04/22 22:13:38 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-07-23 08:14:22 gerel"
  *
  *       File:         pdf-hash-search.c
  *       Date:         Wed Mar  12 12:43:00 2008
@@ -42,8 +42,20 @@
   pdf_hash_t table;
   char *s;
 
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val",NULL);
+  pdf_hash_add (table, "ky", "val",NULL);
+  pdf_hash_add (table, "ky23", "val",NULL);
+  pdf_hash_add (table, "2ky23", "val",NULL);
+  pdf_hash_add (table, "032ky23", "val",NULL);
+  pdf_hash_add (table, "230", "val",NULL);
+  pdf_hash_add (table, "0389", "val",NULL);
+  pdf_hash_add (table, "123", "val",NULL);
+  pdf_hash_add (table, "1", "val",NULL);
+  pdf_hash_add (table, "aky23", "val",NULL);
+  pdf_hash_add (table, "AB23", "val",NULL);
+  pdf_hash_add (table, "0", "val",NULL);
+  pdf_hash_add (table, "AB", "val",NULL);
   
   fail_if (pdf_hash_search (table, "key", (void *) &s) != PDF_OK);
 
@@ -64,8 +76,8 @@
   pdf_hash_t table;
   char *s;
 
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val",NULL);
   
   fail_if (pdf_hash_search (table, "ke", (void *) &s) != PDF_ERROR);
 
@@ -85,8 +97,8 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val",NULL);
   
   fail_if (pdf_hash_search (table, "key", NULL) != PDF_EBADDATA);
 
@@ -108,8 +120,8 @@
   pdf_hash_t table;
   char *s;
 
-  pdf_hash_create (NULL, NULL, &table);
-  pdf_hash_add (table, "key", "val");
+  pdf_hash_create (NULL, &table);
+  pdf_hash_add (table, "key", "val",NULL);
   
   fail_if (pdf_hash_search (table, NULL, (void *) &s) != PDF_EBADDATA);
 

=== modified file 'torture/unit/base/hash/pdf-hash-size.c'
--- torture/unit/base/hash/pdf-hash-size.c      2008-04-18 03:50:23 +0000
+++ torture/unit/base/hash/pdf-hash-size.c      2008-07-23 11:39:04 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-04-16 19:14:23 gerel"
+/* -*- mode: C -*- Time-stamp: "2008-07-23 08:14:28 gerel"
  *
  *       File:         pdf-hash-size.c
  *       Date:         Wed Mar  12 12:43:00 2008
@@ -41,7 +41,7 @@
 {
   pdf_hash_t table;
 
-  pdf_hash_create (NULL, NULL, &table);
+  pdf_hash_create (NULL, &table);
 
   fail_if (pdf_hash_size (table) != 0);
 

# Begin bundle
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
4hoSC6gaGrWR/i7kinChId4lO+Y=


###

cheers

-gerel




reply via email to

[Prev in Thread] Current Thread [Next in Thread]