1*76404edcSAsim Jamshed #include "array.h"
2*76404edcSAsim Jamshed #include "buffer.h"
3*76404edcSAsim Jamshed 
4*76404edcSAsim Jamshed #include <string.h>
5*76404edcSAsim Jamshed #include <stdio.h>
6*76404edcSAsim Jamshed #include <stdlib.h>
7*76404edcSAsim Jamshed #include <limits.h>
8*76404edcSAsim Jamshed 
9*76404edcSAsim Jamshed #include <errno.h>
10*76404edcSAsim Jamshed #include <assert.h>
11*76404edcSAsim Jamshed 
array_init(void)12*76404edcSAsim Jamshed array *array_init(void) {
13*76404edcSAsim Jamshed 	array *a;
14*76404edcSAsim Jamshed 
15*76404edcSAsim Jamshed 	a = calloc(1, sizeof(*a));
16*76404edcSAsim Jamshed 	assert(a);
17*76404edcSAsim Jamshed 
18*76404edcSAsim Jamshed 	a->next_power_of_2 = 1;
19*76404edcSAsim Jamshed 
20*76404edcSAsim Jamshed 	return a;
21*76404edcSAsim Jamshed }
22*76404edcSAsim Jamshed 
array_init_array(array * src)23*76404edcSAsim Jamshed array *array_init_array(array *src) {
24*76404edcSAsim Jamshed 	size_t i;
25*76404edcSAsim Jamshed 	array *a = array_init();
26*76404edcSAsim Jamshed 
27*76404edcSAsim Jamshed 	a->used = src->used;
28*76404edcSAsim Jamshed 	a->size = src->size;
29*76404edcSAsim Jamshed 	a->next_power_of_2 = src->next_power_of_2;
30*76404edcSAsim Jamshed 	a->unique_ndx = src->unique_ndx;
31*76404edcSAsim Jamshed 
32*76404edcSAsim Jamshed 	a->data = malloc(sizeof(*src->data) * src->size);
33*76404edcSAsim Jamshed 	for (i = 0; i < src->size; i++) {
34*76404edcSAsim Jamshed 		if (src->data[i]) a->data[i] = src->data[i]->copy(src->data[i]);
35*76404edcSAsim Jamshed 		else a->data[i] = NULL;
36*76404edcSAsim Jamshed 	}
37*76404edcSAsim Jamshed 
38*76404edcSAsim Jamshed 	a->sorted = malloc(sizeof(*src->sorted)   * src->size);
39*76404edcSAsim Jamshed 	memcpy(a->sorted, src->sorted, sizeof(*src->sorted)   * src->size);
40*76404edcSAsim Jamshed 	return a;
41*76404edcSAsim Jamshed }
42*76404edcSAsim Jamshed 
array_free(array * a)43*76404edcSAsim Jamshed void array_free(array *a) {
44*76404edcSAsim Jamshed 	size_t i;
45*76404edcSAsim Jamshed 	if (!a) return;
46*76404edcSAsim Jamshed 
47*76404edcSAsim Jamshed 	if (!a->is_weakref) {
48*76404edcSAsim Jamshed 		for (i = 0; i < a->size; i++) {
49*76404edcSAsim Jamshed 			if (a->data[i]) a->data[i]->free(a->data[i]);
50*76404edcSAsim Jamshed 		}
51*76404edcSAsim Jamshed 	}
52*76404edcSAsim Jamshed 
53*76404edcSAsim Jamshed 	if (a->data) free(a->data);
54*76404edcSAsim Jamshed 	if (a->sorted) free(a->sorted);
55*76404edcSAsim Jamshed 
56*76404edcSAsim Jamshed 	free(a);
57*76404edcSAsim Jamshed }
58*76404edcSAsim Jamshed 
array_reset(array * a)59*76404edcSAsim Jamshed void array_reset(array *a) {
60*76404edcSAsim Jamshed 	size_t i;
61*76404edcSAsim Jamshed 	if (!a) return;
62*76404edcSAsim Jamshed 
63*76404edcSAsim Jamshed 	if (!a->is_weakref) {
64*76404edcSAsim Jamshed 		for (i = 0; i < a->used; i++) {
65*76404edcSAsim Jamshed 			a->data[i]->reset(a->data[i]);
66*76404edcSAsim Jamshed 		}
67*76404edcSAsim Jamshed 	}
68*76404edcSAsim Jamshed 
69*76404edcSAsim Jamshed 	a->used = 0;
70*76404edcSAsim Jamshed }
71*76404edcSAsim Jamshed 
array_pop(array * a)72*76404edcSAsim Jamshed data_unset *array_pop(array *a) {
73*76404edcSAsim Jamshed 	data_unset *du;
74*76404edcSAsim Jamshed 
75*76404edcSAsim Jamshed 	assert(a->used != 0);
76*76404edcSAsim Jamshed 
77*76404edcSAsim Jamshed 	a->used --;
78*76404edcSAsim Jamshed 	du = a->data[a->used];
79*76404edcSAsim Jamshed 	a->data[a->used] = NULL;
80*76404edcSAsim Jamshed 
81*76404edcSAsim Jamshed 	return du;
82*76404edcSAsim Jamshed }
83*76404edcSAsim Jamshed 
array_get_index(array * a,const char * key,size_t keylen,int * rndx)84*76404edcSAsim Jamshed static int array_get_index(array *a, const char *key, size_t keylen, int *rndx) {
85*76404edcSAsim Jamshed 	int ndx = -1;
86*76404edcSAsim Jamshed 	int i, pos = 0;
87*76404edcSAsim Jamshed 
88*76404edcSAsim Jamshed 	if (key == NULL) return -1;
89*76404edcSAsim Jamshed 
90*76404edcSAsim Jamshed 	/* try to find the string */
91*76404edcSAsim Jamshed 	for (i = pos = a->next_power_of_2 / 2; ; i >>= 1) {
92*76404edcSAsim Jamshed 		int cmp;
93*76404edcSAsim Jamshed 
94*76404edcSAsim Jamshed 		if (pos < 0) {
95*76404edcSAsim Jamshed 			pos += i;
96*76404edcSAsim Jamshed 		} else if (pos >= (int)a->used) {
97*76404edcSAsim Jamshed 			pos -= i;
98*76404edcSAsim Jamshed 		} else {
99*76404edcSAsim Jamshed 			cmp = buffer_caseless_compare(key, keylen, a->data[a->sorted[pos]]->key->ptr, a->data[a->sorted[pos]]->key->used);
100*76404edcSAsim Jamshed 
101*76404edcSAsim Jamshed 			if (cmp == 0) {
102*76404edcSAsim Jamshed 				/* found */
103*76404edcSAsim Jamshed 				ndx = a->sorted[pos];
104*76404edcSAsim Jamshed 				break;
105*76404edcSAsim Jamshed 			} else if (cmp < 0) {
106*76404edcSAsim Jamshed 				pos -= i;
107*76404edcSAsim Jamshed 			} else {
108*76404edcSAsim Jamshed 				pos += i;
109*76404edcSAsim Jamshed 			}
110*76404edcSAsim Jamshed 		}
111*76404edcSAsim Jamshed 		if (i == 0) break;
112*76404edcSAsim Jamshed 	}
113*76404edcSAsim Jamshed 
114*76404edcSAsim Jamshed 	if (rndx) *rndx = pos;
115*76404edcSAsim Jamshed 
116*76404edcSAsim Jamshed 	return ndx;
117*76404edcSAsim Jamshed }
118*76404edcSAsim Jamshed 
array_get_element(array * a,const char * key)119*76404edcSAsim Jamshed data_unset *array_get_element(array *a, const char *key) {
120*76404edcSAsim Jamshed 	int ndx;
121*76404edcSAsim Jamshed 
122*76404edcSAsim Jamshed 	if (-1 != (ndx = array_get_index(a, key, strlen(key) + 1, NULL))) {
123*76404edcSAsim Jamshed 		/* found, leave here */
124*76404edcSAsim Jamshed 
125*76404edcSAsim Jamshed 		return a->data[ndx];
126*76404edcSAsim Jamshed 	}
127*76404edcSAsim Jamshed 
128*76404edcSAsim Jamshed 	return NULL;
129*76404edcSAsim Jamshed }
130*76404edcSAsim Jamshed 
array_get_unused_element(array * a,data_type_t t)131*76404edcSAsim Jamshed data_unset *array_get_unused_element(array *a, data_type_t t) {
132*76404edcSAsim Jamshed 	data_unset *ds = NULL;
133*76404edcSAsim Jamshed 	unsigned int i;
134*76404edcSAsim Jamshed 
135*76404edcSAsim Jamshed 	for (i = a->used; i < a->size; i++) {
136*76404edcSAsim Jamshed 		if (a->data[i] && a->data[i]->type == t) {
137*76404edcSAsim Jamshed 			ds = a->data[i];
138*76404edcSAsim Jamshed 
139*76404edcSAsim Jamshed 			/* make empty slot at a->used for next insert */
140*76404edcSAsim Jamshed 			a->data[i] = a->data[a->used];
141*76404edcSAsim Jamshed 			a->data[a->used] = NULL;
142*76404edcSAsim Jamshed 
143*76404edcSAsim Jamshed 			return ds;
144*76404edcSAsim Jamshed 		}
145*76404edcSAsim Jamshed 	}
146*76404edcSAsim Jamshed 
147*76404edcSAsim Jamshed 	return NULL;
148*76404edcSAsim Jamshed }
149*76404edcSAsim Jamshed 
array_set_key_value(array * hdrs,const char * key,size_t key_len,const char * value,size_t val_len)150*76404edcSAsim Jamshed void array_set_key_value(array *hdrs, const char *key, size_t key_len, const char *value, size_t val_len) {
151*76404edcSAsim Jamshed 	data_string *ds_dst;
152*76404edcSAsim Jamshed 
153*76404edcSAsim Jamshed 	if (NULL != (ds_dst = (data_string *)array_get_element(hdrs, key))) {
154*76404edcSAsim Jamshed 		buffer_copy_string_len(ds_dst->value, value, val_len);
155*76404edcSAsim Jamshed 		return;
156*76404edcSAsim Jamshed 	}
157*76404edcSAsim Jamshed 
158*76404edcSAsim Jamshed 	if (NULL == (ds_dst = (data_string *)array_get_unused_element(hdrs, TYPE_STRING))) {
159*76404edcSAsim Jamshed 		ds_dst = data_string_init();
160*76404edcSAsim Jamshed 	}
161*76404edcSAsim Jamshed 
162*76404edcSAsim Jamshed 	buffer_copy_string_len(ds_dst->key, key, key_len);
163*76404edcSAsim Jamshed 	buffer_copy_string_len(ds_dst->value, value, val_len);
164*76404edcSAsim Jamshed 	array_insert_unique(hdrs, (data_unset *)ds_dst);
165*76404edcSAsim Jamshed }
166*76404edcSAsim Jamshed 
167*76404edcSAsim Jamshed /* replace or insert data, return the old one with the same key */
array_replace(array * a,data_unset * du)168*76404edcSAsim Jamshed data_unset *array_replace(array *a, data_unset *du) {
169*76404edcSAsim Jamshed 	int ndx;
170*76404edcSAsim Jamshed 
171*76404edcSAsim Jamshed 	if (-1 == (ndx = array_get_index(a, du->key->ptr, du->key->used, NULL))) {
172*76404edcSAsim Jamshed 		array_insert_unique(a, du);
173*76404edcSAsim Jamshed 		return NULL;
174*76404edcSAsim Jamshed 	} else {
175*76404edcSAsim Jamshed 		data_unset *old = a->data[ndx];
176*76404edcSAsim Jamshed 		a->data[ndx] = du;
177*76404edcSAsim Jamshed 		return old;
178*76404edcSAsim Jamshed 	}
179*76404edcSAsim Jamshed }
180*76404edcSAsim Jamshed 
array_insert_unique(array * a,data_unset * str)181*76404edcSAsim Jamshed int array_insert_unique(array *a, data_unset *str) {
182*76404edcSAsim Jamshed 	int ndx = -1;
183*76404edcSAsim Jamshed 	int pos = 0;
184*76404edcSAsim Jamshed 	size_t j;
185*76404edcSAsim Jamshed 
186*76404edcSAsim Jamshed 	/* generate unique index if neccesary */
187*76404edcSAsim Jamshed 	if (str->key->used == 0 || str->is_index_key) {
188*76404edcSAsim Jamshed 		buffer_copy_long(str->key, a->unique_ndx++);
189*76404edcSAsim Jamshed 		str->is_index_key = 1;
190*76404edcSAsim Jamshed 	}
191*76404edcSAsim Jamshed 
192*76404edcSAsim Jamshed 	/* try to find the string */
193*76404edcSAsim Jamshed 	if (-1 != (ndx = array_get_index(a, str->key->ptr, str->key->used, &pos))) {
194*76404edcSAsim Jamshed 		/* found, leave here */
195*76404edcSAsim Jamshed 		if (a->data[ndx]->type == str->type) {
196*76404edcSAsim Jamshed 			str->insert_dup(a->data[ndx], str);
197*76404edcSAsim Jamshed 		} else {
198*76404edcSAsim Jamshed 			SEGFAULT();
199*76404edcSAsim Jamshed 		}
200*76404edcSAsim Jamshed 		return 0;
201*76404edcSAsim Jamshed 	}
202*76404edcSAsim Jamshed 
203*76404edcSAsim Jamshed 	/* insert */
204*76404edcSAsim Jamshed 
205*76404edcSAsim Jamshed 	if (a->used+1 > INT_MAX) {
206*76404edcSAsim Jamshed 		/* we can't handle more then INT_MAX entries: see array_get_index() */
207*76404edcSAsim Jamshed 		return -1;
208*76404edcSAsim Jamshed 	}
209*76404edcSAsim Jamshed 
210*76404edcSAsim Jamshed 	if (a->size == 0) {
211*76404edcSAsim Jamshed 		a->size   = 16;
212*76404edcSAsim Jamshed 		a->data   = malloc(sizeof(*a->data)     * a->size);
213*76404edcSAsim Jamshed 		a->sorted = malloc(sizeof(*a->sorted)   * a->size);
214*76404edcSAsim Jamshed 		assert(a->data);
215*76404edcSAsim Jamshed 		assert(a->sorted);
216*76404edcSAsim Jamshed 		for (j = a->used; j < a->size; j++) a->data[j] = NULL;
217*76404edcSAsim Jamshed 	} else if (a->size == a->used) {
218*76404edcSAsim Jamshed 		a->size  += 16;
219*76404edcSAsim Jamshed 		a->data   = realloc(a->data,   sizeof(*a->data)   * a->size);
220*76404edcSAsim Jamshed 		a->sorted = realloc(a->sorted, sizeof(*a->sorted) * a->size);
221*76404edcSAsim Jamshed 		assert(a->data);
222*76404edcSAsim Jamshed 		assert(a->sorted);
223*76404edcSAsim Jamshed 		for (j = a->used; j < a->size; j++) a->data[j] = NULL;
224*76404edcSAsim Jamshed 	}
225*76404edcSAsim Jamshed 
226*76404edcSAsim Jamshed 	ndx = (int) a->used;
227*76404edcSAsim Jamshed 
228*76404edcSAsim Jamshed 	/* make sure there is nothing here */
229*76404edcSAsim Jamshed 	if (a->data[ndx]) a->data[ndx]->free(a->data[ndx]);
230*76404edcSAsim Jamshed 
231*76404edcSAsim Jamshed 	a->data[a->used++] = str;
232*76404edcSAsim Jamshed 
233*76404edcSAsim Jamshed 	if (pos != ndx &&
234*76404edcSAsim Jamshed 	    ((pos < 0) ||
235*76404edcSAsim Jamshed 	     buffer_caseless_compare(str->key->ptr, str->key->used, a->data[a->sorted[pos]]->key->ptr, a->data[a->sorted[pos]]->key->used) > 0)) {
236*76404edcSAsim Jamshed 		pos++;
237*76404edcSAsim Jamshed 	}
238*76404edcSAsim Jamshed 
239*76404edcSAsim Jamshed 	/* move everything on step to the right */
240*76404edcSAsim Jamshed 	if (pos != ndx) {
241*76404edcSAsim Jamshed 		memmove(a->sorted + (pos + 1), a->sorted + (pos), (ndx - pos) * sizeof(*a->sorted));
242*76404edcSAsim Jamshed 	}
243*76404edcSAsim Jamshed 
244*76404edcSAsim Jamshed 	/* insert */
245*76404edcSAsim Jamshed 	a->sorted[pos] = ndx;
246*76404edcSAsim Jamshed 
247*76404edcSAsim Jamshed 	if (a->next_power_of_2 == (size_t)ndx) a->next_power_of_2 <<= 1;
248*76404edcSAsim Jamshed 
249*76404edcSAsim Jamshed 	return 0;
250*76404edcSAsim Jamshed }
251*76404edcSAsim Jamshed 
array_print_indent(int depth)252*76404edcSAsim Jamshed void array_print_indent(int depth) {
253*76404edcSAsim Jamshed 	int i;
254*76404edcSAsim Jamshed 	for (i = 0; i < depth; i ++) {
255*76404edcSAsim Jamshed 		fprintf(stdout, "    ");
256*76404edcSAsim Jamshed 	}
257*76404edcSAsim Jamshed }
258*76404edcSAsim Jamshed 
array_get_max_key_length(array * a)259*76404edcSAsim Jamshed size_t array_get_max_key_length(array *a) {
260*76404edcSAsim Jamshed 	size_t maxlen, i;
261*76404edcSAsim Jamshed 
262*76404edcSAsim Jamshed 	maxlen = 0;
263*76404edcSAsim Jamshed 	for (i = 0; i < a->used; i ++) {
264*76404edcSAsim Jamshed 		data_unset *du = a->data[i];
265*76404edcSAsim Jamshed 		size_t len = strlen(du->key->ptr);
266*76404edcSAsim Jamshed 
267*76404edcSAsim Jamshed 		if (len > maxlen) {
268*76404edcSAsim Jamshed 			maxlen = len;
269*76404edcSAsim Jamshed 		}
270*76404edcSAsim Jamshed 	}
271*76404edcSAsim Jamshed 	return maxlen;
272*76404edcSAsim Jamshed }
273*76404edcSAsim Jamshed 
array_print(array * a,int depth)274*76404edcSAsim Jamshed int array_print(array *a, int depth) {
275*76404edcSAsim Jamshed 	size_t i;
276*76404edcSAsim Jamshed 	size_t maxlen;
277*76404edcSAsim Jamshed 	int oneline = 1;
278*76404edcSAsim Jamshed 
279*76404edcSAsim Jamshed 	if (a->used > 5) {
280*76404edcSAsim Jamshed 		oneline = 0;
281*76404edcSAsim Jamshed 	}
282*76404edcSAsim Jamshed 	for (i = 0; i < a->used && oneline; i++) {
283*76404edcSAsim Jamshed 		data_unset *du = a->data[i];
284*76404edcSAsim Jamshed 		if (!du->is_index_key) {
285*76404edcSAsim Jamshed 			oneline = 0;
286*76404edcSAsim Jamshed 			break;
287*76404edcSAsim Jamshed 		}
288*76404edcSAsim Jamshed 		switch (du->type) {
289*76404edcSAsim Jamshed 			case TYPE_INTEGER:
290*76404edcSAsim Jamshed 			case TYPE_STRING:
291*76404edcSAsim Jamshed 			case TYPE_COUNT:
292*76404edcSAsim Jamshed 				break;
293*76404edcSAsim Jamshed 			default:
294*76404edcSAsim Jamshed 				oneline = 0;
295*76404edcSAsim Jamshed 				break;
296*76404edcSAsim Jamshed 		}
297*76404edcSAsim Jamshed 	}
298*76404edcSAsim Jamshed 	if (oneline) {
299*76404edcSAsim Jamshed 		fprintf(stdout, "(");
300*76404edcSAsim Jamshed 		for (i = 0; i < a->used; i++) {
301*76404edcSAsim Jamshed 			data_unset *du = a->data[i];
302*76404edcSAsim Jamshed 			if (i != 0) {
303*76404edcSAsim Jamshed 				fprintf(stdout, ", ");
304*76404edcSAsim Jamshed 			}
305*76404edcSAsim Jamshed 			du->print(du, depth + 1);
306*76404edcSAsim Jamshed 		}
307*76404edcSAsim Jamshed 		fprintf(stdout, ")");
308*76404edcSAsim Jamshed 		return 0;
309*76404edcSAsim Jamshed 	}
310*76404edcSAsim Jamshed 
311*76404edcSAsim Jamshed 	maxlen = array_get_max_key_length(a);
312*76404edcSAsim Jamshed 	fprintf(stdout, "(\n");
313*76404edcSAsim Jamshed 	for (i = 0; i < a->used; i++) {
314*76404edcSAsim Jamshed 		data_unset *du = a->data[i];
315*76404edcSAsim Jamshed 		array_print_indent(depth + 1);
316*76404edcSAsim Jamshed 		if (!du->is_index_key) {
317*76404edcSAsim Jamshed 			int j;
318*76404edcSAsim Jamshed 
319*76404edcSAsim Jamshed 			if (i && (i % 5) == 0) {
320*76404edcSAsim Jamshed 				fprintf(stdout, "# %zd\n", i);
321*76404edcSAsim Jamshed 				array_print_indent(depth + 1);
322*76404edcSAsim Jamshed 			}
323*76404edcSAsim Jamshed 			fprintf(stdout, "\"%s\"", du->key->ptr);
324*76404edcSAsim Jamshed 			for (j = maxlen - strlen(du->key->ptr); j > 0; j --) {
325*76404edcSAsim Jamshed 				fprintf(stdout, " ");
326*76404edcSAsim Jamshed 			}
327*76404edcSAsim Jamshed 			fprintf(stdout, " => ");
328*76404edcSAsim Jamshed 		}
329*76404edcSAsim Jamshed 		du->print(du, depth + 1);
330*76404edcSAsim Jamshed 		fprintf(stdout, ",\n");
331*76404edcSAsim Jamshed 	}
332*76404edcSAsim Jamshed 	if (!(i && (i - 1 % 5) == 0)) {
333*76404edcSAsim Jamshed 		array_print_indent(depth + 1);
334*76404edcSAsim Jamshed 		fprintf(stdout, "# %zd\n", i);
335*76404edcSAsim Jamshed 	}
336*76404edcSAsim Jamshed 	array_print_indent(depth);
337*76404edcSAsim Jamshed 	fprintf(stdout, ")");
338*76404edcSAsim Jamshed 
339*76404edcSAsim Jamshed 	return 0;
340*76404edcSAsim Jamshed }
341*76404edcSAsim Jamshed 
342*76404edcSAsim Jamshed #ifdef DEBUG_ARRAY
main(int argc,char ** argv)343*76404edcSAsim Jamshed int main (int argc, char **argv) {
344*76404edcSAsim Jamshed 	array *a;
345*76404edcSAsim Jamshed 	data_string *ds;
346*76404edcSAsim Jamshed 	data_count *dc;
347*76404edcSAsim Jamshed 
348*76404edcSAsim Jamshed 	UNUSED(argc);
349*76404edcSAsim Jamshed 	UNUSED(argv);
350*76404edcSAsim Jamshed 
351*76404edcSAsim Jamshed 	a = array_init();
352*76404edcSAsim Jamshed 
353*76404edcSAsim Jamshed 	ds = data_string_init();
354*76404edcSAsim Jamshed 	buffer_copy_string_len(ds->key, CONST_STR_LEN("abc"));
355*76404edcSAsim Jamshed 	buffer_copy_string_len(ds->value, CONST_STR_LEN("alfrag"));
356*76404edcSAsim Jamshed 
357*76404edcSAsim Jamshed 	array_insert_unique(a, (data_unset *)ds);
358*76404edcSAsim Jamshed 
359*76404edcSAsim Jamshed 	ds = data_string_init();
360*76404edcSAsim Jamshed 	buffer_copy_string_len(ds->key, CONST_STR_LEN("abc"));
361*76404edcSAsim Jamshed 	buffer_copy_string_len(ds->value, CONST_STR_LEN("hameplman"));
362*76404edcSAsim Jamshed 
363*76404edcSAsim Jamshed 	array_insert_unique(a, (data_unset *)ds);
364*76404edcSAsim Jamshed 
365*76404edcSAsim Jamshed 	ds = data_string_init();
366*76404edcSAsim Jamshed 	buffer_copy_string_len(ds->key, CONST_STR_LEN("123"));
367*76404edcSAsim Jamshed 	buffer_copy_string_len(ds->value, CONST_STR_LEN("alfrag"));
368*76404edcSAsim Jamshed 
369*76404edcSAsim Jamshed 	array_insert_unique(a, (data_unset *)ds);
370*76404edcSAsim Jamshed 
371*76404edcSAsim Jamshed 	dc = data_count_init();
372*76404edcSAsim Jamshed 	buffer_copy_string_len(dc->key, CONST_STR_LEN("def"));
373*76404edcSAsim Jamshed 
374*76404edcSAsim Jamshed 	array_insert_unique(a, (data_unset *)dc);
375*76404edcSAsim Jamshed 
376*76404edcSAsim Jamshed 	dc = data_count_init();
377*76404edcSAsim Jamshed 	buffer_copy_string_len(dc->key, CONST_STR_LEN("def"));
378*76404edcSAsim Jamshed 
379*76404edcSAsim Jamshed 	array_insert_unique(a, (data_unset *)dc);
380*76404edcSAsim Jamshed 
381*76404edcSAsim Jamshed 	array_print(a, 0);
382*76404edcSAsim Jamshed 
383*76404edcSAsim Jamshed 	array_free(a);
384*76404edcSAsim Jamshed 
385*76404edcSAsim Jamshed 	fprintf(stderr, "%d\n",
386*76404edcSAsim Jamshed 	       buffer_caseless_compare(CONST_STR_LEN("Content-Type"), CONST_STR_LEN("Content-type")));
387*76404edcSAsim Jamshed 
388*76404edcSAsim Jamshed 	return 0;
389*76404edcSAsim Jamshed }
390*76404edcSAsim Jamshed #endif
391