2 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
3 * Copyright (C) 2008 Red Hat, Inc
4 * Copyright (C) 2009 J. Ali Harlow <ali@juiblex.co.uk>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 #include "razor-internal.h"
31 static struct razor_package_iterator *
32 razor_package_iterator_create_with_index(struct razor_set *set,
35 struct razor_package_iterator *pi;
37 pi = zalloc(sizeof *pi);
44 static struct razor_package_iterator *
45 razor_package_iterator_create_empty(struct razor_set *set)
47 struct razor_package_iterator *pi;
48 return zalloc(sizeof *pi);
51 RAZOR_EXPORT struct razor_package_iterator *
52 razor_package_iterator_create(struct razor_set *set)
54 struct razor_package_iterator *pi;
58 pi = zalloc(sizeof *pi);
60 pi->end = set->packages.data + set->packages.size;
61 pi->package = set->packages.data;
67 razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
68 struct razor_set *set,
69 struct razor_property *property)
73 assert (property != NULL);
75 memset(pi, 0, sizeof *pi);
77 pi->index = list_first(&property->packages, &set->package_pool);
80 RAZOR_EXPORT struct razor_package_iterator *
81 razor_package_iterator_create_for_property(struct razor_set *set,
82 struct razor_property *property)
87 assert (property != NULL);
89 index = list_first(&property->packages, &set->package_pool);
90 return razor_package_iterator_create_with_index(set, index);
93 RAZOR_EXPORT struct razor_package_iterator *
94 razor_package_iterator_create_for_file(struct razor_set *set,
97 struct razor_entry *entry;
100 assert (set != NULL);
101 assert (filename != NULL);
103 entry = razor_set_find_entry(set, set->files.data, filename);
105 return razor_package_iterator_create_empty(set);
107 index = list_first(&entry->packages, &set->package_pool);
108 return razor_package_iterator_create_with_index(set, index);
112 * razor_package_iterator_next:
113 * @pi: a %razor_package_iterator
114 * @package: a %razor_package
116 * Gets the next iteratr along with any vararg data.
117 * The vararg must be terminated with %RAZOR_DETAIL_LAST.
119 * Example: razor_package_iterator_next (pi, package,
120 * RAZOR_DETAIL_NAME, &name,
121 * RAZOR_DETAIL_LAST);
124 razor_package_iterator_next(struct razor_package_iterator *pi,
125 struct razor_package **package, ...)
129 struct razor_package *p, *packages;
136 } else if (pi->index) {
137 packages = pi->set->packages.data;
138 p = &packages[pi->index->data];
139 pi->index = list_next(pi->index);
151 va_start(args, NULL);
152 razor_package_get_details_varg (pi->set, p, args);
159 razor_package_iterator_destroy(struct razor_package_iterator *pi)
169 RAZOR_EXPORT struct razor_property_iterator *
170 razor_property_iterator_create(struct razor_set *set,
171 struct razor_package *package)
173 struct razor_property_iterator *pi;
175 assert (set != NULL);
177 pi = zalloc(sizeof *pi);
181 pi->index = list_first(&package->properties,
182 &set->property_pool);
184 pi->property = set->properties.data;
185 pi->end = set->properties.data + set->properties.size;
192 razor_property_iterator_next(struct razor_property_iterator *pi,
193 struct razor_property **property,
196 const char **version)
200 struct razor_property *p, *properties;
207 } else if (pi->index) {
208 properties = pi->set->properties.data;
209 p = &properties[pi->index->data];
210 pi->index = list_next(pi->index);
216 pool = pi->set->string_pool.data;
218 *name = &pool[p->name];
220 *version = &pool[p->version];
229 razor_property_iterator_destroy(struct razor_property_iterator *pi)
234 RAZOR_EXPORT struct razor_file_iterator *
235 razor_file_iterator_create(struct razor_set *set, struct razor_package *package,
238 struct razor_file_iterator *fi;
240 assert (set != NULL);
241 assert (package != NULL);
243 fi = zalloc(sizeof *fi);
245 fi->post_order = post_order;
247 fi->index = list_last(&package->files, &set->file_pool);
249 fi->index = list_first(&package->files, &set->file_pool);
250 array_init(&fi->path);
256 razor_file_iterator_next(struct razor_file_iterator *fi,
259 struct razor_entry *e, *dir, *entries;
269 entries = (struct razor_entry *) fi->set->files.data;
270 pool = fi->set->file_string_pool.data;
277 if (entries + fi->index->data == e) {
279 s = array_add(&fi->path, strlen(f) + 1);
281 if (fi->path.size == 1) {
282 array_add(&fi->path, 1);
283 strcpy(fi->path.data, "/");
285 *name = fi->path.data;
287 fi->index = list_prev(fi->index);
289 fi->index = list_next(fi->index);
292 } while (!((e++)->flags & RAZOR_ENTRY_LAST));
293 for(e--; e >= dir; e--)
294 if (e->start && fi->index->data >= e->start)
299 s = array_add(&fi->path, strlen(f) + 1);
303 dir = entries + e->start;
306 printf("file_iterator_next: Failed to find file %d\n",fi->index->data);
311 RAZOR_EXPORT void razor_file_iterator_destroy(struct razor_file_iterator *fi)
315 array_release(&fi->path);
319 struct razor_package_query {
320 struct razor_set *set;
325 RAZOR_EXPORT struct razor_package_query *
326 razor_package_query_create(struct razor_set *set)
328 struct razor_package_query *pq;
331 assert (set != NULL);
333 pq = zalloc(sizeof *pq);
335 count = set->packages.size / sizeof(struct razor_package);
336 pq->vector = zalloc(count * sizeof(char));
342 razor_package_query_add_package(struct razor_package_query *pq,
343 struct razor_package *p)
345 struct razor_package *packages;
350 packages = pq->set->packages.data;
351 pq->count += pq->vector[p - packages] ^ 1;
352 pq->vector[p - packages] = 1;
356 razor_package_query_add_iterator(struct razor_package_query *pq,
357 struct razor_package_iterator *pi)
359 struct razor_package *packages, *p;
364 packages = pq->set->packages.data;
365 while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST)) {
366 pq->count += pq->vector[p - packages] ^ 1;
367 pq->vector[p - packages] = 1;
371 RAZOR_EXPORT struct razor_package_iterator *
372 razor_package_query_finish(struct razor_package_query *pq)
374 struct razor_package_iterator *pi;
375 struct razor_set *set;
383 index = zalloc(pq->count * sizeof *index);
387 for (i = 0, j = 0; j < pq->count; i++) {
392 if (j == pq->count - 1)
393 index[j].flags = 0x80;
400 pi = razor_package_iterator_create_with_index(set, index);