1.1 --- a/razor.c Wed Apr 09 21:14:36 2008 -0400
1.2 +++ b/razor.c Wed Jun 04 20:04:57 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 +}