annotate array.c @ 25:e09000fc013a

Switch to void * thus the user do not need to cast
author David Demelier <markand@malikania.fr>
date Thu, 15 Sep 2011 17:53:43 +0200
parents 216b6e6a539c
children 4fd9ecbbb143
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
14
2d112b8a3756 Fix typo
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
2 * array.c -- manipulate dynamic arrays
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2011, David Demelier <markand@malikania.fr>
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
9
bf25ed2cf42a Fix vim issue I guess
David Demelier <markand@malikania.fr>
parents: 8
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <stdio.h>
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdlib.h>
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <string.h>
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include "array.h"
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
25 #define SIZE(x) (arr->unit * (x))
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 static int array_grow(struct array *);
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 struct array *
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
30 array_new(const void *data, size_t unit, size_t bsize, int flags)
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 {
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 struct array *arr;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
34 if (unit == 0 || !(arr = malloc(sizeof (struct array))))
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 return NULL;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
36
22
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
37 arr->tmp = NULL;
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
38 arr->length = 0;
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
39 arr->flags = flags;
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 arr->bsize = (bsize == 0) ? ARRAY_DEFAULT_BSIZE : bsize;
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
41 arr->unit = unit;
22
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
42 arr->size = SIZE(arr->bsize);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
43
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
44 if (!(arr->data = malloc(arr->size))) {
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 free(arr);
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 return NULL;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 }
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 if (data)
12
cbfe95c9f7b7 Fix compiler warning (thanks gcc 4.2.2) and security
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
50 memcpy(arr->data, data, arr->unit);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 return arr;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 }
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 /*
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 * Add to the head of array. NOTE: this may be very slow when adding a lot
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 * of object (about 100000). If you need to add a lot of data please consider
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 * using linked list instead or use array_append and then use reverse foreach
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 * functions.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 */
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 int
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 array_push(struct array *arr, const void *data)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 {
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 if (array_grow(arr) < 0)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 return -1;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
67
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
68 memmove((char *) arr->data + arr->unit, arr->data, SIZE(arr->length++));
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
69 memcpy((char *) arr->data, data, arr->unit);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 return 0;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 }
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 /*
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 * Insert the data to the specified index. The function returns -1 on
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 * allocation failure if the array need to grow or when the index is out
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 * of bounds otherwise 0 is returned.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 */
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 int
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 array_insert(struct array *arr, const void *data, int index)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 {
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 if (index > arr->length - 1 || index < 0 || array_grow(arr) < 0)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 return -1;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
86 memmove((char *) arr->data + SIZE(index + 1), (char *) arr->data + SIZE(index),
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 SIZE(arr->length++ - index));
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
88 memcpy((char *) arr->data + SIZE(index), data, arr->unit);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
89
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 return 0;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 }
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 /*
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 * Append the data to the end of array.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 */
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 int
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 array_append(struct array *arr, const void *data)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 {
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 if (array_grow(arr) < 0)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 return -1;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
102
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
103 memcpy((char *) arr->data + SIZE(arr->length++), data, arr->unit);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 return 0;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 }
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
107
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 /*
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 * Remove the array's head and return the object or NULL if
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 * the array is empty.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 */
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 void *
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 array_pop(struct array *arr)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 {
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 void *data;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
117
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 if (arr->length == 0)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 return NULL;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
12
cbfe95c9f7b7 Fix compiler warning (thanks gcc 4.2.2) and security
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
121 data = arr->data;
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
122 memmove((char *) arr->data, (char *) arr->data + SIZE(1),
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
123 SIZE(arr->length));
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
124 memset((char *) arr->data + SIZE(--arr->length), 0, arr->unit);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
125
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 return data;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 }
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
128
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 /*
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 * Remove the array's queue and return the object or NULL
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 * if the array is empty.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 */
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 void *
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 array_unqueue(struct array *arr)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 {
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 void *data;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
138
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 if (arr->length == 0)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 return NULL;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
141
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
142 data = (char *) arr->data + SIZE(--arr->length);
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
143 memset((char *) arr->data + SIZE(arr->length), 0, arr->unit);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
144
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 return data;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 }
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
147
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 /*
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 * Remove the entry at the specified index and return it. If the index is out of
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 * bounds or the list is empty the functions returns NULL.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 */
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
152
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 void *
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 array_remove(struct array *arr, int index)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 {
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 void *data;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
157
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 if (arr->length == 0 || index < 0 || index > arr->length - 1)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 return NULL;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
160
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
161 data = (char *) arr->data + SIZE(index);
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
162 memmove((char *) arr->data + SIZE(index), (char *) arr->data + SIZE(index + 1),
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 SIZE(arr->length - index));
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
164 memset((char *) arr->data + SIZE(--arr->length), 0, arr->unit);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
165
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 return data;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 }
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
168
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 /*
22
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
170 * Swap the two elements referenced by index `i1' and `i2'. This function needs
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
171 * to allocate data to swap elements thus if the functions fails it returns -1
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
172 * otherwise 0 is returned.
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
173 */
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
174
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
175 int
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
176 array_swap(struct array *arr, int i1, int i2)
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
177 {
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
178 /* Out of bounds */
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
179 if (i1 > arr->length - 1|| i1 < 0 || i2 > arr->length - 1|| i2 < 0)
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
180 return -1;
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
181
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
182 /*
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
183 * Only allocate at this time, the user may do not want to use this
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
184 * function.
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
185 */
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
186
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
187 if (!arr->tmp && !(arr->tmp = malloc(arr->unit)))
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
188 return -1;
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
189
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
190 memcpy((char *) arr->tmp, (char *) arr->data + SIZE(i1), arr->unit);
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
191 memcpy((char *) arr->data + SIZE(i1), (char *) arr->data + SIZE(i2), arr->unit);
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
192 memcpy((char *) arr->data + SIZE(i2), (char *) arr->tmp, arr->unit);
22
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
193
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
194 return 0;
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
195 }
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
196
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
197 /*
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 * Apply the function `fn' on each object and give the optional `udata'
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 * argument to the function too.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 */
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
201
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 void
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 array_map(struct array *arr, void (*fn)(void *, void *), void *udata)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 {
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
205 int i;
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
206
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
207 for (i = 0; i < arr->length; ++i)
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
208 fn((char *) arr->data + SIZE(i), udata);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 }
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
210
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 /*
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 * Compare each object with the user supplied function. If the `fn' function
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 * returns 1 then the data is returned. Optional idx argument can be set to
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 * indicate the data position. If the data was not found the function returns
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 * NULL.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 */
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 void *
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
219 array_find(struct array *arr, int (*fn)(void *, void *), int *idx, void *udata)
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 {
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
221 int st, i;
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 void *data;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
223
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
224 for (i = st = 0; i < arr->length && !st; ++i)
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
225 st = fn((char *) arr->data + SIZE(i), udata);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
226
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 if (st) {
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
228 data = (char *) arr->data + SIZE(--i);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 if (idx)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 *idx = i;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 } else
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 data = NULL;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
233
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 return data;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 }
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
236
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 /*
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 * Reset the array, if the trash argument is set it will free the object
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 * too, otherwise the array is just truncated to 0 length.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 */
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
241
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 void
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
243 array_clear(struct array *arr)
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 {
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
245 memset(arr->data, 0, arr->size);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 arr->length = 0;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 }
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
248
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 /*
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 * Same as array_clear except it also free the array object.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 */
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
252
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 void
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
254 array_free(struct array *arr)
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 {
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
256 array_clear(arr);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
257
22
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
258 if (arr->data)
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
259 free(arr->data);
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
260 if (arr->tmp)
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
261 free(arr->tmp);
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
262
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 free(arr);
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 }
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
265
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 /*
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 * Increate the array storage when it is full. If the buffer is fixed size
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 * it returns -1 on full buffer otherwise 0 is returned if allocation
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 * succeeded.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 */
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
271
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 static int
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 array_grow(struct array *arr)
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 {
17
e9a7b671d707 Use char * instead of void, MSVC does not like void * arithmetic
David Demelier <markand@malikania.fr>
parents: 14
diff changeset
275 if ((arr->size / arr->unit) > (size_t) arr->length)
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 return 0;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
277
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 if (arr->flags & ARRAY_AUTO) {
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
279 if (!(arr->data = realloc(arr->data, arr->size +
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 7
diff changeset
280 SIZE(arr->bsize))))
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 return -1;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
282
10
da47652b60c5 Fix security issue
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
283 arr->size += SIZE(arr->bsize);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 } else
17
e9a7b671d707 Use char * instead of void, MSVC does not like void * arithmetic
David Demelier <markand@malikania.fr>
parents: 14
diff changeset
285 return ((arr->size / arr->unit) <= (size_t) arr->length) ? -1 : 0;
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
286
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 return 0;
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 }