razor.c
changeset 92 74f19848a71b
parent 91 6884cefd1b8c
child 94 0aa93cfbcb3f
     1.1 --- a/razor.c	Thu Jan 03 09:32:31 2008 -0500
     1.2 +++ b/razor.c	Thu Jan 03 19:50:20 2008 -0500
     1.3 @@ -323,7 +323,12 @@
     1.4  static unsigned long
     1.5  add_to_property_pool(struct array *pool, struct array *properties)
     1.6  {
     1.7 -	unsigned long  *p;
     1.8 +	unsigned long *p;
     1.9 +
    1.10 +	if (properties->size == 0)
    1.11 +		return ~0;
    1.12 +	else if (properties->size == sizeof *p)
    1.13 +		return *(unsigned long *) properties->data | RAZOR_IMMEDIATE;
    1.14  
    1.15  	p = array_add(pool, properties->size);
    1.16  	memcpy(p, properties->data, properties->size);
    1.17 @@ -756,9 +761,7 @@
    1.18  		s += p->count;
    1.19  
    1.20  		if (p->packages.size == 0) {
    1.21 -			/* FIXME: We need to make sure this is handled
    1.22 -			 * correctly as the empty list. */
    1.23 -			e->packages = 0 | RAZOR_IMMEDIATE;
    1.24 +			e->packages = ~0;
    1.25  		} else if (p->packages.size / sizeof *r == 1) {
    1.26  			r = p->packages.data;
    1.27  			e->packages = *r | RAZOR_IMMEDIATE;
    1.28 @@ -855,7 +858,7 @@
    1.29  	e = array_add(&importer->set->files, sizeof *e);
    1.30  	e->name = root.name | RAZOR_ENTRY_LAST;
    1.31  	e->start = 1;
    1.32 -	e->packages = 0;
    1.33 +	e->packages = ~0;
    1.34  
    1.35  	serialize_files(importer->set, &root, &importer->set->files);
    1.36  
    1.37 @@ -874,10 +877,11 @@
    1.38  	count = set->packages.size / sizeof *p;
    1.39  	pkgs = zalloc(count * sizeof *pkgs);
    1.40  
    1.41 -	e = set->files.data;
    1.42  	end = set->files.data + set->files.size;
    1.43 -	while (e < end) {
    1.44 -		if (e->packages & RAZOR_IMMEDIATE) {
    1.45 +	for (e = set->files.data; e < end; e++) {
    1.46 +		if (e->packages == ~0) {
    1.47 +			continue;
    1.48 +		} else if (e->packages & RAZOR_IMMEDIATE) {
    1.49  			e->packages = rmap[e->packages & RAZOR_ENTRY_MASK] |
    1.50  				RAZOR_IMMEDIATE;
    1.51  			r = &e->packages;
    1.52 @@ -891,7 +895,6 @@
    1.53  			if (*r++ & RAZOR_IMMEDIATE)
    1.54  				break;
    1.55  		}
    1.56 -		e++;
    1.57  	}
    1.58  
    1.59  	packages = set->packages.data;
    1.60 @@ -939,23 +942,43 @@
    1.61  	return set;
    1.62  }
    1.63  
    1.64 -void
    1.65 -razor_set_list(struct razor_set *set, const char *pattern)
    1.66 +struct razor_package_iterator {
    1.67 +	struct razor_set *set;
    1.68 +	struct razor_package *package, *end;
    1.69 +};
    1.70 +
    1.71 +struct razor_package_iterator *
    1.72 +razor_package_iterator_create(struct razor_set *set)
    1.73  {
    1.74 -	struct razor_package *p, *end;
    1.75 -	int with_version = 0;
    1.76 +	struct razor_package_iterator *pi;
    1.77 +
    1.78 +	pi = zalloc(sizeof *pi);
    1.79 +	pi->set = set;
    1.80 +	pi->package = set->packages.data;
    1.81 +	pi->end = set->packages.data + set->packages.size;
    1.82 +
    1.83 +	return pi;
    1.84 +}
    1.85 +
    1.86 +int
    1.87 +razor_package_iterator_next(struct razor_package_iterator *pi,
    1.88 +			    struct razor_package **package,
    1.89 +			    const char **name, const char **version)
    1.90 +{
    1.91  	char *pool;
    1.92  
    1.93 -	pool = set->string_pool.data;
    1.94 -	end = set->packages.data + set->packages.size;
    1.95 -	for (p = set->packages.data; p < end; p++) {
    1.96 -		if (pattern && fnmatch(pattern, &pool[p->name], 0) != 0)
    1.97 -		    continue;
    1.98 -		if (with_version)
    1.99 -			printf("%s-%s\n", &pool[p->name], &pool[p->version]);
   1.100 -		else
   1.101 -			printf("%s\n", &pool[p->name]);
   1.102 -	}
   1.103 +	pool = pi->set->string_pool.data;
   1.104 +	*package = pi->package;
   1.105 +	*name = &pool[pi->package->name];
   1.106 +	*version = &pool[pi->package->version];
   1.107 +
   1.108 +	return pi->package++ < pi->end;
   1.109 +}
   1.110 +
   1.111 +void
   1.112 +razor_package_iterator_destroy(struct razor_package_iterator *pi)
   1.113 +{
   1.114 +	free(pi);
   1.115  }
   1.116  
   1.117  struct razor_set *bsearch_set;
   1.118 @@ -1010,51 +1033,71 @@
   1.119  	return p;
   1.120  }
   1.121  
   1.122 +struct razor_property_iterator {
   1.123 +	struct razor_set *set;
   1.124 +	struct razor_property *property, *end;
   1.125 +	unsigned long *index;
   1.126 +	int last;
   1.127 +};
   1.128 +
   1.129 +struct razor_property_iterator *
   1.130 +razor_property_iterator_create(struct razor_set *set,
   1.131 +			       struct razor_package *package)
   1.132 +{
   1.133 +	struct razor_property_iterator *pi;
   1.134 +
   1.135 +	pi = zalloc(sizeof *pi);
   1.136 +	pi->set = set;
   1.137 +	pi->property = set->properties.data;
   1.138 +	pi->end = set->properties.data + set->properties.size;
   1.139 +	if (package) {
   1.140 +		pi->index = (unsigned long *)
   1.141 +			set->property_pool.data + package->properties;
   1.142 +		pi->last = 0;
   1.143 +	} else {
   1.144 +		pi->index = NULL;
   1.145 +		pi->last = 0;
   1.146 +	}
   1.147 +
   1.148 +	return pi;
   1.149 +}
   1.150 +
   1.151 +int
   1.152 +razor_property_iterator_next(struct razor_property_iterator *pi,
   1.153 +			     struct razor_property **property,
   1.154 +			     const char **name, const char **version,
   1.155 +			     enum razor_property_type *type)
   1.156 +{
   1.157 +	char *pool;
   1.158 +	unsigned long flags, index;
   1.159 +	int valid;
   1.160 +	struct razor_property *p, *properties;
   1.161 +
   1.162 +	if (pi->index) {
   1.163 +		properties = pi->set->properties.data;
   1.164 +		p = &properties[*pi->index & RAZOR_ENTRY_MASK];
   1.165 +		valid = !pi->last;
   1.166 +		pi->last = (*pi->index++ & RAZOR_IMMEDIATE) != 0;
   1.167 +		if (!valid)
   1.168 +			return valid;
   1.169 +	} else {
   1.170 +		p = pi->property++;
   1.171 +		valid = p < pi->end;
   1.172 +	}			
   1.173 +
   1.174 +	pool = pi->set->string_pool.data;
   1.175 +	*property = p;
   1.176 +	*name = &pool[p->name & RAZOR_ENTRY_MASK];
   1.177 +	*version = &pool[p->version];
   1.178 +	*type = p->name >> 30;
   1.179 +
   1.180 +	return valid;
   1.181 +}
   1.182 +
   1.183  void
   1.184 -razor_set_list_properties(struct razor_set *set, const char *name,
   1.185 -			  enum razor_property_type type)
   1.186 +razor_property_iterator_destroy(struct razor_property_iterator *pi)
   1.187  {
   1.188 -	struct razor_property *p, *properties, *end;
   1.189 -	struct razor_package *package;
   1.190 -	unsigned long *r;
   1.191 -	char *pool;
   1.192 -
   1.193 -	pool = set->string_pool.data;
   1.194 -
   1.195 -	if (name) {
   1.196 -		package = razor_set_get_package(set, name);
   1.197 -		r = (unsigned long *) set->property_pool.data +
   1.198 -			package->properties;
   1.199 -		properties = set->properties.data;
   1.200 -		while (1) {
   1.201 -			p = &properties[*r & RAZOR_ENTRY_MASK];
   1.202 -			if ((p->name >> 30) != type)
   1.203 -				goto next;
   1.204 -			if (pool[p->version] == '\0')
   1.205 -				printf("%s\n",
   1.206 -				       &pool[p->name & RAZOR_ENTRY_MASK]);
   1.207 -			else
   1.208 -				printf("%s-%s\n",
   1.209 -				       &pool[p->name & RAZOR_ENTRY_MASK],
   1.210 -				       &pool[p->version]);
   1.211 -		next:
   1.212 -			if (*r++ & RAZOR_IMMEDIATE)
   1.213 -				break;
   1.214 -		}
   1.215 -	} else {
   1.216 -		end = set->properties.data + set->properties.size;
   1.217 -		for (p = set->properties.data; p < end; p++) {
   1.218 -			if ((p->name >> 30) != type)
   1.219 -				continue;
   1.220 -			if (pool[p->version] == '\0')
   1.221 -				printf("%s\n",
   1.222 -				       &pool[p->name & RAZOR_ENTRY_MASK]);
   1.223 -			else
   1.224 -				printf("%s-%s\n",
   1.225 -				       &pool[p->name & RAZOR_ENTRY_MASK],
   1.226 -				       &pool[p->version]);
   1.227 -		}
   1.228 -	}
   1.229 +	free(pi);
   1.230  }
   1.231  
   1.232  void