diff options
Diffstat (limited to 'libkcal/libical/src/libical/pvl.c')
-rw-r--r-- | libkcal/libical/src/libical/pvl.c | 585 |
1 files changed, 0 insertions, 585 deletions
diff --git a/libkcal/libical/src/libical/pvl.c b/libkcal/libical/src/libical/pvl.c deleted file mode 100644 index d663eaab..00000000 --- a/libkcal/libical/src/libical/pvl.c +++ /dev/null @@ -1,585 +0,0 @@ -/*====================================================================== - FILE: pvl.c - CREATOR: eric November, 1995 - - - (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org> - http://www.softwarestudio.org -======================================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "pvl.h" -#include <errno.h> -#include <assert.h> -#include <stdlib.h> - -/** - struct pvl_list_t - - The list structure. This is the hanlde for the entire list - - This type is also private. Use pvl_list instead - - */ - -typedef struct pvl_list_t -{ - int MAGIC; /**< Magic Identifier */ - struct pvl_elem_t *head; /**< Head of list */ - struct pvl_elem_t *tail; /**< Tail of list */ - int count; /**< Number of items in the list */ - struct pvl_elem_t *p; /**< Pointer used for iterators */ -} pvl_list_t; - - - - -/** - * This global is incremented for each call to pvl_new_element(); it gives each - * list a unique identifer - */ - -int pvl_elem_count = 0; -int pvl_list_count = 0; - - -/** - * @brief Creates a new list, clears the pointers and assigns a magic number - * - * @return Pointer to the new list, 0 if there is no available memory. - */ - -pvl_list -pvl_newlist() -{ - struct pvl_list_t *L; - - if ( ( L = (struct pvl_list_t*)malloc(sizeof(struct pvl_list_t))) == 0) - { - errno = ENOMEM; - return 0; - } - - L->MAGIC = pvl_list_count; - pvl_list_count++; - L->head = 0; - L->tail = 0; - L->count = 0; - L->p = 0; - - return L; -} - -void -pvl_free(pvl_list l) -{ - struct pvl_list_t *L = (struct pvl_list_t *)l; - - pvl_clear(l); - - free(L); -} - -/** - * @brief Creates a new list element, assigns a magic number, and assigns - * the next and previous pointers. - * - * Passing in the next and previous points may seem odd, but it allos the user - * to set them while keeping the internal data hidden. In nearly all cases, - * the user is the pvl library itself. - * - * @param d The data item to be stored in the list - * @param next Pointer value to assign to the member "next" - * @param prior Pointer value to assign to the member "prior" - * - * @return A pointer to the new element, 0 if there is no memory available. - */ - -pvl_elem -pvl_new_element(void *d, pvl_elem next, pvl_elem prior) -{ - struct pvl_elem_t *E; - - if ( ( E = (struct pvl_elem_t*)malloc(sizeof(struct pvl_elem_t))) == 0) - { - errno = ENOMEM; - return 0; - } - - E->MAGIC = pvl_elem_count++; - E->d = d; - E->next = next; - E->prior = prior; - - return (pvl_elem)E; -} - -/** - * @brief Add a new element to the from of the list - * - * @param L The list to add the item to - * @param d Pointer to the item to add - */ - -void -pvl_unshift(pvl_list L,void *d) -{ - struct pvl_elem_t *E = pvl_new_element(d,L->head,0); - - if (E->next != 0) - { - /* Link the head node to it */ - E->next->prior = E; - } - - /* move the head */ - L->head = E; - - /* maybe move the tail */ - - if (L->tail == 0) - { - L->tail = E; - } - - L->count++; -} - -/** - * @brief Remove an element from the front of the list - * - * @param L The list to operate on - * - * @return the entry on the front of the list - */ - -void* -pvl_shift(pvl_list L) -{ - if (L->head == 0) - { - return 0; - } - - return pvl_remove(L,(void*)L->head); - -} - -/** - * @brief Add a new item to the tail of the list - * - * @param L The list to operate on - * @param d Pointer to the item to add - * - */ - -void -pvl_push(pvl_list L,void *d) -{ - struct pvl_elem_t *E = pvl_new_element(d,0,L->tail); - - /* These are done in pvl_new_element - E->next = 0; - E->prior = L->tail; - */ - - if (L->tail != 0) - { - L->tail->next = E; - } - - if (L->head == 0) - { - L->head = E; - } - - L->tail = E; - - L->count++; - -} - -/** - * @brief Remove an element from the tail of the list - * - * @param L The list to operate on - */ - -void* -pvl_pop(pvl_list L) -{ - if ( L->tail == 0) - { - return 0; - } - - return pvl_remove(L,(void*) L->tail);; - -} - - -/** - * Add a new item to a list that is ordered by a comparison function. - * This routine assumes that the list is properly ordered. - * - * @param L The list to operate on - * @param f Pointer to a comparison function - * @param d Pointer to data to pass to the comparison function - */ - -void -pvl_insert_ordered(pvl_list L,pvl_comparef f,void *d) -{ - struct pvl_elem_t *P; - - L->count++; - - /* Empty list, add to head */ - - if(L->head == 0) - { - pvl_unshift(L,d); - return; - } - - /* smaller than head, add to head */ - - if ( ((*f)(d,L->head->d)) <= 0) - { - pvl_unshift(L,d); - return; - } - - /* larger than tail, add to tail */ - if ( (*f)(d,L->tail->d) >= 0) - { - pvl_push(L,d); - return; - } - - - /* Search for the first element that is smaller, and add before it */ - - for (P=L->head; P != 0; P = P->next) - { - if ( (*f)(P->d,d) >= 0) - { - pvl_insert_before(L,P,d); - return; - } - } - - /* badness, choke */ -#ifndef lint - assert(0); -#endif -} - -/** - * @brief Add a new item after the referenced element. - * @param L The list to operate on - * @param P The list element to add the item after - * @param d Pointer to the item to add. - */ - -void -pvl_insert_after(pvl_list L,pvl_elem P,void *d) -{ - struct pvl_elem_t *E = 0; - - L->count++; - - if (P == 0) - { - pvl_unshift(L,d); - return; - } - - if ( P == L->tail) - { - E = pvl_new_element(d,0,P); - L->tail = E; - E->prior->next = E; - } - else - { - E = pvl_new_element(d,P->next,P); - E->next->prior = E; - E->prior->next = E; - } -} - -/** - * @brief Add an item after a referenced item - * - * @param L The list to operate on - * @param P The list element to add the item before - * @param d Pointer to the data to be added. - */ - -void -pvl_insert_before(pvl_list L,pvl_elem P,void *d) -{ - struct pvl_elem_t *E = 0; - - L->count++; - - if (P == 0) - { - pvl_unshift(L,d); - return; - } - - if ( P == L->head) - { - E = pvl_new_element(d,P,0); - E->next->prior = E; - L->head = E; - } - else - { - E = pvl_new_element(d,P,P->prior); - E->prior->next = E; - E->next->prior = E; - } -} - -/** - * @brief Remove the referenced item from the list. - * - * This routine will free the element, but not the data item that the - * element contains. - * - * @param L The list to operate on - * @param E The element to remove. - */ - -void* -pvl_remove(pvl_list L,pvl_elem E) -{ - void* data; - - if (E == L->head) - { - if (E->next != 0) - { - E->next->prior = 0; - L->head = E->next; - } else { - /* E Also points to tail -> only one element in list */ - L->tail = 0; - L->head = 0; - } - } - else if (E == L->tail) - { - if (E->prior != 0) - { - E->prior->next = 0; - L->tail = E->prior; - } else { - /* E points to the head, so it was the last element */ - /* This case should be taken care of in the previous clause */ - L->head = 0; - L->tail = 0; - } - } - else - { - E->prior->next = E->next; - E->next->prior = E->prior; - } - - - L->count--; - - data = E->d; - - E->prior = 0; - E->next = 0; - E->d = 0; - - free(E); - - return data; - -} - -/** - * @brief Return a pointer to data that satisfies a function. - * - * This routine will interate through the entire list and call the - * find function for each item. It will break and return a pointer to the - * data that causes the find function to return 1. - * - * @param l The list to operate on - * @param f Pointer to the find function - * @param v Pointer to constant data to pass into the function - * - * @return Pointer to the element that the find function found. - */ - -pvl_elem -pvl_find(pvl_list l,pvl_findf f,void* v) -{ - pvl_elem e; - - for (e=pvl_head(l); e!= 0; e = pvl_next(e)) - { - if ( (*f)(((struct pvl_elem_t *)e)->d,v) == 1) - { - /* Save this elem for a call to find_next */ - ((struct pvl_list_t *)l)->p = e; - return e; - } - } - - return 0; - -} - -/** - * @brief Like pvl_find(), but continues the search where the last find() or - * find_next() left off. - * - * @param l The list to operate on - * @param f Pointer to the find function - * @param v Pointer to constant data to pass into the function - * - * @return Pointer to the element that the find function found. - */ - -pvl_elem -pvl_find_next(pvl_list l,pvl_findf f,void* v) -{ - - pvl_elem e; - - for (e=pvl_head(l); e!= 0; e = pvl_next(e)) - { - if ( (*f)(((struct pvl_elem_t *)e)->d,v) == 1) - { - /* Save this elem for a call to find_next */ - ((struct pvl_list_t *)l)->p = e; - return e; - } - } - - return 0; - -} - -/** - * @brief Remove the all the elements in the list. The does not free - * the data items the elements hold. - */ - -void -pvl_clear(pvl_list l) -{ - pvl_elem e = pvl_head(l); - pvl_elem next; - - if (e == 0) { - return; - } - - while(e != 0) - { - next = pvl_next(e); - pvl_remove(l,e); - e = next; - } -} - - -/** - * @brief Returns the number of items in the list. - */ - -int -pvl_count(pvl_list L) -{ - return L->count; -} - - -/** - * @brief Returns a pointer to the given element - */ - -pvl_elem -pvl_next(pvl_elem E) -{ - if (E == 0){ - return 0; - } - - return (pvl_elem)E->next; -} - - -/** - * @brief Returns a pointer to the element previous to the element given. - */ - -pvl_elem -pvl_prior(pvl_elem E) -{ - return (pvl_elem)E->prior; -} - - -/** - * @brief Returns a pointer to the first item in the list. - */ - -pvl_elem -pvl_head(pvl_list L ) -{ - return (pvl_elem)L->head; -} - -/** - * @brief Returns a pointer to the last item in the list. - */ -pvl_elem -pvl_tail(pvl_list L) -{ - return (pvl_elem)L->tail; -} - -#ifndef PVL_USE_MACROS -void* -pvl_data(pvl_elem E) -{ - if ( E == 0){ - return 0; - } - - return E->d; -} -#endif - -/** - * @brief Call a function for every item in the list. - * - * @param l The list to operate on - * @param f Pointer to the function to call - * @param v Data to pass to the function on every iteration - */ - -void -pvl_apply(pvl_list l,pvl_applyf f, void *v) -{ - pvl_elem e; - - for (e=pvl_head(l); e!= 0; e = pvl_next(e)) - { - (*f)(((struct pvl_elem_t *)e)->d,v); - } - -} |