Use immediate links for property package lists too.
1.1 --- a/razor.c Wed Oct 24 13:20:12 2007 -0400
1.2 +++ b/razor.c Thu Oct 25 13:21:18 2007 -0400
1.3 @@ -35,6 +35,10 @@
1.4 #define RAZOR_MAGIC 0x7a7a7a7a
1.5 #define RAZOR_VERSION 1
1.6
1.7 +#define RAZOR_ENTRY_LAST 0x80000000ul
1.8 +#define RAZOR_IMMEDIATE 0x80000000ul
1.9 +#define RAZOR_ENTRY_MASK 0x00fffffful
1.10 +
1.11 #define RAZOR_STRING_POOL 0
1.12 #define RAZOR_PACKAGES 1
1.13 #define RAZOR_REQUIRES 2
1.14 @@ -696,7 +700,13 @@
1.15 properties->size = (void *) up - properties->data;
1.16 rp_end = up;
1.17 for (rp = properties->data, p = pkgs; rp < rp_end; rp++, p++) {
1.18 - rp->packages = add_to_property_pool(&set->package_pool, p);
1.19 + if (p->size / sizeof *r == 1) {
1.20 + r = p->data;
1.21 + rp->packages = *r | RAZOR_IMMEDIATE;
1.22 + } else {
1.23 + rp->packages =
1.24 + add_to_property_pool(&set->package_pool, p);
1.25 + }
1.26 array_release(p);
1.27 }
1.28
1.29 @@ -740,10 +750,6 @@
1.30 }
1.31 }
1.32
1.33 -#define RAZOR_ENTRY_LAST 0x80000000ul
1.34 -#define RAZOR_IMMEDIATE 0x80000000ul
1.35 -#define RAZOR_ENTRY_MASK 0x00fffffful
1.36 -
1.37 static void
1.38 serialize_files(struct razor_set *set,
1.39 struct import_directory *d, struct array *array)
1.40 @@ -761,7 +767,7 @@
1.41 e->start = p->count > 0 ? s : 0;
1.42 s += p->count;
1.43
1.44 - if (p->packages.size / sizeof (unsigned long) == 1) {
1.45 + if (p->packages.size / sizeof *r == 1) {
1.46 r = p->packages.data;
1.47 e->packages = *r | RAZOR_IMMEDIATE;
1.48 } else {
1.49 @@ -783,6 +789,18 @@
1.50 }
1.51
1.52 static void
1.53 +remap_property_package_links(struct array *properties, unsigned long *rmap)
1.54 +{
1.55 + struct razor_property *p, *end;
1.56 +
1.57 + end = properties->data + properties->size;
1.58 + for (p = properties->data; p < end; p++)
1.59 + if (p->packages & RAZOR_IMMEDIATE)
1.60 + p->packages = rmap[p->packages & RAZOR_ENTRY_MASK] |
1.61 + RAZOR_IMMEDIATE;
1.62 +}
1.63 +
1.64 +static void
1.65 build_file_tree(struct razor_importer *importer)
1.66 {
1.67 int count, i, length;
1.68 @@ -923,9 +941,10 @@
1.69 build_file_tree(importer);
1.70 remap_links(&importer->set->package_pool, rmap);
1.71 build_package_file_lists(importer->set, rmap);
1.72 + remap_property_package_links(&importer->set->requires, rmap);
1.73 + remap_property_package_links(&importer->set->provides, rmap);
1.74 free(rmap);
1.75
1.76 -
1.77 set = importer->set;
1.78 array_release(&importer->buckets);
1.79 free(importer);
1.80 @@ -1081,12 +1100,17 @@
1.81 while (property < end && strcmp(name, &pool[property->name]) == 0) {
1.82 if (version && versioncmp(version, &pool[property->version]) != 0)
1.83 goto next;
1.84 - r = (unsigned long *)
1.85 - set->package_pool.data + property->packages;
1.86 +
1.87 + if (property->packages & RAZOR_IMMEDIATE)
1.88 + r = &property->packages;
1.89 + else
1.90 + r = (unsigned long *)
1.91 + set->package_pool.data + property->packages;
1.92 while (~*r) {
1.93 - p = &packages[*r++];
1.94 - printf("%s-%s\n",
1.95 - &pool[p->name], &pool[p->version]);
1.96 + p = &packages[*r & RAZOR_ENTRY_MASK];
1.97 + printf("%s-%s\n", &pool[p->name], &pool[p->version]);
1.98 + if (*r++ & RAZOR_IMMEDIATE)
1.99 + break;
1.100 }
1.101 next:
1.102 property++;
1.103 @@ -1558,7 +1582,13 @@
1.104 prop_end = set->requires.data + set->requires.size;
1.105 a = requires_pkgs;
1.106 for (prop = set->requires.data; prop < prop_end; prop++, a++) {
1.107 - prop->packages = add_to_property_pool(&set->requires_pool, a);
1.108 + if (a->size / sizeof *r == 1) {
1.109 + r = a->data;
1.110 + prop->packages = *r | RAZOR_IMMEDIATE;
1.111 + } else {
1.112 + prop->packages =
1.113 + add_to_property_pool(&set->requires_pool, a);
1.114 + }
1.115 array_release(a);
1.116 }
1.117 free(requires_pkgs);
1.118 @@ -1566,7 +1596,13 @@
1.119 prop_end = set->provides.data + set->provides.size;
1.120 a = provides_pkgs;
1.121 for (prop = set->provides.data; prop < prop_end; prop++, a++) {
1.122 - prop->packages = add_to_property_pool(&set->provides_pool, a);
1.123 + if (a->size / sizeof *r == 1) {
1.124 + r = a->data;
1.125 + prop->packages = *r | RAZOR_IMMEDIATE;
1.126 + } else {
1.127 + prop->packages =
1.128 + add_to_property_pool(&set->provides_pool, a);
1.129 + }
1.130 array_release(a);
1.131 }
1.132 free(provides_pkgs);
1.133 @@ -1684,7 +1720,10 @@
1.134 } else {
1.135 pkg = array_add(list, sizeof *pkg);
1.136 /* We just pull in the first package that provides */
1.137 - *pkg = package_pool[p->packages];
1.138 + if (p->packages & RAZOR_IMMEDIATE)
1.139 + *pkg = p->packages & RAZOR_ENTRY_MASK;
1.140 + else
1.141 + *pkg = package_pool[p->packages];
1.142 }
1.143 }
1.144 }