build sys, free, delete
This commit is contained in:
5 files changed
+97
No files matched your search
@@ -1 +1,2 @@
|
|||||||
bin/*
|
bin/*
|
||||||
|
obj/*
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
TARGET = bin/final
|
||||||
|
SRC = $(wildcard src/*c)
|
||||||
|
OBJ = $(patsubst src/%.c, obj/%.o, $(SRC))
|
||||||
|
|
||||||
|
default: $(TARGET)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f obj/*.o
|
||||||
|
rm -f bin/*
|
||||||
|
|
||||||
|
$(TARGET): $(OBJ)
|
||||||
|
gcc -o $@ $?
|
||||||
|
|
||||||
|
obj/%.o : src/%.c
|
||||||
|
gcc -c $< -o $@ -Iinc
|
||||||
@@ -19,5 +19,7 @@ typedef struct
|
|||||||
kv_t *kv_init(size_t capacity);
|
kv_t *kv_init(size_t capacity);
|
||||||
int kv_put(kv_t *db, char *key, char *val);
|
int kv_put(kv_t *db, char *key, char *val);
|
||||||
char *kv_get(kv_t *db, char *key);
|
char *kv_get(kv_t *db, char *key);
|
||||||
|
int kv_delete(kv_t *db, char *key);
|
||||||
|
int kv_free(kv_t *db);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -20,6 +20,45 @@ size_t hash(char *val, int capacity)
|
|||||||
return hash % capacity;
|
return hash % capacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fn kv_delete
|
||||||
|
// params:
|
||||||
|
// - db: a pointer to the db
|
||||||
|
// - key: pointer to the key value
|
||||||
|
// returns: index deleted
|
||||||
|
// -1 if not found
|
||||||
|
int kv_delete(kv_t *db, char *key)
|
||||||
|
{
|
||||||
|
if (!db || !key) return -1;
|
||||||
|
|
||||||
|
size_t idx = hash(key, db->capacity);
|
||||||
|
|
||||||
|
for (int i = 0; i < db->capacity - 1; ++i)
|
||||||
|
{
|
||||||
|
size_t real_idx = (idx + i) % db->capacity;
|
||||||
|
|
||||||
|
kv_entry_t *e = &db->entries[real_idx];
|
||||||
|
|
||||||
|
if (e->key == NULL)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e->key &&
|
||||||
|
e->key != (void*)TOMBSTONE &&
|
||||||
|
!strcmp(e->key, key))
|
||||||
|
{
|
||||||
|
free(e->key);
|
||||||
|
free(e->val);
|
||||||
|
db->count--;
|
||||||
|
e->key = (void*)TOMBSTONE;
|
||||||
|
e->val = NULL;
|
||||||
|
|
||||||
|
return real_idx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// fn kv_get
|
// fn kv_get
|
||||||
// params:
|
// params:
|
||||||
@@ -55,6 +94,33 @@ char *kv_get(kv_t *db, char *key)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fn kv_free
|
||||||
|
// params:
|
||||||
|
// - db: a pointer to the db
|
||||||
|
// returns: 0 on success, -1 on failure
|
||||||
|
int kv_free(kv_t *db)
|
||||||
|
{
|
||||||
|
if (!db) return -1;
|
||||||
|
|
||||||
|
for (int i = 0; i < db->capacity - 1; ++i)
|
||||||
|
{
|
||||||
|
kv_entry_t *e = &db->entries[i];
|
||||||
|
|
||||||
|
if (e->key && e->key != (void*)TOMBSTONE)
|
||||||
|
{
|
||||||
|
free(e->key);
|
||||||
|
free(e->val);
|
||||||
|
e->key = NULL;
|
||||||
|
e->val = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(db->entries);
|
||||||
|
free(db);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// fn kv_put
|
// fn kv_put
|
||||||
// params:
|
// params:
|
||||||
// - db: a pointer to the db
|
// - db: a pointer to the db
|
||||||
@@ -78,6 +144,7 @@ int kv_put(kv_t *db, char *key, char *val)
|
|||||||
{
|
{
|
||||||
char *newval = strdup(val);
|
char *newval = strdup(val);
|
||||||
if (!newval) return -1;
|
if (!newval) return -1;
|
||||||
|
free(e->val);
|
||||||
e->val = newval;
|
e->val = newval;
|
||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
|||||||
+12
@@ -24,4 +24,16 @@ int main(void)
|
|||||||
char *val3 = kv_get(table, "fake");
|
char *val3 = kv_get(table, "fake");
|
||||||
|
|
||||||
printf("%s %s %s\n", val, val2, val3);
|
printf("%s %s %s\n", val, val2, val3);
|
||||||
|
|
||||||
|
kv_delete(table, "goodbye");
|
||||||
|
val = NULL;
|
||||||
|
val = kv_get(table, "goodbye");
|
||||||
|
|
||||||
|
printf("%s %s %s\n", val, val2, val3);
|
||||||
|
|
||||||
|
kv_free(table);
|
||||||
|
table = NULL;
|
||||||
|
|
||||||
|
val = kv_get(table, "goodbye");
|
||||||
|
printf("%d\n", val);
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user