Add a test for relocations that are valid paths but would be invalid URIs if mis-interpreted
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.
29 #include "razor-internal.h"
32 static struct razor_package_iterator *
33 razor_package_iterator_create_with_index(struct razor_set *set,
36 struct razor_package_iterator *pi;
38 pi = zalloc(sizeof *pi);
45 static struct razor_package_iterator *
46 razor_package_iterator_create_empty(struct razor_set *set)
48 struct razor_package_iterator *pi;
49 return zalloc(sizeof *pi);
52 RAZOR_EXPORT struct razor_package_iterator *
53 razor_package_iterator_create(struct razor_set *set)
55 struct razor_package_iterator *pi;
59 pi = zalloc(sizeof *pi);
61 pi->end = set->packages.data + set->packages.size;
62 pi->package = set->packages.data;
68 razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
69 struct razor_set *set,
70 struct razor_property *property)
74 assert (property != NULL);
76 memset(pi, 0, sizeof *pi);
78 pi->index = list_first(&property->packages, &set->package_pool);
81 RAZOR_EXPORT struct razor_package_iterator *
82 razor_package_iterator_create_for_property(struct razor_set *set,
83 struct razor_property *property)
88 assert (property != NULL);
90 index = list_first(&property->packages, &set->package_pool);
91 return razor_package_iterator_create_with_index(set, index);
94 RAZOR_EXPORT struct razor_package_iterator *
95 razor_package_iterator_create_for_file(struct razor_set *set,
98 struct razor_entry *entry;
101 assert (set != NULL);
102 assert (filename != NULL);
104 entry = razor_set_find_entry(set, set->files.data, filename);
106 return razor_package_iterator_create_empty(set);
108 index = list_first(&entry->packages, &set->package_pool);
109 return razor_package_iterator_create_with_index(set, index);
113 * razor_package_iterator_next:
114 * @pi: a %razor_package_iterator
115 * @package: a %razor_package
117 * Gets the next iteratr along with any vararg data.
118 * The vararg must be terminated with %RAZOR_DETAIL_LAST.
120 * Example: razor_package_iterator_next (pi, package,
121 * RAZOR_DETAIL_NAME, &name,
122 * RAZOR_DETAIL_LAST);
125 razor_package_iterator_next(struct razor_package_iterator *pi,
126 struct razor_package **package, ...)
130 struct razor_package *p, *packages;
137 } else if (pi->index) {
138 packages = pi->set->packages.data;
139 p = &packages[pi->index->data];
140 pi->index = list_next(pi->index);
152 va_start(args, NULL);
153 razor_package_get_details_varg (pi->set, p, args);
160 razor_package_iterator_destroy(struct razor_package_iterator *pi)
164 if (pi->alloced_index)
165 free(pi->alloced_index);
170 RAZOR_EXPORT struct razor_property_iterator *
171 razor_property_iterator_create(struct razor_set *set,
172 struct razor_package *package)
174 struct razor_property_iterator *pi;
176 assert (set != NULL);
178 pi = zalloc(sizeof *pi);
182 pi->index = list_first(&package->properties,
183 &set->property_pool);
185 pi->property = set->properties.data;
186 pi->end = set->properties.data + set->properties.size;
193 razor_property_iterator_next(struct razor_property_iterator *pi,
194 struct razor_property **property,
197 const char **version)
201 struct razor_property *p, *properties;
208 } else if (pi->index) {
209 properties = pi->set->properties.data;
210 p = &properties[pi->index->data];
211 pi->index = list_next(pi->index);
217 pool = pi->set->string_pool.data;
219 *name = &pool[p->name];
221 *version = &pool[p->version];
230 razor_property_iterator_destroy(struct razor_property_iterator *pi)
235 RAZOR_EXPORT struct razor_file_iterator *
236 razor_file_iterator_create(struct razor_set *set, struct razor_package *package,
239 struct razor_file_iterator *fi;
241 assert (set != NULL);
242 assert (package != NULL);
244 fi = zalloc(sizeof *fi);
246 fi->post_order = post_order;
248 fi->index = list_last(&package->files, &set->file_pool);
250 fi->index = list_first(&package->files, &set->file_pool);
251 array_init(&fi->path);
257 razor_file_iterator_next(struct razor_file_iterator *fi,
260 struct razor_entry *e, *dir, *entries;
270 entries = (struct razor_entry *) fi->set->files.data;
271 pool = fi->set->file_string_pool.data;
278 if (entries + fi->index->data == e) {
280 s = array_add(&fi->path, strlen(f) + 1);
282 if (fi->path.size == 1) {
283 array_add(&fi->path, 1);
284 strcpy(fi->path.data, "/");
286 *name = fi->path.data;
288 fi->index = list_prev(fi->index);
290 fi->index = list_next(fi->index);
293 } while (!((e++)->flags & RAZOR_ENTRY_LAST));
294 for(e--; e >= dir; e--)
295 if (e->start && fi->index->data >= e->start)
300 s = array_add(&fi->path, strlen(f) + 1);
304 dir = entries + e->start;
307 printf("file_iterator_next: Failed to find file %d\n",fi->index->data);
312 RAZOR_EXPORT void razor_file_iterator_destroy(struct razor_file_iterator *fi)
316 array_release(&fi->path);
320 RAZOR_EXPORT struct razor_string_iterator *
321 razor_install_prefix_iterator_create(struct razor_set *set,
322 struct razor_package *package)
324 struct razor_string_iterator *si;
326 assert (set != NULL);
327 assert (package != NULL);
329 si = zalloc(sizeof *si);
332 si->index = list_first(&package->install_prefixes,
339 razor_string_iterator_next(struct razor_string_iterator *si,
348 pool = si->set->string_pool.data;
349 *string = &pool[si->index->data];
350 si->index = list_next(si->index);
361 razor_string_iterator_destroy(struct razor_string_iterator *si)
366 struct razor_package_query {
367 struct razor_set *set;
372 RAZOR_EXPORT struct razor_package_query *
373 razor_package_query_create(struct razor_set *set)
375 struct razor_package_query *pq;
378 assert (set != NULL);
380 pq = zalloc(sizeof *pq);
382 count = set->packages.size / sizeof(struct razor_package);
383 pq->vector = zalloc(count * sizeof(char));
389 razor_package_query_add_package(struct razor_package_query *pq,
390 struct razor_package *p)
392 struct razor_package *packages;
397 packages = pq->set->packages.data;
398 pq->count += pq->vector[p - packages] ^ 1;
399 pq->vector[p - packages] = 1;
403 razor_package_query_add_iterator(struct razor_package_query *pq,
404 struct razor_package_iterator *pi)
406 struct razor_package *packages, *p;
411 packages = pq->set->packages.data;
412 while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST)) {
413 pq->count += pq->vector[p - packages] ^ 1;
414 pq->vector[p - packages] = 1;
418 RAZOR_EXPORT struct razor_package_iterator *
419 razor_package_query_finish(struct razor_package_query *pq)
421 struct razor_package_iterator *pi;
422 struct razor_set *set;
430 index = zalloc(pq->count * sizeof *index);
434 for (i = 0, j = 0; j < pq->count; i++) {
439 if (j == pq->count - 1)
440 index[j].flags = 0x80;
447 pi = razor_package_iterator_create_with_index(set, index);
448 pi->alloced_index = index;