mirror of
git://projects.qi-hardware.com/wernermisc.git
synced 2024-11-14 08:55:20 +02:00
qpkg: towards "struct id" without jrb reference - change ID creation
- id.h, id.c (make_id): return a "struct jrb *", so that we have access to key and value - gobble.c (ID, gobble_buf): adapt to above change - gobble.c (compact_pkg, gobble_buf): keep the RB node reference instead of awkwardly regenerating it via pkg->id->jrb
This commit is contained in:
parent
7058115a64
commit
44e4434b4c
@ -92,7 +92,7 @@
|
|||||||
#define DONE goto done
|
#define DONE goto done
|
||||||
|
|
||||||
|
|
||||||
static void compact_pkg(struct pkg *new)
|
static void compact_pkg(struct pkg *new, struct jrb *jrb)
|
||||||
{
|
{
|
||||||
struct pkg *old;
|
struct pkg *old;
|
||||||
|
|
||||||
@ -102,7 +102,7 @@ static void compact_pkg(struct pkg *new)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
compact:
|
compact:
|
||||||
new->id->jrb->val = new->more;
|
jrb->val = new->more;
|
||||||
old->flags |= new->flags;
|
old->flags |= new->flags;
|
||||||
/* @@@ we may leak a little */
|
/* @@@ we may leak a little */
|
||||||
free(new);
|
free(new);
|
||||||
@ -114,6 +114,7 @@ static void gobble_buf(const char *name, const char *buf, size_t len)
|
|||||||
const char *end = buf+len;
|
const char *end = buf+len;
|
||||||
int lineno = 1;
|
int lineno = 1;
|
||||||
struct pkg *pkg = NULL; /* current package */
|
struct pkg *pkg = NULL; /* current package */
|
||||||
|
struct jrb *jrb = NULL; /* RB tree node of current package */
|
||||||
struct ref **anchor = NULL;
|
struct ref **anchor = NULL;
|
||||||
int i, failed_at = 0;
|
int i, failed_at = 0;
|
||||||
|
|
||||||
@ -280,13 +281,14 @@ depends:
|
|||||||
|
|
||||||
package:
|
package:
|
||||||
if (pkg)
|
if (pkg)
|
||||||
compact_pkg(pkg);
|
compact_pkg(pkg, jrb);
|
||||||
|
|
||||||
WHITESPACE;
|
WHITESPACE;
|
||||||
pkg = alloc_type(struct pkg);
|
pkg = alloc_type(struct pkg);
|
||||||
pkg->id = ID(packages);
|
jrb = ID(packages);
|
||||||
pkg->more = pkg->id->jrb->val;
|
pkg->id = jrb->key;
|
||||||
pkg->id->jrb->val = pkg;
|
pkg->more = jrb->val;
|
||||||
|
jrb->val = pkg;
|
||||||
pkg->version = NULL;
|
pkg->version = NULL;
|
||||||
pkg->conflicts = pkg->depends = NULL;
|
pkg->conflicts = pkg->depends = NULL;
|
||||||
pkg->filename = NULL;
|
pkg->filename = NULL;
|
||||||
@ -298,7 +300,7 @@ version:
|
|||||||
WHITESPACE;
|
WHITESPACE;
|
||||||
if (pkg->version)
|
if (pkg->version)
|
||||||
FAIL;
|
FAIL;
|
||||||
pkg->version = ID(versions);
|
pkg->version = ID(versions)->key;
|
||||||
goto eol;
|
goto eol;
|
||||||
|
|
||||||
provides:
|
provides:
|
||||||
@ -350,7 +352,7 @@ list_with_version:
|
|||||||
|
|
||||||
WHITESPACE;
|
WHITESPACE;
|
||||||
ref = alloc_type(struct ref);
|
ref = alloc_type(struct ref);
|
||||||
ref->pkg = ID(packages);
|
ref->pkg = ID(packages)->key;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Work around the Wireshark Anomaly
|
* Work around the Wireshark Anomaly
|
||||||
@ -380,7 +382,7 @@ list_with_version:
|
|||||||
FAIL;
|
FAIL;
|
||||||
}
|
}
|
||||||
WHITESPACE;
|
WHITESPACE;
|
||||||
ref->version = ID(versions);
|
ref->version = ID(versions)->key;
|
||||||
EXPECT(")");
|
EXPECT(")");
|
||||||
}
|
}
|
||||||
ref->next = *anchor;
|
ref->next = *anchor;
|
||||||
@ -396,7 +398,7 @@ list_with_version:
|
|||||||
|
|
||||||
done:
|
done:
|
||||||
if (pkg)
|
if (pkg)
|
||||||
compact_pkg(pkg);
|
compact_pkg(pkg, jrb);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
@ -50,7 +50,7 @@ struct tree *make_tree(int (*comp)(const void *a, const void *b))
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct id *make_id(struct tree *tree, const char *s, size_t len)
|
struct jrb *make_id(struct tree *tree, const char *s, size_t len)
|
||||||
{
|
{
|
||||||
struct id *id;
|
struct id *id;
|
||||||
|
|
||||||
@ -60,10 +60,9 @@ struct id *make_id(struct tree *tree, const char *s, size_t len)
|
|||||||
id->s = s;
|
id->s = s;
|
||||||
id->len = len;
|
id->len = len;
|
||||||
id->jrb = jrb_find_or_insert(tree->root, id, NULL, tree->comp);
|
id->jrb = jrb_find_or_insert(tree->root, id, NULL, tree->comp);
|
||||||
if (id->jrb->key != id)
|
if (id->jrb->key == id)
|
||||||
return id->jrb->key;
|
|
||||||
free_id = NULL;
|
free_id = NULL;
|
||||||
return id;
|
return id->jrb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ struct id {
|
|||||||
int comp_id(const void *a, const void *b);
|
int comp_id(const void *a, const void *b);
|
||||||
|
|
||||||
struct tree *make_tree(int (*comp)(const void *a, const void *b));
|
struct tree *make_tree(int (*comp)(const void *a, const void *b));
|
||||||
struct id *make_id(struct tree *tree, const char *s, size_t len);
|
struct jrb *make_id(struct tree *tree, const char *s, size_t len);
|
||||||
const struct jrb *find_id(const struct tree *tree, const char *s, size_t len);
|
const struct jrb *find_id(const struct tree *tree, const char *s, size_t len);
|
||||||
|
|
||||||
#endif /* !ID_H */
|
#endif /* !ID_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user