split razor_property.name into name, flags, and type bitfields
authorDan Winship <danw@gnome.org>
Mon Feb 11 11:21:54 2008 -0500 (2008-02-11)
changeset 11966998d6a1765
parent 118 832743d47157
child 120 b937596c33d7
split razor_property.name into name, flags, and type bitfields
razor.c
     1.1 --- a/razor.c	Mon Feb 11 09:50:17 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