Split razor_package and razor_entry names into name and flags
authorDan Winship <danw@gnome.org>
Mon Feb 11 11:57:47 2008 -0500 (2008-02-11)
changeset 120b937596c33d7
parent 119 66998d6a1765
child 121 f991e2623c41
Split razor_package and razor_entry names into name and flags
razor.c
     1.1 --- a/razor.c	Mon Feb 11 11:21:54 2008 -0500
     1.2 +++ b/razor.c	Mon Feb 11 11:57:47 2008 -0500
     1.3 @@ -33,9 +33,6 @@
     1.4  #define RAZOR_MAGIC 0x7a7a7a7a
     1.5  #define RAZOR_VERSION 1
     1.6  
     1.7 -#define RAZOR_ENTRY_LAST	0x80000000ul
     1.8 -#define RAZOR_ENTRY_MASK	0x00fffffful
     1.9 -
    1.10  #define RAZOR_STRING_POOL	0
    1.11  #define RAZOR_PACKAGES		1
    1.12  #define RAZOR_PROPERTIES	2
    1.13 @@ -45,7 +42,8 @@
    1.14  #define RAZOR_FILE_POOL		6
    1.15  
    1.16  struct razor_package {
    1.17 -	uint32_t name;
    1.18 +	uint name  : 24;
    1.19 +	uint flags : 8;
    1.20  	uint32_t version;
    1.21  	struct list_head properties;
    1.22  	struct list_head files;
    1.23 @@ -61,11 +59,14 @@
    1.24  };
    1.25  
    1.26  struct razor_entry {
    1.27 -	uint32_t name;
    1.28 +	uint name  : 24;
    1.29 +	uint flags : 8;
    1.30  	uint32_t start;
    1.31  	struct list_head packages;
    1.32  };
    1.33  
    1.34 +#define RAZOR_ENTRY_LAST	0x80
    1.35 +
    1.36  struct razor_set {
    1.37  	struct array string_pool;
    1.38   	struct array packages;
    1.39 @@ -235,6 +236,7 @@
    1.40  
    1.41  	p = array_add(&importer->set->packages, sizeof *p);
    1.42  	p->name = hashtable_tokenize(&importer->table, name);
    1.43 +	p->flags = 0;
    1.44  	p->version = hashtable_tokenize(&importer->table, version);
    1.45  
    1.46  	importer->package = p;
    1.47 @@ -447,6 +449,7 @@
    1.48  	struct razor_set *set = data;
    1.49  	char *pool = set->string_pool.data;
    1.50  
    1.51 +	/* FIXME: what if the flags are different? */
    1.52  	if (pkg1->name == pkg2->name)
    1.53  		return versioncmp(&pool[pkg1->version], &pool[pkg2->version]);
    1.54  	else
    1.55 @@ -558,6 +561,7 @@
    1.56  	while (p < end) {
    1.57  		e = array_add(array, sizeof *e);
    1.58  		e->name = p->name;
    1.59 +		e->flags = 0;
    1.60  		e->start = p->count > 0 ? s : 0;
    1.61  		s += p->count;
    1.62  
    1.63 @@ -566,7 +570,7 @@
    1.64  		p++;
    1.65  	}		
    1.66  	if (e != NULL)
    1.67 -		e->name |= RAZOR_ENTRY_LAST;
    1.68 +		e->flags |= RAZOR_ENTRY_LAST;
    1.69  
    1.70  	p = d->files.data;
    1.71  	end = d->files.data + d->files.size;
    1.72 @@ -647,7 +651,8 @@
    1.73  	array_init(&importer->set->files);
    1.74  
    1.75  	e = array_add(&importer->set->files, sizeof *e);
    1.76 -	e->name = root.name | RAZOR_ENTRY_LAST;
    1.77 +	e->name = root.name;
    1.78 +	e->flags = RAZOR_ENTRY_LAST;
    1.79  	e->start = 1;
    1.80  	list_set_empty(&e->packages);
    1.81  
    1.82 @@ -789,7 +794,7 @@
    1.83  	if (valid) {
    1.84  		pool = pi->set->string_pool.data;
    1.85  		*package = p;
    1.86 -		*name = &pool[p->name & RAZOR_ENTRY_MASK];
    1.87 +		*name = &pool[p->name];
    1.88  		*version = &pool[p->version];
    1.89  	} else {
    1.90  		*package = NULL;
    1.91 @@ -899,7 +904,7 @@
    1.92  
    1.93  	e = (struct razor_entry *) set->files.data + dir->start;
    1.94  	do {
    1.95 -		n = pool + (e->name & RAZOR_ENTRY_MASK);
    1.96 +		n = pool + e->name;
    1.97  		if (strcmp(pattern + 1, n) == 0)
    1.98  			return e;
    1.99  		len = strlen(n);
   1.100 @@ -907,7 +912,7 @@
   1.101  		    pattern[len + 1] == '/') {
   1.102  			return find_entry(set, e, pattern + len + 1);
   1.103  		}
   1.104 -	} while (((e++)->name & RAZOR_ENTRY_LAST) == 0);
   1.105 +	} while (!((e++)->flags & RAZOR_ENTRY_LAST));
   1.106  
   1.107  	return NULL;
   1.108  }
   1.109 @@ -921,11 +926,11 @@
   1.110  
   1.111  	e = (struct razor_entry *) set->files.data + dir->start;
   1.112  	do {
   1.113 -		n = pool + (e->name & RAZOR_ENTRY_MASK);
   1.114 +		n = pool + e->name;
   1.115  		if (pattern && pattern[0] && fnmatch(pattern, n, 0) != 0)
   1.116  			continue;
   1.117  		printf("%s/%s%s\n", prefix, n, e->start > 0 ? "/" : "");
   1.118 -	} while (((e++)->name & RAZOR_ENTRY_LAST) == 0);
   1.119 +	} while (!((e++)->flags & RAZOR_ENTRY_LAST));
   1.120  }
   1.121  
   1.122  void
   1.123 @@ -986,26 +991,25 @@
   1.124  	e = entries + dir->start;
   1.125  	do {
   1.126  		if (entries + r->data == e) {
   1.127 -			printf("%s/%s\n", prefix,
   1.128 -			       pool + (e->name & RAZOR_ENTRY_MASK));
   1.129 +			printf("%s/%s\n", prefix, pool + e->name);
   1.130  			r = list_next(r);
   1.131  			if (!r)
   1.132  				return NULL;
   1.133  			if (r->data >= end)
   1.134  				return r;
   1.135  		}
   1.136 -	} while (!((e++)->name & RAZOR_ENTRY_LAST));
   1.137 +	} while (!((e++)->flags & RAZOR_ENTRY_LAST));
   1.138  
   1.139  	e = entries + dir->start;
   1.140  	do {
   1.141  		if (e->start == 0)
   1.142  			continue;
   1.143  
   1.144 -		if (e->name & RAZOR_ENTRY_LAST)
   1.145 +		if (e->flags & RAZOR_ENTRY_LAST)
   1.146  			next = end;
   1.147  		else {
   1.148  			f = e + 1; 
   1.149 -			while (f->start == 0 && !(f->name & RAZOR_ENTRY_LAST))
   1.150 +			while (f->start == 0 && !(f->flags & RAZOR_ENTRY_LAST))
   1.151  				f++;
   1.152  			if (f->start == 0)
   1.153  				next = end;
   1.154 @@ -1017,12 +1021,11 @@
   1.155  		if (e->start <= file && file < next) {
   1.156  			len = strlen(prefix);
   1.157  			prefix[len] = '/';
   1.158 -			strcpy(prefix + len + 1,
   1.159 -			       pool + (e->name & RAZOR_ENTRY_MASK));
   1.160 +			strcpy(prefix + len + 1, pool + e->name);
   1.161  			r = list_package_files(set, r, e, next, prefix);
   1.162  			prefix[len] = '\0';
   1.163  		}
   1.164 -	} while (!((e++)->name & RAZOR_ENTRY_LAST) && r != NULL);
   1.165 +	} while (!((e++)->flags & RAZOR_ENTRY_LAST) && r != NULL);
   1.166  
   1.167  	return r;
   1.168  }
   1.169 @@ -1121,8 +1124,7 @@
   1.170  	array_release(&unsatisfied);
   1.171  }
   1.172  
   1.173 -#define UPSTREAM_SOURCE 0x80000000ul
   1.174 -#define INDEX_MASK 0x00fffffful
   1.175 +#define UPSTREAM_SOURCE 0x80
   1.176  
   1.177  struct source {
   1.178  	struct razor_set *set;
   1.179 @@ -1172,7 +1174,7 @@
   1.180  	pool = source->set->string_pool.data;
   1.181  	p = array_add(&merger->set->packages, sizeof *p);
   1.182  	p->name = hashtable_tokenize(&merger->table, &pool[package->name]);
   1.183 -	p->name |= flags;
   1.184 +	p->flags = flags;
   1.185  	p->version = hashtable_tokenize(&merger->table,
   1.186  					&pool[package->version]);
   1.187  	p->properties = package->properties;
   1.188 @@ -1416,7 +1418,7 @@
   1.189  	for (p = merger->set->packages.data; p < pend; p++) {
   1.190  		struct source *src;
   1.191  
   1.192 -		if (p->name & UPSTREAM_SOURCE)
   1.193 +		if (p->flags & UPSTREAM_SOURCE)
   1.194  			src = &merger->source2;
   1.195  		else
   1.196  			src = &merger->source1;
   1.197 @@ -1425,7 +1427,7 @@
   1.198  				&src->set->property_pool,
   1.199  				src->property_map,
   1.200  				&merger->set->property_pool);
   1.201 -		p->name &= INDEX_MASK;
   1.202 +		p->flags &= ~UPSTREAM_SOURCE;
   1.203  	}
   1.204  
   1.205  	rebuild_package_lists(merger->set);