razor.c
changeset 109 313b0a615c14
parent 108 340d92912f49
child 113 e408ff1d4a4d
     1.1 --- a/razor.c	Mon Feb 04 10:46:29 2008 -0500
     1.2 +++ b/razor.c	Mon Feb 04 14:25:45 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  		}