Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "config.h"
00013
00014 #if STDC_HEADERS
00015 # include <stdlib.h>
00016 # include <string.h>
00017 #endif
00018
00019 #if HAVE_STRINGS_H
00020 # include <strings.h>
00021 #endif
00022
00023 #include "bits.h"
00024 #include "arraylist.h"
00025
00026 struct array_list*
00027 array_list_new(array_list_free_fn *free_fn)
00028 {
00029 struct array_list *this;
00030
00031 if(!(this = calloc(1, sizeof(struct array_list)))) return NULL;
00032 this->size = ARRAY_LIST_DEFAULT_SIZE;
00033 this->length = 0;
00034 this->free_fn = free_fn;
00035 if(!(this->array = calloc(sizeof(void*), (size_t) this->size))) {
00036 free(this);
00037 return NULL;
00038 }
00039 return this;
00040 }
00041
00042 extern void
00043 array_list_free(struct array_list *this)
00044 {
00045 int i;
00046 for(i = 0; i < this->length; i++)
00047 if(this->array[i]) this->free_fn(this->array[i]);
00048 free(this->array);
00049 free(this);
00050 }
00051
00052 void*
00053 array_list_get_idx(struct array_list *this, int i)
00054 {
00055 if(i >= this->length) return NULL;
00056 return this->array[i];
00057 }
00058
00059 static int array_list_expand_internal(struct array_list *this, int max)
00060 {
00061 void *t;
00062 int new_size;
00063
00064 if(max < this->size) return 0;
00065 new_size = max(this->size << 1, max);
00066 if(!(t = realloc(this->array, new_size*sizeof(void*)))) return -1;
00067 this->array = t;
00068 (void)memset(this->array + this->size, 0, (new_size-this->size)*sizeof(void*));
00069 this->size = new_size;
00070 return 0;
00071 }
00072
00073 int
00074 array_list_put_idx(struct array_list *this, int idx, void *data)
00075 {
00076 if(array_list_expand_internal(this, idx)) return -1;
00077 if(this->array[idx]) this->free_fn(this->array[idx]);
00078 this->array[idx] = data;
00079 if(this->length <= idx) this->length = idx + 1;
00080 return 0;
00081 }
00082
00083 int
00084 array_list_add(struct array_list *this, void *data)
00085 {
00086 return array_list_put_idx(this, this->length, data);
00087 }
00088
00089 int
00090 array_list_length(struct array_list *this)
00091 {
00092 return this->length;
00093 }