From 9085029da5b3667ee33d3a60f5ae1c9a24a9b012 Mon Sep 17 00:00:00 2001
From: "alexey.stratulat" <alexey.stratulat@demlabs.net>
Date: Thu, 23 Apr 2020 17:47:58 +0700
Subject: [PATCH] [+] Added functionality, deleting data from the list.

---
 include/dap_chain_plugins_list.h     |  1 +
 include/dap_chain_plugins_manifest.h | 10 +++++
 src/dap_chain_plugins_list.c         |  4 ++
 src/dap_chain_plugins_manifest.c     | 67 ++++++++++++++++++++++++++++
 4 files changed, 82 insertions(+)

diff --git a/include/dap_chain_plugins_list.h b/include/dap_chain_plugins_list.h
index 7eec9695..ad31b73f 100644
--- a/include/dap_chain_plugins_list.h
+++ b/include/dap_chain_plugins_list.h
@@ -32,6 +32,7 @@ bool dap_chain_plugins_list_check_load_plugins(dap_chain_plugins_list_char_t *li
 
 void dap_chain_plugins_list_add(PyObject *module, const char *name);
 void dap_chain_plugins_list_name_del(const char *name);
+int dap_chain_plugins_list_name_cmp(dap_chain_plugin_list_module_t *element, const char *name);
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/include/dap_chain_plugins_manifest.h b/include/dap_chain_plugins_manifest.h
index 107a6c21..4072c28e 100644
--- a/include/dap_chain_plugins_manifest.h
+++ b/include/dap_chain_plugins_manifest.h
@@ -19,6 +19,8 @@ typedef struct dap_chain_plugins_list_char{
     struct dap_chain_plugins_list_char *next;
 }dap_chain_plugins_list_char_t;
 
+void dap_chain_plugins_list_char_delete_all(dap_chain_plugins_list_char_t *list);
+
 typedef struct dap_list_manifest{
     char *name;
     char *version;
@@ -30,17 +32,25 @@ typedef struct dap_list_manifest{
 
 dap_chain_plugins_list_manifest_t* manifests;
 
+int dap_chain_plugins_manifest_name_cmp(dap_chain_plugins_list_manifest_t *man, const char *name);
+
 dap_chain_plugins_list_manifest_t *dap_chain_plugins_manifest_new(const char *name, const char *version, const dap_chain_plugins_list_char_t *dep, const char *author,
                          const char *description);
 
 void dap_chain_plugins_manifest_list_create();
 
 dap_chain_plugins_list_manifest_t* dap_chain_plugins_manifests_get_list();
+dap_chain_plugins_list_manifest_t *dap_chain_plugins_manifest_list_get_name(const char *name);
+
+char* dap_chain_plugins_manifests_get_list_dependencyes(dap_chain_plugins_list_manifest_t *element);
 
 dap_chain_plugins_list_manifest_t* dap_chain_plugins_add_manifest_from_file(const char *file_path);
 
 bool dap_chain_plugins_manifest_list_add_from_file(const char *path_file);
 
+bool dap_chain_plugins_manifest_list_delete_name(const char *name);
+void dap_chain_plugins_manifest_list_delete_all(void);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/dap_chain_plugins_list.c b/src/dap_chain_plugins_list.c
index cac4d703..3593a804 100644
--- a/src/dap_chain_plugins_list.c
+++ b/src/dap_chain_plugins_list.c
@@ -55,3 +55,7 @@ void dap_chain_plugins_list_name_del(const char *name){
     }
 }
 
+int dap_chain_plugins_list_name_cmp(dap_chain_plugin_list_module_t *element, const char *name){
+    return strcmp(element->name, name);
+}
+
diff --git a/src/dap_chain_plugins_manifest.c b/src/dap_chain_plugins_manifest.c
index 4a202f98..840b9ac0 100644
--- a/src/dap_chain_plugins_manifest.c
+++ b/src/dap_chain_plugins_manifest.c
@@ -1,5 +1,14 @@
 #include "dap_chain_plugins_manifest.h"
 
+void dap_chain_plugins_list_char_delete_all(dap_chain_plugins_list_char_t *list){
+    dap_chain_plugins_list_char_t *element;
+    dap_chain_plugins_list_char_t *tmp;
+    LL_FOREACH_SAFE(list, element, tmp){
+        DAP_FREE(element->value);
+        LL_DELETE(list, element);
+    }
+}
+
 dap_chain_plugins_list_manifest_t *dap_chain_plugins_manifest_new(const char *name, const char *version, const dap_chain_plugins_list_char_t *dep, const char *author,
                                                     const char *description){
     dap_chain_plugins_list_manifest_t *man = (dap_chain_plugins_list_manifest_t*)DAP_NEW(dap_chain_plugins_list_manifest_t);
@@ -34,6 +43,10 @@ void dap_chain_plugins_manifest_list_create(){
     manifests = NULL;
 }
 
+int dap_chain_plugins_manifest_name_cmp(dap_chain_plugins_list_manifest_t *man, const char *name){
+    return dap_strcmp(man->name, name);
+}
+
 dap_chain_plugins_list_manifest_t* dap_chain_plugins_add_manifest_from_file(const char *file_path){
     //READ File in char
     log_it(L_INFO, "Parse json file");
@@ -75,6 +88,33 @@ dap_chain_plugins_list_manifest_t* dap_chain_plugins_manifests_get_list(){
     return manifests;
 }
 
+dap_chain_plugins_list_manifest_t *dap_chain_plugins_manifest_list_get_name(const char *name){
+    dap_chain_plugins_list_manifest_t *element;
+    LL_SEARCH(manifests, element, name, dap_chain_plugins_manifest_name_cmp);
+    return element;
+}
+
+char* dap_chain_plugins_manifests_get_list_dependencyes(dap_chain_plugins_list_manifest_t *element){
+    char *result = NULL;
+    dap_chain_plugins_list_char_t *e1;
+    LL_FOREACH(element->dependencys, e1){
+        char *new_result = dap_strjoin(NULL, result, e1->value, ", ");
+        DAP_FREE(result);
+        result = new_result;
+    }
+    if (result != NULL){
+        size_t size_result = dap_strlen(result);
+        size_t new_size_result = size_result - 2;
+        char *new_result = DAP_NEW_SIZE(char, new_size_result);
+        memcpy(new_result, result, new_size_result);
+        DAP_FREE(result);
+        result = new_result;
+    } else {
+        result = "";
+    }
+    return result;
+}
+
 bool dap_chain_plugins_manifest_list_add_from_file(const char *file_path){
     dap_chain_plugins_list_manifest_t *manifest = dap_chain_plugins_add_manifest_from_file(file_path);
     if (manifest == NULL)
@@ -82,3 +122,30 @@ bool dap_chain_plugins_manifest_list_add_from_file(const char *file_path){
     dap_chain_plugins_manifest_list_add_manifest(manifest);
     return true;
 }
+
+bool dap_chain_plugins_manifest_list_delete_name(const char *name){
+    dap_chain_plugins_list_manifest_t *element;
+    LL_SEARCH(manifests, element, name, dap_chain_plugins_manifest_name_cmp);
+    if (element == NULL)
+        return false;
+    DAP_FREE(element->name);
+    DAP_FREE(element->version);
+    DAP_FREE(element->author);
+    DAP_FREE(element->description);
+    dap_chain_plugins_list_char_delete_all(element->dependencys);
+    LL_DELETE(manifests, element);
+    return true;
+}
+void dap_chain_plugins_manifest_list_delete_all(void){
+    dap_chain_plugins_list_manifest_t *element;
+    dap_chain_plugins_list_manifest_t *tmp;
+    LL_FOREACH_SAFE(manifests, element, tmp){
+        DAP_FREE(element->name);
+        DAP_FREE(element->version);
+        DAP_FREE(element->author);
+        DAP_FREE(element->description);
+        dap_chain_plugins_list_char_delete_all(element->dependencys);
+        LL_DELETE(manifests, element);
+    }
+//    LL_FOREACH_SAFE()
+}
-- 
GitLab