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