1.1 --- a/razor.c Fri Sep 07 00:09:18 2007 -0400
1.2 +++ b/razor.c Fri Sep 07 11:56:04 2007 -0400
1.3 @@ -15,6 +15,18 @@
1.4 int size, alloc;
1.5 };
1.6
1.7 +static void
1.8 +array_init(struct array *array)
1.9 +{
1.10 + memset(array, 0, sizeof *array);
1.11 +}
1.12 +
1.13 +static void
1.14 +array_release(struct array *array)
1.15 +{
1.16 + free(array->data);
1.17 +}
1.18 +
1.19 static void *
1.20 array_add(struct array *array, int size)
1.21 {
1.22 @@ -388,53 +400,14 @@
1.23 return value;
1.24 }
1.25
1.26 -static unsigned long
1.27 -razor_set_add_package(struct razor_set *set,
1.28 - unsigned long name, unsigned long version)
1.29 -{
1.30 - struct razor_package *p;
1.31 -
1.32 - p = array_add(&set->packages, sizeof *p);
1.33 -
1.34 - p->name = name;
1.35 - p->version = version;
1.36 -
1.37 - return p - (struct razor_package *) set->packages.data;
1.38 -}
1.39 -
1.40 -static unsigned long
1.41 -razor_set_add_requires(struct razor_set *set,
1.42 - unsigned long name, unsigned long version)
1.43 -{
1.44 - struct razor_property *p;
1.45 -
1.46 - p = array_add(&set->requires, sizeof *p);
1.47 -
1.48 - p->name = name;
1.49 - p->version = version;
1.50 -
1.51 - return p - (struct razor_property *) set->requires.data;
1.52 -}
1.53 -
1.54 -static unsigned long
1.55 -razor_set_add_provides(struct razor_set *set,
1.56 - unsigned long name, unsigned long version)
1.57 -{
1.58 - struct razor_property *p;
1.59 -
1.60 - p = array_add(&set->provides, sizeof *p);
1.61 -
1.62 - p->name = name;
1.63 - p->version = version;
1.64 -
1.65 - return p - (struct razor_property *) set->provides.data;
1.66 -}
1.67 -
1.68 unsigned long
1.69 razor_set_tokenize(struct razor_set *set, const char *string)
1.70 {
1.71 unsigned long token;
1.72
1.73 + if (string == NULL)
1.74 + return 0;
1.75 +
1.76 token = razor_set_lookup(set, string);
1.77 if (token != 0)
1.78 return token;
1.79 @@ -442,15 +415,15 @@
1.80 return razor_set_insert(set, string);
1.81 }
1.82
1.83 -struct property_context {
1.84 +struct import_property_context {
1.85 struct array all;
1.86 struct array package;
1.87 };
1.88
1.89 struct import_context {
1.90 struct razor_set *set;
1.91 - struct property_context requires;
1.92 - struct property_context provides;
1.93 + struct import_property_context requires;
1.94 + struct import_property_context provides;
1.95 unsigned long package;
1.96 unsigned long *requires_map;
1.97 unsigned long *provides_map;
1.98 @@ -465,59 +438,92 @@
1.99 };
1.100
1.101 static void
1.102 +import_context_add_package(struct import_context *ctx,
1.103 + const char *name, const char *version)
1.104 +{
1.105 + struct razor_package *p;
1.106 +
1.107 + p = array_add(&ctx->set->packages, sizeof *p);
1.108 + p->name = razor_set_tokenize(ctx->set, name);
1.109 + p->version = razor_set_tokenize(ctx->set, version);
1.110 +
1.111 + ctx->package = p - (struct razor_package *) ctx->set->packages.data;
1.112 + array_init(&ctx->requires.package);
1.113 + array_init(&ctx->provides.package);
1.114 +}
1.115 +
1.116 +void
1.117 +import_context_finish_package(struct import_context *ctx)
1.118 +{
1.119 + struct razor_package *p;
1.120 +
1.121 + p = (struct razor_package *) ctx->set->packages.data + ctx->package;
1.122 + p->requires = add_to_property_pool(ctx->set, &ctx->requires.package);
1.123 + p->provides = add_to_property_pool(ctx->set, &ctx->provides.package);
1.124 +
1.125 + array_release(&ctx->requires.package);
1.126 + array_release(&ctx->provides.package);
1.127 +}
1.128 +
1.129 +static void
1.130 +import_context_add_property(struct import_context *ctx,
1.131 + struct import_property_context *pctx,
1.132 + const char *name, const char *version)
1.133 +{
1.134 + struct import_property *p;
1.135 + unsigned long *r;
1.136 +
1.137 + p = array_add(&pctx->all, sizeof *p);
1.138 + p->name = razor_set_tokenize(ctx->set, name);
1.139 + p->version = razor_set_tokenize(ctx->set, version);
1.140 + p->package = ctx->package;
1.141 + p->index = p - (struct import_property *) pctx->all.data;
1.142 +
1.143 + r = array_add(&pctx->package, sizeof *r);
1.144 + *r = p->index;
1.145 +}
1.146 +
1.147 +static void
1.148 parse_package(struct import_context *ctx, const char **atts, void *data)
1.149 {
1.150 - unsigned long name = 0, version = 0;
1.151 + const char *name = NULL, *version = NULL;
1.152 int i;
1.153
1.154 for (i = 0; atts[i]; i += 2) {
1.155 if (strcmp(atts[i], "name") == 0)
1.156 - name = razor_set_tokenize(ctx->set, atts[i + 1]);
1.157 + name = atts[i + 1];
1.158 else if (strcmp(atts[i], "version") == 0)
1.159 - version = razor_set_tokenize(ctx->set, atts[i + 1]);
1.160 + version = atts[i + 1];
1.161 }
1.162
1.163 - if (name == 0 || version == 0) {
1.164 + if (name == NULL || version == NULL) {
1.165 fprintf(stderr, "invalid package tag, "
1.166 "missing name or version attributes\n");
1.167 return;
1.168 }
1.169
1.170 - ctx->package = razor_set_add_package(ctx->set, name, version);
1.171 - memset(&ctx->requires.package, 0, sizeof ctx->requires.package);
1.172 - memset(&ctx->provides.package, 0, sizeof ctx->provides.package);
1.173 -
1.174 - return;
1.175 + import_context_add_package(ctx, name, version);
1.176 }
1.177
1.178 static void
1.179 parse_property(struct import_context *ctx, const char **atts, void *data)
1.180 {
1.181 - unsigned long name = 0, version = 0, *r;
1.182 - struct import_property *p;
1.183 - struct property_context *pctx = data;
1.184 + const char *name = NULL, *version = NULL;
1.185 int i;
1.186
1.187 for (i = 0; atts[i]; i += 2) {
1.188 if (strcmp(atts[i], "name") == 0)
1.189 - name = razor_set_tokenize(ctx->set, atts[i + 1]);
1.190 + name = atts[i + 1];
1.191 if (strcmp(atts[i], "version") == 0)
1.192 - version = razor_set_tokenize(ctx->set, atts[i + 1]);
1.193 + version = atts[i + 1];
1.194 }
1.195
1.196 - if (name == 0) {
1.197 + if (name == NULL) {
1.198 fprintf(stderr, "invalid tag, missing name attribute\n");
1.199 return;
1.200 }
1.201
1.202 - p = array_add(&pctx->all, sizeof *p);
1.203 - p->name = name;
1.204 - p->version = version;
1.205 - p->package = ctx->package;
1.206 - p->index = p - (struct import_property *) pctx->all.data;
1.207 -
1.208 - r = array_add(&pctx->package, sizeof *r);
1.209 - *r = p->index;
1.210 + import_context_add_property(ctx, data, name, version);
1.211 }
1.212
1.213 static void
1.214 @@ -537,19 +543,9 @@
1.215 end_element (void *data, const char *name)
1.216 {
1.217 struct import_context *ctx = data;
1.218 - struct razor_package *package;
1.219
1.220 - if (strcmp(name, "package") == 0) {
1.221 - package = (struct razor_package *) ctx->set->packages.data +
1.222 - ctx->package;
1.223 - package->requires =
1.224 - add_to_property_pool(ctx->set, &ctx->requires.package);
1.225 - package->provides =
1.226 - add_to_property_pool(ctx->set, &ctx->provides.package);
1.227 - free(ctx->requires.package.data);
1.228 - free(ctx->provides.package.data);
1.229 - ctx->package = 0;
1.230 - }
1.231 + if (strcmp(name, "package") == 0)
1.232 + import_context_finish_package(ctx);
1.233 }
1.234
1.235 static char *
1.236 @@ -572,14 +568,14 @@
1.237 }
1.238
1.239 static void
1.240 -razor_set_prepare_import(struct razor_set *set, struct import_context *ctx)
1.241 +razor_prepare_import(struct import_context *ctx)
1.242 {
1.243 memset(ctx, 0, sizeof *ctx);
1.244 - ctx->set = set;
1.245 + ctx->set = razor_set_create();
1.246 }
1.247
1.248 static int
1.249 -razor_set_import(struct import_context *ctx, const char *filename)
1.250 +razor_import(struct import_context *ctx, const char *filename)
1.251 {
1.252 SHA_CTX sha1;
1.253 XML_Parser parser;
1.254 @@ -701,9 +697,12 @@
1.255 sizeof(struct razor_package), compare_packages);
1.256 }
1.257
1.258 -static void
1.259 -razor_set_finish_import(struct import_context *ctx)
1.260 +static struct razor_set *
1.261 +razor_finish_import(struct import_context *ctx)
1.262 {
1.263 + struct razor_package *pkg;
1.264 + struct razor_property *prop;
1.265 +
1.266 qsort_set = ctx->set;
1.267
1.268 ctx->requires_map =
1.269 @@ -718,15 +717,25 @@
1.270 free(ctx->requires_map);
1.271 free(ctx->provides_map);
1.272
1.273 + /* FIXME: We add sentinel package/props here, but we should
1.274 + * probably just have a size field in the header section. */
1.275 + pkg = array_add(&ctx->set->packages, sizeof *pkg);
1.276 + pkg->name = 0;
1.277 + prop = array_add(&ctx->set->requires, sizeof *prop);
1.278 + prop->name = 0;
1.279 + prop = array_add(&ctx->set->provides, sizeof *prop);
1.280 + prop->name = 0;
1.281 +
1.282 fprintf(stderr, "parsed %d requires, %d unique\n",
1.283 ctx->requires.all.size / sizeof(struct import_property),
1.284 ctx->set->requires.size / sizeof(struct razor_property));
1.285 fprintf(stderr, "parsed %d provides, %d unique\n",
1.286 ctx->provides.all.size / sizeof(struct import_property),
1.287 ctx->set->provides.size / sizeof(struct razor_property));
1.288 +
1.289 + return ctx->set;
1.290 }
1.291
1.292 -
1.293 void
1.294 razor_set_list(struct razor_set *set)
1.295 {
1.296 @@ -866,26 +875,17 @@
1.297 exit(-1);
1.298 }
1.299
1.300 - set = razor_set_create();
1.301 -
1.302 - razor_set_prepare_import(set, &ctx);
1.303 + razor_prepare_import(&ctx);
1.304
1.305 for (i = 2; i < argc; i++) {
1.306 - if (razor_set_import(&ctx, argv[i]) < 0) {
1.307 + if (razor_import(&ctx, argv[i]) < 0) {
1.308 fprintf(stderr, "failed to import %s\n",
1.309 argv[i]);
1.310 exit(-1);
1.311 }
1.312 }
1.313
1.314 - razor_set_finish_import(&ctx);
1.315 -
1.316 - /* FIXME: We add a sentinel package here, but we
1.317 - * should probably just have a size field in the
1.318 - * header section. */
1.319 - razor_set_add_package(set, 0, 0);
1.320 - razor_set_add_requires(set, 0, 0);
1.321 - razor_set_add_provides(set, 0, 0);
1.322 + set = razor_finish_import(&ctx);
1.323
1.324 printf("bucket allocation: %d\n", set->buckets.alloc);
1.325 printf("pool size: %d\n", set->string_pool.size);