1 : /*
2 : * $Id: arraylist.c,v 1.4 2006/01/26 02:16:28 mclark Exp $
3 : *
4 : * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
5 : * Michael Clark <michael@metaparadigm.com>
6 : *
7 : * This library is free software; you can redistribute it and/or modify
8 : * it under the terms of the MIT license. See COPYING for details.
9 : *
10 : */
11 :
12 : #include "config.h"
13 :
14 : #if STDC_HEADERS
15 : # include <stdlib.h>
16 : # include <string.h>
17 : #endif /* STDC_HEADERS */
18 :
19 : #if defined HAVE_STRINGS_H && !defined _STRING_H && !defined __USE_BSD
20 : # include <strings.h>
21 : #endif /* HAVE_STRINGS_H */
22 :
23 : #include "bits.h"
24 : #include "arraylist.h"
25 :
26 : struct array_list*
27 : array_list_new(array_list_free_fn *free_fn)
28 325 : {
29 : struct array_list *arr;
30 :
31 325 : arr = (struct array_list*)calloc(1, sizeof(struct array_list));
32 325 : if(!arr) return NULL;
33 325 : arr->size = ARRAY_LIST_DEFAULT_SIZE;
34 325 : arr->length = 0;
35 325 : arr->free_fn = free_fn;
36 325 : if(!(arr->array = (void**)calloc(sizeof(void*), arr->size))) {
37 0 : free(arr);
38 0 : return NULL;
39 : }
40 325 : return arr;
41 : }
42 :
43 : extern void
44 : array_list_free(struct array_list *arr)
45 325 : {
46 : int i;
47 1009 : for(i = 0; i < arr->length; i++)
48 684 : if(arr->array[i]) arr->free_fn(arr->array[i]);
49 325 : free(arr->array);
50 325 : free(arr);
51 325 : }
52 :
53 : void*
54 : array_list_get_idx(struct array_list *arr, int i)
55 718 : {
56 718 : if(i >= arr->length) return NULL;
57 718 : return arr->array[i];
58 : }
59 :
60 : static int array_list_expand_internal(struct array_list *arr, int max)
61 684 : {
62 : void *t;
63 : int new_size;
64 :
65 684 : if(max < arr->size) return 0;
66 0 : new_size = json_max(arr->size << 1, max);
67 0 : if(!(t = realloc(arr->array, new_size*sizeof(void*)))) return -1;
68 0 : arr->array = (void**)t;
69 0 : (void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*));
70 0 : arr->size = new_size;
71 0 : return 0;
72 : }
73 :
74 : int
75 : array_list_put_idx(struct array_list *arr, int idx, void *data)
76 684 : {
77 684 : if(array_list_expand_internal(arr, idx)) return -1;
78 684 : if(arr->array[idx]) arr->free_fn(arr->array[idx]);
79 684 : arr->array[idx] = data;
80 684 : if(arr->length <= idx) arr->length = idx + 1;
81 684 : return 0;
82 : }
83 :
84 : int
85 : array_list_add(struct array_list *arr, void *data)
86 684 : {
87 684 : return array_list_put_idx(arr, arr->length, data);
88 : }
89 :
90 : int
91 : array_list_length(struct array_list *arr)
92 598 : {
93 598 : return arr->length;
94 : }
|