annotate parray.c @ 63:d78c4d9fad13

Move to port/ code that I didn't write
author David Demelier <markand@malikania.fr>
date Wed, 09 Nov 2011 19:30:33 +0100
parents 2901c594eaef
children cff6869fbc94
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 parray_map(const struct parray *arr, void (*fn)(void *, void *), void *udata)
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
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 * returns 1 then the data is returned. Optional idx argument can be set to
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 * indicate the data position. If the data was not found the function returns
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 * NULL.
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
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 void *
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 parray_find(const struct parray *arr, int (*fn)(void *, void *), int *ix, void *u)
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 void *data;
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
233
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 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
235 st = fn(arr->datas[i], u);
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
236
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 if (st) {
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 data = arr->datas[--i];
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 if (ix)
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 *ix = i;
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 } else
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 data = NULL;
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 return data;
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 }
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 /*
40
d741c948de89 Added a convenient macro PARRAY_FLUSH to free all objects
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
248 * 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
249 */
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 void
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 parray_clear(struct parray *arr)
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 memset(arr->datas, 0, arr->size);
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 arr->length = 0;
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 }
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 * 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
260 */
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 void
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 parray_free(struct parray *arr)
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 {
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 parray_clear(arr);
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 if (arr->datas)
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 free(arr->datas);
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 free(arr);
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 }
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
272
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 /*
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 * 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
275 * 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
276 * succeeded.
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 */
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
278
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 static int
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 parray_grow(struct parray *arr)
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 {
37
7119508e78ac Security fix
David Demelier <markand@malikania.fr>
parents: 36
diff changeset
282 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
283 return 0;
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
284
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 if (arr->type == PARRAY_AUTO) {
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 if ((arr->datas = realloc(arr->datas, arr->size +
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 LENGTH(arr->bsize))) == NULL)
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 return -1;
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
289
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 arr->size += LENGTH(arr->bsize);
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 } else
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 return -1;
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
293
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 return 0;
fdc3736ff806 Added parray.c and parray.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 }