#define RAZOR_MAGIC 0x7a7a7a7a
#define RAZOR_VERSION 1
-#define RAZOR_ENTRY_LAST 0x80000000ul
-#define RAZOR_ENTRY_MASK 0x00fffffful
-
#define RAZOR_STRING_POOL 0
#define RAZOR_PACKAGES 1
#define RAZOR_PROPERTIES 2
#define RAZOR_FILE_POOL 6
struct razor_package {
- uint32_t name;
+ uint name : 24;
+ uint flags : 8;
uint32_t version;
struct list_head properties;
struct list_head files;
};
struct razor_entry {
- uint32_t name;
+ uint name : 24;
+ uint flags : 8;
uint32_t start;
struct list_head packages;
};
+#define RAZOR_ENTRY_LAST 0x80
+
struct razor_set {
struct array string_pool;
struct array packages;
p = array_add(&importer->set->packages, sizeof *p);
p->name = hashtable_tokenize(&importer->table, name);
+ p->flags = 0;
p->version = hashtable_tokenize(&importer->table, version);
importer->package = p;
struct razor_set *set = data;
char *pool = set->string_pool.data;
+ /* FIXME: what if the flags are different? */
if (pkg1->name == pkg2->name)
return versioncmp(&pool[pkg1->version], &pool[pkg2->version]);
else
while (p < end) {
e = array_add(array, sizeof *e);
e->name = p->name;
+ e->flags = 0;
e->start = p->count > 0 ? s : 0;
s += p->count;
p++;
}
if (e != NULL)
- e->name |= RAZOR_ENTRY_LAST;
+ e->flags |= RAZOR_ENTRY_LAST;
p = d->files.data;
end = d->files.data + d->files.size;
array_init(&importer->set->files);
e = array_add(&importer->set->files, sizeof *e);
- e->name = root.name | RAZOR_ENTRY_LAST;
+ e->name = root.name;
+ e->flags = RAZOR_ENTRY_LAST;
e->start = 1;
list_set_empty(&e->packages);
if (valid) {
pool = pi->set->string_pool.data;
*package = p;
- *name = &pool[p->name & RAZOR_ENTRY_MASK];
+ *name = &pool[p->name];
*version = &pool[p->version];
} else {
*package = NULL;
e = (struct razor_entry *) set->files.data + dir->start;
do {
- n = pool + (e->name & RAZOR_ENTRY_MASK);
+ n = pool + e->name;
if (strcmp(pattern + 1, n) == 0)
return e;
len = strlen(n);
pattern[len + 1] == '/') {
return find_entry(set, e, pattern + len + 1);
}
- } while (((e++)->name & RAZOR_ENTRY_LAST) == 0);
+ } while (!((e++)->flags & RAZOR_ENTRY_LAST));
return NULL;
}
e = (struct razor_entry *) set->files.data + dir->start;
do {
- n = pool + (e->name & RAZOR_ENTRY_MASK);
+ n = pool + e->name;
if (pattern && pattern[0] && fnmatch(pattern, n, 0) != 0)
continue;
printf("%s/%s%s\n", prefix, n, e->start > 0 ? "/" : "");
- } while (((e++)->name & RAZOR_ENTRY_LAST) == 0);
+ } while (!((e++)->flags & RAZOR_ENTRY_LAST));
}
void
e = entries + dir->start;
do {
if (entries + r->data == e) {
- printf("%s/%s\n", prefix,
- pool + (e->name & RAZOR_ENTRY_MASK));
+ printf("%s/%s\n", prefix, pool + e->name);
r = list_next(r);
if (!r)
return NULL;
if (r->data >= end)
return r;
}
- } while (!((e++)->name & RAZOR_ENTRY_LAST));
+ } while (!((e++)->flags & RAZOR_ENTRY_LAST));
e = entries + dir->start;
do {
if (e->start == 0)
continue;
- if (e->name & RAZOR_ENTRY_LAST)
+ if (e->flags & RAZOR_ENTRY_LAST)
next = end;
else {
f = e + 1;
- while (f->start == 0 && !(f->name & RAZOR_ENTRY_LAST))
+ while (f->start == 0 && !(f->flags & RAZOR_ENTRY_LAST))
f++;
if (f->start == 0)
next = end;
if (e->start <= file && file < next) {
len = strlen(prefix);
prefix[len] = '/';
- strcpy(prefix + len + 1,
- pool + (e->name & RAZOR_ENTRY_MASK));
+ strcpy(prefix + len + 1, pool + e->name);
r = list_package_files(set, r, e, next, prefix);
prefix[len] = '\0';
}
- } while (!((e++)->name & RAZOR_ENTRY_LAST) && r != NULL);
+ } while (!((e++)->flags & RAZOR_ENTRY_LAST) && r != NULL);
return r;
}
array_release(&unsatisfied);
}
-#define UPSTREAM_SOURCE 0x80000000ul
-#define INDEX_MASK 0x00fffffful
+#define UPSTREAM_SOURCE 0x80
struct source {
struct razor_set *set;
pool = source->set->string_pool.data;
p = array_add(&merger->set->packages, sizeof *p);
p->name = hashtable_tokenize(&merger->table, &pool[package->name]);
- p->name |= flags;
+ p->flags = flags;
p->version = hashtable_tokenize(&merger->table,
&pool[package->version]);
p->properties = package->properties;
for (p = merger->set->packages.data; p < pend; p++) {
struct source *src;
- if (p->name & UPSTREAM_SOURCE)
+ if (p->flags & UPSTREAM_SOURCE)
src = &merger->source2;
else
src = &merger->source1;
&src->set->property_pool,
src->property_map,
&merger->set->property_pool);
- p->name &= INDEX_MASK;
+ p->flags &= ~UPSTREAM_SOURCE;
}
rebuild_package_lists(merger->set);