byte_array.c
Raw
1#include <cutils/byte_array.h>
2
3Bytearray* bytearray_with_capacity(size_t capacity, size_t element_size)
4{
5 Bytearray* bytearray;
6
7 bytearray = malloc(sizeof(*bytearray));
8 if(!bytearray)
9 return NULL;
10
11 bytearray->items = malloc(sizeof(*bytearray->items)*capacity*element_size);
12 if(!bytearray->items)
13 {
14 free(bytearray);
15 return NULL;
16 }
17
18 bytearray->length = 0;
19 bytearray->capacity = capacity;
20 bytearray->element_size = element_size;
21
22 return bytearray;
23}
24
25
26void delete_bytearray(Bytearray* bytearray, void(*rmv_el) (void*))
27{
28 if(rmv_el)
29 {
30 size_t i;
31 for(i = 0; i < bytearray->length; i++)
32 {
33 rmv_el(&bytearray->items[i*bytearray->element_size]);
34 }
35 }
36
37 free(bytearray->items);
38 free(bytearray);
39}
40
41void bytearray_remove_range(Bytearray* bytearray, size_t index, size_t length, void (*rmv)(void*))
42{
43 size_t i;
44 if(rmv)
45 {
46 for(i = index; i < length; i++)
47 {
48 rmv(bytearray_at(bytearray, i));
49 }
50 }
51 memmove(bytearray->items+index, bytearray->items+index+length, (bytearray->length-(index+length))*sizeof(*bytearray->items));
52 bytearray->length -= length;
53}
54
55
56void* bytearray_pop_at(Bytearray* bytearray, size_t index, void* retptr)
57{
58 void *tmp;
59
60 tmp = bytearray_at(bytearray, index);
61 if(!tmp)
62 return NULL;
63
64 retptr = retptr ? retptr : malloc(bytearray->element_size);
65 if(!retptr)
66 return NULL;
67
68 memcpy(retptr, tmp, bytearray->element_size);
69 bytearray_remove(bytearray, index, NULL);
70 return retptr;
71}
72
73bool bytearray_insert(Bytearray* bytearray, size_t index, const void* item)
74{
75 size_t length = bytearray->length;
76 size_t size = bytearray->element_size;
77
78 if(index > length || length == SIZE_MAX || !bytearray_adjust_size(bytearray, length+1))
79 return false;
80
81 memmove(bytearray->items+index*size+1*size, bytearray->items+index*size, (length*size-index*size)*sizeof(*bytearray->items));
82 memcpy(bytearray->items+index*size, item, bytearray->element_size);
83 bytearray->length++;
84 return true;
85}
86
87bool bytearray_adjust_size(Bytearray* bytearray, size_t size)
88{
89 while(bytearray->capacity < size)
90 {
91 byte* tmp = bytearray->items;
92 bytearray->items = cutil_reallocarray_inc(bytearray->items, bytearray->capacity, bytearray->element_size, bytearray->capacity);
93 if(!bytearray->items)
94 {
95 bytearray->items = tmp;
96 return false;
97 }
98 bytearray->capacity *= 2;
99 }
100 return true;
101}
102
103bool bytearray_shrink(Bytearray* bytearray)
104{
105 while(bytearray->capacity > bytearray->length*2)
106 {
107 byte* tmp = bytearray->items;
108 bytearray->items = cutil_reallocarray(bytearray->items, bytearray->capacity/2, bytearray->element_size);
109 if(!bytearray->items)
110 {
111 bytearray->items = tmp;
112 return false;
113 }
114 bytearray->capacity /= 2;
115 }
116 return true;
117}
118
119size_t* bytearray_find(const Bytearray* haystack, const void* needle, int (*cmp)(const void*, const void*))
120{
121 size_t* ret;
122 size_t i;
123
124 for(i = 0; i < haystack->length; i++)
125 {
126 if(cmp(haystack->items+(i*haystack->element_size),needle) == 0)
127 {
128 ret = malloc(sizeof(*ret));
129 *ret = i;
130 return ret;
131 }
132 }
133 return NULL;
134}
135