Only export symbols starting with razor_ in dynamic library.
Apart from being good practice to avoid clashes with higher-level
libraries and the application, this also fixes an obscure bug: The
gnulib library is used both by librazor (the dynamic library) and
by razor (the executable). In doing so, we want to have two separate
copies of the library despite the code duplication this involves.
Without the explicit limit to export only razor_ symbols, the razor
executable under mingw64 was picking up the getopt_long function
from librazor and the optind variable from libgnu which meant that
it did not see optind changing. Hiding librazor's copy of getopt
causes the linker to find libgnu's copy and everything works.
Note that under mingw librazor-#.dll still contains undocumented
(private) razor_ symbols but these will do no harm as long as nobody
tries to use them.
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)
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 struct razor_package_query {
321 struct razor_set *set;
326 RAZOR_EXPORT struct razor_package_query *
327 razor_package_query_create(struct razor_set *set)
329 struct razor_package_query *pq;
332 assert (set != NULL);
334 pq = zalloc(sizeof *pq);
336 count = set->packages.size / sizeof(struct razor_package);
337 pq->vector = zalloc(count * sizeof(char));
343 razor_package_query_add_package(struct razor_package_query *pq,
344 struct razor_package *p)
346 struct razor_package *packages;
351 packages = pq->set->packages.data;
352 pq->count += pq->vector[p - packages] ^ 1;
353 pq->vector[p - packages] = 1;
357 razor_package_query_add_iterator(struct razor_package_query *pq,
358 struct razor_package_iterator *pi)
360 struct razor_package *packages, *p;
365 packages = pq->set->packages.data;
366 while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST)) {
367 pq->count += pq->vector[p - packages] ^ 1;
368 pq->vector[p - packages] = 1;
372 RAZOR_EXPORT struct razor_package_iterator *
373 razor_package_query_finish(struct razor_package_query *pq)
375 struct razor_package_iterator *pi;
376 struct razor_set *set;
384 index = zalloc(pq->count * sizeof *index);
388 for (i = 0, j = 0; j < pq->count; i++) {
393 if (j == pq->count - 1)
394 index[j].flags = 0x80;
401 pi = razor_package_iterator_create_with_index(set, index);