Added necessary myarray.{c,h} files.
[ctodo.git] / myarray.c
blobfdeea7a02ee79a3af2979a2a56fd68b827126e65
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include "myarray.h"
6 MArray myarray_new(int size, int incr, int elsize) {
7 MArray myarray = malloc(sizeof(struct myarray));
8 myarray->elements = calloc(size, sizeof(void *));
9 myarray->len = 0;
10 myarray->maxlen = size;
11 myarray->incr = incr;
12 myarray->elsize = elsize;
13 myarray->cmpfunc = NULL;
15 return myarray;
18 void myarray_set_cmpfunc(MArray array, int (*cmpfunc)(void *, void *)) {
19 array->cmpfunc = cmpfunc;
22 void myarray_enlarge(MArray array) {
23 array->maxlen+= array->incr;
24 array->elements = realloc(array->elements, array->maxlen*sizeof(void *));
27 void _myarray_insert(MArray array, void *element, int index) {
28 void *toinsert = malloc(array->elsize);
29 memcpy(toinsert, element, array->elsize);
30 if (index < 0 || index > array->len) {
31 fprintf(stderr, "Array index out of bounds %s:%d. Index: %d. Array size: %d\n", __FILE__, __LINE__, index, array->len);
32 exit(EXIT_FAILURE);
34 if (array->len == array->maxlen) {
35 myarray_enlarge(array);
37 memmove(&array->elements[index+1], &array->elements[index], (array->len - index)*sizeof(void *));
38 array->elements[index] = toinsert;
39 array->len += 1;
42 void _myarray_insert_sorted(MArray array, void *element) {
43 if (array->cmpfunc == NULL) {
44 _myarray_insert(array, element, array->len);
45 } else {
46 int i;
47 for (i = 0; i < array->len; i++) {
48 if (array->cmpfunc(*(void **) element, myarray_get(array, void *, i)) <= 0) {
49 break;
52 _myarray_insert(array, element, i);
56 void myarray_remove_index(MArray array, int index) {
57 free(array->elements[index]);
58 memmove(&array->elements[index], &array->elements[index+1], (array->len - index - 1)*sizeof(void *));
59 array->len--;
62 void myarray_free(MArray array) {
63 int i;
64 for (i = 0; i < array->len; i++) {
65 free(array->elements[i]);
67 free(array->elements);
68 free(array);
71 void myarray_reset(MArray array) {
72 array->len = 0;