Don't free data in db_remove()
This commit is contained in:
38
src/db.c
38
src/db.c
@@ -11,11 +11,13 @@ struct node {
|
|||||||
uint8_t mask;
|
uint8_t mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_pure_
|
||||||
static inline size_t db_size (const uint8_t *a)
|
static inline size_t db_size (const uint8_t *a)
|
||||||
{
|
{
|
||||||
return (a[0]?:str_len((char *)a+1))+1;
|
return (a[0]?:str_len((char *)a+1))+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_pure_
|
||||||
static inline size_t db_cmp (const uint8_t *a, const uint8_t *b)
|
static inline size_t db_cmp (const uint8_t *a, const uint8_t *b)
|
||||||
{
|
{
|
||||||
const size_t size = a[0];
|
const size_t size = a[0];
|
||||||
@@ -36,6 +38,7 @@ static inline size_t db_cmp (const uint8_t *a, const uint8_t *b)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_pure_
|
||||||
static inline int db_dir (struct node *node, const uint8_t *data, const size_t size)
|
static inline int db_dir (struct node *node, const uint8_t *data, const size_t size)
|
||||||
{
|
{
|
||||||
if (node->size>=size)
|
if (node->size>=size)
|
||||||
@@ -63,14 +66,14 @@ uint8_t *db_search (uint8_t **p, uint8_t *data)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int db_insert (uint8_t **p, uint8_t *data)
|
uint8_t *db_insert (uint8_t **p, uint8_t *data)
|
||||||
{
|
{
|
||||||
if (CBIT(data))
|
if (CBIT(data))
|
||||||
return 0;
|
return NULL;
|
||||||
|
|
||||||
if (!*p) {
|
if (!*p) {
|
||||||
*p = data;
|
*p = data;
|
||||||
return 1;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *r = *p;
|
uint8_t *r = *p;
|
||||||
@@ -84,7 +87,7 @@ int db_insert (uint8_t **p, uint8_t *data)
|
|||||||
const size_t diff = db_cmp(r, data);
|
const size_t diff = db_cmp(r, data);
|
||||||
|
|
||||||
if (!diff)
|
if (!diff)
|
||||||
return 2;
|
return r;
|
||||||
|
|
||||||
const uint8_t size = diff-1;
|
const uint8_t size = diff-1;
|
||||||
const uint8_t mask = ~((1u<<31)>>CLZ(r[size]^data[size]));
|
const uint8_t mask = ~((1u<<31)>>CLZ(r[size]^data[size]));
|
||||||
@@ -103,7 +106,7 @@ int db_insert (uint8_t **p, uint8_t *data)
|
|||||||
struct node *node = malloc(sizeof(struct node));
|
struct node *node = malloc(sizeof(struct node));
|
||||||
|
|
||||||
if (!node)
|
if (!node)
|
||||||
return 0;
|
return NULL;
|
||||||
|
|
||||||
const int dir = (mask|r[size])==255;
|
const int dir = (mask|r[size])==255;
|
||||||
|
|
||||||
@@ -114,20 +117,20 @@ int db_insert (uint8_t **p, uint8_t *data)
|
|||||||
|
|
||||||
*p = CBIT_PTR(node);
|
*p = CBIT_PTR(node);
|
||||||
|
|
||||||
return 1;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
int db_delete (uint8_t **p, uint8_t *data)
|
uint8_t *db_remove (uint8_t **p, uint8_t *data)
|
||||||
{
|
{
|
||||||
if (!*p)
|
if (!*p)
|
||||||
return 0;
|
return NULL;
|
||||||
|
|
||||||
|
const size_t size = db_size(data);
|
||||||
|
|
||||||
uint8_t **p_old = NULL;
|
uint8_t **p_old = NULL;
|
||||||
struct node *node = NULL;
|
struct node *node = NULL;
|
||||||
int dir = 0;
|
int dir = 0;
|
||||||
|
|
||||||
const size_t size = db_size(data);
|
|
||||||
|
|
||||||
while (CBIT(*p)) {
|
while (CBIT(*p)) {
|
||||||
p_old = p;
|
p_old = p;
|
||||||
node = CBIT_NODE(*p);
|
node = CBIT_NODE(*p);
|
||||||
@@ -136,17 +139,16 @@ int db_delete (uint8_t **p, uint8_t *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (db_cmp(data, *p))
|
if (db_cmp(data, *p))
|
||||||
return 0;
|
return NULL;
|
||||||
|
|
||||||
free(*p);
|
uint8_t *r = *p;
|
||||||
|
|
||||||
if (!p_old) {
|
if (p_old) {
|
||||||
|
*p_old = node->child[1-dir];
|
||||||
|
free(node);
|
||||||
|
} else {
|
||||||
*p = NULL;
|
*p = NULL;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*p_old = node->child[1-dir];
|
return r;
|
||||||
free(node);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|||||||
4
src/db.h
4
src/db.h
@@ -3,5 +3,5 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
uint8_t *db_search (uint8_t **, uint8_t *);
|
uint8_t *db_search (uint8_t **, uint8_t *);
|
||||||
int db_insert (uint8_t **, uint8_t *);
|
uint8_t *db_insert (uint8_t **, uint8_t *);
|
||||||
int db_remove (uint8_t **, uint8_t *);
|
uint8_t *db_remove (uint8_t **, uint8_t *);
|
||||||
|
|||||||
Reference in New Issue
Block a user