From 1d83bf48e02c4386a76cec8fac491bdaad1d6b6e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Wed, 19 Sep 2007 15:26:25 -0400 Subject: [PATCH] Refactor the import interface and make it opaque. --- import.c | 98 ++++++++++++++++++------------- razor.c | 195 +++++++++++++++++++++++++++++++++++++++++++++---------------- razor.h | 80 +++----------------------- 3 files changed, 209 insertions(+), 164 deletions(-) diff --git a/import.c b/import.c index 75a675a..63b2fa4 100644 --- a/import.c +++ b/import.c @@ -15,7 +15,7 @@ #include "razor.h" static void -parse_package(struct import_context *ctx, const char **atts, void *data) +parse_package(struct razor_importer *importer, const char **atts, void *data) { const char *name = NULL, *version = NULL; int i; @@ -33,11 +33,15 @@ parse_package(struct import_context *ctx, const char **atts, void *data) return; } - import_context_add_package(ctx, name, version); + razor_importer_begin_package(importer, name, version); } +enum { + RZR_REQUIRES, RZR_PROVIDES +}; + static void -parse_property(struct import_context *ctx, const char **atts, void *data) +parse_property(struct razor_importer *importer, const char **atts, void *data) { const char *name = NULL, *version = NULL; int i; @@ -54,33 +58,40 @@ parse_property(struct import_context *ctx, const char **atts, void *data) return; } - import_context_add_property(ctx, data, name, version); + switch ((int) data) { + case RZR_REQUIRES: + razor_importer_add_requires(importer, name, version); + break; + case RZR_PROVIDES: + razor_importer_add_provides(importer, name, version); + break; + } } static void start_element(void *data, const char *name, const char **atts) { - struct import_context *ctx = data; + struct razor_importer *importer = data; if (strcmp(name, "package") == 0) - parse_package(ctx, atts, NULL); + parse_package(importer, atts, NULL); else if (strcmp(name, "requires") == 0) - parse_property(ctx, atts, &ctx->requires); + parse_property(importer, atts, (void *) RZR_REQUIRES); else if (strcmp(name, "provides") == 0) - parse_property(ctx, atts, &ctx->provides); + parse_property(importer, atts, (void*) RZR_PROVIDES); } static void end_element (void *data, const char *name) { - struct import_context *ctx = data; + struct razor_importer *importer = data; if (strcmp(name, "package") == 0) - import_context_finish_package(ctx); + razor_importer_finish_package(importer); } static int -import_rzr_file(struct import_context *ctx, const char *filename) +import_rzr_file(struct razor_importer *importer, const char *filename) { SHA_CTX sha1; XML_Parser parser; @@ -97,7 +108,7 @@ import_rzr_file(struct import_context *ctx, const char *filename) return -1; parser = XML_ParserCreate(NULL); - XML_SetUserData(parser, ctx); + XML_SetUserData(parser, importer); XML_SetElementHandler(parser, start_element, end_element); if (XML_Parse(parser, p, stat.st_size, 1) == XML_STATUS_ERROR) { fprintf(stderr, @@ -124,30 +135,32 @@ import_rzr_file(struct import_context *ctx, const char *filename) struct razor_set * razor_import_rzr_files(int count, const char *files[]) { - struct import_context ctx; + struct razor_importer *importer; int i; - razor_prepare_import(&ctx); + importer = razor_importer_new(); for (i = 0; i < count; i++) { - if (import_rzr_file(&ctx, files[i]) < 0) { + if (import_rzr_file(importer, files[i]) < 0) { fprintf(stderr, "failed to import %s\n", files[i]); exit(-1); } } - return razor_finish_import(&ctx); + return razor_importer_finish(importer); } /* Import a yum filelist as a razor package set. */ enum { YUM_STATE_BEGIN, - YUM_STATE_PACKAGE_NAME + YUM_STATE_PACKAGE_NAME, + YUM_STATE_REQUIRES, + YUM_STATE_PROVIDES }; struct yum_context { - struct import_context ctx; + struct razor_importer *importer; struct import_property_context *current_property_context; char *name; int state; @@ -168,13 +181,13 @@ yum_start_element(void *data, const char *name, const char **atts) if (strcmp(atts[i], "ver") == 0) version = atts[i + 1]; } - import_context_add_package(&ctx->ctx, ctx->name, version); + razor_importer_begin_package(ctx->importer, ctx->name, version); } else if (strcmp(name, "rpm:requires") == 0) { - ctx->current_property_context = &ctx->ctx.requires; + ctx->state = YUM_STATE_REQUIRES; } else if (strcmp(name, "rpm:provides") == 0) { - ctx->current_property_context = &ctx->ctx.provides; + ctx->state = YUM_STATE_PROVIDES; } else if (strcmp(name, "rpm:entry") == 0 && - ctx->current_property_context != NULL) { + ctx->state != YUM_STATE_BEGIN) { n = NULL; version = NULL; for (i = 0; atts[i]; i += 2) { @@ -190,9 +203,15 @@ yum_start_element(void *data, const char *name, const char **atts) return; } - import_context_add_property(&ctx->ctx, - ctx->current_property_context, - n, version); + switch (ctx->state) { + case YUM_STATE_REQUIRES: + razor_importer_add_requires(ctx->importer, n, version); + break; + case YUM_STATE_PROVIDES: + razor_importer_add_provides(ctx->importer, n, version); + break; + } + } } @@ -203,13 +222,13 @@ yum_end_element (void *data, const char *name) if (strcmp(name, "package") == 0) { free(ctx->name); - import_context_finish_package(&ctx->ctx); + razor_importer_finish_package(ctx->importer); } else if (strcmp(name, "name") == 0) { - ctx->state = 0; + ctx->state = YUM_STATE_BEGIN; } else if (strcmp(name, "rpm:requires") == 0) { - ctx->current_property_context = NULL; + ctx->state = YUM_STATE_BEGIN; } else if (strcmp(name, "rpm:provides") == 0) { - ctx->current_property_context = NULL; + ctx->state = YUM_STATE_BEGIN; } } @@ -230,7 +249,7 @@ razor_set_create_from_yum_filelist(int fd) char buf[4096]; int len; - razor_prepare_import(&ctx.ctx); + ctx.importer = razor_importer_new(); parser = XML_ParserCreate(NULL); XML_SetUserData(parser, &ctx); @@ -257,13 +276,13 @@ razor_set_create_from_yum_filelist(int fd) XML_ParserFree(parser); - return razor_finish_import(&ctx.ctx); + return razor_importer_finish(ctx.importer); } struct razor_set * razor_set_create_from_rpmdb(void) { - struct import_context ctx; + struct razor_importer *importer; rpmdbMatchIterator iter; Header h; int_32 type, count, i; @@ -278,7 +297,7 @@ razor_set_create_from_rpmdb(void) exit(1); } - razor_prepare_import(&ctx); + importer = razor_importer_new(); iter = rpmdbInitIterator(db, 0, NULL, 0); while (h = rpmdbNextIterator(iter), h != NULL) { @@ -288,16 +307,14 @@ razor_set_create_from_rpmdb(void) (void **) &version, &count); headerGetEntry(h, RPMTAG_RELEASE, &type, (void **) &release, &count); - import_context_add_package(&ctx, name, version); - + razor_importer_begin_package(importer, name, version); headerGetEntry(h, RPMTAG_REQUIRES, &type, (void **) &properties, &count); headerGetEntry(h, RPMTAG_REQUIREVERSION, &type, (void **) &property_versions, &count); for (i = 0; i < count; i++) - import_context_add_property(&ctx, - &ctx.requires, + razor_importer_add_requires(importer, properties[i], property_versions[i]); @@ -306,15 +323,14 @@ razor_set_create_from_rpmdb(void) headerGetEntry(h, RPMTAG_PROVIDEVERSION, &type, (void **) &property_versions, &count); for (i = 0; i < count; i++) - import_context_add_property(&ctx, - &ctx.provides, + razor_importer_add_provides(importer, properties[i], property_versions[i]); - import_context_finish_package(&ctx); + razor_importer_finish_package(importer); } rpmdbClose(db); - return razor_finish_import(&ctx); + return razor_importer_finish(importer); } diff --git a/razor.c b/razor.c index f908337..1aabdd4 100644 --- a/razor.c +++ b/razor.c @@ -13,6 +13,71 @@ #include "razor.h" +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) + +struct array { + void *data; + int size, alloc; +}; + +struct razor_set_section { + unsigned int type; + unsigned int offset; + unsigned int size; +}; + +struct razor_set_header { + unsigned int magic; + unsigned int version; + struct razor_set_section sections[0]; +}; + +#define RAZOR_MAGIC 0x7a7a7a7a +#define RAZOR_VERSION 1 + +#define RAZOR_PACKAGES 0 +#define RAZOR_REQUIRES 1 +#define RAZOR_PROVIDES 2 +#define RAZOR_STRING_POOL 3 +#define RAZOR_PROPERTY_POOL 4 + +struct razor_package { + unsigned long name; + unsigned long version; + unsigned long requires; + unsigned long provides; +}; + +struct razor_property { + unsigned long name; + unsigned long version; + unsigned long packages; +}; + +struct razor_set { + struct array buckets; + struct array string_pool; + struct array property_pool; + struct array packages; + struct array requires; + struct array provides; + struct razor_set_header *header; +}; + +struct import_property_context { + struct array *all; + struct array package; +}; + +struct razor_importer { + struct razor_set *set; + struct import_property_context requires; + struct import_property_context provides; + struct razor_package *package; + unsigned long *requires_map; + unsigned long *provides_map; +}; + static void array_init(struct array *array) { @@ -305,7 +370,7 @@ razor_set_insert(struct razor_set *set, const char *key) return value; } -unsigned long +static unsigned long razor_set_tokenize(struct razor_set *set, const char *string) { unsigned long token; @@ -321,35 +386,37 @@ razor_set_tokenize(struct razor_set *set, const char *string) } void -import_context_add_package(struct import_context *ctx, - const char *name, const char *version) +razor_importer_begin_package(struct razor_importer *importer, + const char *name, const char *version) { struct razor_package *p; - p = array_add(&ctx->set->packages, sizeof *p); - p->name = razor_set_tokenize(ctx->set, name); - p->version = razor_set_tokenize(ctx->set, version); + p = array_add(&importer->set->packages, sizeof *p); + p->name = razor_set_tokenize(importer->set, name); + p->version = razor_set_tokenize(importer->set, version); - ctx->package = p; - array_init(&ctx->requires.package); - array_init(&ctx->provides.package); + importer->package = p; + array_init(&importer->requires.package); + array_init(&importer->provides.package); } void -import_context_finish_package(struct import_context *ctx) +razor_importer_finish_package(struct razor_importer *importer) { struct razor_package *p; - p = ctx->package; - p->requires = add_to_property_pool(ctx->set, &ctx->requires.package); - p->provides = add_to_property_pool(ctx->set, &ctx->provides.package); + p = importer->package; + p->requires = add_to_property_pool(importer->set, + &importer->requires.package); + p->provides = add_to_property_pool(importer->set, + &importer->provides.package); - array_release(&ctx->requires.package); - array_release(&ctx->provides.package); + array_release(&importer->requires.package); + array_release(&importer->provides.package); } -void -import_context_add_property(struct import_context *ctx, +static void +razor_importer_add_property(struct razor_importer *importer, struct import_property_context *pctx, const char *name, const char *version) { @@ -357,22 +424,42 @@ import_context_add_property(struct import_context *ctx, unsigned long *r; p = array_add(pctx->all, sizeof *p); - p->name = razor_set_tokenize(ctx->set, name); - p->version = razor_set_tokenize(ctx->set, version); - p->packages = ctx->package - - (struct razor_package *) ctx->set->packages.data; + p->name = razor_set_tokenize(importer->set, name); + p->version = razor_set_tokenize(importer->set, version); + p->packages = importer->package - + (struct razor_package *) importer->set->packages.data; r = array_add(&pctx->package, sizeof *r); *r = p - (struct razor_property *) pctx->all->data; } void -razor_prepare_import(struct import_context *ctx) +razor_importer_add_requires(struct razor_importer *importer, + const char *name, const char *version) +{ + razor_importer_add_property(importer, + &importer->requires, name, version); +} + +void +razor_importer_add_provides(struct razor_importer *importer, + const char *name, const char *version) +{ + razor_importer_add_property(importer, + &importer->provides, name, version); +} + +struct razor_importer * +razor_importer_new(void) { - memset(ctx, 0, sizeof *ctx); - ctx->set = razor_set_create(); - ctx->requires.all = &ctx->set->requires; - ctx->provides.all = &ctx->set->provides; + struct razor_importer *importer; + + importer = zalloc(sizeof *importer); + importer->set = razor_set_create(); + importer->requires.all = &importer->set->requires; + importer->provides.all = &importer->set->provides; + + return importer; } typedef int (*compare_with_data_func_t)(const void *p1, @@ -541,33 +628,33 @@ uniqueify_properties(struct razor_set *set, struct array *properties) } static void -remap_package_links(struct import_context *ctx) +remap_package_links(struct razor_importer *importer) { struct razor_package *p, *end; unsigned long *pool, *r; - pool = ctx->set->property_pool.data; - end = ctx->set->packages.data + ctx->set->packages.size; - for (p = ctx->set->packages.data; p < end; p++) { + pool = importer->set->property_pool.data; + end = importer->set->packages.data + importer->set->packages.size; + for (p = importer->set->packages.data; p < end; p++) { for (r = &pool[p->requires]; ~*r; r++) - *r = ctx->requires_map[*r]; + *r = importer->requires_map[*r]; for (r = &pool[p->provides]; ~*r; r++) - *r = ctx->provides_map[*r]; + *r = importer->provides_map[*r]; } } static void -remap_property_links(struct import_context *ctx, unsigned long *map) +remap_property_links(struct razor_importer *importer, unsigned long *map) { struct razor_property *p, *end; struct razor_package *rp; unsigned long *pool, *r, *rmap; int i, count; - pool = ctx->set->property_pool.data; - count = ctx->set->packages.size / sizeof(struct razor_package); + pool = importer->set->property_pool.data; + count = importer->set->packages.size / sizeof(struct razor_package); rmap = malloc(count * sizeof *map); - rp = ctx->set->packages.data; + rp = importer->set->packages.data; for (i = 0; i < count; i++) rmap[map[i]] = i; @@ -578,13 +665,13 @@ remap_property_links(struct import_context *ctx, unsigned long *map) * a flat pool. Right now, as property lists and package * lists are mixed, we can't do that. */ - end = ctx->set->requires.data + ctx->set->requires.size; - for (p = ctx->set->requires.data; p < end; p++) + end = importer->set->requires.data + importer->set->requires.size; + for (p = importer->set->requires.data; p < end; p++) for (r = &pool[p->packages]; ~*r; r++) *r = rmap[*r]; - end = ctx->set->provides.data + ctx->set->provides.size; - for (p = ctx->set->provides.data; p < end; p++) + end = importer->set->provides.data + importer->set->provides.size; + for (p = importer->set->provides.data; p < end; p++) for (r = &pool[p->packages]; ~*r; r++) *r = rmap[*r]; @@ -592,27 +679,33 @@ remap_property_links(struct import_context *ctx, unsigned long *map) } struct razor_set * -razor_finish_import(struct import_context *ctx) +razor_importer_finish(struct razor_importer *importer) { + struct razor_set *set; unsigned long *map; int count; - ctx->requires_map = uniqueify_properties(ctx->set, ctx->requires.all); - ctx->provides_map = uniqueify_properties(ctx->set, ctx->provides.all); - remap_package_links(ctx); - free(ctx->requires_map); - free(ctx->provides_map); + importer->requires_map = uniqueify_properties(importer->set, + importer->requires.all); + importer->provides_map = uniqueify_properties(importer->set, + importer->provides.all); + remap_package_links(importer); + free(importer->requires_map); + free(importer->provides_map); - count = ctx->set->packages.size / sizeof(struct razor_package); - map = qsort_with_data(ctx->set->packages.data, + count = importer->set->packages.size / sizeof(struct razor_package); + map = qsort_with_data(importer->set->packages.data, count, sizeof(struct razor_package), compare_packages, - ctx->set); - remap_property_links(ctx, map); + importer->set); + remap_property_links(importer, map); free(map); - return ctx->set; + set = importer->set; + free(importer); + + return set; } void diff --git a/razor.h b/razor.h index 6bb2542..6b911ff 100644 --- a/razor.h +++ b/razor.h @@ -1,81 +1,17 @@ #ifndef _RAZOR_H_ #define _RAZOR_H_ -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +struct razor_importer; -struct array { - void *data; - int size, alloc; -}; - -struct razor_set_section { - unsigned int type; - unsigned int offset; - unsigned int size; -}; - -struct razor_set_header { - unsigned int magic; - unsigned int version; - struct razor_set_section sections[0]; -}; - -#define RAZOR_MAGIC 0x7a7a7a7a -#define RAZOR_VERSION 1 - -#define RAZOR_PACKAGES 0 -#define RAZOR_REQUIRES 1 -#define RAZOR_PROVIDES 2 -#define RAZOR_STRING_POOL 3 -#define RAZOR_PROPERTY_POOL 4 - -struct razor_package { - unsigned long name; - unsigned long version; - unsigned long requires; - unsigned long provides; -}; - -struct razor_property { - unsigned long name; - unsigned long version; - unsigned long packages; -}; - -struct razor_set { - struct array buckets; - struct array string_pool; - struct array property_pool; - struct array packages; - struct array requires; - struct array provides; - struct razor_set_header *header; -}; - -struct import_property_context { - struct array *all; - struct array package; -}; - -struct import_context { - struct razor_set *set; - struct import_property_context requires; - struct import_property_context provides; - struct razor_package *package; - unsigned long *requires_map; - unsigned long *provides_map; -}; - -void import_context_add_package(struct import_context *ctx, +struct razor_importer *razor_importer_new(void); +void razor_importer_begin_package(struct razor_importer *importer, const char *name, const char *version); -void import_context_add_property(struct import_context *ctx, - struct import_property_context *pctx, +void razor_importer_add_requires(struct razor_importer *importer, const char *name, const char *version); -void import_context_finish_package(struct import_context *ctx); - -unsigned long razor_set_tokenize(struct razor_set *set, const char *string); -void razor_prepare_import(struct import_context *ctx); -struct razor_set *razor_finish_import(struct import_context *ctx); +void razor_importer_add_provides(struct razor_importer *importer, + const char *name, const char *version); +void razor_importer_finish_package(struct razor_importer *importer); +struct razor_set *razor_importer_finish(struct razor_importer *importer); struct razor_set *razor_import_rzr_files(int count, const char **files); struct razor_set *razor_set_create_from_yum_filelist(int fd); -- 1.7.1