razor.c
changeset 219 1c2997b34929
parent 212 e8f493d8ff9a
child 220 1fcb5c23034a
     1.1 --- a/razor.c	Wed Apr 09 21:14:36 2008 -0400
     1.2 +++ b/razor.c	Wed Jun 04 20:16:50 2008 -0400
     1.3 @@ -810,6 +810,7 @@
     1.4  	struct razor_set *set;
     1.5  	struct razor_package *package, *end;
     1.6  	struct list *index;
     1.7 +	int free_index;
     1.8  };
     1.9  
    1.10  static struct razor_package_iterator *
    1.11 @@ -886,6 +887,9 @@
    1.12  void
    1.13  razor_package_iterator_destroy(struct razor_package_iterator *pi)
    1.14  {
    1.15 +	if (pi->free_index)
    1.16 +		free(pi->index);
    1.17 +
    1.18  	free(pi);
    1.19  }
    1.20  
    1.21 @@ -2993,3 +2997,78 @@
    1.22  
    1.23  	/* FIXME: free upstream if it was created as an empty set */
    1.24  }
    1.25 +
    1.26 +struct razor_package_query {
    1.27 +	struct razor_set *set;
    1.28 +	char *vector;
    1.29 +	int count;
    1.30 +};
    1.31 +
    1.32 +struct razor_package_query *
    1.33 +razor_package_query_create(struct razor_set *set)
    1.34 +{
    1.35 +	struct razor_package_query *pq;
    1.36 +	int count;
    1.37 +
    1.38 +	pq = zalloc(sizeof *pq);
    1.39 +	pq->set = set;
    1.40 +	count = set->packages.size / sizeof(struct razor_package);
    1.41 +	pq->vector = zalloc(count * sizeof(char));
    1.42 +
    1.43 +	return pq;
    1.44 +}
    1.45 +
    1.46 +void
    1.47 +razor_package_query_add_package(struct razor_package_query *pq,
    1.48 +				struct razor_package *p)
    1.49 +{
    1.50 +	struct razor_package *packages;
    1.51 +
    1.52 +	packages = pq->set->packages.data;
    1.53 +	pq->count += pq->vector[p - packages] ^ 1;
    1.54 +	pq->vector[p - packages] = 1;
    1.55 +}
    1.56 +
    1.57 +void
    1.58 +razor_package_query_add_iterator(struct razor_package_query *pq,
    1.59 +				 struct razor_package_iterator *pi)
    1.60 +{
    1.61 +	struct razor_package *packages, *p;
    1.62 +	const char *name, *version, *arch;
    1.63 +
    1.64 +	packages = pq->set->packages.data;
    1.65 +	while (razor_package_iterator_next(pi, &p, &name, &version, &arch)) {
    1.66 +		pq->count += pq->vector[p - packages] ^ 1;
    1.67 +		pq->vector[p - packages] = 1;
    1.68 +	}
    1.69 +}
    1.70 +
    1.71 +struct razor_package_iterator *
    1.72 +razor_package_query_finish(struct razor_package_query *pq)
    1.73 +{
    1.74 +	struct razor_package_iterator *pi;
    1.75 +	struct razor_set *set;
    1.76 +	struct list *index;
    1.77 +	int i, j, count;
    1.78 +
    1.79 +	set = pq->set;
    1.80 +	count = set->packages.size / sizeof(struct razor_package);
    1.81 +	index = zalloc(pq->count * sizeof *index);
    1.82 +
    1.83 +	for (i = 0, j = 0; i < count; i++) {
    1.84 +		if (!pq->vector[i])
    1.85 +			continue;
    1.86 +
    1.87 +		index[j].data = i;
    1.88 +		if (j == pq->count - 1)
    1.89 +			index[j].flags = 0x80;
    1.90 +		j++;
    1.91 +	}
    1.92 +
    1.93 +	free(pq);
    1.94 +
    1.95 +	pi = razor_package_iterator_create_with_index(set, index);
    1.96 +	pi->free_index = 1;
    1.97 +
    1.98 +	return pi;
    1.99 +}