move rx.[hc].
[apps/madmutt.git] / lib / list.c
index bc8133f..7ef6e6c 100644 (file)
 #include <stddef.h>
 #include <string.h>
 
+#include <lib-lib/mem.h>
+#include <lib-lib/str.h>
+
 #include "list.h"
 
-#include "mem.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**)) {
-  size_t i = 0;
+void list_del (list2_t** l, list_del_t* del) {
+  ssize_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,35 +74,34 @@ 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*)) {
+list2_t* list_dup (list2_t* l, void* (*dup_f) (void*)) {
   list2_t* ret = NULL;
   int i = 0;
-  if (list_empty(l) || !*dup)
+  if (list_empty(l) || !*dup_f)
     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]);
+    ret->data[i] = dup_f (l->data[i]);
   return (ret);
 }
 
-int _list_lookup (list2_t* l, int (*cmp) (const void*, const void*), const void* p) {
+int list_lookup (list2_t* l, int (*cmp) (const void*, const void*), const void* p) {
   int i = 0;
   if (list_empty(l) || !*cmp)
     return (-1);
@@ -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 = m_strdup(str);
+  for (p = strtok (tmp, delim); p; p = strtok (NULL, delim)) {
+    list_push_back (&ret, m_strdup(p));
+  }
+  p_delete(&tmp);
+  return (ret);
+}
+