Overload --disable-shared to also build static executables.
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.
27 #include "razor-internal.h"
30 static struct razor_package_iterator *
31 razor_package_iterator_create_with_index(struct razor_set *set,
34 struct razor_package_iterator *pi;
36 pi = zalloc(sizeof *pi);
43 static struct razor_package_iterator *
44 razor_package_iterator_create_empty(struct razor_set *set)
46 struct razor_package_iterator *pi;
47 return zalloc(sizeof *pi);
50 RAZOR_EXPORT struct razor_package_iterator *
51 razor_package_iterator_create(struct razor_set *set)
53 struct razor_package_iterator *pi;
57 pi = zalloc(sizeof *pi);
59 pi->end = set->packages.data + set->packages.size;
60 pi->package = set->packages.data;
66 razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
67 struct razor_set *set,
68 struct razor_property *property)
72 assert (property != NULL);
74 memset(pi, 0, sizeof *pi);
76 pi->index = list_first(&property->packages, &set->package_pool);
79 RAZOR_EXPORT struct razor_package_iterator *
80 razor_package_iterator_create_for_property(struct razor_set *set,
81 struct razor_property *property)
86 assert (property != NULL);
88 index = list_first(&property->packages, &set->package_pool);
89 return razor_package_iterator_create_with_index(set, index);
92 RAZOR_EXPORT struct razor_package_iterator *
93 razor_package_iterator_create_for_file(struct razor_set *set,
96 struct razor_entry *entry;
100 assert (filename != NULL);
102 entry = razor_set_find_entry(set, set->files.data, filename);
104 return razor_package_iterator_create_empty(set);
106 index = list_first(&entry->packages, &set->package_pool);
107 return razor_package_iterator_create_with_index(set, index);
111 * razor_package_iterator_next:
112 * @pi: a %razor_package_iterator
113 * @package: a %razor_package
115 * Gets the next iteratr along with any vararg data.
116 * The vararg must be terminated with %RAZOR_DETAIL_LAST.
118 * Example: razor_package_iterator_next (pi, package,
119 * RAZOR_DETAIL_NAME, &name,
120 * RAZOR_DETAIL_LAST);
123 razor_package_iterator_next(struct razor_package_iterator *pi,
124 struct razor_package **package, ...)
128 struct razor_package *p, *packages;
135 } else if (pi->index) {
136 packages = pi->set->packages.data;
137 p = &packages[pi->index->data];
138 pi->index = list_next(pi->index);
150 va_start(args, NULL);
151 razor_package_get_details_varg (pi->set, p, args);
158 razor_package_iterator_destroy(struct razor_package_iterator *pi)
168 RAZOR_EXPORT struct razor_property_iterator *
169 razor_property_iterator_create(struct razor_set *set,
170 struct razor_package *package)
172 struct razor_property_iterator *pi;
174 assert (set != NULL);
176 pi = zalloc(sizeof *pi);
180 pi->index = list_first(&package->properties,
181 &set->property_pool);
183 pi->property = set->properties.data;
184 pi->end = set->properties.data + set->properties.size;
191 razor_property_iterator_next(struct razor_property_iterator *pi,
192 struct razor_property **property,
195 const char **version)
199 struct razor_property *p, *properties;
206 } else if (pi->index) {
207 properties = pi->set->properties.data;
208 p = &properties[pi->index->data];
209 pi->index = list_next(pi->index);
215 pool = pi->set->string_pool.data;
217 *name = &pool[p->name];
219 *version = &pool[p->version];
228 razor_property_iterator_destroy(struct razor_property_iterator *pi)
233 RAZOR_EXPORT struct razor_file_iterator *
234 razor_file_iterator_create(struct razor_set *set, struct razor_package *package,
237 struct razor_file_iterator *fi;
239 assert (set != NULL);
240 assert (package != NULL);
242 fi = zalloc(sizeof *fi);
244 fi->post_order = post_order;
246 fi->index = list_last(&package->files, &set->file_pool);
248 fi->index = list_first(&package->files, &set->file_pool);
249 array_init(&fi->path);
255 razor_file_iterator_next(struct razor_file_iterator *fi,
258 struct razor_entry *e, *dir, *entries;
268 entries = (struct razor_entry *) fi->set->files.data;
269 pool = fi->set->file_string_pool.data;
276 if (entries + fi->index->data == e) {
278 s = array_add(&fi->path, strlen(f) + 1);
280 if (fi->path.size == 1) {
281 array_add(&fi->path, 1);
282 strcpy(fi->path.data, "/");
284 *name = fi->path.data;
286 fi->index = list_prev(fi->index);
288 fi->index = list_next(fi->index);
291 } while (!((e++)->flags & RAZOR_ENTRY_LAST));
292 for(e--; e >= dir; e--)
293 if (e->start && fi->index->data >= e->start)
298 s = array_add(&fi->path, strlen(f) + 1);
302 dir = entries + e->start;
305 printf("file_iterator_next: Failed to find file %d\n",fi->index->data);
310 RAZOR_EXPORT void razor_file_iterator_destroy(struct razor_file_iterator *fi)
314 array_release(&fi->path);
318 struct razor_package_query {
319 struct razor_set *set;
324 RAZOR_EXPORT struct razor_package_query *
325 razor_package_query_create(struct razor_set *set)
327 struct razor_package_query *pq;
330 assert (set != NULL);
332 pq = zalloc(sizeof *pq);
334 count = set->packages.size / sizeof(struct razor_package);
335 pq->vector = zalloc(count * sizeof(char));
341 razor_package_query_add_package(struct razor_package_query *pq,
342 struct razor_package *p)
344 struct razor_package *packages;
349 packages = pq->set->packages.data;
350 pq->count += pq->vector[p - packages] ^ 1;
351 pq->vector[p - packages] = 1;
355 razor_package_query_add_iterator(struct razor_package_query *pq,
356 struct razor_package_iterator *pi)
358 struct razor_package *packages, *p;
363 packages = pq->set->packages.data;
364 while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST)) {
365 pq->count += pq->vector[p - packages] ^ 1;
366 pq->vector[p - packages] = 1;
370 RAZOR_EXPORT struct razor_package_iterator *
371 razor_package_query_finish(struct razor_package_query *pq)
373 struct razor_package_iterator *pi;
374 struct razor_set *set;
382 index = zalloc(pq->count * sizeof *index);
386 for (i = 0, j = 0; j < pq->count; i++) {
391 if (j == pq->count - 1)
392 index[j].flags = 0x80;
399 pi = razor_package_iterator_create_with_index(set, index);