razor.c
changeset 65 8fec3db93757
parent 61 b0e1638a9f96
child 66 bb4ca4a47f66
     1.1 --- a/razor.c	Thu Oct 25 13:21:18 2007 -0400
     1.2 +++ b/razor.c	Sun Oct 28 22:50:57 2007 -0400
     1.3 @@ -348,10 +348,9 @@
     1.4  {
     1.5  	unsigned long  *p;
     1.6  
     1.7 -	p = array_add(properties, sizeof *p);
     1.8 -	*p = ~0ul;
     1.9  	p = array_add(pool, properties->size);
    1.10  	memcpy(p, properties->data, properties->size);
    1.11 +	p[properties->size / sizeof *p - 1] |= RAZOR_IMMEDIATE;
    1.12  
    1.13  	return p - (unsigned long *) pool->data;
    1.14  }
    1.15 @@ -722,8 +721,7 @@
    1.16  
    1.17  	end = links->data + links->size;
    1.18  	for (p = links->data; p < end; p++)
    1.19 -		if (*p != ~0)
    1.20 -			*p = map[*p];
    1.21 +		*p = map[*p & RAZOR_ENTRY_MASK] | (*p & ~RAZOR_ENTRY_MASK);
    1.22  }
    1.23  
    1.24  static int
    1.25 @@ -767,7 +765,11 @@
    1.26  		e->start = p->count > 0 ? s : 0;
    1.27  		s += p->count;
    1.28  
    1.29 -		if (p->packages.size / sizeof *r == 1) {
    1.30 +		if (p->packages.size == 0) {
    1.31 +			/* FIXME: We need to make sure this is handled
    1.32 +			 * correctly as the empty list. */
    1.33 +			e->packages = 0 | RAZOR_IMMEDIATE;
    1.34 +		} else if (p->packages.size / sizeof *r == 1) {
    1.35  			r = p->packages.data;
    1.36  			e->packages = *r | RAZOR_IMMEDIATE;
    1.37  		} else {
    1.38 @@ -893,7 +895,7 @@
    1.39  			r = (unsigned long *) set->package_pool.data + e->packages;
    1.40  		}
    1.41  
    1.42 -		while (~*r) {
    1.43 +		while (1) {
    1.44  			q = array_add(&pkgs[*r & RAZOR_ENTRY_MASK], sizeof *q);
    1.45  			*q = e - (struct razor_entry *) set->files.data;
    1.46  			if (*r++ & RAZOR_IMMEDIATE)
    1.47 @@ -1049,9 +1051,11 @@
    1.48  			package->requires;
    1.49  		requires = set->requires.data;
    1.50  		pool = set->string_pool.data;
    1.51 -		while (~*r) {
    1.52 -			p = &requires[*r++];
    1.53 +		while (1) {
    1.54 +			p = &requires[*r & RAZOR_ENTRY_MASK];
    1.55  			printf("%s-%s\n", &pool[p->name], &pool[p->version]);
    1.56 +			if (*r++ & RAZOR_IMMEDIATE)
    1.57 +				break;
    1.58  		}
    1.59  	} else
    1.60  		razor_set_list_all_properties(set, &set->requires);
    1.61 @@ -1071,9 +1075,11 @@
    1.62  			package->provides;
    1.63  		provides = set->provides.data;
    1.64  		pool = set->string_pool.data;
    1.65 -		while (~*r) {
    1.66 -			p = &provides[*r++];
    1.67 +		while (1) {
    1.68 +			p = &provides[*r & RAZOR_ENTRY_MASK];
    1.69  			printf("%s-%s\n", &pool[p->name], &pool[p->version]);
    1.70 +			if (*r++ & RAZOR_IMMEDIATE)
    1.71 +				break;
    1.72  		}
    1.73  	} else 
    1.74  		razor_set_list_all_properties(set, &set->provides);
    1.75 @@ -1106,7 +1112,7 @@
    1.76  		else
    1.77  			r = (unsigned long *)
    1.78  				set->package_pool.data + property->packages;
    1.79 -		while (~*r) {
    1.80 +		while (1) {
    1.81  			p = &packages[*r & RAZOR_ENTRY_MASK];
    1.82  			printf("%s-%s\n", &pool[p->name], &pool[p->version]);
    1.83  			if (*r++ & RAZOR_IMMEDIATE)
    1.84 @@ -1217,7 +1223,7 @@
    1.85  
    1.86  	packages = set->packages.data;
    1.87  	pool = set->string_pool.data;
    1.88 -	while (~*r) {
    1.89 +	while (1) {
    1.90  		p = &packages[*r & RAZOR_ENTRY_MASK];
    1.91  		printf("%s-%s\n", &pool[p->name], &pool[p->version]);
    1.92  		if (*r++ & RAZOR_IMMEDIATE)
    1.93 @@ -1401,15 +1407,27 @@
    1.94  	p->requires = package->requires;
    1.95  	p->provides = package->provides;
    1.96  
    1.97 -	r = (unsigned long *)
    1.98 -		source->set->requires_pool.data + package->requires;
    1.99 -	while (*r != ~0)
   1.100 -		source->requires_map[*r++] = 1;
   1.101 +	if (package->requires & RAZOR_IMMEDIATE)
   1.102 +		r = &package->requires;
   1.103 +	else
   1.104 +		r = (unsigned long *)
   1.105 +			source->set->requires_pool.data + package->requires;
   1.106 +	while (1) {
   1.107 +		source->requires_map[*r & RAZOR_ENTRY_MASK] = 1;
   1.108 +		if (*r++ & RAZOR_IMMEDIATE)
   1.109 +			break;
   1.110 +	}
   1.111  
   1.112 -	r = (unsigned long *)
   1.113 -		source->set->provides_pool.data + package->provides;
   1.114 -	while (*r != ~0)
   1.115 -		source->provides_map[*r++] = 1;
   1.116 +	if (package->provides & RAZOR_IMMEDIATE)
   1.117 +		r = &package->requires;
   1.118 +	else
   1.119 +		r = (unsigned long *)
   1.120 +			source->set->provides_pool.data + package->provides;
   1.121 +	while (1) {
   1.122 +		source->provides_map[*r & RAZOR_ENTRY_MASK] = 1;
   1.123 +		if (*r++ & RAZOR_IMMEDIATE)
   1.124 +			break;
   1.125 +	}
   1.126  }
   1.127  
   1.128  
   1.129 @@ -1536,14 +1554,13 @@
   1.130  
   1.131  	r = pool->size / sizeof *q;
   1.132  	p = (unsigned long *) source_pool->data + index;
   1.133 -	while (*p != ~0) {
   1.134 +	while (1) {
   1.135  		q = array_add(pool, sizeof *q);
   1.136 -		*q = map[*p++];
   1.137 +		*q = map[*p & RAZOR_ENTRY_MASK] | (*p & ~RAZOR_ENTRY_MASK);
   1.138 +		if (*p++ & RAZOR_ENTRY_LAST)
   1.139 +			break;
   1.140  	}
   1.141  
   1.142 -	q = array_add(pool, sizeof *q);
   1.143 -	*q = ~0;
   1.144 -
   1.145  	return r;
   1.146  }
   1.147  	
   1.148 @@ -1569,13 +1586,17 @@
   1.149  	ppool = set->provides_pool.data;
   1.150  
   1.151  	for (pkg = set->packages.data; pkg < pkg_end; pkg++) {
   1.152 -		for (r = &rpool[pkg->requires]; *r != ~0; r++) {
   1.153 -			q = array_add(&requires_pkgs[*r], sizeof *q);
   1.154 +		for (r = &rpool[pkg->requires]; ; r++) {
   1.155 +			q = array_add(&requires_pkgs[*r & RAZOR_ENTRY_MASK], sizeof *q);
   1.156  			*q = pkg - (struct razor_package *) set->packages.data;
   1.157 +			if (*r & RAZOR_IMMEDIATE)
   1.158 +				break;
   1.159  		}
   1.160 -		for (r = &ppool[pkg->provides]; *r != ~0; r++) {
   1.161 -			q = array_add(&provides_pkgs[*r], sizeof *q);
   1.162 +		for (r = &ppool[pkg->provides]; ; r++) {
   1.163 +			q = array_add(&provides_pkgs[*r & RAZOR_ENTRY_MASK], sizeof *q);
   1.164  			*q = pkg - (struct razor_package *) set->packages.data;
   1.165 +			if (*r & RAZOR_IMMEDIATE)
   1.166 +				break;
   1.167  		}
   1.168  	}
   1.169