Make 0 a valid hashtable value consistently (and 0xFFFFFFFF invalid).
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)
236 struct razor_file_iterator *fi;
238 assert (set != NULL);
239 assert (package != NULL);
241 fi = zalloc(sizeof *fi);
243 fi->index = list_first(&package->files, &set->file_pool);
244 array_init(&fi->path);
250 razor_file_iterator_next(struct razor_file_iterator *fi,
253 struct razor_entry *e, *dir, *entries;
263 entries = (struct razor_entry *) fi->set->files.data;
264 pool = fi->set->file_string_pool.data;
271 if (entries + fi->index->data == e) {
273 s = array_add(&fi->path, strlen(f) + 1);
275 if (fi->path.size == 1) {
276 array_add(&fi->path, 1);
277 strcpy(fi->path.data, "/");
279 *name = fi->path.data;
280 fi->index = list_next(fi->index);
283 } while (!((e++)->flags & RAZOR_ENTRY_LAST));
284 for(e--; e >= dir; e--)
285 if (e->start && fi->index->data >= e->start)
290 s = array_add(&fi->path, strlen(f) + 1);
294 dir = entries + e->start;
297 printf("file_iterator_next: Failed to find file %d\n",fi->index->data);
302 RAZOR_EXPORT void razor_file_iterator_destroy(struct razor_file_iterator *fi)
306 array_release(&fi->path);
310 struct razor_package_query {
311 struct razor_set *set;
316 RAZOR_EXPORT struct razor_package_query *
317 razor_package_query_create(struct razor_set *set)
319 struct razor_package_query *pq;
322 assert (set != NULL);
324 pq = zalloc(sizeof *pq);
326 count = set->packages.size / sizeof(struct razor_package);
327 pq->vector = zalloc(count * sizeof(char));
333 razor_package_query_add_package(struct razor_package_query *pq,
334 struct razor_package *p)
336 struct razor_package *packages;
341 packages = pq->set->packages.data;
342 pq->count += pq->vector[p - packages] ^ 1;
343 pq->vector[p - packages] = 1;
347 razor_package_query_add_iterator(struct razor_package_query *pq,
348 struct razor_package_iterator *pi)
350 struct razor_package *packages, *p;
355 packages = pq->set->packages.data;
356 while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST)) {
357 pq->count += pq->vector[p - packages] ^ 1;
358 pq->vector[p - packages] = 1;
362 RAZOR_EXPORT struct razor_package_iterator *
363 razor_package_query_finish(struct razor_package_query *pq)
365 struct razor_package_iterator *pi;
366 struct razor_set *set;
374 index = zalloc(pq->count * sizeof *index);
378 for (i = 0, j = 0; j < pq->count; i++) {
383 if (j == pq->count - 1)
384 index[j].flags = 0x80;
391 pi = razor_package_iterator_create_with_index(set, index);