Add support for preloading lua modules. This is useful both when
providing lua bindings to applications based on librazor and when
producing static binaries using librazor (where otherwise the lua
POSIX library would need to be included as an additional dynamic
object).
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);