diff options
Diffstat (limited to 'kxsldbg/kxsldbgpart/libxsldbg/arraylist.cpp')
-rw-r--r-- | kxsldbg/kxsldbgpart/libxsldbg/arraylist.cpp | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/kxsldbg/kxsldbgpart/libxsldbg/arraylist.cpp b/kxsldbg/kxsldbgpart/libxsldbg/arraylist.cpp new file mode 100644 index 00000000..a9de14fe --- /dev/null +++ b/kxsldbg/kxsldbgpart/libxsldbg/arraylist.cpp @@ -0,0 +1,240 @@ + +/*************************************************************************** + arraylist.c - define array implementation of a list + ------------------- + begin : Sat Nov 10 2001 + copyright : (C) 2001 by Keith Isdale + email : [email protected] + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "arraylist.h" +#include <libxslt/xsltutils.h> + +#ifndef NULL +#define NULL 0 +#endif + +/** + * arrayListNew: + * @initialSize: The initial size of list + * @deleteFunction: The function to call to free items in the list + * + * Create a new list with a size of @initialSize + * + * Returns Non-null on success, + * NULL otherwise + */ +arrayListPtr +arrayListNew(int initialSize, freeItemFunc deleteFunction) +{ + arrayListPtr list = NULL; + + if (initialSize <= 0) { +#ifdef WITH_XSLDBG_DEBUG_PROCESS + xsltGenericError(xsltGenericErrorContext, + "arrayListNew invalid initialSize %d\n", + initialSize); +#endif + } else + list = (arrayListPtr) xmlMalloc(sizeof(arrayList)); + + if (list) { + list->data = (void **) xmlMalloc(sizeof(void *) * initialSize); + list->deleteFunction = deleteFunction; + list->count = 0; + list->size = initialSize; + } + + return list; +} + + +/** + * arrayListFree: + * @list: A valid list + * + * Free memory assocated with array list, if the array list + * has a valid deleteFunction then content with be freed with + * using that deleteFunction + */ +void +arrayListFree(arrayListPtr list) +{ + if (!list) + return; + + arrayListEmpty(list); + xmlFree(list->data); + xmlFree(list); +} + + +/** + * arrayListEmpty: + * @list: A valid list + * + * Empties the list of its content + * + * Returns 1 on success, + * 0 otherwise + */ +int +arrayListEmpty(arrayListPtr list) +{ + int index, result = 0; + + if (list) { + if (list->deleteFunction) { + for (index = 0; index < list->count; index++) { + if (list->data[index]) + (*list->deleteFunction) (list->data[index]); + } + result = 1; + list->count = 0; + } + } + return result; +} + + +/** + * arrayListSize: + * @list: A valid list + * + * Return The maximum number elements this list can contain + * + * Returns The maximum number elements this list can contain + */ +int +arrayListSize(arrayListPtr list) +{ + int result = 0; + + if (list) + result = list->size; + + return result; +} + + +/** + * arrayListCount: + * @list: A valid list + * + * Return the count of number items in list + * + * Returns The count of number items in list + */ +int +arrayListCount(arrayListPtr list) +{ + int result = 0; + + if (list) + result = list->count; + + return result; +} + + +/** + * arrayListAdd: + * @list: A valid list + * @item: A valid list + * + * Add @item to @list + * + * Returns 1 if able to add @item to end of @list, + * 0 otherwise + */ +int +arrayListAdd(arrayListPtr list, void *item) +{ + int result = 0; + + if (list && item) { + if (list->count + 1 > list->size) { + /* grow the size of data */ + void **temp; + int newSize, index; + + if (list->size < DOUBLE_SIZE_MAX_ITEM) + newSize = list->size * 2; + else + newSize = (int) (list->size * 1.5); + temp = (void **) xmlMalloc(sizeof(void *) * newSize); + for (index = 0; index < list->count; index++) { + temp[index] = list->data[index]; + } + xmlFree(list->data); + list->data = temp; + list->size = newSize; + } + list->data[list->count++] = item; + result = 1; + } + return result; +} + + +/** + * arrayListDelete: + * @list: A valid list + * @position: 0 =< @position < arrayListCount(@list) + * + * Delete item at position @position from @list + * + * Returns 1 if able to delete element in @list at position @position, + * 0 otherwise + */ +int +arrayListDelete(arrayListPtr list, int position) +{ + int result = 0, index; + + if (list && (list->count > 0) && (position >= 0) && + (position < list->count) && list->data[position]) { + if (list->deleteFunction) + (*list->deleteFunction) (list->data[position]); + + /* shuffle all elements upwards */ + for (index = position; index < (list->count - 1); index++) { + list->data[index] = list->data[index + 1]; + } + list->count--; + result = 1; + } + return result; +} + + + +/** + * arrayListGet: + * @list: A valid list + * @position: 0 =< @position < arrayListCount(@list) + * + * Get item at position @position from @list + * + * Returns Non-null if able to retrieve element in @list at position @position, + * NULL otherwise + */ +void * +arrayListGet(arrayListPtr list, int position) +{ + void *result = NULL; + + if (list && (position >= 0) && (position < list->count)) { + result = list->data[position]; + } + return result; +} |