Removed array bag, and restructured the tree bag to be WMBag
[wmaker-crm.git] / WINGs / array.c
blobf7249218f78dfd172db6f9bd11be2b2f9e714d57
1 /*
2 * Dynamically Resized Array
4 * Authors: Alfredo K. Kojima <kojima@windowmaker.org>
5 * Dan Pascu <dan@windowmaker.org>
7 * This code is released to the Public Domain, but
8 * proper credit is always appreciated :)
9 */
12 #include <stdlib.h>
13 #include <string.h>
15 #include "WUtil.h"
18 #define INITIAL_SIZE 8
19 #define RESIZE_INCREMENT 8
22 typedef struct {
23 void **items; /* the array data */
24 unsigned length; /* # of items in array */
25 unsigned allocSize; /* allocated size of array */
26 } W_Array;
29 WMArray*
30 WMCreateArray(unsigned initialSize)
32 Array *a;
34 a = malloc(sizeof(Array));
35 sassertrv(a!=NULL, NULL);
37 if (initialSize == 0) {
38 initialSize = INITIAL_SIZE;
41 a->items = malloc(sizeof(void*)*initialSize);
42 sassertdo(a->items!=NULL,
43 free(a);
44 return NULL;
46 a->length = 0;
47 a->allocSize = initialSize;
49 return a;
53 void ArrayFree(Array *array)
55 free(array->items);
56 free(array);
60 void ArrayClear(Array *array)
62 memset(array->items, 0, array->length*sizeof(void*));
63 array->length = 0;
67 int ArraySet(Array *array, unsigned index, void *data)
69 sassertrv(index > array->length, 0);
71 if (index == array->length)
72 return ArrayAppend(array, data);
74 array->items[index] = data;
76 return 1;
80 #if 0
81 void *ArrayGet(Array *array, unsigned index)
83 return array->items[index];
85 #endif
88 int ArrayAppend(Array *array, void *data)
90 if (array->length >= array->allocSize) {
91 array->allocSize += RESIZE_INCREMENT;
92 array->items = realloc(array->items, sizeof(void*)*array->allocSize);
93 sassertrv(array->items != NULL, 0);
95 array->items[array->length++] = data;
97 return 1;
101 int ArrayInsert(Array *array, unsigned index, void *data)
103 sassertrv(index < array->length, 0);
105 if (array->length >= array->allocSize) {
106 array->allocSize += RESIZE_INCREMENT;
107 array->items = realloc(array->items, sizeof(void*)*array->allocSize);
108 sassertrv(array->items != NULL, 0);
110 if (index < array->length-1)
111 memmove(array->items+index+1, array->items+index,
112 sizeof(void*)*(array->length-index));
113 array->items[index] = data;
115 array->length++;
117 return 1;
121 void ArrayDelete(Array *array, unsigned index)
123 sassertr(index < array->length);
125 memmove(array->items+index, array->items+index+1,
126 sizeof(void*)*(array->length-index-1));
128 array->length--;
133 void *ArrayPop(Array *array)
135 void *d = ArrayGet(array, array->length-1);
137 ArrayDelete(array, array->length-1);
139 return d;
143 int ArrayIndex(Array *array, void *data)
145 unsigned i;
147 for (i = 0; i < array->length; i++)
148 if (array->items[i] == data)
149 return i;
151 return -1;