pdf-devel
[Top][All Lists]
Advanced

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

[pdf-devel] Missing List module functions.


From: gerel
Subject: [pdf-devel] Missing List module functions.
Date: Sat, 12 Apr 2008 16:36:43 -0300

I've missed the sorted functions for the List Module (don't know why). Here
is a patch for the ref doc and one for the source code.

The test implementations for those can be written using the non-sorted
versions. I'll do it later in case no one offers.


##

Index: doc/gnupdf.texi
===================================================================
RCS file: /sources/pdf/libgnupdf/doc/gnupdf.texi,v
retrieving revision 1.42
diff -u -r1.42 gnupdf.texi
--- doc/gnupdf.texi     10 Apr 2008 19:40:28 -0000      1.42
+++ doc/gnupdf.texi     12 Apr 2008 19:38:06 -0000
@@ -1235,6 +1235,8 @@
 @node Lists
 @section Lists
 
+This section describes how to work with unsorted and sorted lists. In case 
you're going to work with a sorted list, you should use the sorted version of 
each function if it's available. @xref{Working with sorted lists}.
+
 @menu
 * List Data Types::
 * Creating and Destroying Lists::
@@ -1242,6 +1244,7 @@
 * Searching for List Elements::
 * Setting and Getting List Elements::
 * Adding and Removing List Elements::
+* Working with sorted lists::
 * Working with Iterators::
 @end menu
 
@@ -1559,8 +1562,6 @@
 @var{element} not found.
 @item PDF_EBADDATA
 Invalid or NULL pointers.
address@hidden PDF_EINVRANGE
address@hidden or @var{end_index} is greater than the list size or less than 0.
 @end table
 @item Usage Example
 @example
@@ -1875,7 +1876,7 @@
 @table @code
 @item PDF_OK
 @var{element} was found in the list and was removed.
address@hidden PDF_BADDATA
address@hidden PDF_EBADDATA
 @var{element} was not found in the list.
 @end table
 @item Usage example
@@ -1885,6 +1886,218 @@
 @end table
 @end deftypefun
 
+
address@hidden Working with sorted lists
address@hidden Working with sorted lists
+
address@hidden pdf_status_t pdf_list_sorted_add (pdf_list_t @var{list}, 
pdf_list_element_compar_fn_t @var{compar_fn}, const void* @var{element}, 
pdf_list_node_t @var{* element_node})
+
+Add an element to the list.
+
address@hidden @strong
address@hidden Parameters
address@hidden @var
address@hidden list
+A list.
address@hidden compar_fn
+A comparision function.
address@hidden element
+A pointer to the user data to be stored as a list element.
address@hidden element_node
+A pointer where the added element node will be saved.
address@hidden table
address@hidden Returns
+A pdf status value:
address@hidden @code
address@hidden PDF_OK
+The operation succeeded.
address@hidden PDF_EBADDATA
+Invalid @var{compar_fn} or @var{element_node} pointer.
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_list_sorted_remove (pdf_list_t @var{list}, 
pdf_list_element_compar_fn_t @var{compar_fn}, const void * @var{element})
+
+Search and remove an element from the list.
+
address@hidden @strong
address@hidden Parameters
address@hidden @var
address@hidden list
+A list.
address@hidden compar_fn
+A comparision function.
address@hidden element
+The element to be removed.
address@hidden table
address@hidden Returns
+A pdf status value:
address@hidden @code
address@hidden PDF_OK
address@hidden was found in the list and was removed.
address@hidden PDF_ENONODE
address@hidden was not found in the list.
address@hidden PDF_EBADDATA
+Invalid @var{compar_fn}.
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_list_sorted_search (pdf_list_t @var{list}, 
pdf_list_element_compar_fn_t @var{compar_fn}, const void* @var{element}, 
pdf_list_node_t @var{*node})
+
+Search whether an element is already in the list.
+
address@hidden @strong
address@hidden Parameters
address@hidden @var
address@hidden list
+A list.
address@hidden compar_fn
+A comparision function.
address@hidden element
+The element to search for.
address@hidden node
+The searched node if it was found.
address@hidden table
address@hidden Returns
+A pdf status value:
address@hidden @code
address@hidden PDF_OK
+The operation succeeded.
address@hidden PDF_ENONODE
address@hidden not found.
address@hidden PDF_EBADDATA
+Invalid @var{node} pointer or @var{compar_fn}.
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_list_sorted_search_from_to (pdf_list_t 
@var{list}, pdf_list_element_compar_fn_t @var{compar_fn}, pdf_size_t 
@var{start_index}, pdf_size_t @var{end_index}, const void* @var{element}, 
pdf_list_node_t @var{*node})
+
+Search whether an element is already in the list, at a position >=
address@hidden and < @var{end_index}.
+
address@hidden @strong
address@hidden Parameters
address@hidden @var
address@hidden list
+A list.
address@hidden compar_fn
+A comparision function.
address@hidden start_index
+Index to the first list position to be searched.
address@hidden end_index
+Index to the last list position to be searched.
address@hidden element
+The element to search for.
address@hidden node
+The seached node if it was found.
address@hidden table
address@hidden Returns
+A pdf status value:
address@hidden @code
address@hidden PDF_OK
+The operation succeeded.
address@hidden PDF_ENONODE
address@hidden not found.
address@hidden PDF_EBADDATA
+Invalid @var{node} pointer or @var{compar_fn}.
address@hidden PDF_EINVRANGE
address@hidden or @var{end_index} is greater than the list size or less than 0.
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_list_sorted_indexof (pdf_list_t @var{list}, 
pdf_list_element_compar_fn_t @var{compar_fn}, const void* @var{element}, 
pdf_size_t @var{*position})
+
+Search whether an element is already in the list.
+
address@hidden @strong
address@hidden Parameters
address@hidden @var
address@hidden list
+A list.
address@hidden compar_fn
+A comparision function.
address@hidden element
+A pointer to user data.
address@hidden position
+A pointer where the element position will be saved.
address@hidden table
address@hidden Returns
+A pdf status value:
address@hidden @code
address@hidden PDF_OK
+The operation succeeded.
address@hidden PDF_ENONODE
address@hidden not found.
address@hidden PDF_EBADDATA
+Invalid or NULL pointers.
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_list_sorted_indexof_from_to (pdf_list_t 
@var{list}, pdf_list_element_compar_fn_t @var{compar_fn}, pdf_size_t 
@var{start_index}, pdf_size_t @var{end_index}, const void* @var{element}, 
pdf_size_t @var{*position})
+
+Search whether an element is already in the list, at a position >= 
@var{start_index} and < @var{end_index}.
+
address@hidden @strong
address@hidden Parameters
address@hidden @var
address@hidden list
+A list.
address@hidden compar_fn
+A comparision function.
address@hidden start_index
+A position in @var{list}.
address@hidden end_index
+A position in @var{list}.
address@hidden element
+A pointer to some user data.
address@hidden position
+A pointer where the element position will be saved.
address@hidden table
address@hidden Returns
+A pdf status value:
address@hidden @code
address@hidden PDF_OK
+The operation succeeded.
address@hidden PDF_ENONODE
address@hidden not found.
address@hidden PDF_EBADDATA
+Invalid or NULL pointers.
address@hidden PDF_EINVRANGE
address@hidden or @var{end_index} is greater than the list size or less than 0.
address@hidden table
address@hidden Usage example
address@hidden
+XXX
address@hidden example
address@hidden table
address@hidden deftypefun
+
+
 @node Working with Iterators
 @subsection Working with Iterators
 
@@ -3432,7 +3645,7 @@
 @table @code
 @item PDF_OK
 The operation successfully finished.
address@hidden PDF_E_BADDATA
address@hidden PDF_EBADDATA
 The data in @var{cal_span} is invalid.
 @end table
 
@@ -3450,7 +3663,7 @@
 cal_span.minute = 0;
 cal_span.second = 0;
 
-if (pdf_time_add_cal_span (mytime, cal_span) == PDF_E_BADDATA)
+if (pdf_time_add_cal_span (mytime, cal_span) == PDF_EBADDATA)
 @{
   /* Bad data in `cal_span' */
 @}
@@ -3480,7 +3693,7 @@
 @table @code
 @item PDF_OK
 The operation successfully finished.
address@hidden PDF_E_BADDATA
address@hidden PDF_EBADDATA
 The data in @var{cal_span} is invalid.
 @end table
 
@@ -3498,7 +3711,7 @@
 cal_span.minute = 0;
 cal_span.second = 0;
 
-if (pdf_time_add_cal_span (mytime, cal_span) == PDF_E_BADDATA)
+if (pdf_time_add_cal_span (mytime, cal_span) == PDF_EBADDATA)
 @{
   /* Bad data in `cal_span' */
 @}
@@ -3507,7 +3720,7 @@
   /* `time' now contains Aug 21 2000-08-21 21:00:00 */
 @}
 
-if (pdf_time_sub_cal_span (mytime, cal_span) == PDF_E_BADDATA)
+if (pdf_time_sub_cal_span (mytime, cal_span) == PDF_EBADDATA)
 @{
   /* Bad data in `cal_span' */
 @}
@@ -3670,7 +3883,7 @@
 @table @code
 @item PDF_OK
 The operation successfully finished.
address@hidden PDF_E_BADDATA
address@hidden PDF_EBADDATA
 There is invalid data in the calendar structure @var{cal_time}.
 @end table
 
@@ -3690,7 +3903,7 @@
 mycaltime.sec = 0;
 mycaltime.gmt_offset = 1;
 
-if (pdf_time_from_cal (mytime, mycaltime) == PDF_E_BADDATA)
+if (pdf_time_from_cal (mytime, mycaltime) == PDF_EBADDATA)
 @{
   /* Bad data in `mycaltime' */
 @}
@@ -3920,7 +4133,7 @@
 @table @code
 @item PDF_OK
 The operation succeeded.
address@hidden PDF_E_BADDATA
address@hidden PDF_EBADDATA
 Error while parsing @var{time_str} according to @var{time_format}.
 @end table
 
@@ -3932,7 +4145,7 @@
 mytime = pdf_time_new ();
 if (pdf_time_from_string (mytime, 
                           time_str,
-                          PDF_TIME_FORMAT_PDF) == PDF_E_BADDATA)
+                          PDF_TIME_FORMAT_PDF) == PDF_EBADDATA)
 @{
   /* Error while parsing `time_str' according to `PDF_TIME_FORMAT_PDF' */
 @}
@@ -4402,7 +4615,7 @@
 @table @code
 @item PDF_OK
 The operation successfully finished.
address@hidden PDF_E_BADDATA
address@hidden PDF_EBADDATA
 There is invalid data in @var{span1} or @var{span2}.
 @end table
 
@@ -4420,7 +4633,7 @@
 if (pdf_time_add_cal_span_with_base (cal_span1,
                                      cal_span2,
                                      mytime,
-                                     cal_result) == PDF_E_BADDATA)
+                                     cal_result) == PDF_EBADDATA)
 @{
   /* Invalid data in `cal_span1' or `cal_span2' */
 @}      
@@ -4513,7 +4726,7 @@
 @table @code
 @item PDF_OK
 The operation successfully finished.
address@hidden PDF_E_BADDATA
address@hidden PDF_EBADDATA
 There is invalid data in @var{span1} or @var{span2}.
 @end table
 
@@ -4531,7 +4744,7 @@
 if (pdf_time_cal_span_diff (span1,
                             span2,
                             mytime,
-                            result) == PDF_E_BADDATA)
+                            result) == PDF_EBADDATA)
 @{
   /* Invalid data in `span1' or `span2' */
 @}


Index: src/base/pdf-list.h
===================================================================
RCS file: /sources/pdf/libgnupdf/src/base/pdf-list.h,v
retrieving revision 1.6
diff -u -r1.6 pdf-list.h
--- src/base/pdf-list.h 25 Mar 2008 15:53:32 -0000      1.6
+++ src/base/pdf-list.h 12 Apr 2008 19:38:07 -0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "2008-03-25 12:33:59 gerel"
+/* -*- mode: C -*- Time-stamp: "2008-04-12 16:01:47 gerel"
  *
  *       File:         pdf-list.h
  *       Date:         Sat Mar 1 02:14:35 2008
@@ -64,6 +64,8 @@
 typedef bool (*pdf_list_element_equals_fn_t) (const void *elt1, const void 
*elt2);
 typedef pdf_size_t (*pdf_list_element_hashcode_fn_t) (const void *elt);
 typedef void (*pdf_list_element_dispose_fn_t) (const void *elt);
+typedef int (*pdf_list_element_compar_fn_t) (const void *elt1, const void 
*elt2);
+
 
 /* END PUBLIC */
 
@@ -118,6 +120,37 @@
 pdf_status_t pdf_list_remove_at (pdf_list_t list, pdf_size_t position);
 pdf_status_t pdf_list_remove (pdf_list_t list, const void * element);
 
+/* Sorted list functions */
+
+pdf_status_t
+pdf_list_sorted_add (pdf_list_t list, pdf_list_element_compar_fn_t compar_fn,
+                     const void* element, pdf_list_node_t * element_node);
+
+pdf_status_t
+pdf_list_sorted_remove (pdf_list_t list, pdf_list_element_compar_fn_t 
compar_fn,
+                        const void * element);
+
+pdf_status_t
+pdf_list_sorted_search (pdf_list_t list, pdf_list_element_compar_fn_t 
compar_fn,
+                        const void* element, pdf_list_node_t *node);
+
+pdf_status_t
+pdf_list_sorted_search_from_to (pdf_list_t list,
+                                pdf_list_element_compar_fn_t compar_fn,
+                                pdf_size_t start_index, pdf_size_t end_index,
+                                const void* element, pdf_list_node_t *node);
+
+pdf_status_t
+pdf_list_sorted_indexof (pdf_list_t list,
+                         pdf_list_element_compar_fn_t compar_fn,
+                         const void* element, pdf_size_t *position);
+
+pdf_status_t
+pdf_list_sorted_indexof_from_to (pdf_list_t list,
+                                 pdf_list_element_compar_fn_t compar_fn,
+                                 pdf_size_t start_index, pdf_size_t end_index,
+                                 const void* element, pdf_size_t *position);
+
 /* Element iterator functions */
 
 pdf_status_t pdf_list_iterator (pdf_list_t list, pdf_list_iterator_t *itr);
@@ -717,6 +750,187 @@
   return PDF_OK;
 }
 
+
+EXTERN_INLINE pdf_status_t
+pdf_list_sorted_add (pdf_list_t list, pdf_list_element_compar_fn_t compar_fn,
+                     const void* element, pdf_list_node_t * element_node)
+{
+  pdf_list_node_t node;
+  pdf_status_t st;
+
+  st = PDF_OK;
+  
+  if (compar_fn != NULL && element_node != NULL)
+    {
+      node.gl_node = gl_sortedlist_add ((gl_list_t)list.gl_list, compar_fn,
+                                        element);
+      *element_node = node;
+    }
+  else
+    {
+      st = PDF_EBADDATA;
+    }
+  
+  return (st);
+
+}
+
+EXTERN_INLINE pdf_status_t
+pdf_list_sorted_remove (pdf_list_t list, pdf_list_element_compar_fn_t 
compar_fn,
+                        const void * element)
+{
+  pdf_status_t st;
+
+  st = PDF_OK;
+
+  if (compar_fn != NULL)
+    {
+      if (!gl_sortedlist_remove ((gl_list_t)list.gl_list, compar_fn, element))
+        st = PDF_ENONODE;
+    }
+  else
+    {
+      st = PDF_EBADDATA;
+    }
+
+  return (st);
+
+}
+
+EXTERN_INLINE pdf_status_t
+pdf_list_sorted_search (pdf_list_t list, pdf_list_element_compar_fn_t 
compar_fn,
+                        const void* element, pdf_list_node_t *node)
+{
+
+  pdf_status_t st;
+
+  st = PDF_OK;
+
+  if (compar_fn != NULL && node != NULL && element != NULL)
+    {
+      node->gl_node = gl_sortedlist_search ((gl_list_t)list.gl_list,
+                                            compar_fn, element);
+      if (node->gl_node == NULL)
+        {
+          st = PDF_ENONODE;
+        }
+    }
+  else
+    {
+      st = PDF_EBADDATA;
+    }
+
+  return (st);
+}
+
+EXTERN_INLINE pdf_status_t
+pdf_list_sorted_search_from_to (pdf_list_t list,
+                                pdf_list_element_compar_fn_t compar_fn,
+                                pdf_size_t start_index, pdf_size_t end_index,
+                                const void* element, pdf_list_node_t *node)
+{
+  pdf_status_t st;
+
+  st = PDF_OK;
+
+  if (compar_fn != NULL && node != NULL && element != NULL)
+    {
+      if (((start_index < pdf_list_size (list) && start_index > 0) ||
+           (start_index == 0)) &&
+          ((end_index <= pdf_list_size (list) && end_index > 0) ||
+           (end_index == 0)) &&
+          (start_index < end_index))
+        {
+          node->gl_node = gl_sortedlist_search_from_to((gl_list_t)list.gl_list,
+                                                       compar_fn, start_index,
+                                                       end_index, element);
+          if (node->gl_node == NULL)
+            {
+              st = PDF_ENONODE;
+            }
+        }
+      else
+        {
+          st = PDF_EINVRANGE;
+        }
+    }
+  else
+    {
+      st = PDF_EBADDATA;
+    }
+
+  return (st);
+}
+
+EXTERN_INLINE pdf_status_t
+pdf_list_sorted_indexof (pdf_list_t list,
+                         pdf_list_element_compar_fn_t compar_fn,
+                         const void* element, pdf_size_t *position)
+{
+
+  pdf_status_t st;
+
+  st = PDF_OK;
+
+  if (compar_fn != NULL && position != NULL && element != NULL )
+    {
+      *position = (pdf_size_t) gl_sortedlist_indexof ((gl_list_t)list.gl_list,
+                                                      compar_fn, element);
+      if (*position == -1)
+        {
+          st = PDF_ENONODE;
+        }
+    }
+  else
+    {
+      st = PDF_EBADDATA;
+    }
+
+  return (st);
+}
+
+EXTERN_INLINE pdf_status_t
+pdf_list_sorted_indexof_from_to (pdf_list_t list,
+                                 pdf_list_element_compar_fn_t compar_fn,
+                                 pdf_size_t start_index, pdf_size_t end_index,
+                                 const void* element, pdf_size_t *position)
+{
+  pdf_status_t st;
+
+  st = PDF_OK;
+
+  if (compar_fn != NULL && position != NULL && element != NULL)
+    {
+      if (((start_index > 0 && start_index < pdf_list_size (list)) ||
+           start_index == 0) &&
+          (end_index > 0 && end_index <= pdf_list_size (list)) &&
+          (start_index < end_index))
+        {
+          *position = (pdf_size_t)
+            gl_sortedlist_indexof_from_to ((gl_list_t)list.gl_list, compar_fn,
+                                           start_index, end_index,
+                                           element);
+          if (*position == -1)
+            {
+              st = PDF_ENONODE;
+            }
+        }
+      else
+        {
+          st = PDF_EINVRANGE;
+        }
+    }
+  else
+    {
+      st = PDF_EBADDATA;
+    }
+
+
+  return (st);
+}
+
+
+
 #endif /* HAVE_INLINE */
 
 #endif /* PDF_LIST_H */


###


-gerel




reply via email to

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