razor.c
changeset 60 fca1ef50dd2c
parent 59 c525dec02ef4
child 61 b0e1638a9f96
     1.1 --- a/razor.c	Wed Oct 24 12:21:29 2007 -0400
     1.2 +++ b/razor.c	Wed Oct 24 13:20:12 2007 -0400
     1.3 @@ -740,8 +740,9 @@
     1.4  	}		
     1.5  }
     1.6  
     1.7 -#define RAZOR_ENTRY_LAST 0x80000000ul
     1.8 -#define RAZOR_ENTRY_MASK 0x00fffffful
     1.9 +#define RAZOR_ENTRY_LAST	0x80000000ul
    1.10 +#define RAZOR_IMMEDIATE		0x80000000ul
    1.11 +#define RAZOR_ENTRY_MASK	0x00fffffful
    1.12  
    1.13  static void
    1.14  serialize_files(struct razor_set *set,
    1.15 @@ -749,7 +750,7 @@
    1.16  {
    1.17  	struct import_directory *p, *end;
    1.18  	struct razor_entry *e = NULL;
    1.19 -	unsigned long s;
    1.20 +	unsigned long s, *r;
    1.21  
    1.22  	p = d->files.data;
    1.23  	end = d->files.data + d->files.size;
    1.24 @@ -759,8 +760,14 @@
    1.25  		e->name = p->name;
    1.26  		e->start = p->count > 0 ? s : 0;
    1.27  		s += p->count;
    1.28 -		e->packages = add_to_property_pool(&set->package_pool,
    1.29 -						   &p->packages);
    1.30 +
    1.31 +		if (p->packages.size / sizeof (unsigned long) == 1) {
    1.32 +			r = p->packages.data;
    1.33 +			e->packages = *r | RAZOR_IMMEDIATE;
    1.34 +		} else {
    1.35 +			e->packages = add_to_property_pool(&set->package_pool,
    1.36 +							   &p->packages);
    1.37 +		}
    1.38  		array_release(&p->packages);
    1.39  		p++;
    1.40  	}		
    1.41 @@ -846,7 +853,7 @@
    1.42  }
    1.43  
    1.44  static void
    1.45 -build_package_file_lists(struct razor_set *set)
    1.46 +build_package_file_lists(struct razor_set *set, unsigned long *rmap)
    1.47  {
    1.48  	struct razor_package *p, *packages;
    1.49  	struct array *pkgs;
    1.50 @@ -860,10 +867,19 @@
    1.51  	e = set->files.data;
    1.52  	end = set->files.data + set->files.size;
    1.53  	while (e < end) {
    1.54 -		r = (unsigned long *) set->package_pool.data + e->packages;
    1.55 +		if (e->packages & RAZOR_IMMEDIATE) {
    1.56 +			e->packages = rmap[e->packages & RAZOR_ENTRY_MASK] |
    1.57 +				RAZOR_IMMEDIATE;
    1.58 +			r = &e->packages;
    1.59 +		} else {
    1.60 +			r = (unsigned long *) set->package_pool.data + e->packages;
    1.61 +		}
    1.62 +
    1.63  		while (~*r) {
    1.64 -			q = array_add(&pkgs[*r++], sizeof *q);
    1.65 +			q = array_add(&pkgs[*r & RAZOR_ENTRY_MASK], sizeof *q);
    1.66  			*q = e - (struct razor_entry *) set->files.data;
    1.67 +			if (*r++ & RAZOR_IMMEDIATE)
    1.68 +				break;
    1.69  		}
    1.70  		e++;
    1.71  	}
    1.72 @@ -906,9 +922,9 @@
    1.73  
    1.74  	build_file_tree(importer);
    1.75  	remap_links(&importer->set->package_pool, rmap);
    1.76 +	build_package_file_lists(importer->set, rmap);
    1.77  	free(rmap);
    1.78  
    1.79 -	build_package_file_lists(importer->set);
    1.80  
    1.81  	set = importer->set;
    1.82  	array_release(&importer->buckets);
    1.83 @@ -1170,12 +1186,18 @@
    1.84  	if (e == NULL)
    1.85  		return;
    1.86  	
    1.87 -	r = (unsigned long *) set->package_pool.data + e->packages;
    1.88 +	if (e->packages & RAZOR_IMMEDIATE)
    1.89 +		r = &e->packages;
    1.90 +	else
    1.91 +		r = (unsigned long *) set->package_pool.data + e->packages;
    1.92 +
    1.93  	packages = set->packages.data;
    1.94  	pool = set->string_pool.data;
    1.95  	while (~*r) {
    1.96 -		p = &packages[*r++];
    1.97 +		p = &packages[*r & RAZOR_ENTRY_MASK];
    1.98  		printf("%s-%s\n", &pool[p->name], &pool[p->version]);
    1.99 +		if (*r++ & RAZOR_IMMEDIATE)
   1.100 +			break;
   1.101  	}
   1.102  }
   1.103