When uniquifying properties, also sort them on the owning package.
This ensures that whenever two packages provide or (or require, obsolete
or conflict) the same property, they appear in the same order in the
propertys list of packages.
2 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
3 * Copyright (C) 2008 Red Hat, Inc
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 #include "razor-internal.h"
26 static struct razor_package_iterator *
27 razor_package_iterator_create_with_index(struct razor_set *set,
30 struct razor_package_iterator *pi;
32 pi = zalloc(sizeof *pi);
39 struct razor_package_iterator *
40 razor_package_iterator_create(struct razor_set *set)
42 struct razor_package_iterator *pi;
44 pi = zalloc(sizeof *pi);
46 pi->end = set->packages.data + set->packages.size;
47 pi->package = set->packages.data;
53 razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
54 struct razor_set *set,
55 struct razor_property *property)
57 memset(pi, 0, sizeof *pi);
59 pi->index = list_first(&property->packages, &set->package_pool);
62 struct razor_package_iterator *
63 razor_package_iterator_create_for_property(struct razor_set *set,
64 struct razor_property *property)
68 index = list_first(&property->packages, &set->package_pool);
69 return razor_package_iterator_create_with_index(set, index);
72 struct razor_package_iterator *
73 razor_package_iterator_create_for_file(struct razor_set *set,
76 struct razor_entry *entry;
79 entry = razor_set_find_entry(set, set->files.data, filename);
83 index = list_first(&entry->packages, &set->package_pool);
84 return razor_package_iterator_create_with_index(set, index);
88 razor_package_iterator_next(struct razor_package_iterator *pi,
89 struct razor_package **package,
96 struct razor_package *p, *packages;
101 } else if (pi->index) {
102 packages = pi->set->packages.data;
103 p = &packages[pi->index->data];
104 pi->index = list_next(pi->index);
110 pool = pi->set->string_pool.data;
112 *name = &pool[p->name];
113 *version = &pool[p->version];
114 *arch = &pool[p->arch];
123 razor_package_iterator_destroy(struct razor_package_iterator *pi)
131 struct razor_property_iterator *
132 razor_property_iterator_create(struct razor_set *set,
133 struct razor_package *package)
135 struct razor_property_iterator *pi;
137 pi = zalloc(sizeof *pi);
141 pi->index = list_first(&package->properties,
142 &set->property_pool);
144 pi->property = set->properties.data;
145 pi->end = set->properties.data + set->properties.size;
152 razor_property_iterator_next(struct razor_property_iterator *pi,
153 struct razor_property **property,
156 const char **version)
160 struct razor_property *p, *properties;
165 } else if (pi->index) {
166 properties = pi->set->properties.data;
167 p = &properties[pi->index->data];
168 pi->index = list_next(pi->index);
174 pool = pi->set->string_pool.data;
176 *name = &pool[p->name];
178 *version = &pool[p->version];
187 razor_property_iterator_destroy(struct razor_property_iterator *pi)
192 struct razor_package_query {
193 struct razor_set *set;
198 struct razor_package_query *
199 razor_package_query_create(struct razor_set *set)
201 struct razor_package_query *pq;
204 pq = zalloc(sizeof *pq);
206 count = set->packages.size / sizeof(struct razor_package);
207 pq->vector = zalloc(count * sizeof(char));
213 razor_package_query_add_package(struct razor_package_query *pq,
214 struct razor_package *p)
216 struct razor_package *packages;
218 packages = pq->set->packages.data;
219 pq->count += pq->vector[p - packages] ^ 1;
220 pq->vector[p - packages] = 1;
224 razor_package_query_add_iterator(struct razor_package_query *pq,
225 struct razor_package_iterator *pi)
227 struct razor_package *packages, *p;
228 const char *name, *version, *arch;
230 packages = pq->set->packages.data;
231 while (razor_package_iterator_next(pi, &p, &name, &version, &arch)) {
232 pq->count += pq->vector[p - packages] ^ 1;
233 pq->vector[p - packages] = 1;
237 struct razor_package_iterator *
238 razor_package_query_finish(struct razor_package_query *pq)
240 struct razor_package_iterator *pi;
241 struct razor_set *set;
247 index = zalloc(pq->count * sizeof *index);
251 for (i = 0, j = 0; i < pq->count; i++) {
256 if (j == pq->count - 1)
257 index[j].flags = 0x80;
264 pi = razor_package_iterator_create_with_index(set, index);