summaryrefslogtreecommitdiff
path: root/src/slist.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/slist.c')
-rw-r--r--src/slist.c395
1 files changed, 0 insertions, 395 deletions
diff --git a/src/slist.c b/src/slist.c
deleted file mode 100644
index d01d58ecd..000000000
--- a/src/slist.c
+++ /dev/null
@@ -1,395 +0,0 @@
-/* Services list handler implementation.
- *
- * (C) 2003-2010 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- *
- *
- */
-
-#include "services.h"
-#include "slist.h"
-
-static SListOpts slist_defopts = { 0, NULL, NULL, NULL };
-
-/*************************************************************************/
-
-/**
- * Adds a pointer to the list. Returns the index of the new item.
- * Returns -2 if there are too many items in the list, -3 if the
- * item already exists when the flags of the list contain SLISTF_NODUP.
- * @param slist Slist Struct
- * @param item Item being added
- * @return int
- */
-int slist_add(SList * slist, void *item)
-{
- if (slist->limit != 0 && slist->count >= slist->limit)
- return -2;
- if (slist->opts && (slist->opts->flags & SLISTF_NODUP)
- && slist_indexof(slist, item) != -1)
- return -3;
- if (slist->capacity == slist->count)
- slist_setcapacity(slist, slist->capacity + 1);
-
- if (slist->opts && (slist->opts->flags & SLISTF_SORT)
- && slist->opts->compareitem) {
- int i;
-
- for (i = 0; i < slist->count; i++) {
- if (slist->opts->compareitem(slist, item, slist->list[i]) <= 0) {
- memmove(&slist->list[i + 1], &slist->list[i],
- sizeof(void *) * (slist->count - i));
- slist->list[i] = item;
- break;
- }
- }
-
- if (i == slist->count)
- slist->list[slist->count] = item;
- } else {
- slist->list[slist->count] = item;
- }
-
- return slist->count++;
-}
-
-/*************************************************************************/
-
-/**
- * Clears the list. If free is 1, the freeitem function will be called
- * for each item before clearing.
- * @param slist Slist Struct
- * @param mustfree What is being freed
- * @return void
- */
-void slist_clear(SList * slist, int mustfree)
-{
- if (mustfree && slist->opts && slist->opts->freeitem && slist->count) {
- int i;
-
- for (i = 0; i < slist->count; i++)
- if (slist->list[i])
- slist->opts->freeitem(slist, slist->list[i]);
- }
-
- if (slist->list) {
- free(slist->list);
- slist->list = NULL;
- }
- slist->capacity = 0;
- slist->count = 0;
-}
-
-/*************************************************************************/
-
-/**
- * Deletes an item from the list, by index. Returns 1 if successful,
- * 0 otherwise.
- * @param slist Slist Struct
- * @param index beign deleted
- * @return int Returns 1 if successful, 0 otherwise.
- */
-int slist_delete(SList * slist, int index)
-{
- /* Range check */
- if (index >= slist->count)
- return 0;
-
- if (slist->list[index] && slist->opts && slist->opts->freeitem)
- slist->opts->freeitem(slist, slist->list[index]);
-
- slist->list[index] = NULL;
- slist->count--;
-
- if (index < slist->count)
- memmove(&slist->list[index], &slist->list[index + 1],
- sizeof(void *) * (slist->count - index));
-
- slist_setcapacity(slist, slist->capacity - 1);
-
- return 1;
-}
-
-/*************************************************************************/
-
-/**
- * Deletes a range of entries. Return -1 if the permission was denied,
- * 0 if no records were deleted, or the number of records deleted
- * @param slist Slist Struct
- * @param range Range to delete
- * @param cb Call back function
- * @param ... various args
- * @return int
- */
-int slist_delete_range(SList * slist, const char *crange, slist_delcheckcb_t cb, ...)
-{
- int count = 0, i, n1, n2;
- va_list args, preserve;
- char *range = const_cast<char *>(crange); // XXX: unsafe cast
-
- va_start(args, cb);
-
- for (;;) {
- n1 = n2 = strtol(range, &range, 10);
- range += strcspn(range, "0123456789,-");
-
- if (*range == '-') {
- range++;
- range += strcspn(range, "0123456789,");
- if (isdigit(*range)) {
- n2 = strtol(range, &range, 10);
- range += strcspn(range, "0123456789,-");
- }
- }
-
- for (i = n1; i <= n2 && i > 0 && i <= slist->count; i++) {
-
- if (!slist->list[i - 1])
- continue;
-
- /* copy this off the stack for safety's sake --nenolod */
- VA_COPY(preserve, args);
-
- if (cb && !cb(slist, slist->list[i - 1], preserve)) {
- va_end(preserve);
- return -1;
- }
-
- /* if it's to be freed, lets free it */
- if (slist->opts && slist->opts->freeitem)
- slist->opts->freeitem(slist, slist->list[i - 1]);
- slist->list[i - 1] = NULL;
-
- /* and release the copied list */
- va_end(preserve);
-
- count++;
- }
-
- range += strcspn(range, ",");
- if (*range)
- range++;
- else
- break;
- }
-
- /* We only really delete the items from the list after having processed
- * everything because it would change the position of the items in the
- * list otherwise.
- */
- slist_pack(slist);
-
- va_end(args);
- return count;
-}
-
-/*************************************************************************/
-
-/**
- * Enumerates all entries of the list. If range is not NULL, will only
- * enumerate entries that are in the range. Returns the total number
- * of entries enumerated.
- * @param slit Slist struct
- * @param range Range to enum
- * @param cb Call back function
- * @param ... various args
- * @return int
- */
-int slist_enum(SList * slist, const char *crange, slist_enumcb_t cb, ...)
-{
- int count = 0, i, res;
- va_list args, preserve;
- char *range = const_cast<char *>(crange); // XXX: unsafe cast
-
- va_start(args, cb);
-
- if (!range) {
- for (i = 0; i < slist->count; i++) {
- if (!slist->list[i]) {
- Alog() << "SList: warning: NULL pointer in the list (?)";
- continue;
- }
-
- /* copy off stack for safety */
- VA_COPY(preserve, args);
-
- res = cb(slist, i + 1, slist->list[i], preserve);
- if (res < 0) {
- va_end(preserve);
- break;
- }
-
- /* and release our copy */
- va_end(preserve);
-
- count += res;
- }
- } else {
- int n1, n2;
-
- for (;;) {
- res = 0;
- n1 = n2 = strtol(range, &range, 10);
- range += strcspn(range, "0123456789,-");
- if (*range == '-') {
- range++;
- range += strcspn(range, "0123456789,");
- if (isdigit(*range)) {
- n2 = strtol(range, &range, 10);
- range += strcspn(range, "0123456789,-");
- }
- }
- for (i = n1; i <= n2 && i > 0 && i <= slist->count; i++) {
- if (!slist->list[i - 1]) {
- Alog() << "SList: warning: NULL pointer in the list (?)";
- continue;
- }
-
- /* copy off stack for safety */
- VA_COPY(preserve, args);
-
- res = cb(slist, i, slist->list[i - 1], preserve);
- if (res < 0) {
- va_end(preserve);
- break;
- }
- count += res;
-
- /* and release our copy */
- va_end(preserve);
- }
- if (res < -1)
- break;
- range += strcspn(range, ",");
- if (*range)
- range++;
- else
- break;
- }
- }
-
- va_end(args);
-
- return count;
-}
-
-/*************************************************************************/
-
-/**
- * Determines whether the list is full.
- * @param slist Slist Struct
- * @return int
- */
-int slist_full(SList * slist)
-{
- if (slist->limit != 0 && slist->count >= slist->limit)
- return 1;
- else
- return 0;
-}
-
-/*************************************************************************/
-
-/**
- * Initialization of the list.
- * @param slist Slist Struct
- * @return int
- */
-void slist_init(SList * slist)
-{
- memset(slist, 0, sizeof(SList));
- slist->limit = SLIST_DEFAULT_LIMIT;
- slist->opts = &slist_defopts;
-}
-
-/*************************************************************************/
-
-/**
- * Returns the index of an item in the list, -1 if inexistant.
- * @param slist Slist Struct
- * @param item Item index
- * @return int
- */
-int slist_indexof(SList * slist, void *item)
-{
- int16 i;
- void *entry;
-
- if (slist->count == 0)
- return -1;
-
- for (i = 0, entry = slist->list[0]; i < slist->count;
- i++, entry = slist->list[i]) {
- if ((slist->opts
- && slist->opts->isequal) ? (slist->opts->isequal(slist, item,
- entry))
- : (item == entry))
- return i;
- }
-
- return -1;
-}
-
-/*************************************************************************/
-
-/**
- * Removes all NULL pointers from the list.
- * @param slist Slist Struct
- * @return void
- */
-void slist_pack(SList * slist)
-{
- int i;
-
- for (i = slist->count - 1; i >= 0; i--)
- if (!slist->list[i])
- slist_delete(slist, i);
-}
-
-/*************************************************************************/
-
-/**
- * Removes a specific item from the list. Returns the old index of the
- * deleted item, or -1 if the item was not found.
- * @param slist Slist Struct
- * @param item to remove
- * @return int
- */
-int slist_remove(SList * slist, void *item)
-{
- int index = slist_indexof(slist, item);
- if (index == -1)
- return -1;
- slist_delete(slist, index);
- return index;
-}
-
-/*************************************************************************/
-
-/**
- * Sets the maximum capacity of the list
- * @param slist Slist Struct
- * @param capacity How large the list can be
- * @return int
- */
-int slist_setcapacity(SList * slist, int16 capacity)
-{
- if (slist->capacity == capacity)
- return 1;
- slist->capacity = capacity;
- if (slist->capacity)
- slist->list =
- static_cast<void **>(srealloc(slist->list, sizeof(void *) * slist->capacity));
- else {
- free(slist->list);
- slist->list = NULL;
- }
- if (slist->capacity < slist->count)
- slist->count = slist->capacity;
- return 1;
-}