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