#define RAZOR_REQUIRES 1
#define RAZOR_PROVIDES 2
#define RAZOR_STRING_POOL 3
-#define RAZOR_PROPERTY_POOL 4
+#define RAZOR_PACKAGE_POOL 4
+#define RAZOR_REQUIRES_POOL 5
+#define RAZOR_PROVIDES_POOL 6
struct razor_package {
unsigned long name;
struct razor_set {
struct array string_pool;
- struct array property_pool;
struct array packages;
+ struct array package_pool;
struct array requires;
struct array provides;
+ struct array requires_pool;
+ struct array provides_pool;
struct razor_set_header *header;
};
{ RAZOR_REQUIRES, offsetof(struct razor_set, requires) },
{ RAZOR_PROVIDES, offsetof(struct razor_set, provides) },
{ RAZOR_STRING_POOL, offsetof(struct razor_set, string_pool) },
- { RAZOR_PROPERTY_POOL, offsetof(struct razor_set, property_pool) },
+ { RAZOR_PACKAGE_POOL, offsetof(struct razor_set, package_pool) },
+ { RAZOR_REQUIRES_POOL, offsetof(struct razor_set, requires_pool) },
+ { RAZOR_PROVIDES_POOL, offsetof(struct razor_set, provides_pool) },
};
struct razor_set *
}
static unsigned long
-add_to_property_pool(struct razor_set *set, struct array *properties)
+add_to_property_pool(struct array *pool, struct array *properties)
{
unsigned long *p;
p = array_add(properties, sizeof *p);
*p = ~0ul;
- p = array_add(&set->property_pool, properties->size);
+ p = array_add(pool, properties->size);
memcpy(p, properties->data, properties->size);
- return p - (unsigned long *) set->property_pool.data;
+ return p - (unsigned long *) pool->data;
}
static void
struct razor_package *p;
p = importer->package;
- p->requires = add_to_property_pool(importer->set,
+ p->requires = add_to_property_pool(&importer->set->requires_pool,
&importer->requires.package);
- p->provides = add_to_property_pool(importer->set,
+ p->provides = add_to_property_pool(&importer->set->provides_pool,
&importer->provides.package);
array_release(&importer->requires.package);
properties->size = (void *) up - properties->data;
rp_end = up;
for (rp = properties->data, p = pkgs; rp < rp_end; rp++, p++) {
- rp->packages = add_to_property_pool(set, p);
+ rp->packages = add_to_property_pool(&set->package_pool, p);
array_release(p);
}
}
static void
-remap_package_links(struct razor_importer *importer)
+remap_links(struct array *links, unsigned long *map)
{
- struct razor_package *p, *end;
- unsigned long *pool, *r;
-
- pool = importer->set->property_pool.data;
- end = importer->set->packages.data + importer->set->packages.size;
- for (p = importer->set->packages.data; p < end; p++) {
- for (r = &pool[p->requires]; ~*r; r++)
- *r = importer->requires_map[*r];
- for (r = &pool[p->provides]; ~*r; r++)
- *r = importer->provides_map[*r];
- }
-}
-
-static void
-remap_property_links(struct razor_importer *importer, unsigned long *map)
-{
- struct razor_property *p, *end;
- struct razor_package *rp;
- unsigned long *pool, *r, *rmap;
- int i, count;
-
- pool = importer->set->property_pool.data;
- count = importer->set->packages.size / sizeof(struct razor_package);
- rmap = malloc(count * sizeof *map);
- rp = importer->set->packages.data;
- for (i = 0; i < count; i++)
- rmap[map[i]] = i;
-
- /* FIXME: This will break if we implement package list sharing
- * for all properties, since we'll remap those lists more than
- * once. We should just have a separate pool for property
- * lists and a separate pool for package lists and remap it as
- * a flat pool. Right now, as property lists and package
- * lists are mixed, we can't do that. */
+ unsigned long *p, *end;
- end = importer->set->requires.data + importer->set->requires.size;
- for (p = importer->set->requires.data; p < end; p++)
- for (r = &pool[p->packages]; ~*r; r++)
- *r = rmap[*r];
-
- end = importer->set->provides.data + importer->set->provides.size;
- for (p = importer->set->provides.data; p < end; p++)
- for (r = &pool[p->packages]; ~*r; r++)
- *r = rmap[*r];
-
- free(rmap);
+ end = links->data + links->size;
+ for (p = links->data; p < end; p++)
+ if (*p != ~0)
+ *p = map[*p];
}
struct razor_set *
razor_importer_finish(struct razor_importer *importer)
{
struct razor_set *set;
- unsigned long *map;
- int count;
+ unsigned long *map, *rmap;
+ int i, count;
+
+ map = uniqueify_properties(importer->set, &importer->set->requires);
+ remap_links(&importer->set->requires_pool, map);
+ free(map);
- importer->requires_map = uniqueify_properties(importer->set,
- importer->requires.all);
- importer->provides_map = uniqueify_properties(importer->set,
- importer->provides.all);
- remap_package_links(importer);
- free(importer->requires_map);
- free(importer->provides_map);
+ map = uniqueify_properties(importer->set, &importer->set->provides);
+ remap_links(&importer->set->provides_pool, map);
+ free(map);
count = importer->set->packages.size / sizeof(struct razor_package);
map = qsort_with_data(importer->set->packages.data,
sizeof(struct razor_package),
compare_packages,
importer->set);
- remap_property_links(importer, map);
+
+ rmap = malloc(count * sizeof *rmap);
+ for (i = 0; i < count; i++)
+ rmap[map[i]] = i;
+
+ remap_links(&importer->set->package_pool, rmap);
free(map);
+ free(rmap);
set = importer->set;
array_release(&importer->buckets);
if (name) {
package = razor_set_get_package(set, name);
- r = (unsigned long *) set->property_pool.data +
+ r = (unsigned long *) set->requires_pool.data +
package->requires;
requires = set->requires.data;
pool = set->string_pool.data;
if (name) {
package = razor_set_get_package(set, name);
- r = (unsigned long *) set->property_pool.data +
+ r = (unsigned long *) set->provides_pool.data +
package->provides;
provides = set->provides.data;
pool = set->string_pool.data;
if (version && versioncmp(version, &pool[property->version]) != 0)
goto next;
r = (unsigned long *)
- set->property_pool.data + property->packages;
+ set->package_pool.data + property->packages;
while (~*r) {
p = &packages[*r++];
printf("%s %s\n",
&pool[package->name],
&pool[package->version]);
- r = (unsigned long *) set->property_pool.data + package->requires;
+ r = (unsigned long *) set->requires_pool.data + package->requires;
properties = set->requires.data;
while (~*r) {
p = &properties[*r++];
&pool[p->name], &pool[p->version]);
}
- r = (unsigned long *) set->property_pool.data + package->provides;
+ r = (unsigned long *) set->provides_pool.data + package->provides;
properties = set->provides.data;
while (~*r) {
p = &properties[*r++];
{
struct razor_property *requires, *r;
struct razor_property *p, *pend;
- unsigned long *u, *end, *pkg, *property_pool;
+ unsigned long *u, *end, *pkg, *package_pool;
char *pool, *upool;
end = unsatisfied->data + unsatisfied->size;
p = upstream->provides.data;
pend = upstream->provides.data + upstream->provides.size;
upool = upstream->string_pool.data;
- property_pool = upstream->property_pool.data;
+ package_pool = upstream->package_pool.data;
for (u = unsatisfied->data; u < end; u++) {
r = requires + *u;
} else {
pkg = array_add(list, sizeof *pkg);
/* We just pull in the first package that provides */
- *pkg = property_pool[p->packages];
+ *pkg = package_pool[p->packages];
}
}
}
case RAZOR_STRING_POOL:
printf("string pool:\t\t%dkb\n", size / 1024);
break;
- case RAZOR_PROPERTY_POOL:
- printf("properties section:\t%dkb\n", size / 1024);
- break;
}
}
}