[Top][All Lists]
[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
- [pdf-devel] Missing List module functions.,
gerel <=
- Re: [pdf-devel] Missing List module functions., gerel, 2008/04/13
- Re: [pdf-devel] Missing List module functions., jemarch, 2008/04/13
- Re: [pdf-devel] Missing List module functions., gerel, 2008/04/13
- Re: [pdf-devel] Missing List module functions., jemarch, 2008/04/13
- Re: [pdf-devel] Missing List module functions., gerel, 2008/04/13
- Re: [pdf-devel] Missing List module functions., jemarch, 2008/04/13
- Re: [pdf-devel] Missing List module functions., gerel, 2008/04/13
Re: [pdf-devel] Missing List module functions., jemarch, 2008/04/13