--- psiconv/trunk/lib/psiconv/list.c 2000/12/20 22:07:49 70 +++ psiconv/trunk/lib/psiconv/list.c 2000/12/25 00:26:53 76 @@ -19,6 +19,7 @@ #include "config.h" +#include "compat.h" #include #include #include @@ -82,8 +83,9 @@ int psiconv_list_add(psiconv_list l, const void *el) { - if (psiconv_list_resize(l,l->cur_len + 1)) - return -PSICONV_E_NOMEM; + int res; + if ((res = psiconv_list_resize(l,l->cur_len + 1))) + return res; memcpy(((char *) (l->els)) + l->cur_len * l->el_size, el, l->el_size); l->cur_len ++; return 0; @@ -112,7 +114,6 @@ } - size_t psiconv_list_fread(psiconv_list l,size_t size, FILE *f) { size_t res; @@ -123,6 +124,29 @@ return res; } +int psiconv_list_fread_all(psiconv_list l, FILE *f) +{ + while (!feof(f)) { + if (!psiconv_list_fread(l,1024,f) && !feof(f)) + return -PSICONV_E_NOMEM; + } + return -PSICONV_E_OK; +} + +int psiconv_list_fwrite_all(const psiconv_list l, FILE *f) +{ + int pos = 0; + int written; + int len = psiconv_list_length(l); + while (pos < len) { + if (!(written = fwrite(((char *)(l->els)) + pos * l->el_size,l->el_size, + len - pos,f))) + return -PSICONV_E_OTHER; + pos += written; + } + return -PSICONV_E_OK; +} + int psiconv_list_resize(psiconv_list l,unsigned int nr) { void * temp; @@ -132,10 +156,24 @@ temp = realloc(l->els,l->max_len * l->el_size); if (temp) { l->els = temp; - return 0; + return -PSICONV_E_OK; } else return -PSICONV_E_NOMEM; } - return 0; + return -PSICONV_E_OK; } +int psiconv_list_concat(psiconv_list l, const psiconv_list extra) +{ + int res; + if (l->el_size != extra->el_size) + return -PSICONV_E_OTHER; + if ((res = psiconv_list_resize(l, + l->cur_len + extra->cur_len))) + return res; + /* Unreadable but correct. */ + memcpy(((char *) (l->els)) + l->cur_len * l->el_size,extra->els, + extra->cur_len * extra->el_size); + l->cur_len += extra->cur_len; + return 0; +}