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 :)
18 #define INITIAL_SIZE 8
19 #define RESIZE_INCREMENT 8
23 void **items
; /* the array data */
24 unsigned length
; /* # of items in array */
25 unsigned allocSize
; /* allocated size of array */
30 WMCreateArray(unsigned initialSize
)
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
,
47 a
->allocSize
= initialSize
;
53 void ArrayFree(Array
*array
)
60 void ArrayClear(Array
*array
)
62 memset(array
->items
, 0, array
->length
*sizeof(void*));
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
;
81 void *ArrayGet(Array
*array
, unsigned index
)
83 return array
->items
[index
];
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
;
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
;
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));
133 void *ArrayPop(Array
*array
)
135 void *d
= ArrayGet(array
, array
->length
-1);
137 ArrayDelete(array
, array
->length
-1);
143 int ArrayIndex(Array
*array
, void *data
)
147 for (i
= 0; i
< array
->length
; i
++)
148 if (array
->items
[i
] == data
)