Imported Upstream version 0.9.2
[platform/upstream/iotivity.git] / resource / csdk / connectivity / common / src / uarraylist.c
index a618e51..be897be 100644 (file)
 #include "logger.h"
 #include "oic_malloc.h"
 
-#define TAG PCF("UARRAYLIST")
+#define TAG "UARRAYLIST"
+
+/**
+ * Use this default size when initialized
+ */
+#define U_ARRAYLIST_DEFAULT_SIZE 1
 
 u_arraylist_t *u_arraylist_create()
 {
     u_arraylist_t *list = NULL;
 
-    if (!(list = (u_arraylist_t*) OICMalloc(sizeof(u_arraylist_t))))
+    list = (u_arraylist_t *) OICMalloc(sizeof(u_arraylist_t));
+    if (!list)
     {
         return NULL;
     }
@@ -38,33 +44,39 @@ u_arraylist_t *u_arraylist_create()
     list->size = U_ARRAYLIST_DEFAULT_SIZE;
     list->length = 0;
 
-    if (!(list->data = (void*) OICMalloc(list->size * sizeof(void*))))
+    list->data = (void *) OICMalloc(list->size * sizeof(void *));
+    if (!list->data)
     {
+        OIC_LOG(DEBUG, TAG, "Out of memory");
         OICFree(list);
         return NULL;
     }
-
     return list;
 }
 
-CAResult_t u_arraylist_free(u_arraylist_t *list)
+CAResult_t u_arraylist_free(u_arraylist_t **list)
 {
-    OICFree(list->data);
-    OICFree(list);
+    if (!list || !(*list))
+    {
+        return CA_STATUS_INVALID_PARAM;
+    }
 
-    list = NULL;
+    OICFree((*list)->data);
+    OICFree(*list);
+
+    *list = NULL;
 
     return CA_STATUS_OK;
 }
 
 void *u_arraylist_get(const u_arraylist_t *list, uint32_t index)
 {
-    if (index >= list->length)
+    if (!list )
     {
         return NULL;
     }
 
-    if (list->data)
+    if ((index < list->length) && (list->data))
     {
         return list->data[index];
     }
@@ -74,31 +86,39 @@ void *u_arraylist_get(const u_arraylist_t *list, uint32_t index)
 
 CAResult_t u_arraylist_add(u_arraylist_t *list, void *data)
 {
-    uint32_t new_size = 0;
+    if (!list)
+    {
+        return CA_STATUS_INVALID_PARAM;
+    }
 
     if (list->size <= list->length)
     {
 
-        new_size = list->size + 1;
+       uint32_t new_size = list->size + 1;
         if (!(list->data = (void **) realloc(list->data, new_size * sizeof(void *))))
         {
-            return -1;
+            return CA_MEMORY_ALLOC_FAILED;
         }
 
-        (void) memset(list->data + list->size, 0, (new_size - list->size) * sizeof(void *));
+        memset(list->data + list->size, 0, (new_size - list->size) * sizeof(void *));
         list->size = new_size;
     }
 
     list->data[list->length] = data;
     list->length++;
 
-    return 0;
+    return CA_STATUS_OK;
 }
 
 void *u_arraylist_remove(u_arraylist_t *list, uint32_t index)
 {
     void *removed = NULL;
 
+    if (!list)
+    {
+        return NULL;
+    }
+
     if (index >= list->length)
     {
         return NULL;
@@ -115,6 +135,9 @@ void *u_arraylist_remove(u_arraylist_t *list, uint32_t index)
     list->size--;
     list->length--;
 
+    // check minimum size.
+    list->size = (list->size <= U_ARRAYLIST_DEFAULT_SIZE) ? U_ARRAYLIST_DEFAULT_SIZE : list->size;
+
     if (!(list->data = (void **) realloc(list->data, list->size * sizeof(void *))))
     {
         return NULL;
@@ -125,25 +148,47 @@ void *u_arraylist_remove(u_arraylist_t *list, uint32_t index)
 
 uint32_t u_arraylist_length(const u_arraylist_t *list)
 {
+    if (!list)
+    {
+        OIC_LOG(DEBUG, TAG, "Invalid Parameter");
+        return 0;
+    }
     return list->length;
 }
 
-uint8_t u_arraylist_contains(const u_arraylist_t *list, void *data)
+bool u_arraylist_contains(const u_arraylist_t *list,const void *data)
 {
     uint32_t i = 0;
 
-    for (i = 0; i < u_arraylist_length(list); i++)
+    if (!list)
+    {
+        return false;
+    }
+
+    uint32_t length = u_arraylist_length(list);
+
+    for (i = 0; i < length; i++)
     {
         if (data == u_arraylist_get(list, i))
         {
-            return 1;
-        }
-        else
-        {
-            continue;
+            return true;
         }
     }
 
-    return 0;
+    return false;
 }
 
+// Assumes elements are shallow (have no pointers to allocated memory)
+void u_arraylist_destroy(u_arraylist_t *list)
+{
+    if (!list)
+    {
+        return;
+    }
+    uint32_t len = u_arraylist_length(list);
+    for (uint32_t i = 0; i < len; i++)
+    {
+        OICFree(u_arraylist_get(list, i));
+    }
+    (void)u_arraylist_free(&list);
+}