summaryrefslogtreecommitdiff
path: root/src/base/list.c~
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/list.c~')
-rw-r--r--src/base/list.c~167
1 files changed, 167 insertions, 0 deletions
diff --git a/src/base/list.c~ b/src/base/list.c~
new file mode 100644
index 0000000..72ea95e
--- /dev/null
+++ b/src/base/list.c~
@@ -0,0 +1,167 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "main.h"
+#include "list.h"
+
+list_t* newList()
+{
+ list_t *new;
+
+ new = malloc(sizeof(list_t));
+ memset(new, 0, sizeof(list_t));
+ return new;
+}
+
+list_t* cloneList(list_t *p)
+{
+ list_t *new;
+
+ assert(p != NULL);
+ new = malloc( sizeof(list_t) );
+ memcpy(new, p, sizeof(list_t) );
+ if(p->list != NULL) {
+ new->list = malloc( p->alloc * sizeof(void *) );
+ memcpy(new->list, p->list, p->alloc * sizeof(void *));
+ }
+ return new;
+}
+
+list_t* cloneListItem(list_t *p, void *f)
+{
+ list_t *new;
+ void* (*fce)(void *);
+ int i;
+
+ assert(p != NULL);
+ assert(f != NULL);
+ new = cloneList(p);
+ fce = f;
+ for (i = 0; i < p->count; i++)
+ new->list[i] = fce(p->list[i]);
+ return new;
+}
+
+void addList(list_t *p, void *item)
+{
+ assert( p != NULL );
+
+ if (p->alloc == 0) {
+ p->alloc = LIST_ALLOC_LIMIT;
+ p->count = 1;
+ p->list = malloc(p->alloc * sizeof(void *));
+ p->list[0] = item;
+ return;
+ }
+
+ if (p->count + 1 <= p->alloc) {
+ p->list[p->count] = item;
+ p->count += 1;
+ return;
+ }
+
+ if (p->count + 1 > p->alloc) {
+ void **new;
+#ifdef DEBUG_LIST
+ printf("Realocating from %d to %d (count=%d)\n",
+ p->alloc, p->alloc+LIST_ALLOC_LIMIT, p->count);
+#endif
+ p->alloc += LIST_ALLOC_LIMIT;
+ new = malloc(p->alloc * sizeof(void *));
+ memcpy(new, p->list, p->count * sizeof(void *));
+ free(p->list);
+ p->list = new;
+ p->list[p->count] = item;
+ p->count++;
+ return;
+ }
+}
+
+void insList(list_t *p, int n, void *item)
+{
+ assert( p != NULL );
+ addList(p, NULL); // :)
+ assert(n >= 0 || n < p->count);
+ memmove(p->list+n+1, p->list+n, ((p->count-1) - n) * sizeof(void *));
+ p->list[n] = item;
+}
+
+void *getList(list_t *p, int n)
+{
+ assert(p != NULL);
+ assert(n >= 0 || n < p->count);
+ return p->list[n];
+}
+
+int searchListItem(list_t *p, void *n)
+{
+ int i;
+
+ assert( p != NULL );
+ for (i = 0; i < p->count; i++)
+ if (p->list[i] == n)
+ return i;
+ return -1;
+}
+
+void delList(list_t *p, int n)
+{
+ assert(p != NULL);
+ assert(n >= 0 || n < p->count);
+ memmove(p->list+n, p->list+n+1, ( (p->count-1) - n ) * sizeof(void *));
+ p->count--;
+ if(p->count + LIST_ALLOC_LIMIT < p->alloc) {
+ void **new;
+
+#ifdef DEBUG_LIST
+ printf("Realocating from %d to %d (count=%d)\n",
+ p->alloc, p->alloc-LIST_ALLOC_LIMIT, p->count);
+#endif
+ p->alloc -= LIST_ALLOC_LIMIT;
+ new = malloc(p->alloc * sizeof(void *) );
+ memcpy(new, p->list, p->count * sizeof(void *) );
+ free(p->list);
+ p->list = new;
+ }
+}
+
+void delListItem(list_t *p, int n, void *f)
+{
+ int (*fce)(void *);
+
+ assert(p != NULL);
+ assert(n >= 0 || n < p->count);
+ fce = f;
+ if(fce != NULL)
+ fce(p->list[n]);
+ delList(p, n);
+}
+
+void listDoEmpty(list_t *p)
+{
+ p->count = 0;
+}
+
+void destroyList(list_t *p)
+{
+ assert( p != NULL );
+
+ if( p->list != NULL )free(p->list);
+ free(p);
+}
+
+void destroyListItem(list_t *p, void *f)
+{
+ void (*fce)(void *);
+ int i;
+
+ assert( p != NULL );
+ assert( f != NULL );
+ fce = f;
+ for (i = 0; i < p->count; i++)
+ fce(p->list[i]);
+ destroyList(p);
+}