1.1 --- a/razor.c Thu Oct 25 13:21:18 2007 -0400
1.2 +++ b/razor.c Thu Oct 25 23:35:42 2007 -0400
1.3 @@ -348,10 +348,9 @@
1.4 {
1.5 unsigned long *p;
1.6
1.7 - p = array_add(properties, sizeof *p);
1.8 - *p = ~0ul;
1.9 p = array_add(pool, properties->size);
1.10 memcpy(p, properties->data, properties->size);
1.11 + p[properties->size / sizeof *p - 1] |= RAZOR_IMMEDIATE;
1.12
1.13 return p - (unsigned long *) pool->data;
1.14 }
1.15 @@ -722,8 +721,7 @@
1.16
1.17 end = links->data + links->size;
1.18 for (p = links->data; p < end; p++)
1.19 - if (*p != ~0)
1.20 - *p = map[*p];
1.21 + *p = map[*p & RAZOR_ENTRY_MASK] | (*p & ~RAZOR_ENTRY_MASK);
1.22 }
1.23
1.24 static int
1.25 @@ -767,7 +765,11 @@
1.26 e->start = p->count > 0 ? s : 0;
1.27 s += p->count;
1.28
1.29 - if (p->packages.size / sizeof *r == 1) {
1.30 + if (p->packages.size == 0) {
1.31 + /* FIXME: We need to make sure this is handled
1.32 + * correctly as the empty list. */
1.33 + e->packages = 0 | RAZOR_IMMEDIATE;
1.34 + } else if (p->packages.size / sizeof *r == 1) {
1.35 r = p->packages.data;
1.36 e->packages = *r | RAZOR_IMMEDIATE;
1.37 } else {
1.38 @@ -893,7 +895,7 @@
1.39 r = (unsigned long *) set->package_pool.data + e->packages;
1.40 }
1.41
1.42 - while (~*r) {
1.43 + while (1) {
1.44 q = array_add(&pkgs[*r & RAZOR_ENTRY_MASK], sizeof *q);
1.45 *q = e - (struct razor_entry *) set->files.data;
1.46 if (*r++ & RAZOR_IMMEDIATE)
1.47 @@ -1049,9 +1051,11 @@
1.48 package->requires;
1.49 requires = set->requires.data;
1.50 pool = set->string_pool.data;
1.51 - while (~*r) {
1.52 - p = &requires[*r++];
1.53 + while (1) {
1.54 + p = &requires[*r & RAZOR_ENTRY_MASK];
1.55 printf("%s-%s\n", &pool[p->name], &pool[p->version]);
1.56 + if (*r++ & RAZOR_IMMEDIATE)
1.57 + break;
1.58 }
1.59 } else
1.60 razor_set_list_all_properties(set, &set->requires);
1.61 @@ -1071,9 +1075,11 @@
1.62 package->provides;
1.63 provides = set->provides.data;
1.64 pool = set->string_pool.data;
1.65 - while (~*r) {
1.66 - p = &provides[*r++];
1.67 + while (1) {
1.68 + p = &provides[*r & RAZOR_ENTRY_MASK];
1.69 printf("%s-%s\n", &pool[p->name], &pool[p->version]);
1.70 + if (*r++ & RAZOR_IMMEDIATE)
1.71 + break;
1.72 }
1.73 } else
1.74 razor_set_list_all_properties(set, &set->provides);
1.75 @@ -1106,7 +1112,7 @@
1.76 else
1.77 r = (unsigned long *)
1.78 set->package_pool.data + property->packages;
1.79 - while (~*r) {
1.80 + while (1) {
1.81 p = &packages[*r & RAZOR_ENTRY_MASK];
1.82 printf("%s-%s\n", &pool[p->name], &pool[p->version]);
1.83 if (*r++ & RAZOR_IMMEDIATE)
1.84 @@ -1217,7 +1223,7 @@
1.85
1.86 packages = set->packages.data;
1.87 pool = set->string_pool.data;
1.88 - while (~*r) {
1.89 + while (1) {
1.90 p = &packages[*r & RAZOR_ENTRY_MASK];
1.91 printf("%s-%s\n", &pool[p->name], &pool[p->version]);
1.92 if (*r++ & RAZOR_IMMEDIATE)
1.93 @@ -1401,15 +1407,27 @@
1.94 p->requires = package->requires;
1.95 p->provides = package->provides;
1.96
1.97 - r = (unsigned long *)
1.98 - source->set->requires_pool.data + package->requires;
1.99 - while (*r != ~0)
1.100 - source->requires_map[*r++] = 1;
1.101 + if (package->requires & RAZOR_IMMEDIATE)
1.102 + r = &package->requires;
1.103 + else
1.104 + r = (unsigned long *)
1.105 + source->set->requires_pool.data + package->requires;
1.106 + while (1) {
1.107 + source->requires_map[*r & RAZOR_ENTRY_MASK] = 1;
1.108 + if (*r++ & RAZOR_IMMEDIATE)
1.109 + break;
1.110 + }
1.111
1.112 - r = (unsigned long *)
1.113 - source->set->provides_pool.data + package->provides;
1.114 - while (*r != ~0)
1.115 - source->provides_map[*r++] = 1;
1.116 + if (package->provides & RAZOR_IMMEDIATE)
1.117 + r = &package->requires;
1.118 + else
1.119 + r = (unsigned long *)
1.120 + source->set->provides_pool.data + package->provides;
1.121 + while (1) {
1.122 + source->provides_map[*r & RAZOR_ENTRY_MASK] = 1;
1.123 + if (*r++ & RAZOR_IMMEDIATE)
1.124 + break;
1.125 + }
1.126 }
1.127
1.128
1.129 @@ -1536,14 +1554,13 @@
1.130
1.131 r = pool->size / sizeof *q;
1.132 p = (unsigned long *) source_pool->data + index;
1.133 - while (*p != ~0) {
1.134 + while (1) {
1.135 q = array_add(pool, sizeof *q);
1.136 - *q = map[*p++];
1.137 + *q = map[*p & RAZOR_ENTRY_MASK] | (*p & ~RAZOR_ENTRY_MASK);
1.138 + if (*p++ & RAZOR_ENTRY_LAST)
1.139 + break;
1.140 }
1.141
1.142 - q = array_add(pool, sizeof *q);
1.143 - *q = ~0;
1.144 -
1.145 return r;
1.146 }
1.147
1.148 @@ -1569,13 +1586,17 @@
1.149 ppool = set->provides_pool.data;
1.150
1.151 for (pkg = set->packages.data; pkg < pkg_end; pkg++) {
1.152 - for (r = &rpool[pkg->requires]; *r != ~0; r++) {
1.153 - q = array_add(&requires_pkgs[*r], sizeof *q);
1.154 + for (r = &rpool[pkg->requires]; ; r++) {
1.155 + q = array_add(&requires_pkgs[*r & RAZOR_ENTRY_MASK], sizeof *q);
1.156 *q = pkg - (struct razor_package *) set->packages.data;
1.157 + if (*r & RAZOR_IMMEDIATE)
1.158 + break;
1.159 }
1.160 - for (r = &ppool[pkg->provides]; *r != ~0; r++) {
1.161 - q = array_add(&provides_pkgs[*r], sizeof *q);
1.162 + for (r = &ppool[pkg->provides]; ; r++) {
1.163 + q = array_add(&provides_pkgs[*r & RAZOR_ENTRY_MASK], sizeof *q);
1.164 *q = pkg - (struct razor_package *) set->packages.data;
1.165 + if (*r & RAZOR_IMMEDIATE)
1.166 + break;
1.167 }
1.168 }
1.169