--- psiconv/trunk/lib/psiconv/list.c 2000/12/13 00:42:04 61 +++ psiconv/trunk/lib/psiconv/list.c 2000/12/13 16:17:54 62 @@ -23,8 +23,9 @@ #include #include #include "list.h" +#include "error.h" -static void psiconv_list_resize(psiconv_list l,unsigned int nr); +static int psiconv_list_resize(psiconv_list l,unsigned int nr); struct psiconv_list_s { int cur_len; @@ -37,6 +38,8 @@ { psiconv_list l; l = malloc(sizeof(*l)); + if (!l) + return NULL; l->cur_len = 0; l->max_len = 0; l->el_size=element_size; @@ -77,11 +80,13 @@ return ((char *) (l->els)) + indx * l->el_size; } -void psiconv_list_add(psiconv_list l, void *el) +int psiconv_list_add(psiconv_list l, void *el) { - psiconv_list_resize(l,l->cur_len + 1); + if (psiconv_list_resize(l,l->cur_len + 1)) + return -PSICONV_E_NOMEM; memcpy(((char *) (l->els)) + l->cur_len * l->el_size, el, l->el_size); l->cur_len ++; + return 0; } void psiconv_list_foreach_el(psiconv_list l, void action(void *el)) @@ -96,34 +101,40 @@ psiconv_list l2; int i; l2 = psiconv_list_new(l->el_size); + if (!l2) + return NULL; for (i = 0; i < l->cur_len; i ++) - psiconv_list_add(l2,psiconv_list_get(l,i)); + if (psiconv_list_add(l2,psiconv_list_get(l,i))) { + psiconv_list_free(l2); + return NULL; + } return l2; } -psiconv_list psiconv_list_clone_el(const psiconv_list l,void clone_el(void *el)) -{ - psiconv_list l2 = psiconv_list_clone(l); - psiconv_list_foreach_el(l2,clone_el); - return l2; -} size_t psiconv_list_fread(psiconv_list l,size_t size, FILE *f) { size_t res; - psiconv_list_resize(l,l->cur_len + size); + if (psiconv_list_resize(l,l->cur_len + size)) + return 0; res = fread(((char *) (l->els)) + l->cur_len * l->el_size,l->el_size,size,f); l->cur_len += res; return res; } -void psiconv_list_resize(psiconv_list l,unsigned int nr) +int psiconv_list_resize(psiconv_list l,unsigned int nr) { + void * temp; if (nr > l->max_len) { l->max_len = 1.1 * nr; l->max_len += 16 - l->max_len % 16; - l->els = realloc(l->els,l->max_len * l->el_size); + temp = realloc(l->els,l->max_len * l->el_size); + if (temp) { + l->els = temp; + return 0; + } else + return -PSICONV_E_NOMEM; } }