diff -r 000000000000 -r 7bd64a40cb03 test-driver.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-driver.c Sat Dec 29 19:00:25 2007 -0500 @@ -0,0 +1,170 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "razor.h" + +#define XML_BUFFER_SIZE 4096 + +static void +parse_xml_file(const char *filename, + XML_StartElementHandler start, + XML_EndElementHandler end, + void *data) +{ + XML_Parser parser; + char *buffer; + int fd, len, err; + + parser = XML_ParserCreate(NULL); + XML_SetElementHandler(parser, start, end); + XML_SetUserData(parser, data); + + buffer = XML_GetBuffer(parser, XML_BUFFER_SIZE); + + fd = open(filename, O_RDONLY); + if (fd < 0) { + fprintf(stderr, "open: %m\n"); + exit(-1); + } + + while (len = read(fd, buffer, XML_BUFFER_SIZE), len > 0) { + err = XML_ParseBuffer(parser, len, len == 0); + if (err == XML_STATUS_ERROR) { + fprintf(stderr, "parse error at line %lu:\n%s\n", + XML_GetCurrentLineNumber(parser), + XML_ErrorString(XML_GetErrorCode(parser))); + exit(-1); + } + } + + if (fd < 0) { + fprintf(stderr, "read: %m\n"); + exit(-1); + } + + close(fd); +} + +struct test_set { + char *name; + struct razor_set *set; + struct test_set *next; +}; + +struct test_context { + struct razor_importer *importer; + struct test_set *sets; +}; + +static void +get_atts(const char **atts, ...) +{ + va_list ap; + const char *name, **ptr; + int i; + + va_start(ap, atts); + while (name = va_arg(ap, const char *), name != NULL) { + ptr = va_arg(ap, const char **); + for (i = 0; atts[i]; i += 2) { + if (strcmp(atts[i], name) == 0) + *ptr = atts[i + 1]; + } + } + va_end(ap); +} + +static void +parse_property(struct test_context *ctx, const char **atts, + enum razor_property_type type) +{ + const char *name = NULL, *version = NULL; + int i; + + for (i = 0; atts[i]; i += 2) { + if (strcmp(atts[i], "name") == 0) + name = atts[i + 1]; + else if (strcmp(atts[i], "eq") == 0) + version = atts[i + 1]; + } + + if (name == NULL) { + fprintf(stderr, "no name specified for property\n"); + exit(-1); + } + + razor_importer_add_property(ctx->importer, name, version, type); +} + +static void +start_test_sets_element(void *data, const char *element, const char **atts) +{ + struct test_context *ctx = data; + struct test_set *set; + const char *name, *version; + + if (strcmp(element, "set") == 0) { + get_atts(atts, "name", &name, NULL); + ctx->importer = razor_importer_new(); + set = malloc(sizeof *set); + set->name = strdup(name); + set->next = ctx->sets; + ctx->sets = set; + } else if (strcmp(element, "package") == 0) { + get_atts(atts, "name", &name, "version", &version, NULL); + razor_importer_begin_package(ctx->importer, name, version); + } else if (strcmp(element, "requires") == 0) { + parse_property(ctx, atts, RAZOR_PROPERTY_REQUIRES); + } else if (strcmp(element, "provides") == 0) { + parse_property(ctx, atts, RAZOR_PROPERTY_PROVIDES); + } else if (strcmp(element, "obsoletes") == 0) { + parse_property(ctx, atts, RAZOR_PROPERTY_OBSOLETES); + } else if (strcmp(element, "conflicts") == 0) { + parse_property(ctx, atts, RAZOR_PROPERTY_CONFLICTS); + } else if (strcmp(element, "file") == 0) { + get_atts(atts, "name", &name, NULL); + razor_importer_add_file(ctx->importer, name); + } else if (strcmp(element, "dir") == 0) { + get_atts(atts, "name", &name, NULL); + razor_importer_add_file(ctx->importer, name); + } +} + +static void +end_test_sets_element (void *data, const char *name) +{ + struct test_context *ctx = data; + + if (strcmp(name, "set") == 0) { + ctx->sets->set = razor_importer_finish(ctx->importer); + } else if (strcmp(name, "package") == 0) { + razor_importer_finish_package(ctx->importer); + } +} + +int main(int argc, char *argv[]) +{ + struct test_context ctx; + struct test_set *set; + + if (argc != 3) { + fprintf(stderr, "usage: %s SETS-FILE TESTS-FILE\n", argv[0]); + exit(-1); + } + + memset(&ctx, 0, sizeof ctx); + parse_xml_file(argv[1], + start_test_sets_element, + end_test_sets_element, + &ctx); + + for (set = ctx.sets; set != NULL; set = set->next) + printf("set %s\n", set->name); + + return 0; +}