1.1 --- a/razor.c Wed Sep 19 14:34:11 2007 -0400
1.2 +++ b/razor.c Wed Sep 19 15:28:19 2007 -0400
1.3 @@ -13,6 +13,71 @@
1.4
1.5 #include "razor.h"
1.6
1.7 +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
1.8 +
1.9 +struct array {
1.10 + void *data;
1.11 + int size, alloc;
1.12 +};
1.13 +
1.14 +struct razor_set_section {
1.15 + unsigned int type;
1.16 + unsigned int offset;
1.17 + unsigned int size;
1.18 +};
1.19 +
1.20 +struct razor_set_header {
1.21 + unsigned int magic;
1.22 + unsigned int version;
1.23 + struct razor_set_section sections[0];
1.24 +};
1.25 +
1.26 +#define RAZOR_MAGIC 0x7a7a7a7a
1.27 +#define RAZOR_VERSION 1
1.28 +
1.29 +#define RAZOR_PACKAGES 0
1.30 +#define RAZOR_REQUIRES 1
1.31 +#define RAZOR_PROVIDES 2
1.32 +#define RAZOR_STRING_POOL 3
1.33 +#define RAZOR_PROPERTY_POOL 4
1.34 +
1.35 +struct razor_package {
1.36 + unsigned long name;
1.37 + unsigned long version;
1.38 + unsigned long requires;
1.39 + unsigned long provides;
1.40 +};
1.41 +
1.42 +struct razor_property {
1.43 + unsigned long name;
1.44 + unsigned long version;
1.45 + unsigned long packages;
1.46 +};
1.47 +
1.48 +struct razor_set {
1.49 + struct array buckets;
1.50 + struct array string_pool;
1.51 + struct array property_pool;
1.52 + struct array packages;
1.53 + struct array requires;
1.54 + struct array provides;
1.55 + struct razor_set_header *header;
1.56 +};
1.57 +
1.58 +struct import_property_context {
1.59 + struct array *all;
1.60 + struct array package;
1.61 +};
1.62 +
1.63 +struct razor_importer {
1.64 + struct razor_set *set;
1.65 + struct import_property_context requires;
1.66 + struct import_property_context provides;
1.67 + struct razor_package *package;
1.68 + unsigned long *requires_map;
1.69 + unsigned long *provides_map;
1.70 +};
1.71 +
1.72 static void
1.73 array_init(struct array *array)
1.74 {
1.75 @@ -305,7 +370,7 @@
1.76 return value;
1.77 }
1.78
1.79 -unsigned long
1.80 +static unsigned long
1.81 razor_set_tokenize(struct razor_set *set, const char *string)
1.82 {
1.83 unsigned long token;
1.84 @@ -321,35 +386,37 @@
1.85 }
1.86
1.87 void
1.88 -import_context_add_package(struct import_context *ctx,
1.89 - const char *name, const char *version)
1.90 +razor_importer_begin_package(struct razor_importer *importer,
1.91 + const char *name, const char *version)
1.92 {
1.93 struct razor_package *p;
1.94
1.95 - p = array_add(&ctx->set->packages, sizeof *p);
1.96 - p->name = razor_set_tokenize(ctx->set, name);
1.97 - p->version = razor_set_tokenize(ctx->set, version);
1.98 + p = array_add(&importer->set->packages, sizeof *p);
1.99 + p->name = razor_set_tokenize(importer->set, name);
1.100 + p->version = razor_set_tokenize(importer->set, version);
1.101
1.102 - ctx->package = p;
1.103 - array_init(&ctx->requires.package);
1.104 - array_init(&ctx->provides.package);
1.105 + importer->package = p;
1.106 + array_init(&importer->requires.package);
1.107 + array_init(&importer->provides.package);
1.108 }
1.109
1.110 void
1.111 -import_context_finish_package(struct import_context *ctx)
1.112 +razor_importer_finish_package(struct razor_importer *importer)
1.113 {
1.114 struct razor_package *p;
1.115
1.116 - p = ctx->package;
1.117 - p->requires = add_to_property_pool(ctx->set, &ctx->requires.package);
1.118 - p->provides = add_to_property_pool(ctx->set, &ctx->provides.package);
1.119 + p = importer->package;
1.120 + p->requires = add_to_property_pool(importer->set,
1.121 + &importer->requires.package);
1.122 + p->provides = add_to_property_pool(importer->set,
1.123 + &importer->provides.package);
1.124
1.125 - array_release(&ctx->requires.package);
1.126 - array_release(&ctx->provides.package);
1.127 + array_release(&importer->requires.package);
1.128 + array_release(&importer->provides.package);
1.129 }
1.130
1.131 -void
1.132 -import_context_add_property(struct import_context *ctx,
1.133 +static void
1.134 +razor_importer_add_property(struct razor_importer *importer,
1.135 struct import_property_context *pctx,
1.136 const char *name, const char *version)
1.137 {
1.138 @@ -357,22 +424,42 @@
1.139 unsigned long *r;
1.140
1.141 p = array_add(pctx->all, sizeof *p);
1.142 - p->name = razor_set_tokenize(ctx->set, name);
1.143 - p->version = razor_set_tokenize(ctx->set, version);
1.144 - p->packages = ctx->package -
1.145 - (struct razor_package *) ctx->set->packages.data;
1.146 + p->name = razor_set_tokenize(importer->set, name);
1.147 + p->version = razor_set_tokenize(importer->set, version);
1.148 + p->packages = importer->package -
1.149 + (struct razor_package *) importer->set->packages.data;
1.150
1.151 r = array_add(&pctx->package, sizeof *r);
1.152 *r = p - (struct razor_property *) pctx->all->data;
1.153 }
1.154
1.155 void
1.156 -razor_prepare_import(struct import_context *ctx)
1.157 +razor_importer_add_requires(struct razor_importer *importer,
1.158 + const char *name, const char *version)
1.159 {
1.160 - memset(ctx, 0, sizeof *ctx);
1.161 - ctx->set = razor_set_create();
1.162 - ctx->requires.all = &ctx->set->requires;
1.163 - ctx->provides.all = &ctx->set->provides;
1.164 + razor_importer_add_property(importer,
1.165 + &importer->requires, name, version);
1.166 +}
1.167 +
1.168 +void
1.169 +razor_importer_add_provides(struct razor_importer *importer,
1.170 + const char *name, const char *version)
1.171 +{
1.172 + razor_importer_add_property(importer,
1.173 + &importer->provides, name, version);
1.174 +}
1.175 +
1.176 +struct razor_importer *
1.177 +razor_importer_new(void)
1.178 +{
1.179 + struct razor_importer *importer;
1.180 +
1.181 + importer = zalloc(sizeof *importer);
1.182 + importer->set = razor_set_create();
1.183 + importer->requires.all = &importer->set->requires;
1.184 + importer->provides.all = &importer->set->provides;
1.185 +
1.186 + return importer;
1.187 }
1.188
1.189 typedef int (*compare_with_data_func_t)(const void *p1,
1.190 @@ -541,33 +628,33 @@
1.191 }
1.192
1.193 static void
1.194 -remap_package_links(struct import_context *ctx)
1.195 +remap_package_links(struct razor_importer *importer)
1.196 {
1.197 struct razor_package *p, *end;
1.198 unsigned long *pool, *r;
1.199
1.200 - pool = ctx->set->property_pool.data;
1.201 - end = ctx->set->packages.data + ctx->set->packages.size;
1.202 - for (p = ctx->set->packages.data; p < end; p++) {
1.203 + pool = importer->set->property_pool.data;
1.204 + end = importer->set->packages.data + importer->set->packages.size;
1.205 + for (p = importer->set->packages.data; p < end; p++) {
1.206 for (r = &pool[p->requires]; ~*r; r++)
1.207 - *r = ctx->requires_map[*r];
1.208 + *r = importer->requires_map[*r];
1.209 for (r = &pool[p->provides]; ~*r; r++)
1.210 - *r = ctx->provides_map[*r];
1.211 + *r = importer->provides_map[*r];
1.212 }
1.213 }
1.214
1.215 static void
1.216 -remap_property_links(struct import_context *ctx, unsigned long *map)
1.217 +remap_property_links(struct razor_importer *importer, unsigned long *map)
1.218 {
1.219 struct razor_property *p, *end;
1.220 struct razor_package *rp;
1.221 unsigned long *pool, *r, *rmap;
1.222 int i, count;
1.223
1.224 - pool = ctx->set->property_pool.data;
1.225 - count = ctx->set->packages.size / sizeof(struct razor_package);
1.226 + pool = importer->set->property_pool.data;
1.227 + count = importer->set->packages.size / sizeof(struct razor_package);
1.228 rmap = malloc(count * sizeof *map);
1.229 - rp = ctx->set->packages.data;
1.230 + rp = importer->set->packages.data;
1.231 for (i = 0; i < count; i++)
1.232 rmap[map[i]] = i;
1.233
1.234 @@ -578,13 +665,13 @@
1.235 * a flat pool. Right now, as property lists and package
1.236 * lists are mixed, we can't do that. */
1.237
1.238 - end = ctx->set->requires.data + ctx->set->requires.size;
1.239 - for (p = ctx->set->requires.data; p < end; p++)
1.240 + end = importer->set->requires.data + importer->set->requires.size;
1.241 + for (p = importer->set->requires.data; p < end; p++)
1.242 for (r = &pool[p->packages]; ~*r; r++)
1.243 *r = rmap[*r];
1.244
1.245 - end = ctx->set->provides.data + ctx->set->provides.size;
1.246 - for (p = ctx->set->provides.data; p < end; p++)
1.247 + end = importer->set->provides.data + importer->set->provides.size;
1.248 + for (p = importer->set->provides.data; p < end; p++)
1.249 for (r = &pool[p->packages]; ~*r; r++)
1.250 *r = rmap[*r];
1.251
1.252 @@ -592,27 +679,33 @@
1.253 }
1.254
1.255 struct razor_set *
1.256 -razor_finish_import(struct import_context *ctx)
1.257 +razor_importer_finish(struct razor_importer *importer)
1.258 {
1.259 + struct razor_set *set;
1.260 unsigned long *map;
1.261 int count;
1.262
1.263 - ctx->requires_map = uniqueify_properties(ctx->set, ctx->requires.all);
1.264 - ctx->provides_map = uniqueify_properties(ctx->set, ctx->provides.all);
1.265 - remap_package_links(ctx);
1.266 - free(ctx->requires_map);
1.267 - free(ctx->provides_map);
1.268 + importer->requires_map = uniqueify_properties(importer->set,
1.269 + importer->requires.all);
1.270 + importer->provides_map = uniqueify_properties(importer->set,
1.271 + importer->provides.all);
1.272 + remap_package_links(importer);
1.273 + free(importer->requires_map);
1.274 + free(importer->provides_map);
1.275
1.276 - count = ctx->set->packages.size / sizeof(struct razor_package);
1.277 - map = qsort_with_data(ctx->set->packages.data,
1.278 + count = importer->set->packages.size / sizeof(struct razor_package);
1.279 + map = qsort_with_data(importer->set->packages.data,
1.280 count,
1.281 sizeof(struct razor_package),
1.282 compare_packages,
1.283 - ctx->set);
1.284 - remap_property_links(ctx, map);
1.285 + importer->set);
1.286 + remap_property_links(importer, map);
1.287 free(map);
1.288
1.289 - return ctx->set;
1.290 + set = importer->set;
1.291 + free(importer);
1.292 +
1.293 + return set;
1.294 }
1.295
1.296 void