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 5248 : array_list_new(array_list_free_fn *free_fn)
28 : {
29 : struct array_list *arr;
30 :
31 5248 : arr = (struct array_list*)calloc(1, sizeof(struct array_list));
32 5248 : if(!arr) return NULL;
33 5248 : arr->size = ARRAY_LIST_DEFAULT_SIZE;
34 5248 : arr->length = 0;
35 5248 : arr->free_fn = free_fn;
36 5248 : if((arr->array = (void**)calloc(sizeof(void*), arr->size)) == NULL) {
37 0 : free(arr);
38 0 : return NULL;
39 : }
40 5248 : return arr;
41 : }
42 :
43 : extern void
44 5248 : array_list_free(struct array_list *arr)
45 : {
46 : int i;
47 20040 : for(i = 0; i < arr->length; i++)
48 14792 : if(arr->array[i]) arr->free_fn(arr->array[i]);
49 5248 : free(arr->array);
50 5248 : free(arr);
51 5248 : }
52 :
53 : void*
54 6909 : array_list_get_idx(struct array_list *arr, int i)
55 : {
56 6909 : if(i >= arr->length) return NULL;
57 6909 : return arr->array[i];
58 : }
59 :
60 14792 : static int array_list_expand_internal(struct array_list *arr, int max)
61 : {
62 : void *t;
63 : int new_size;
64 :
65 14792 : if(max < arr->size) return 0;
66 18 : new_size = json_max(arr->size << 1, max);
67 18 : if((t = realloc(arr->array, new_size*sizeof(void*))) == NULL) return -1;
68 18 : arr->array = (void**)t;
69 18 : (void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*));
70 18 : arr->size = new_size;
71 18 : return 0;
72 : }
73 :
74 : int
75 14792 : array_list_put_idx(struct array_list *arr, int idx, void *data)
76 : {
77 14792 : if(array_list_expand_internal(arr, idx)) return -1;
78 14792 : if(arr->array[idx]) arr->free_fn(arr->array[idx]);
79 14792 : arr->array[idx] = data;
80 14792 : if(arr->length <= idx) arr->length = idx + 1;
81 14792 : return 0;
82 : }
83 :
84 : int
85 14792 : array_list_add(struct array_list *arr, void *data)
86 : {
87 14792 : return array_list_put_idx(arr, arr->length, data);
88 : }
89 :
90 : int
91 2797 : array_list_length(struct array_list *arr)
92 : {
93 2797 : return arr->length;
94 : }
|