1.1 --- a/razor.c Fri Feb 08 14:39:34 2008 -0500
1.2 +++ b/razor.c Mon Feb 11 11:21:54 2008 -0500
1.3 @@ -52,7 +52,9 @@
1.4 };
1.5
1.6 struct razor_property {
1.7 - uint32_t name;
1.8 + uint name : 24;
1.9 + uint flags : 6;
1.10 + uint type : 2;
1.11 uint32_t relation;
1.12 uint32_t version;
1.13 struct list_head packages;
1.14 @@ -260,7 +262,9 @@
1.15 uint32_t *r;
1.16
1.17 p = array_add(&importer->set->properties, sizeof *p);
1.18 - p->name = hashtable_tokenize(&importer->table, name) | (type << 30);
1.19 + p->name = hashtable_tokenize(&importer->table, name);
1.20 + p->flags = 0;
1.21 + p->type = type;
1.22 p->relation = relation;
1.23 p->version = hashtable_tokenize(&importer->table, version);
1.24 list_set_ptr(&p->packages, importer->package -
1.25 @@ -456,17 +460,14 @@
1.26 struct razor_set *set = data;
1.27 char *pool = set->string_pool.data;
1.28
1.29 - if (prop1->name == prop2->name) {
1.30 - if (prop1->relation == prop2->relation)
1.31 - return versioncmp(&pool[prop1->version],
1.32 - &pool[prop2->version]);
1.33 - else
1.34 - return prop1->relation - prop2->relation;
1.35 - } else if ((prop1->name & RAZOR_ENTRY_MASK) == (prop2->name & RAZOR_ENTRY_MASK))
1.36 - return (prop1->name >> 30) - (prop2->name >> 30);
1.37 + if (prop1->name != prop2->name)
1.38 + return strcmp(&pool[prop1->name], &pool[prop2->name]);
1.39 + else if (prop1->type != prop2->type)
1.40 + return prop1->type - prop2->type;
1.41 + else if (prop1->relation != prop2->relation)
1.42 + return prop1->relation - prop2->relation;
1.43 else
1.44 - return strcmp(&pool[prop1->name & RAZOR_ENTRY_MASK],
1.45 - &pool[prop2->name & RAZOR_ENTRY_MASK]);
1.46 + return versioncmp(&pool[prop1->version], &pool[prop2->version]);
1.47 }
1.48
1.49 static uint32_t *
1.50 @@ -489,10 +490,12 @@
1.51 rmap = malloc(count * sizeof *map);
1.52 pkgs = zalloc(count * sizeof *pkgs);
1.53 for (rp = set->properties.data, up = rp, i = 0; rp < rp_end; rp++, i++) {
1.54 - if (rp->name != up->name || rp->relation != up->relation ||
1.55 - rp->version != up->version) {
1.56 + if (rp->name != up->name || rp->type != up->type ||
1.57 + rp->relation != up->relation || rp->version != up->version) {
1.58 up++;
1.59 up->name = rp->name;
1.60 + up->flags = 0;
1.61 + up->type = rp->type;
1.62 up->relation = rp->relation;
1.63 up->version = rp->version;
1.64 }
1.65 @@ -870,10 +873,10 @@
1.66 if (valid) {
1.67 pool = pi->set->string_pool.data;
1.68 *property = p;
1.69 - *name = &pool[p->name & RAZOR_ENTRY_MASK];
1.70 + *name = &pool[p->name];
1.71 *relation = p->relation;
1.72 *version = &pool[p->version];
1.73 - *type = p->name >> 30;
1.74 + *type = p->type;
1.75 } else {
1.76 *property = NULL;
1.77 }
1.78 @@ -1051,12 +1054,13 @@
1.79 pool = set->string_pool.data;
1.80
1.81 for (r = set->properties.data, p = r; r < end; r++) {
1.82 - if (r->name >> 30 != RAZOR_PROPERTY_REQUIRES)
1.83 + if (r->type != RAZOR_PROPERTY_REQUIRES)
1.84 continue;
1.85
1.86 - if ((r->name & RAZOR_ENTRY_MASK) != (p->name & RAZOR_ENTRY_MASK)) {
1.87 + if (r->name != p->name) {
1.88 p = r;
1.89 - while (p < end && p->name == r->name)
1.90 + while (p < end && p->name == r->name &&
1.91 + p->type == r->type)
1.92 p++;
1.93 }
1.94
1.95 @@ -1066,7 +1070,8 @@
1.96 * requires a = 1, provides a = 1, requires a = 2,
1.97 * provides a = 2, as the kernel and kernel-devel
1.98 * does.*/
1.99 - while (p + 1 < end && p->name == (p + 1)->name)
1.100 + while (p + 1 < end && p->name == (p + 1)->name &&
1.101 + p->type == (p + 1)->type)
1.102 p++;
1.103
1.104 /* FIXME: We need to track property flags (<, <=, =
1.105 @@ -1075,11 +1080,11 @@
1.106 * requires a = 1 isn't satisfied by a = 2 provides. */
1.107
1.108 if (p == end ||
1.109 - (p->name >> 30) != RAZOR_PROPERTY_PROVIDES ||
1.110 - (r->name & RAZOR_ENTRY_MASK) != (p->name & RAZOR_ENTRY_MASK) ||
1.111 + p->type != RAZOR_PROPERTY_PROVIDES ||
1.112 + r->name != p->name ||
1.113 versioncmp(&pool[r->version], &pool[p->version]) > 0) {
1.114 /* FIXME: We ignore file requires for now. */
1.115 - if (pool[r->name & RAZOR_ENTRY_MASK] == '/')
1.116 + if (pool[r->name] == '/')
1.117 continue;
1.118 u = array_add(unsatisfied, sizeof *u);
1.119 *u = r - (struct razor_property *) set->properties.data;
1.120 @@ -1106,10 +1111,10 @@
1.121 r = properties + *u;
1.122 if (pool[r->version] == '\0')
1.123 printf("%ss not satisfied\n",
1.124 - &pool[r->name & RAZOR_ENTRY_MASK]);
1.125 + &pool[r->name]);
1.126 else
1.127 printf("%s-%s not satisfied\n",
1.128 - &pool[r->name & RAZOR_ENTRY_MASK],
1.129 + &pool[r->name],
1.130 &pool[r->version]);
1.131 }
1.132
1.133 @@ -1230,7 +1235,9 @@
1.134 struct razor_property *p;
1.135
1.136 p = array_add(&merger->set->properties, sizeof *p);
1.137 - p->name = hashtable_tokenize(&merger->table, name) | (type << 30);
1.138 + p->name = hashtable_tokenize(&merger->table, name);
1.139 + p->flags = 0;
1.140 + p->type = type;
1.141 p->relation = relation;
1.142 p->version = hashtable_tokenize(&merger->table, version);
1.143
1.144 @@ -1270,8 +1277,7 @@
1.145 p1 = (struct razor_property *) set1->properties.data + i;
1.146 p2 = (struct razor_property *) set2->properties.data + j;
1.147 if (i < count1 && j < count2)
1.148 - cmp = strcmp(&pool1[p1->name & RAZOR_ENTRY_MASK],
1.149 - &pool2[p2->name & RAZOR_ENTRY_MASK]);
1.150 + cmp = strcmp(&pool1[p1->name], &pool2[p2->name]);
1.151 else if (i < count1)
1.152 cmp = -1;
1.153 else
1.154 @@ -1283,22 +1289,22 @@
1.155 &pool2[p2->version]);
1.156 if (cmp < 0) {
1.157 map1[i++] = add_property(merger,
1.158 - &pool1[p1->name & RAZOR_ENTRY_MASK],
1.159 + &pool1[p1->name],
1.160 p1->relation,
1.161 &pool1[p1->version],
1.162 - (p1->name >> 30));
1.163 + p1->type);
1.164 } else if (cmp > 0) {
1.165 map2[j++] = add_property(merger,
1.166 - &pool2[p2->name & RAZOR_ENTRY_MASK],
1.167 + &pool2[p2->name],
1.168 p2->relation,
1.169 &pool2[p2->version],
1.170 - (p2->name >> 30));
1.171 + p2->type);
1.172 } else {
1.173 map1[i++] = map2[j++] = add_property(merger,
1.174 - &pool1[p1->name & RAZOR_ENTRY_MASK],
1.175 + &pool1[p1->name],
1.176 p1->relation,
1.177 &pool1[p1->version],
1.178 - (p1->name >> 30));
1.179 + p1->type);
1.180 }
1.181 }
1.182 }
1.183 @@ -1450,18 +1456,16 @@
1.184 r = requires + *u;
1.185
1.186 while (p < pend &&
1.187 - strcmp(&pool[r->name & RAZOR_ENTRY_MASK],
1.188 - &upool[p->name & RAZOR_ENTRY_MASK]) > 0 &&
1.189 - (p->name >> 30) != RAZOR_PROPERTY_PROVIDES)
1.190 + strcmp(&pool[r->name], &upool[p->name]) > 0 &&
1.191 + p->type != RAZOR_PROPERTY_PROVIDES)
1.192 p++;
1.193 /* If there is more than one version of a provides,
1.194 * seek to the end for the highest version. */
1.195 - while (p + 1 < pend && p->name == (p + 1)->name)
1.196 + while (p + 1 < pend && p->name == (p + 1)->name && p->type == (p + 1)->type)
1.197 p++;
1.198
1.199 if (p == pend ||
1.200 - strcmp(&pool[r->name & RAZOR_ENTRY_MASK],
1.201 - &upool[p->name & RAZOR_ENTRY_MASK]) != 0 ||
1.202 + strcmp(&pool[r->name], &upool[p->name]) != 0 ||
1.203 versioncmp(&pool[r->version], &upool[p->version]) > 0) {
1.204 /* Do we need to track unsatisfiable requires
1.205 * as we go, or should we just do a