summaryrefslogtreecommitdiff
path: root/src/storage.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/storage.c')
-rw-r--r--src/storage.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/storage.c b/src/storage.c
new file mode 100644
index 0000000..0ae057c
--- /dev/null
+++ b/src/storage.c
@@ -0,0 +1,136 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "main.h"
+#include "list.h"
+
+typedef struct struct_storage_item
+{
+ char *name;
+ char *group;
+ void *data;
+} storage_item_t;
+
+list_t* newStorage()
+{
+ return newList();
+}
+
+static storage_item_t* newStorageItem(char *group, char *name, void *data)
+{
+ storage_item_t *new;
+
+ assert( name != NULL );
+ assert( group != NULL );
+ assert( data != NULL );
+
+ new = malloc( sizeof(storage_item_t) );
+ new->name = strdup(name);
+ new->group = strdup(group);
+ new->data = data;
+
+ return new;
+}
+
+static void destroyStorageItem(storage_item_t *p, void(*f)(void *))
+{
+ assert( p != NULL );
+ assert( f != NULL );
+
+ f(p->data);
+ free(p->name);
+ free(p->group);
+ free(p);
+}
+
+void addItemToStorage(list_t *list, char *group, char *name, void *data)
+{
+ addList(list, newStorageItem(group, name, data) );
+}
+
+void* getItemFromStorage(list_t *list, char *group, char *name)
+{
+ storage_item_t *this;
+
+ assert( group != NULL );
+ assert( name != NULL );
+
+ int i;
+
+ for(i = 0 ; i < list->count; i++)
+ {
+ this = (storage_item_t *) list->list[i];
+
+ if( strcmp(group, this->group) == 0 && strcmp(name, this->name) == 0 )
+ {
+ return this->data;
+ }
+ }
+
+ printf("%s %s not found in storage !!!\n", group, name);
+ return NULL;
+}
+
+void delItemFromStorage(list_t *list, char *group, char *name, void(*f)(void *))
+{
+ storage_item_t *this;
+
+ assert( group != NULL );
+ assert( name != NULL );
+
+ int i;
+
+ for(i = 0 ; i < list->count; i++)
+ {
+ this = (storage_item_t *) list->list[i];
+
+ if( strcmp(group, this->group) == 0 && strcmp(name, this->name) == 0 )
+ {
+ destroyStorageItem(this, f);
+ delList(list, i);
+ return;
+ }
+ }
+
+ return;
+}
+
+void delAllItemFromStorage(list_t *list, char *group, void(*f)(void *))
+{
+ storage_item_t *this;
+ int i;
+
+ assert( group != NULL );
+
+ for(i = 0 ; i < list->count; i++)
+ {
+ this = (storage_item_t *) list->list[i];
+
+ if( strcmp(group, this->group) == 0 )
+ {
+ destroyStorageItem(this, f);
+ delList(list, i);
+ i--;
+ }
+ }
+}
+
+void destroyStorage(list_t *p, void(*f)(void *) )
+{
+ storage_item_t *this;
+ int i;
+
+ assert( p != NULL );
+ assert( f != NULL );
+
+ for( i = 0 ; i < p->count ; i++ )
+ {
+ this = (storage_item_t *)p->list[i];
+ destroyStorageItem(this, f);
+ }
+
+ destroyList(p);
+}