1
0
mirror of git://projects.qi-hardware.com/wernermisc.git synced 2024-11-14 08:55:20 +02:00
wernermisc/qpkg/id.c
Werner Almesberger a9f12d5666 qpkg: converted ID comparison from "struct id *" to "void *"
- id.h (struct tree, comp_id, make_tree), id.c (comp_id, make_tree):
  comparison function now takes "void *" (pointing to a "struct id")
  arguments instead of "struct id *", for compatibility with jrb
- id.c (comp_id, do_comp_id): added wrapper to convert "void *" back to
  "struct id *"
2010-11-19 21:53:43 -03:00

87 lines
1.4 KiB
C

#include <string.h>
#include "util.h"
#include "id.h"
static struct id *free_id = NULL;
static int do_comp_id(const struct id *a, const struct id *b)
{
int len = a->len < b->len ? a->len : b->len;
int cmp;
cmp = memcmp(a->s, b->s, len);
if (cmp)
return cmp;
return a->len < b->len ? -1 : a->len > b->len;
}
int comp_id(const void *a, const void *b)
{
return do_comp_id(a, b);
}
struct tree *make_tree(int (*comp)(const void *a, const void *b))
{
struct tree *tree;
tree = alloc_type(struct tree);
tree->comp = comp;
tree->root = make_jrb();
return tree;
}
struct id *make_id(struct tree *tree, const char *s, size_t len)
{
struct id *id;
struct jrb *node;
if (!free_id)
free_id = alloc_type(struct id);
id = free_id;
id->s = s;
id->len = len;
id->value = NULL;
node = jrb_find(tree->root, id, tree->comp);
if (node)
return node->key;
id->jrb = jrb_insert(tree->root, id, NULL, tree->comp);
free_id = NULL;
return id;
}
const struct id *find_id(const struct tree *tree, const char *s, size_t len)
{
struct id id = {
.s = s,
.len = len
};
struct jrb *node;
node = jrb_find(tree->root, &id, tree->comp);
return node ? node->key : NULL;
}
const struct id *first_id(const struct tree *tree)
{
struct jrb *node;
node = jrb_first(tree->root);
return node ? node->key : NULL;
}
const struct id *next_id(const struct id *id)
{
struct jrb *next;
next = jrb_next(id->jrb);
return next ? next->key : NULL;
}