librazor/iterator.c
author Richard Hughes <richard@hughsie.com>
Sun Jun 29 10:55:17 2008 +0100 (2008-06-29)
changeset 300 455eaa569767
parent 269 03fc85294bc9
child 301 4124c37fd953
permissions -rw-r--r--
add missing licencing information at the top of each source file

The licence text is needed when razor is packaged for Debian. :-)
krh@248
     1
/*
krh@248
     2
 * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
krh@248
     3
 * Copyright (C) 2008  Red Hat, Inc
krh@248
     4
 *
krh@248
     5
 * This program is free software; you can redistribute it and/or modify
krh@248
     6
 * it under the terms of the GNU General Public License as published by
krh@248
     7
 * the Free Software Foundation; either version 2 of the License, or
krh@248
     8
 * (at your option) any later version.
krh@248
     9
 *
krh@248
    10
 * This program is distributed in the hope that it will be useful,
krh@248
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
krh@248
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
krh@248
    13
 * GNU General Public License for more details.
krh@248
    14
 *
krh@248
    15
 * You should have received a copy of the GNU General Public License along
krh@248
    16
 * with this program; if not, write to the Free Software Foundation, Inc.,
krh@248
    17
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
krh@248
    18
 */
krh@248
    19
krh@248
    20
#define _GNU_SOURCE
krh@248
    21
krh@248
    22
#include <string.h>
krh@248
    23
#include "razor-internal.h"
krh@248
    24
#include "razor.h"
krh@248
    25
krh@248
    26
static struct razor_package_iterator *
krh@248
    27
razor_package_iterator_create_with_index(struct razor_set *set,
krh@248
    28
					 struct list *index)
krh@248
    29
{
krh@248
    30
	struct razor_package_iterator *pi;
krh@248
    31
krh@248
    32
	pi = zalloc(sizeof *pi);
krh@248
    33
	pi->set = set;
krh@248
    34
	pi->index = index;
krh@248
    35
krh@248
    36
	return pi;
krh@248
    37
}
krh@248
    38
jbowes@278
    39
static struct razor_package_iterator *
jbowes@278
    40
razor_package_iterator_create_empty(struct razor_set *set)
jbowes@278
    41
{
jbowes@278
    42
	struct razor_package_iterator *pi;
jbowes@278
    43
	return zalloc(sizeof *pi);
jbowes@278
    44
}
jbowes@278
    45
krh@269
    46
RAZOR_EXPORT struct razor_package_iterator *
krh@248
    47
razor_package_iterator_create(struct razor_set *set)
krh@248
    48
{
krh@248
    49
	struct razor_package_iterator *pi;
krh@248
    50
krh@248
    51
	pi = zalloc(sizeof *pi);
krh@248
    52
	pi->set = set;
krh@248
    53
	pi->end = set->packages.data + set->packages.size;
krh@248
    54
	pi->package = set->packages.data;
krh@248
    55
krh@248
    56
	return pi;
krh@248
    57
}
krh@248
    58
krh@269
    59
RAZOR_EXPORT void
krh@248
    60
razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
krh@248
    61
					 struct razor_set *set,
krh@248
    62
					 struct razor_property *property)
krh@248
    63
{
krh@248
    64
	memset(pi, 0, sizeof *pi);
krh@248
    65
	pi->set = set;
krh@248
    66
	pi->index = list_first(&property->packages, &set->package_pool);
krh@248
    67
}
krh@248
    68
krh@269
    69
RAZOR_EXPORT struct razor_package_iterator *
krh@248
    70
razor_package_iterator_create_for_property(struct razor_set *set,
krh@248
    71
					   struct razor_property *property)
krh@248
    72
{
krh@248
    73
	struct list *index;
krh@248
    74
krh@248
    75
	index = list_first(&property->packages, &set->package_pool);
krh@248
    76
	return razor_package_iterator_create_with_index(set, index);
krh@248
    77
}
krh@248
    78
krh@269
    79
RAZOR_EXPORT struct razor_package_iterator *
krh@248
    80
razor_package_iterator_create_for_file(struct razor_set *set,
krh@248
    81
				       const char *filename)
krh@248
    82
{
krh@248
    83
	struct razor_entry *entry;
krh@248
    84
	struct list *index;
krh@248
    85
krh@248
    86
	entry = razor_set_find_entry(set, set->files.data, filename);
krh@248
    87
	if (entry == NULL)
jbowes@278
    88
		return razor_package_iterator_create_empty(set);
krh@248
    89
krh@248
    90
	index = list_first(&entry->packages, &set->package_pool);
krh@248
    91
	return razor_package_iterator_create_with_index(set, index);
krh@248
    92
}
krh@248
    93
krh@269
    94
RAZOR_EXPORT int
krh@248
    95
razor_package_iterator_next(struct razor_package_iterator *pi,
krh@248
    96
			    struct razor_package **package,
krh@248
    97
			    const char **name,
krh@248
    98
			    const char **version,
krh@248
    99
			    const char **arch)
krh@248
   100
{
krh@248
   101
	char *pool;
krh@248
   102
	int valid;
krh@248
   103
	struct razor_package *p, *packages;
krh@248
   104
krh@248
   105
	if (pi->package) {
krh@248
   106
		p = pi->package++;
krh@248
   107
		valid = p < pi->end;
krh@248
   108
	} else if (pi->index) {
krh@248
   109
		packages = pi->set->packages.data;
krh@248
   110
		p = &packages[pi->index->data];
krh@248
   111
		pi->index = list_next(pi->index);
krh@248
   112
		valid = 1;
krh@248
   113
	} else
krh@248
   114
		valid = 0;
krh@248
   115
krh@248
   116
	if (valid) {
krh@248
   117
		pool = pi->set->string_pool.data;
krh@248
   118
		*package = p;
krh@248
   119
		*name = &pool[p->name];
krh@248
   120
		*version = &pool[p->version];
krh@248
   121
		*arch = &pool[p->arch];
krh@248
   122
	} else {
krh@248
   123
		*package = NULL;
krh@248
   124
	}
krh@248
   125
krh@248
   126
	return valid;
krh@248
   127
}
krh@248
   128
krh@269
   129
RAZOR_EXPORT void
krh@248
   130
razor_package_iterator_destroy(struct razor_package_iterator *pi)
krh@248
   131
{
krh@248
   132
	if (pi->free_index)
krh@248
   133
		free(pi->index);
krh@248
   134
krh@248
   135
	free(pi);
krh@248
   136
}
krh@248
   137
krh@269
   138
RAZOR_EXPORT struct razor_property_iterator *
krh@248
   139
razor_property_iterator_create(struct razor_set *set,
krh@248
   140
			       struct razor_package *package)
krh@248
   141
{
krh@248
   142
	struct razor_property_iterator *pi;
krh@248
   143
krh@248
   144
	pi = zalloc(sizeof *pi);
krh@248
   145
	pi->set = set;
krh@248
   146
krh@248
   147
	if (package) {
krh@248
   148
		pi->index = list_first(&package->properties,
krh@248
   149
				       &set->property_pool);
krh@248
   150
	} else {
krh@248
   151
		pi->property = set->properties.data;
krh@248
   152
		pi->end = set->properties.data + set->properties.size;
krh@248
   153
	}
krh@248
   154
krh@248
   155
	return pi;
krh@248
   156
}
krh@248
   157
krh@269
   158
RAZOR_EXPORT int
krh@248
   159
razor_property_iterator_next(struct razor_property_iterator *pi,
krh@248
   160
			     struct razor_property **property,
krh@248
   161
			     const char **name,
krh@248
   162
			     uint32_t *flags,
krh@248
   163
			     const char **version)
krh@248
   164
{
krh@248
   165
	char *pool;
krh@248
   166
	int valid;
krh@248
   167
	struct razor_property *p, *properties;
krh@248
   168
krh@248
   169
	if (pi->property) {
krh@248
   170
		p = pi->property++;
krh@248
   171
		valid = p < pi->end;
krh@248
   172
	} else if (pi->index) {
krh@248
   173
		properties = pi->set->properties.data;
krh@248
   174
		p = &properties[pi->index->data];
krh@248
   175
		pi->index = list_next(pi->index);
krh@248
   176
		valid = 1;
krh@248
   177
	} else
krh@248
   178
		valid = 0;
krh@248
   179
krh@248
   180
	if (valid) {
krh@248
   181
		pool = pi->set->string_pool.data;
krh@248
   182
		*property = p;
krh@248
   183
		*name = &pool[p->name];
krh@248
   184
		*flags = p->flags;
krh@248
   185
		*version = &pool[p->version];
krh@248
   186
	} else {
krh@248
   187
		*property = NULL;
krh@248
   188
	}
krh@248
   189
krh@248
   190
	return valid;
krh@248
   191
}
krh@248
   192
krh@269
   193
RAZOR_EXPORT void
krh@248
   194
razor_property_iterator_destroy(struct razor_property_iterator *pi)
krh@248
   195
{
krh@248
   196
	free(pi);
krh@248
   197
}
krh@248
   198
krh@248
   199
struct razor_package_query {
krh@248
   200
	struct razor_set *set;
krh@248
   201
	char *vector;
krh@248
   202
	int count;
krh@248
   203
};
krh@248
   204
krh@269
   205
RAZOR_EXPORT struct razor_package_query *
krh@248
   206
razor_package_query_create(struct razor_set *set)
krh@248
   207
{
krh@248
   208
	struct razor_package_query *pq;
krh@248
   209
	int count;
krh@248
   210
krh@248
   211
	pq = zalloc(sizeof *pq);
krh@248
   212
	pq->set = set;
krh@248
   213
	count = set->packages.size / sizeof(struct razor_package);
krh@248
   214
	pq->vector = zalloc(count * sizeof(char));
krh@248
   215
krh@248
   216
	return pq;
krh@248
   217
}
krh@248
   218
krh@269
   219
RAZOR_EXPORT void
krh@248
   220
razor_package_query_add_package(struct razor_package_query *pq,
krh@248
   221
				struct razor_package *p)
krh@248
   222
{
krh@248
   223
	struct razor_package *packages;
krh@248
   224
krh@248
   225
	packages = pq->set->packages.data;
krh@248
   226
	pq->count += pq->vector[p - packages] ^ 1;
krh@248
   227
	pq->vector[p - packages] = 1;
krh@248
   228
}
krh@248
   229
krh@269
   230
RAZOR_EXPORT void
krh@248
   231
razor_package_query_add_iterator(struct razor_package_query *pq,
krh@248
   232
				 struct razor_package_iterator *pi)
krh@248
   233
{
krh@248
   234
	struct razor_package *packages, *p;
krh@248
   235
	const char *name, *version, *arch;
krh@248
   236
krh@248
   237
	packages = pq->set->packages.data;
krh@248
   238
	while (razor_package_iterator_next(pi, &p, &name, &version, &arch)) {
krh@248
   239
		pq->count += pq->vector[p - packages] ^ 1;
krh@248
   240
		pq->vector[p - packages] = 1;
krh@248
   241
	}
krh@248
   242
}
krh@248
   243
krh@269
   244
RAZOR_EXPORT struct razor_package_iterator *
krh@248
   245
razor_package_query_finish(struct razor_package_query *pq)
krh@248
   246
{
krh@248
   247
	struct razor_package_iterator *pi;
krh@248
   248
	struct razor_set *set;
krh@248
   249
	struct list *index;
krh@251
   250
	int i, j;
krh@248
   251
krh@248
   252
	set = pq->set;
krh@251
   253
	if (pq->count > 0)
krh@251
   254
		index = zalloc(pq->count * sizeof *index);
krh@251
   255
	else
krh@251
   256
		index = NULL;
krh@248
   257
krh@267
   258
	for (i = 0, j = 0; j < pq->count; i++) {
krh@248
   259
		if (!pq->vector[i])
krh@248
   260
			continue;
krh@248
   261
krh@248
   262
		index[j].data = i;
krh@248
   263
		if (j == pq->count - 1)
krh@248
   264
			index[j].flags = 0x80;
krh@248
   265
		j++;
krh@248
   266
	}
krh@248
   267
krh@251
   268
	free(pq->vector);
krh@248
   269
	free(pq);
krh@248
   270
krh@248
   271
	pi = razor_package_iterator_create_with_index(set, index);
krh@248
   272
	pi->free_index = 1;
krh@248
   273
krh@248
   274
	return pi;
krh@248
   275
}