Add toolchain and mbtk source

Change-Id: Ie12546301367ea59240bf23d5e184ad7e36e40b3
diff --git a/mbtk/mbtk_lib/src/mbtk_map.c b/mbtk/mbtk_lib/src/mbtk_map.c
new file mode 100755
index 0000000..061a538
--- /dev/null
+++ b/mbtk/mbtk_lib/src/mbtk_map.c
@@ -0,0 +1,242 @@
+/*
+ * mbtk_map.c
+ *
+ *  Created on: Aug 18, 2020
+ *      Author: lb
+ */
+#include <stdlib.h>
+#include <string.h>
+#include "mbtk_map.h"
+
+map_node_t* map_create(uint32 capacity, map_free_func free_func)
+{
+    if (capacity > 0) {
+        map_node_t *map = (map_node_t*) malloc(sizeof(map_node_t));
+        if (map) {
+            memset(map, 0x0, sizeof(map_node_t));
+            map->size = 0;
+            map->cur_index = 0;
+            map->cur_data = NULL;
+            map->capacity = (uint32) (capacity * 0.75f); // Default 0.75
+            if(map->capacity < 1) {
+                free(map);
+                return NULL;
+            }
+            map->free_func = free_func;
+            map->map_array = (map_data_t**) malloc(
+                    sizeof(map_data_t*) * map->capacity);
+            uint32 i = 0;
+            while (i < map->capacity) {
+                map->map_array[i] = NULL;
+                i++;
+            }
+            return map;
+        }
+    }
+
+    return NULL;
+}
+
+uint32 map_size(map_node_t* map)
+{
+    if (map) {
+        return map->size;
+    }
+
+    return 0;
+}
+
+uint32 map_hash(const char* key, uint32 capacity)
+{
+    uint32 hash = 0;
+    const uint8 *ptr = (const uint8*) key;
+    while (*ptr) {
+        hash = 31 * hash + *ptr;
+        ptr++;
+    }
+
+    return hash % capacity;
+}
+
+void map_put(map_node_t* map, const char* key, void* value)
+{
+    if (map && key && strlen(key) > 0 && value) {
+        uint32 index = map_hash(key, map->capacity);
+
+        map_data_t *ptr = map->map_array[index];
+        if (!ptr) { // Add to first position.
+            ptr = (map_data_t*) malloc(sizeof(map_data_t));
+            ptr->key = strdup(key);
+            ptr->value = value;
+            ptr->next = NULL;
+
+            map->size++;
+            map->map_array[index] = ptr;
+        } else { // This position has one item at least.
+            if (!memcmp(ptr->key, key, strlen(key))) { // Has this item,will change.
+                if (map->free_func) {
+                    map->free_func(ptr->value);
+                }
+
+                ptr->value = value;
+            } else {
+                while (ptr->next) {
+                    if (!memcmp(ptr->next->key, key, strlen(key))) // Has this item,will change.
+                        break;
+                    ptr = ptr->next;
+                }
+
+                if (!ptr->next) { // Add new item.
+                    ptr->next = (map_data_t*) malloc(sizeof(map_data_t));
+
+                    ptr->next->key = strdup(key);
+                    ptr->next->value = value;
+                    ptr->next->next = NULL;
+                    map->size++;
+                } else { // Change item.
+                    if (map->free_func) {
+                        map->free_func(ptr->next->value);
+                    }
+
+                    ptr->next->value = value;
+                }
+            }
+        }
+    }
+}
+
+void* map_get(map_node_t* map, char* key)
+{
+    if (map && key && strlen(key) > 0) {
+        uint32 index = map_hash(key, map->capacity);
+        map_data_t *ptr = map->map_array[index];
+        while (ptr) {
+            if (ptr->key && !memcmp(ptr->key, key, strlen(key))) {
+                return ptr->value;
+            }
+            ptr = ptr->next;
+        }
+    }
+    return NULL;
+}
+
+void* map_remove(map_node_t* map, char* key)
+{
+    if (map && key && strlen(key) > 0) {
+        uint32 index = map_hash(key, map->capacity);
+        map_data_t *ptr = map->map_array[index];
+        if (!ptr) { // No items.
+            return NULL;
+        }
+
+        if (!memcmp(ptr->key, key, strlen(key))) { // Is first item
+            map_data_t *temp = ptr;
+            void *result = temp->value;
+            map->map_array[index] = ptr->next;
+            free(temp);
+            map->size--;
+
+            return result;
+        } else {
+            while (ptr->next) {
+                if (!memcmp(ptr->next->key, key, strlen(key))) {
+                    map_data_t *temp = ptr->next;
+                    void *result = temp->value;
+                    ptr->next = temp->next;
+                    free(temp);
+                    map->size--;
+
+                    return result;
+                }
+                ptr = ptr->next;
+            }
+        }
+    }
+    return NULL;
+}
+
+void map_first(map_node_t *map)
+{
+    if (map) {
+        map->cur_index = 0;
+        map->cur_data = map->map_array[0];
+    }
+}
+
+void* map_next(map_node_t *map)
+{
+    if (map) {
+        while (1) {
+            if (map->cur_data) {
+                void *result = map->cur_data;
+                map->cur_data = map->cur_data->next;
+                return result;
+            } else {
+                map->cur_index++;
+                if (map->cur_index < map->capacity) {
+                    map->cur_data = map->map_array[map->cur_index];
+                } else { // Finish
+                    return NULL;
+                }
+            }
+        }
+    } else {
+        return NULL;
+    }
+}
+
+void map_clear(map_node_t* map)
+{
+    if (map) {
+        uint32 i = 0;
+        map_data_t *ptr = NULL;
+        while (i < map->capacity) {
+            ptr = map->map_array[i];
+            while (ptr) {
+                map->map_array[i] = ptr->next;
+
+                free(ptr->key);
+                if (map->free_func) {
+                    map->free_func(ptr->value);
+                }
+                free(ptr);
+
+                ptr = map->map_array[i];
+            }
+            i++;
+        }
+
+        map->size = 0;
+        map->cur_index = 0;
+        map->cur_data = NULL;
+        memset(map->map_array, 0x0,
+                sizeof(sizeof(map_data_t*) * map->capacity));
+    }
+}
+
+void map_free(map_node_t* map)
+{
+    if (map) {
+        uint32 i = 0;
+        map_data_t *ptr = NULL;
+        while (i < map->capacity) {
+            ptr = map->map_array[i];
+            while (ptr) {
+                map->map_array[i] = ptr->next;
+
+                free(ptr->key);
+                if (map->free_func) {
+                    map->free_func(ptr->value);
+                }
+                free(ptr);
+
+                ptr = map->map_array[i];
+            }
+            i++;
+        }
+
+        free(map->map_array);
+        free(map);
+    }
+}
+