1.1 --- a/razor.c Mon Feb 04 10:46:29 2008 -0500
1.2 +++ b/razor.c Wed Feb 06 12:37:49 2008 -0500
1.3 @@ -58,6 +58,7 @@
1.4
1.5 struct razor_property {
1.6 uint32_t name;
1.7 + uint32_t relation;
1.8 uint32_t version;
1.9 uint32_t packages;
1.10 };
1.11 @@ -440,7 +441,9 @@
1.12
1.13 void
1.14 razor_importer_add_property(struct razor_importer *importer,
1.15 - const char *name, const char *version,
1.16 + const char *name,
1.17 + enum razor_version_relation relation,
1.18 + const char *version,
1.19 enum razor_property_type type)
1.20 {
1.21 struct razor_property *p;
1.22 @@ -448,6 +451,7 @@
1.23
1.24 p = array_add(&importer->set->properties, sizeof *p);
1.25 p->name = hashtable_tokenize(&importer->table, name) | (type << 30);
1.26 + p->relation = relation;
1.27 p->version = hashtable_tokenize(&importer->table, version);
1.28 p->packages = importer->package -
1.29 (struct razor_package *) importer->set->packages.data;
1.30 @@ -642,10 +646,13 @@
1.31 struct razor_set *set = data;
1.32 char *pool = set->string_pool.data;
1.33
1.34 - if (prop1->name == prop2->name)
1.35 - return versioncmp(&pool[prop1->version],
1.36 - &pool[prop2->version]);
1.37 - else if ((prop1->name & RAZOR_ENTRY_MASK) == (prop2->name & RAZOR_ENTRY_MASK))
1.38 + if (prop1->name == prop2->name) {
1.39 + if (prop1->relation == prop2->relation)
1.40 + return versioncmp(&pool[prop1->version],
1.41 + &pool[prop2->version]);
1.42 + else
1.43 + return prop1->relation - prop2->relation;
1.44 + } else if ((prop1->name & RAZOR_ENTRY_MASK) == (prop2->name & RAZOR_ENTRY_MASK))
1.45 return (prop1->name >> 30) - (prop2->name >> 30);
1.46 else
1.47 return strcmp(&pool[prop1->name & RAZOR_ENTRY_MASK],
1.48 @@ -671,9 +678,11 @@
1.49 rmap = malloc(count * sizeof *map);
1.50 pkgs = zalloc(count * sizeof *pkgs);
1.51 for (rp = set->properties.data, up = rp, i = 0; rp < rp_end; rp++, i++) {
1.52 - if (rp->name != up->name || rp->version != up->version) {
1.53 + if (rp->name != up->name || rp->relation != up->relation ||
1.54 + rp->version != up->version) {
1.55 up++;
1.56 up->name = rp->name;
1.57 + up->relation = rp->relation;
1.58 up->version = rp->version;
1.59 }
1.60
1.61 @@ -1061,7 +1070,9 @@
1.62 int
1.63 razor_property_iterator_next(struct razor_property_iterator *pi,
1.64 struct razor_property **property,
1.65 - const char **name, const char **version,
1.66 + const char **name,
1.67 + enum razor_version_relation *relation,
1.68 + const char **version,
1.69 enum razor_property_type *type)
1.70 {
1.71 char *pool;
1.72 @@ -1082,6 +1093,7 @@
1.73 pool = pi->set->string_pool.data;
1.74 *property = p;
1.75 *name = &pool[p->name & RAZOR_ENTRY_MASK];
1.76 + *relation = p->relation;
1.77 *version = &pool[p->version];
1.78 *type = p->name >> 30;
1.79 } else {
1.80 @@ -1443,12 +1455,14 @@
1.81
1.82 static uint32_t
1.83 add_property(struct razor_merger *merger,
1.84 - const char *name, const char *version, int type)
1.85 + const char *name, enum razor_version_relation relation,
1.86 + const char *version, int type)
1.87 {
1.88 struct razor_property *p;
1.89
1.90 p = array_add(&merger->set->properties, sizeof *p);
1.91 p->name = hashtable_tokenize(&merger->table, name) | (type << 30);
1.92 + p->relation = relation;
1.93 p->version = hashtable_tokenize(&merger->table, version);
1.94
1.95 return p - (struct razor_property *) merger->set->properties.data;
1.96 @@ -1494,21 +1508,26 @@
1.97 else
1.98 cmp = 1;
1.99 if (cmp == 0)
1.100 + cmp = p1->relation - p2->relation;
1.101 + if (cmp == 0)
1.102 cmp = versioncmp(&pool1[p1->version],
1.103 &pool2[p2->version]);
1.104 if (cmp < 0) {
1.105 map1[i++] = add_property(merger,
1.106 &pool1[p1->name & RAZOR_ENTRY_MASK],
1.107 + p1->relation,
1.108 &pool1[p1->version],
1.109 (p1->name >> 30));
1.110 } else if (cmp > 0) {
1.111 map2[j++] = add_property(merger,
1.112 &pool2[p2->name & RAZOR_ENTRY_MASK],
1.113 + p2->relation,
1.114 &pool2[p2->version],
1.115 (p2->name >> 30));
1.116 } else {
1.117 map1[i++] = map2[j++] = add_property(merger,
1.118 &pool1[p1->name & RAZOR_ENTRY_MASK],
1.119 + p1->relation,
1.120 &pool1[p1->version],
1.121 (p1->name >> 30));
1.122 }