X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib%2Flist.c;h=23dcf2682cf709e45fcea525591029ddb538f81e;hp=7d233e7184ffab01921a02229f34f2e591ba8f36;hb=617e7d83d14e14e6a520a48e75437211b16c8834;hpb=fa7f733a61a6fe3143198791ab470ddf4d08fdbe diff --git a/lib/list.c b/lib/list.c index 7d233e7..23dcf26 100644 --- a/lib/list.c +++ b/lib/list.c @@ -10,36 +10,38 @@ #include #include +#include + #include "list.h" -#include "mem.h" +#include "str.h" list2_t* list_new (void) { - return (safe_calloc (1, sizeof (list2_t))); + return p_new(list2_t, 1); } -void list_del (list2_t** l, void (*edel) (void**)) { +void list_del (list2_t** l, list_del_t* del) { size_t i = 0; if (!l || !*l) return; - if (*edel) + if (del) for (i = 0; i < (*l)->length; i++) - edel (&(*l)->data[i]); - FREE(&(*l)->data); - FREE(l); + del (&(*l)->data[i]); + p_delete(&(*l)->data); + p_delete(l); } void list_push_back (list2_t** l, void* p) { if (!*l) *l = list_new (); - safe_realloc (&(*l)->data, (++(*l)->length)*sizeof(void*)); + p_realloc(&(*l)->data, ++(*l)->length); (*l)->data[(*l)->length-1] = p; } void list_push_front (list2_t** l, void* p) { if (!*l) *l = list_new (); - safe_realloc (&(*l)->data, (++(*l)->length)*sizeof(void*)); + p_realloc(&(*l)->data, ++(*l)->length); if ((*l)->length > 1) memmove (&(*l)->data[1], &(*l)->data[0], ((*l)->length-1)*sizeof(void*)); (*l)->data[0] = p; @@ -50,7 +52,7 @@ void* list_pop_back (list2_t* l) { if (list_empty(l)) return (NULL); p = l->data[l->length-1]; - safe_realloc (&l->data, --(l->length)*sizeof(void*)); + p_realloc(&l->data, --(l->length)); return (p); } @@ -60,7 +62,7 @@ void* list_pop_front (list2_t* l) { return (NULL); p = l->data[0]; memmove (&l->data[0], &l->data[1], (--(l->length))*sizeof(void*)); - safe_realloc (&l->data, l->length*sizeof(void*)); + p_realloc(&l->data, l->length); return (p); } @@ -72,19 +74,18 @@ void* list_pop_idx (list2_t* l, int c) { return (list_pop_back (l)); p = l->data[c]; memmove (&l->data[c], &l->data[c+1], (l->length-c)*sizeof(void*)); - safe_realloc (&l->data, (--(l->length))*sizeof(void*)); + p_realloc(&l->data, --(l->length)); return (p); } -list2_t* list_cpy (list2_t* l) { - list2_t* ret = NULL; - if (list_empty(l)) - return (NULL); - ret = list_new (); - ret->length = l->length; - ret->data = safe_malloc (l->length*sizeof(void*)); - memcpy (ret->data, l->data, l->length*sizeof(void*)); - return (ret); +list2_t *list_cpy(list2_t *l) { + list2_t* ret = NULL; + if (list_empty(l)) + return NULL; + ret = list_new(); + ret->length = l->length; + ret->data = p_dup(l->data, l->length); + return ret; } list2_t* list_dup (list2_t* l, void* (*dup) (void*)) { @@ -94,7 +95,7 @@ list2_t* list_dup (list2_t* l, void* (*dup) (void*)) { return (NULL); ret = list_new (); ret->length = l->length; - ret->data = safe_malloc (l->length*sizeof(void*)); + ret->data = p_new(void*, l->length); for (i = 0; i < l->length; i++) ret->data[i] = dup (l->data[i]); return (ret); @@ -109,3 +110,19 @@ int list_lookup (list2_t* l, int (*cmp) (const void*, const void*), const void* return (i); return (-1); } + +list2_t* list_from_str (const char* str, const char* delim) { + list2_t* ret = NULL; + char* tmp = NULL, *p = NULL; + + if (!str || !*str || !delim || !*delim) + return (NULL); + + tmp = str_dup (str); + for (p = strtok (tmp, delim); p; p = strtok (NULL, delim)) { + list_push_back (&ret, str_dup (p)); + } + p_delete(&tmp); + return (ret); +} +