xref: /lighttpd1.4/src/array.c (revision 4f4d40f3)
1bcdc6a3bSJan Kneschke #include <string.h>
2bcdc6a3bSJan Kneschke #include <stdio.h>
3bcdc6a3bSJan Kneschke #include <stdlib.h>
4bcdc6a3bSJan Kneschke #include <limits.h>
5bcdc6a3bSJan Kneschke 
6bcdc6a3bSJan Kneschke #include <errno.h>
7bcdc6a3bSJan Kneschke #include <assert.h>
8bcdc6a3bSJan Kneschke 
9bcdc6a3bSJan Kneschke #include "array.h"
10bcdc6a3bSJan Kneschke #include "buffer.h"
11bcdc6a3bSJan Kneschke 
12bcdc6a3bSJan Kneschke array *array_init(void) {
13bcdc6a3bSJan Kneschke 	array *a;
14bcdc6a3bSJan Kneschke 
15bcdc6a3bSJan Kneschke 	a = calloc(1, sizeof(*a));
16bcdc6a3bSJan Kneschke 	assert(a);
17bcdc6a3bSJan Kneschke 
18bcdc6a3bSJan Kneschke 	a->next_power_of_2 = 1;
19bcdc6a3bSJan Kneschke 
20bcdc6a3bSJan Kneschke 	return a;
21bcdc6a3bSJan Kneschke }
22bcdc6a3bSJan Kneschke 
236e78c2c8SJan Kneschke array *array_init_array(array *src) {
246e78c2c8SJan Kneschke 	size_t i;
256e78c2c8SJan Kneschke 	array *a = array_init();
266e78c2c8SJan Kneschke 
276e78c2c8SJan Kneschke 	a->used = src->used;
286e78c2c8SJan Kneschke 	a->size = src->size;
296e78c2c8SJan Kneschke 	a->next_power_of_2 = src->next_power_of_2;
306e78c2c8SJan Kneschke 	a->unique_ndx = src->unique_ndx;
316e78c2c8SJan Kneschke 
326e78c2c8SJan Kneschke 	a->data = malloc(sizeof(*src->data) * src->size);
336e78c2c8SJan Kneschke 	for (i = 0; i < src->size; i++) {
346e78c2c8SJan Kneschke 		if (src->data[i]) a->data[i] = src->data[i]->copy(src->data[i]);
356e78c2c8SJan Kneschke 		else a->data[i] = NULL;
366e78c2c8SJan Kneschke 	}
376e78c2c8SJan Kneschke 
386e78c2c8SJan Kneschke 	a->sorted = malloc(sizeof(*src->sorted)   * src->size);
396e78c2c8SJan Kneschke 	memcpy(a->sorted, src->sorted, sizeof(*src->sorted)   * src->size);
406e78c2c8SJan Kneschke 	return a;
416e78c2c8SJan Kneschke }
426e78c2c8SJan Kneschke 
43bcdc6a3bSJan Kneschke void array_free(array *a) {
44bcdc6a3bSJan Kneschke 	size_t i;
45bcdc6a3bSJan Kneschke 	if (!a) return;
46bcdc6a3bSJan Kneschke 
478b07d57dSJan Kneschke 	if (!a->is_weakref) {
48bcdc6a3bSJan Kneschke 		for (i = 0; i < a->size; i++) {
49bcdc6a3bSJan Kneschke 			if (a->data[i]) a->data[i]->free(a->data[i]);
50bcdc6a3bSJan Kneschke 		}
518b07d57dSJan Kneschke 	}
52bcdc6a3bSJan Kneschke 
53bcdc6a3bSJan Kneschke 	if (a->data) free(a->data);
54bcdc6a3bSJan Kneschke 	if (a->sorted) free(a->sorted);
55bcdc6a3bSJan Kneschke 
56bcdc6a3bSJan Kneschke 	free(a);
57bcdc6a3bSJan Kneschke }
58bcdc6a3bSJan Kneschke 
59bcdc6a3bSJan Kneschke void array_reset(array *a) {
60bcdc6a3bSJan Kneschke 	size_t i;
61bcdc6a3bSJan Kneschke 	if (!a) return;
62bcdc6a3bSJan Kneschke 
638b07d57dSJan Kneschke 	if (!a->is_weakref) {
64bcdc6a3bSJan Kneschke 		for (i = 0; i < a->used; i++) {
65bcdc6a3bSJan Kneschke 			a->data[i]->reset(a->data[i]);
66bcdc6a3bSJan Kneschke 		}
678b07d57dSJan Kneschke 	}
68bcdc6a3bSJan Kneschke 
69bcdc6a3bSJan Kneschke 	a->used = 0;
70bcdc6a3bSJan Kneschke }
71bcdc6a3bSJan Kneschke 
728073d5feSJan Kneschke data_unset *array_pop(array *a) {
738073d5feSJan Kneschke 	data_unset *du;
748073d5feSJan Kneschke 
758073d5feSJan Kneschke 	assert(a->used != 0);
768073d5feSJan Kneschke 
778073d5feSJan Kneschke 	a->used --;
788073d5feSJan Kneschke 	du = a->data[a->used];
798073d5feSJan Kneschke 	a->data[a->used] = NULL;
808073d5feSJan Kneschke 
818073d5feSJan Kneschke 	return du;
828073d5feSJan Kneschke }
838073d5feSJan Kneschke 
84bcdc6a3bSJan Kneschke static int array_get_index(array *a, const char *key, size_t keylen, int *rndx) {
85bcdc6a3bSJan Kneschke 	int ndx = -1;
86bcdc6a3bSJan Kneschke 	int i, pos = 0;
87bcdc6a3bSJan Kneschke 
88bcdc6a3bSJan Kneschke 	if (key == NULL) return -1;
89bcdc6a3bSJan Kneschke 
90bcdc6a3bSJan Kneschke 	/* try to find the string */
91bcdc6a3bSJan Kneschke 	for (i = pos = a->next_power_of_2 / 2; ; i >>= 1) {
92bcdc6a3bSJan Kneschke 		int cmp;
93bcdc6a3bSJan Kneschke 
94bcdc6a3bSJan Kneschke 		if (pos < 0) {
95bcdc6a3bSJan Kneschke 			pos += i;
96bcdc6a3bSJan Kneschke 		} else if (pos >= (int)a->used) {
97bcdc6a3bSJan Kneschke 			pos -= i;
98bcdc6a3bSJan Kneschke 		} else {
99bcdc6a3bSJan Kneschke 			cmp = buffer_caseless_compare(key, keylen, a->data[a->sorted[pos]]->key->ptr, a->data[a->sorted[pos]]->key->used);
100bcdc6a3bSJan Kneschke 
101bcdc6a3bSJan Kneschke 			if (cmp == 0) {
102bcdc6a3bSJan Kneschke 				/* found */
103bcdc6a3bSJan Kneschke 				ndx = a->sorted[pos];
104bcdc6a3bSJan Kneschke 				break;
105bcdc6a3bSJan Kneschke 			} else if (cmp < 0) {
106bcdc6a3bSJan Kneschke 				pos -= i;
107bcdc6a3bSJan Kneschke 			} else {
108bcdc6a3bSJan Kneschke 				pos += i;
109bcdc6a3bSJan Kneschke 			}
110bcdc6a3bSJan Kneschke 		}
111bcdc6a3bSJan Kneschke 		if (i == 0) break;
112bcdc6a3bSJan Kneschke 	}
113bcdc6a3bSJan Kneschke 
114bcdc6a3bSJan Kneschke 	if (rndx) *rndx = pos;
115bcdc6a3bSJan Kneschke 
116bcdc6a3bSJan Kneschke 	return ndx;
117bcdc6a3bSJan Kneschke }
118bcdc6a3bSJan Kneschke 
119bcdc6a3bSJan Kneschke data_unset *array_get_element(array *a, const char *key) {
120bcdc6a3bSJan Kneschke 	int ndx;
121bcdc6a3bSJan Kneschke 
122bcdc6a3bSJan Kneschke 	if (-1 != (ndx = array_get_index(a, key, strlen(key) + 1, NULL))) {
123bcdc6a3bSJan Kneschke 		/* found, leave here */
124bcdc6a3bSJan Kneschke 
125bcdc6a3bSJan Kneschke 		return a->data[ndx];
126bcdc6a3bSJan Kneschke 	}
127bcdc6a3bSJan Kneschke 
128bcdc6a3bSJan Kneschke 	return NULL;
129bcdc6a3bSJan Kneschke }
130bcdc6a3bSJan Kneschke 
131bcdc6a3bSJan Kneschke data_unset *array_get_unused_element(array *a, data_type_t t) {
132bcdc6a3bSJan Kneschke 	data_unset *ds = NULL;
133bcdc6a3bSJan Kneschke 
134bcdc6a3bSJan Kneschke 	UNUSED(t);
135bcdc6a3bSJan Kneschke 
136bcdc6a3bSJan Kneschke 	if (a->size == 0) return NULL;
137bcdc6a3bSJan Kneschke 
138bcdc6a3bSJan Kneschke 	if (a->used == a->size) return NULL;
139bcdc6a3bSJan Kneschke 
140bcdc6a3bSJan Kneschke 	if (a->data[a->used]) {
141bcdc6a3bSJan Kneschke 		ds = a->data[a->used];
142bcdc6a3bSJan Kneschke 
143bcdc6a3bSJan Kneschke 		a->data[a->used] = NULL;
144bcdc6a3bSJan Kneschke 	}
145bcdc6a3bSJan Kneschke 
146bcdc6a3bSJan Kneschke 	return ds;
147bcdc6a3bSJan Kneschke }
148bcdc6a3bSJan Kneschke 
149*4f4d40f3SStefan Bühler void array_set_key_value(array *hdrs, const char *key, size_t key_len, const char *value, size_t val_len) {
150*4f4d40f3SStefan Bühler 	data_string *ds_dst;
151*4f4d40f3SStefan Bühler 
152*4f4d40f3SStefan Bühler 	if (NULL != (ds_dst = (data_string *)array_get_element(hdrs, key))) {
153*4f4d40f3SStefan Bühler 		buffer_copy_string_len(ds_dst->value, value, val_len);
154*4f4d40f3SStefan Bühler 		return;
155*4f4d40f3SStefan Bühler 	}
156*4f4d40f3SStefan Bühler 
157*4f4d40f3SStefan Bühler 	if (NULL == (ds_dst = (data_string *)array_get_unused_element(hdrs, TYPE_STRING))) {
158*4f4d40f3SStefan Bühler 		ds_dst = data_string_init();
159*4f4d40f3SStefan Bühler 	}
160*4f4d40f3SStefan Bühler 
161*4f4d40f3SStefan Bühler 	buffer_copy_string_len(ds_dst->key, key, key_len);
162*4f4d40f3SStefan Bühler 	buffer_copy_string_len(ds_dst->value, value, val_len);
163*4f4d40f3SStefan Bühler 	array_insert_unique(hdrs, (data_unset *)ds_dst);
164*4f4d40f3SStefan Bühler }
165*4f4d40f3SStefan Bühler 
1666e78c2c8SJan Kneschke /* replace or insert data, return the old one with the same key */
1676e78c2c8SJan Kneschke data_unset *array_replace(array *a, data_unset *du) {
1686e78c2c8SJan Kneschke 	int ndx;
169cf002f68SJan Kneschke 
1706e78c2c8SJan Kneschke 	if (-1 == (ndx = array_get_index(a, du->key->ptr, du->key->used, NULL))) {
1716e78c2c8SJan Kneschke 		array_insert_unique(a, du);
1726e78c2c8SJan Kneschke 		return NULL;
173cf002f68SJan Kneschke 	} else {
1746e78c2c8SJan Kneschke 		data_unset *old = a->data[ndx];
1756e78c2c8SJan Kneschke 		a->data[ndx] = du;
1766e78c2c8SJan Kneschke 		return old;
1776e78c2c8SJan Kneschke 	}
1786e78c2c8SJan Kneschke }
1796e78c2c8SJan Kneschke 
180bcdc6a3bSJan Kneschke int array_insert_unique(array *a, data_unset *str) {
181bcdc6a3bSJan Kneschke 	int ndx = -1;
182bcdc6a3bSJan Kneschke 	int pos = 0;
183bcdc6a3bSJan Kneschke 	size_t j;
184bcdc6a3bSJan Kneschke 
185bcdc6a3bSJan Kneschke 	/* generate unique index if neccesary */
186f387d898SmOo 	if (str->key->used == 0 || str->is_index_key) {
187bcdc6a3bSJan Kneschke 		buffer_copy_long(str->key, a->unique_ndx++);
188f387d898SmOo 		str->is_index_key = 1;
189bcdc6a3bSJan Kneschke 	}
190bcdc6a3bSJan Kneschke 
191bcdc6a3bSJan Kneschke 	/* try to find the string */
192bcdc6a3bSJan Kneschke 	if (-1 != (ndx = array_get_index(a, str->key->ptr, str->key->used, &pos))) {
193bcdc6a3bSJan Kneschke 		/* found, leave here */
194bcdc6a3bSJan Kneschke 		if (a->data[ndx]->type == str->type) {
195bcdc6a3bSJan Kneschke 			str->insert_dup(a->data[ndx], str);
196bcdc6a3bSJan Kneschke 		} else {
197bcdc6a3bSJan Kneschke 			fprintf(stderr, "a\n");
198bcdc6a3bSJan Kneschke 		}
199bcdc6a3bSJan Kneschke 		return 0;
200bcdc6a3bSJan Kneschke 	}
201bcdc6a3bSJan Kneschke 
202bcdc6a3bSJan Kneschke 	/* insert */
203bcdc6a3bSJan Kneschke 
204bcdc6a3bSJan Kneschke 	if (a->used+1 > INT_MAX) {
205bcdc6a3bSJan Kneschke 		/* we can't handle more then INT_MAX entries: see array_get_index() */
206bcdc6a3bSJan Kneschke 		return -1;
207bcdc6a3bSJan Kneschke 	}
208bcdc6a3bSJan Kneschke 
209bcdc6a3bSJan Kneschke 	if (a->size == 0) {
210bcdc6a3bSJan Kneschke 		a->size   = 16;
211bcdc6a3bSJan Kneschke 		a->data   = malloc(sizeof(*a->data)     * a->size);
212bcdc6a3bSJan Kneschke 		a->sorted = malloc(sizeof(*a->sorted)   * a->size);
213bcdc6a3bSJan Kneschke 		assert(a->data);
214bcdc6a3bSJan Kneschke 		assert(a->sorted);
215bcdc6a3bSJan Kneschke 		for (j = a->used; j < a->size; j++) a->data[j] = NULL;
216bcdc6a3bSJan Kneschke 	} else if (a->size == a->used) {
217bcdc6a3bSJan Kneschke 		a->size  += 16;
218bcdc6a3bSJan Kneschke 		a->data   = realloc(a->data,   sizeof(*a->data)   * a->size);
219bcdc6a3bSJan Kneschke 		a->sorted = realloc(a->sorted, sizeof(*a->sorted) * a->size);
220bcdc6a3bSJan Kneschke 		assert(a->data);
221bcdc6a3bSJan Kneschke 		assert(a->sorted);
222bcdc6a3bSJan Kneschke 		for (j = a->used; j < a->size; j++) a->data[j] = NULL;
223bcdc6a3bSJan Kneschke 	}
224bcdc6a3bSJan Kneschke 
225bcdc6a3bSJan Kneschke 	ndx = (int) a->used;
226bcdc6a3bSJan Kneschke 
227bcdc6a3bSJan Kneschke 	a->data[a->used++] = str;
228bcdc6a3bSJan Kneschke 
229bcdc6a3bSJan Kneschke 	if (pos != ndx &&
230bcdc6a3bSJan Kneschke 	    ((pos < 0) ||
231bcdc6a3bSJan Kneschke 	     buffer_caseless_compare(str->key->ptr, str->key->used, a->data[a->sorted[pos]]->key->ptr, a->data[a->sorted[pos]]->key->used) > 0)) {
232bcdc6a3bSJan Kneschke 		pos++;
233bcdc6a3bSJan Kneschke 	}
234bcdc6a3bSJan Kneschke 
235bcdc6a3bSJan Kneschke 	/* move everything on step to the right */
236bcdc6a3bSJan Kneschke 	if (pos != ndx) {
237bcdc6a3bSJan Kneschke 		memmove(a->sorted + (pos + 1), a->sorted + (pos), (ndx - pos) * sizeof(*a->sorted));
238bcdc6a3bSJan Kneschke 	}
239bcdc6a3bSJan Kneschke 
240bcdc6a3bSJan Kneschke 	/* insert */
241bcdc6a3bSJan Kneschke 	a->sorted[pos] = ndx;
242bcdc6a3bSJan Kneschke 
243bcdc6a3bSJan Kneschke 	if (a->next_power_of_2 == (size_t)ndx) a->next_power_of_2 <<= 1;
244bcdc6a3bSJan Kneschke 
245bcdc6a3bSJan Kneschke 	return 0;
246bcdc6a3bSJan Kneschke }
247bcdc6a3bSJan Kneschke 
2489e75ba00SJan Kneschke void array_print_indent(int depth) {
2499e75ba00SJan Kneschke 	int i;
2509e75ba00SJan Kneschke 	for (i = 0; i < depth; i ++) {
251dd0abe5aSJan Kneschke 		fprintf(stdout, "    ");
2529e75ba00SJan Kneschke 	}
2539e75ba00SJan Kneschke }
2549e75ba00SJan Kneschke 
2556044dbc5SmOo size_t array_get_max_key_length(array *a) {
2566044dbc5SmOo 	size_t maxlen, i;
2576044dbc5SmOo 
2586044dbc5SmOo 	maxlen = 0;
2596044dbc5SmOo 	for (i = 0; i < a->used; i ++) {
2606044dbc5SmOo 		data_unset *du = a->data[i];
2616044dbc5SmOo 		size_t len = strlen(du->key->ptr);
2626044dbc5SmOo 
2636044dbc5SmOo 		if (len > maxlen) {
2646044dbc5SmOo 			maxlen = len;
2656044dbc5SmOo 		}
2666044dbc5SmOo 	}
2676044dbc5SmOo 	return maxlen;
2686044dbc5SmOo }
2696044dbc5SmOo 
2709e75ba00SJan Kneschke int array_print(array *a, int depth) {
271bcdc6a3bSJan Kneschke 	size_t i;
2726044dbc5SmOo 	size_t maxlen;
2736044dbc5SmOo 	int oneline = 1;
274bcdc6a3bSJan Kneschke 
2756044dbc5SmOo 	if (a->used > 5) {
2766044dbc5SmOo 		oneline = 0;
2776044dbc5SmOo 	}
2786044dbc5SmOo 	for (i = 0; i < a->used && oneline; i++) {
2796044dbc5SmOo 		data_unset *du = a->data[i];
280f387d898SmOo 		if (!du->is_index_key) {
2816044dbc5SmOo 			oneline = 0;
2826044dbc5SmOo 			break;
2836044dbc5SmOo 		}
2846044dbc5SmOo 		switch (du->type) {
2856044dbc5SmOo 			case TYPE_INTEGER:
2866044dbc5SmOo 			case TYPE_STRING:
2876044dbc5SmOo 			case TYPE_COUNT:
2886044dbc5SmOo 				break;
2896044dbc5SmOo 			default:
2906044dbc5SmOo 				oneline = 0;
2916044dbc5SmOo 				break;
2926044dbc5SmOo 		}
2936044dbc5SmOo 	}
2946044dbc5SmOo 	if (oneline) {
295dd0abe5aSJan Kneschke 		fprintf(stdout, "(");
296bcdc6a3bSJan Kneschke 		for (i = 0; i < a->used; i++) {
2976044dbc5SmOo 			data_unset *du = a->data[i];
2986044dbc5SmOo 			if (i != 0) {
299dd0abe5aSJan Kneschke 				fprintf(stdout, ", ");
3006044dbc5SmOo 			}
3016044dbc5SmOo 			du->print(du, depth + 1);
3026044dbc5SmOo 		}
303dd0abe5aSJan Kneschke 		fprintf(stdout, ")");
3046044dbc5SmOo 		return 0;
3056044dbc5SmOo 	}
3066044dbc5SmOo 
3076044dbc5SmOo 	maxlen = array_get_max_key_length(a);
308dd0abe5aSJan Kneschke 	fprintf(stdout, "(\n");
3096044dbc5SmOo 	for (i = 0; i < a->used; i++) {
3106044dbc5SmOo 		data_unset *du = a->data[i];
3118b07d57dSJan Kneschke 		array_print_indent(depth + 1);
312f387d898SmOo 		if (!du->is_index_key) {
3136044dbc5SmOo 			int j;
3146044dbc5SmOo 
3156044dbc5SmOo 			if (i && (i % 5) == 0) {
316dd0abe5aSJan Kneschke 				fprintf(stdout, "# %zd\n", i);
3176044dbc5SmOo 				array_print_indent(depth + 1);
3186044dbc5SmOo 			}
319dd0abe5aSJan Kneschke 			fprintf(stdout, "\"%s\"", du->key->ptr);
3206044dbc5SmOo 			for (j = maxlen - strlen(du->key->ptr); j > 0; j --) {
321dd0abe5aSJan Kneschke 				fprintf(stdout, " ");
3226044dbc5SmOo 			}
323dd0abe5aSJan Kneschke 			fprintf(stdout, " => ");
3246044dbc5SmOo 		}
3256044dbc5SmOo 		du->print(du, depth + 1);
326dd0abe5aSJan Kneschke 		fprintf(stdout, ",\n");
3276044dbc5SmOo 	}
3286044dbc5SmOo 	if (!(i && (i - 1 % 5) == 0)) {
3296044dbc5SmOo 		array_print_indent(depth + 1);
330dd0abe5aSJan Kneschke 		fprintf(stdout, "# %zd\n", i);
331bcdc6a3bSJan Kneschke 	}
3328b07d57dSJan Kneschke 	array_print_indent(depth);
333dd0abe5aSJan Kneschke 	fprintf(stdout, ")");
334bcdc6a3bSJan Kneschke 
335bcdc6a3bSJan Kneschke 	return 0;
336bcdc6a3bSJan Kneschke }
337bcdc6a3bSJan Kneschke 
338bcdc6a3bSJan Kneschke #ifdef DEBUG_ARRAY
339bcdc6a3bSJan Kneschke int main (int argc, char **argv) {
340bcdc6a3bSJan Kneschke 	array *a;
341bcdc6a3bSJan Kneschke 	data_string *ds;
342bcdc6a3bSJan Kneschke 	data_count *dc;
343bcdc6a3bSJan Kneschke 
344bcdc6a3bSJan Kneschke 	UNUSED(argc);
345bcdc6a3bSJan Kneschke 	UNUSED(argv);
346bcdc6a3bSJan Kneschke 
347bcdc6a3bSJan Kneschke 	a = array_init();
348bcdc6a3bSJan Kneschke 
349bcdc6a3bSJan Kneschke 	ds = data_string_init();
35052861d77SStefan Bühler 	buffer_copy_string_len(ds->key, CONST_STR_LEN("abc"));
35152861d77SStefan Bühler 	buffer_copy_string_len(ds->value, CONST_STR_LEN("alfrag"));
352bcdc6a3bSJan Kneschke 
353bcdc6a3bSJan Kneschke 	array_insert_unique(a, (data_unset *)ds);
354bcdc6a3bSJan Kneschke 
355bcdc6a3bSJan Kneschke 	ds = data_string_init();
35652861d77SStefan Bühler 	buffer_copy_string_len(ds->key, CONST_STR_LEN("abc"));
35752861d77SStefan Bühler 	buffer_copy_string_len(ds->value, CONST_STR_LEN("hameplman"));
358bcdc6a3bSJan Kneschke 
359bcdc6a3bSJan Kneschke 	array_insert_unique(a, (data_unset *)ds);
360bcdc6a3bSJan Kneschke 
361bcdc6a3bSJan Kneschke 	ds = data_string_init();
36252861d77SStefan Bühler 	buffer_copy_string_len(ds->key, CONST_STR_LEN("123"));
36352861d77SStefan Bühler 	buffer_copy_string_len(ds->value, CONST_STR_LEN("alfrag"));
364bcdc6a3bSJan Kneschke 
365bcdc6a3bSJan Kneschke 	array_insert_unique(a, (data_unset *)ds);
366bcdc6a3bSJan Kneschke 
367bcdc6a3bSJan Kneschke 	dc = data_count_init();
36852861d77SStefan Bühler 	buffer_copy_string_len(dc->key, CONST_STR_LEN("def"));
369bcdc6a3bSJan Kneschke 
370bcdc6a3bSJan Kneschke 	array_insert_unique(a, (data_unset *)dc);
371bcdc6a3bSJan Kneschke 
372bcdc6a3bSJan Kneschke 	dc = data_count_init();
37352861d77SStefan Bühler 	buffer_copy_string_len(dc->key, CONST_STR_LEN("def"));
374bcdc6a3bSJan Kneschke 
375bcdc6a3bSJan Kneschke 	array_insert_unique(a, (data_unset *)dc);
376bcdc6a3bSJan Kneschke 
3779e75ba00SJan Kneschke 	array_print(a, 0);
378bcdc6a3bSJan Kneschke 
379bcdc6a3bSJan Kneschke 	array_free(a);
380bcdc6a3bSJan Kneschke 
381bcdc6a3bSJan Kneschke 	fprintf(stderr, "%d\n",
382bcdc6a3bSJan Kneschke 	       buffer_caseless_compare(CONST_STR_LEN("Content-Type"), CONST_STR_LEN("Content-type")));
383bcdc6a3bSJan Kneschke 
384bcdc6a3bSJan Kneschke 	return 0;
385bcdc6a3bSJan Kneschke }
386bcdc6a3bSJan Kneschke #endif
387