From dd6948d743ee6985eaf18e16e16bd430ce814c59 Mon Sep 17 00:00:00 2001 From: lomna-dev Date: Tue, 23 May 2023 16:56:09 +0530 Subject: [PATCH] First Commit --- clean.tsk | 4 ++ example.c | 43 +++++++++++++ lookup_list.h | 163 ++++++++++++++++++++++++++++++++++++++++++++++++++ main.tsk | 7 +++ 4 files changed, 217 insertions(+) create mode 100644 clean.tsk create mode 100644 example.c create mode 100644 lookup_list.h create mode 100644 main.tsk diff --git a/clean.tsk b/clean.tsk new file mode 100644 index 0000000..d2a5512 --- /dev/null +++ b/clean.tsk @@ -0,0 +1,4 @@ +*Remove +#do +rm created_binary +rm test \ No newline at end of file diff --git a/example.c b/example.c new file mode 100644 index 0000000..9dbc212 --- /dev/null +++ b/example.c @@ -0,0 +1,43 @@ +#include +#include "lookup_list.h" + +int main(){ + + // Creating a new list + LookupList *l = NULL; + // Adding stuff + LookupList_add(&l, "Key1", "Value 1"); + LookupList_add(&l, "Key2", "Value 2"); + LookupList_add(&l, "Key3", "Value 3"); + LookupList_add(&l, "Key4", "Value 4"); + LookupList_add(&l, "Key5", "Value 5"); + LookupList_add(&l, "Key6", "Value 6"); + + // Printing list + LookupList_print(l); + + // Removing stuff + LookupList_remove(&l, "Key1"); + LookupList_remove(&l, "Key3"); + LookupList_remove(&l, "Key6"); + LookupList_print(l); + + // Retrieving using key + printf("%s\n",LookupList_get(l, "Key2", "")); + + // Replacing old value + printf("%s\n",LookupList_get(l, "Key5", "")); + LookupList_add(&l, "Key5", "Replaced Value 5"); + printf("%s\n",LookupList_get(l, "Key5", "")); + + // Storing list as a binary + LookupList_store(l, "created_binary"); + + // Loading list from binary + LookupList *l1 = NULL; + LookupList_load(&l1, "created_binary"); + assert(l1 != NULL); + LookupList_print(l1); + + return 0; +} diff --git a/lookup_list.h b/lookup_list.h new file mode 100644 index 0000000..70c948e --- /dev/null +++ b/lookup_list.h @@ -0,0 +1,163 @@ +#ifndef INCLUDED_LOOKUP_LIST_H +#define INCLUDED_LOOKUP_LIST_H + +#include +#include +#include +#include +#include + +// Both key and value will be string +typedef struct LookupList{ + char *key; + char *value; + struct LookupList *next; +} LookupList; + +// return -1 on failure +int LookupList_add(LookupList **list ,char *key, char *value){ + // Search in list for key and change value + LookupList *i = *list; + while(i != NULL){ + if(strcmp(i->key, key) == 0 ){ + i->value = value; + return 0; + } + i = i->next; + } + + // Create new node if key not in list + LookupList *node = (LookupList *) malloc(sizeof(LookupList)); + if(node == NULL) return -1; + + node->key = key; + node->value = value; + node->next = *list; + *list = node; + + return 0; +} + +// Does not try to free key and value strings +void LookupList_remove(LookupList **list, char *key){ + LookupList *a = *list; + if(a == NULL) return; + if(strcmp(key, a->key) == 0){ + *list = (*list)->next; + free(a); + return; + } + + LookupList *b = a->next; + while(b != NULL){ + if(strcmp(key, b->key) == 0){ + a->next = b->next; + free(b); + return; + } + + a = b; + b = b->next; + } +} + +char *LookupList_get(LookupList *list, char *key, char *r){ + while(list != NULL){ + if(strcmp(list->key, key) == 0 ) + return list->value; + list = list->next; + } + return r; +} + +void LookupList_print(LookupList *list){ + printf("{ "); + while(list != NULL){ + printf("\"%s\" : \"%s\" ,", list->key, list->value); + list = list->next; + } + printf("}\n"); +} + +// The binary will first have a uint32_t equal to the number of (key,value) pairs. +// Then we kill have char[] that are seperated using \0 in key1, value1, key2, value2, key3, value3 .... for all pairs. +void LookupList_store(LookupList *list, char *filename){ + uint32_t n = 0; + LookupList *t = list; + while(t != NULL){ + n += 1; + t = t->next; + } + + t = list; + FILE *f = fopen(filename, "wb"); + fwrite(&n, sizeof(uint32_t), 1, f); + for(int i = 0; i < n; i++){ + size_t len_key = 0; + size_t len_value = 0; + + while(t->key[len_key++] != '\0'); + while(t->value[len_value++] != '\0'); + + fwrite(t->key, sizeof(char), len_key, f); + fwrite(t->value, sizeof(char), len_value, f); + t = t->next; + } + fclose(f); +} + +void LookupList_load(LookupList **l, char *filename){ + FILE *f = fopen(filename, "rb"); + assert(f != NULL); + + uint32_t n = 0; + fread(&n, sizeof(uint32_t), 1, f); + + for(int i = 0; i < n; i++){ + + size_t key_capacity = 10; + char *key = (char *) malloc(sizeof(char) * key_capacity); + assert(key != NULL); + int j = 0; + + + while(1){ + + if((j+1) == key_capacity){ + key_capacity *= 2; + key = (char *) realloc(key, sizeof(char) * key_capacity); + assert(key != NULL); + } + + fread((key + j), sizeof(char), 1, f); + if (key[j] == '\0') + break; + + j++; + } + + size_t value_capacity = 10; + char *value = (char *) malloc(sizeof(char) * value_capacity); + assert(value != NULL); + j = 0; + + while(1){ + if((j+1) == value_capacity){ + value_capacity *= 2; + value = (char *) realloc(value, sizeof(char) * value_capacity); + assert(value != NULL); + } + + fread((value + j), sizeof(char), 1, f); + if (value[j] == '\0') + break; + j++; + } + + LookupList_add(l, key, value); + } + + fclose(f); +} + +#endif diff --git a/main.tsk b/main.tsk new file mode 100644 index 0000000..e125be3 --- /dev/null +++ b/main.tsk @@ -0,0 +1,7 @@ +*Compile +#do +gcc -o test example.c -Wall -g + +*Run +#do +./test