Mercurial > code
annotate parray.c @ 76:4c5f69f5f409
Merge for inifile
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 14 Nov 2011 18:51:07 +0100 |
parents | cff6869fbc94 |
children | 4d723e81b685 |
rev | line source |
---|---|
36
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * parray.c -- manipulate dynamic pointer arrays |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2011, David Demelier <markand@malikania.fr> |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <stdio.h> |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <stdlib.h> |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <string.h> |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include "parray.h" |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #define LENGTH(x) ((x) * (sizeof (void *))) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 static int parray_grow(struct parray *); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 struct parray * |
50
2901c594eaef
And last commit applied to parray too
David Demelier <markand@malikania.fr>
parents:
43
diff
changeset
|
30 parray_new(enum parray_type type, int length) |
36
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 struct parray *arr; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 if ((arr = malloc(sizeof (struct parray))) == NULL) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 return NULL; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 memset(arr, 0, sizeof (struct parray)); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 arr->type = type; |
50
2901c594eaef
And last commit applied to parray too
David Demelier <markand@malikania.fr>
parents:
43
diff
changeset
|
40 arr->bsize = (length == 0) ? PARRAY_DEFAULT_BSIZE : length; |
36
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 arr->size = LENGTH(arr->bsize); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 if ((arr->datas = calloc(arr->bsize, sizeof (void *))) == NULL) { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 free(arr); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 return NULL; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 return arr; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 /* |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 * Add to the head of array. NOTE: this may be very slow when adding a lot |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 * of object (about 100000). If you need to add a lot of data please consider |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 * using linked list instead. |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 int |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 parray_push(struct parray *arr, void *data) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 if (parray_grow(arr) < 0) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 return -1; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 memmove(&arr->datas[1], &arr->datas[0], LENGTH(arr->length++)); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 arr->datas[0] = data; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 return 0; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 /* |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 * Insert the data at the specified index. The function returns -1 on |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 * allocation failure or when the index is outof bounds otherwise 0 is returned. |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 int |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 parray_insert(struct parray *arr, void *data, int index) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 if (index > arr->length - 1 || index < 0 || parray_grow(arr) < 0) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 return -1; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 memmove(&arr->datas[index + 1], &arr->datas[index], |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 LENGTH(arr->length++ - index)); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 arr->datas[index] = data; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 return 0; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 /* |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 * Append the data to the end of array. |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 int |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 parray_append(struct parray *arr, void *data) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 if (parray_grow(arr) < 0) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 return -1; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 arr->datas[arr->length++] = data; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 return 0; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 /* |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 * Remove the array's head. |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 void |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 parray_pop(struct parray *arr) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 if (arr->length > 0) { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 memmove(&arr->datas[0], &arr->datas[1], LENGTH(--arr->length)); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 arr->datas[arr->length] = NULL; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 /* |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 * Remove the array's tail. |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 void |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 parray_unqueue(struct parray *arr) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 if (arr->length > 0) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 arr->datas[--arr->length] = NULL; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 /* |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 * Remove the data at the specified index. Bounds are checked. |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 void |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 parray_remove(struct parray *arr, int index) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 if (arr->length > 0 && index >= 0 && index < arr->length) { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 memmove(&arr->datas[index], &arr->datas[index + 1], |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 LENGTH(arr->length - index - 1)); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 arr->datas[--arr->length] = NULL; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
139 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
140 /* |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 * Remove the object referenced by the `data' argument. Useful when you |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 * don't know the index. |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 void |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 parray_unref(struct parray *arr, const void *data) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 void *elm; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
149 int i; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 for (i = 0; i < arr->length; ++i) { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 elm = PARRAY_INDEX(arr, i); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
154 if (elm == data) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
155 parray_remove(arr, i); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
157 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
158 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
159 /* |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
160 * Swap the two elements referenced by index `i1' and `i2'. This function needs |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
161 * to allocate data to swap elements thus if the functions fails it returns -1 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
162 * otherwise 0 is returned. |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
163 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
164 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
165 int |
43
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
166 parray_iswap(struct parray *arr, int i1, int i2) |
36
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
167 { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
168 void *tmp; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
169 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
170 /* Out of bounds */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 if (i1 >= arr->length || i1 < 0 || i2 >= arr->length || i2 < 0) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
172 return -1; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 tmp = arr->datas[i1]; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 arr->datas[i1] = arr->datas[i2]; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 arr->datas[i2] = tmp; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 return 0; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 /* |
43
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
182 * Swap the two elements referenced by data `o1' and `o2'. This function |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
183 * may be slow on large arrays since it must travel all the object |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
184 * to find the indexes. |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
185 */ |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
186 |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
187 int |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
188 parray_pswap(struct parray *arr, const void *o1, const void *o2) |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
189 { |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
190 int found, i1, i2; |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
191 |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
192 for (i1 = found = 0; !found && i1 < arr->length; ++i1) |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
193 found = arr->datas[i1] == o1; |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
194 |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
195 if (!found) |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
196 return -1; |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
197 |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
198 for (i2 = found = 0; !found && i2 < arr->length; ++i2) |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
199 found = arr->datas[i2] == o2; |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
200 |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
201 if (!found) |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
202 return -1; |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
203 |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
204 return parray_iswap(arr, --i1, --i2); |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
205 } |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
206 |
f1e184940197
Same last commit for array too
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
207 /* |
36
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 * Apply the function `fn' on each object and give the optional `udata' |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 * argument to the function too. |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
210 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
211 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
212 void |
67
cff6869fbc94
Modified [p]array_find to return the index for a better usage
David Demelier <markand@malikania.fr>
parents:
50
diff
changeset
|
213 parray_map(const struct parray *arr, parray_map_fn fn, void *udata) |
36
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
214 { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
215 int i; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
216 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
217 for (i = 0; i < arr->length; ++i) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
218 fn(arr->datas[i], udata); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
219 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
220 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
221 /* |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
222 * Compare each object with the user supplied function. If the `fn' function |
67
cff6869fbc94
Modified [p]array_find to return the index for a better usage
David Demelier <markand@malikania.fr>
parents:
50
diff
changeset
|
223 * returns 1 then the index of the data position is returned and the parameter |
cff6869fbc94
Modified [p]array_find to return the index for a better usage
David Demelier <markand@malikania.fr>
parents:
50
diff
changeset
|
224 * data points to the array data at the correct index. If the comparison |
cff6869fbc94
Modified [p]array_find to return the index for a better usage
David Demelier <markand@malikania.fr>
parents:
50
diff
changeset
|
225 * function nevers returns 1, array_find returns -1. |
36
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
226 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
227 |
67
cff6869fbc94
Modified [p]array_find to return the index for a better usage
David Demelier <markand@malikania.fr>
parents:
50
diff
changeset
|
228 int |
cff6869fbc94
Modified [p]array_find to return the index for a better usage
David Demelier <markand@malikania.fr>
parents:
50
diff
changeset
|
229 parray_find(const struct parray *arr, parray_cmp_fn fn, void **ptr, void *u) |
36
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
230 { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
231 int st, i; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
232 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
233 for (i = st = 0; i < arr->length && st != 1; ++i) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
234 st = fn(arr->datas[i], u); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
235 |
67
cff6869fbc94
Modified [p]array_find to return the index for a better usage
David Demelier <markand@malikania.fr>
parents:
50
diff
changeset
|
236 if (st) |
cff6869fbc94
Modified [p]array_find to return the index for a better usage
David Demelier <markand@malikania.fr>
parents:
50
diff
changeset
|
237 *ptr = arr->datas[--i]; |
cff6869fbc94
Modified [p]array_find to return the index for a better usage
David Demelier <markand@malikania.fr>
parents:
50
diff
changeset
|
238 else |
cff6869fbc94
Modified [p]array_find to return the index for a better usage
David Demelier <markand@malikania.fr>
parents:
50
diff
changeset
|
239 i = -1; |
36
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
240 |
67
cff6869fbc94
Modified [p]array_find to return the index for a better usage
David Demelier <markand@malikania.fr>
parents:
50
diff
changeset
|
241 return i; |
36
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
242 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
243 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
244 /* |
40
d741c948de89
Added a convenient macro PARRAY_FLUSH to free all objects
David Demelier <markand@malikania.fr>
parents:
37
diff
changeset
|
245 * Reset the array by setting each pointer to NULL and the length to 0. |
36
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
246 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
247 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
248 void |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
249 parray_clear(struct parray *arr) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
250 { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
251 memset(arr->datas, 0, arr->size); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
252 arr->length = 0; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
253 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
254 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
255 /* |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
256 * Same as parray_clear except it also free the array object. |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
257 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
258 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
259 void |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
260 parray_free(struct parray *arr) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
261 { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
262 parray_clear(arr); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
263 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
264 if (arr->datas) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
265 free(arr->datas); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
266 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
267 free(arr); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
268 } |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
269 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
270 /* |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
271 * Increate the array storage when it is full. If the buffer is fixed size |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
272 * it returns -1 on full buffer otherwise 0 is returned if allocation |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
273 * succeeded. |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
274 */ |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
275 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
276 static int |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
277 parray_grow(struct parray *arr) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
278 { |
37 | 279 if ((arr->size / sizeof (void *)) > (size_t) arr->length) |
36
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
280 return 0; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
281 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
282 if (arr->type == PARRAY_AUTO) { |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
283 if ((arr->datas = realloc(arr->datas, arr->size + |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
284 LENGTH(arr->bsize))) == NULL) |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
285 return -1; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
286 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
287 arr->size += LENGTH(arr->bsize); |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
288 } else |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
289 return -1; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
290 |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
291 return 0; |
fdc3736ff806
Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
292 } |