razor.c
changeset 62 3e42af5305ac
parent 60 fca1ef50dd2c
child 64 8e37a9f8fd70
     1.1 --- a/razor.c	Wed Oct 24 13:20:12 2007 -0400
     1.2 +++ b/razor.c	Thu Oct 25 13:21:26 2007 -0400
     1.3 @@ -35,6 +35,10 @@
     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_IMMEDIATE		0x80000000ul
     1.9 +#define RAZOR_ENTRY_MASK	0x00fffffful
    1.10 +
    1.11  #define RAZOR_STRING_POOL 0
    1.12  #define RAZOR_PACKAGES 1
    1.13  #define RAZOR_REQUIRES 2
    1.14 @@ -696,7 +700,13 @@
    1.15  	properties->size = (void *) up - properties->data;
    1.16  	rp_end = up;
    1.17  	for (rp = properties->data, p = pkgs; rp < rp_end; rp++, p++) {
    1.18 -		rp->packages = add_to_property_pool(&set->package_pool, p);
    1.19 +		if (p->size / sizeof *r == 1) {
    1.20 +			r = p->data;
    1.21 +			rp->packages = *r | RAZOR_IMMEDIATE;
    1.22 +		} else {
    1.23 +			rp->packages =
    1.24 +				add_to_property_pool(&set->package_pool, p);
    1.25 +		}
    1.26  		array_release(p);
    1.27  	}
    1.28  
    1.29 @@ -740,10 +750,6 @@
    1.30  	}		
    1.31  }
    1.32  
    1.33 -#define RAZOR_ENTRY_LAST	0x80000000ul
    1.34 -#define RAZOR_IMMEDIATE		0x80000000ul
    1.35 -#define RAZOR_ENTRY_MASK	0x00fffffful
    1.36 -
    1.37  static void
    1.38  serialize_files(struct razor_set *set,
    1.39  		struct import_directory *d, struct array *array)
    1.40 @@ -761,7 +767,7 @@
    1.41  		e->start = p->count > 0 ? s : 0;
    1.42  		s += p->count;
    1.43  
    1.44 -		if (p->packages.size / sizeof (unsigned long) == 1) {
    1.45 +		if (p->packages.size / sizeof *r == 1) {
    1.46  			r = p->packages.data;
    1.47  			e->packages = *r | RAZOR_IMMEDIATE;
    1.48  		} else {
    1.49 @@ -783,6 +789,18 @@
    1.50  }
    1.51  
    1.52  static void
    1.53 +remap_property_package_links(struct array *properties, unsigned long *rmap)
    1.54 +{
    1.55 +	struct razor_property *p, *end;
    1.56 +
    1.57 +	end = properties->data + properties->size;
    1.58 +	for (p = properties->data; p < end; p++)
    1.59 +		if (p->packages & RAZOR_IMMEDIATE)
    1.60 +			p->packages = rmap[p->packages & RAZOR_ENTRY_MASK] |
    1.61 +				RAZOR_IMMEDIATE;
    1.62 +}
    1.63 +
    1.64 +static void
    1.65  build_file_tree(struct razor_importer *importer)
    1.66  {
    1.67  	int count, i, length;
    1.68 @@ -923,9 +941,10 @@
    1.69  	build_file_tree(importer);
    1.70  	remap_links(&importer->set->package_pool, rmap);
    1.71  	build_package_file_lists(importer->set, rmap);
    1.72 +	remap_property_package_links(&importer->set->requires, rmap);
    1.73 +	remap_property_package_links(&importer->set->provides, rmap);
    1.74  	free(rmap);
    1.75  
    1.76 -
    1.77  	set = importer->set;
    1.78  	array_release(&importer->buckets);
    1.79  	free(importer);
    1.80 @@ -1081,12 +1100,17 @@
    1.81  	while (property < end && strcmp(name, &pool[property->name]) == 0) {
    1.82  		if (version && versioncmp(version, &pool[property->version]) != 0)
    1.83  			goto next;
    1.84 -		r = (unsigned long *)
    1.85 -			set->package_pool.data + property->packages;
    1.86 +		
    1.87 +		if (property->packages & RAZOR_IMMEDIATE)
    1.88 +			r = &property->packages;
    1.89 +		else
    1.90 +			r = (unsigned long *)
    1.91 +				set->package_pool.data + property->packages;
    1.92  		while (~*r) {
    1.93 -			p = &packages[*r++];
    1.94 -			printf("%s-%s\n",
    1.95 -			       &pool[p->name], &pool[p->version]);
    1.96 +			p = &packages[*r & RAZOR_ENTRY_MASK];
    1.97 +			printf("%s-%s\n", &pool[p->name], &pool[p->version]);
    1.98 +			if (*r++ & RAZOR_IMMEDIATE)
    1.99 +				break;
   1.100  		}
   1.101  	next:
   1.102  		property++;
   1.103 @@ -1558,7 +1582,13 @@
   1.104  	prop_end = set->requires.data + set->requires.size;
   1.105  	a = requires_pkgs;
   1.106  	for (prop = set->requires.data; prop < prop_end; prop++, a++) {
   1.107 -		prop->packages = add_to_property_pool(&set->requires_pool, a);
   1.108 +		if (a->size / sizeof *r == 1) {
   1.109 +			r = a->data;
   1.110 +			prop->packages = *r | RAZOR_IMMEDIATE;
   1.111 +		} else {
   1.112 +			prop->packages =
   1.113 +				add_to_property_pool(&set->requires_pool, a);
   1.114 +		}
   1.115  		array_release(a);
   1.116  	}
   1.117  	free(requires_pkgs);
   1.118 @@ -1566,7 +1596,13 @@
   1.119  	prop_end = set->provides.data + set->provides.size;
   1.120  	a = provides_pkgs;
   1.121  	for (prop = set->provides.data; prop < prop_end; prop++, a++) {
   1.122 -		prop->packages = add_to_property_pool(&set->provides_pool, a);
   1.123 +		if (a->size / sizeof *r == 1) {
   1.124 +			r = a->data;
   1.125 +			prop->packages = *r | RAZOR_IMMEDIATE;
   1.126 +		} else {
   1.127 +			prop->packages =
   1.128 +				add_to_property_pool(&set->provides_pool, a);
   1.129 +		}
   1.130  		array_release(a);
   1.131  	}
   1.132  	free(provides_pkgs);
   1.133 @@ -1684,7 +1720,10 @@
   1.134  		} else {
   1.135  			pkg = array_add(list, sizeof *pkg);
   1.136  			/* We just pull in the first package that provides */
   1.137 -			*pkg = package_pool[p->packages];
   1.138 +			if (p->packages & RAZOR_IMMEDIATE)
   1.139 +				*pkg = p->packages & RAZOR_ENTRY_MASK;
   1.140 +			else
   1.141 +				*pkg = package_pool[p->packages];
   1.142  		}
   1.143  	}	
   1.144  }