From: Martin Mares Date: Thu, 12 Feb 2015 17:52:18 +0000 (+0100) Subject: Simplified XML processing X-Git-Url: http://mj.ucw.cz/gitweb/?p=leo.git;a=commitdiff_plain;h=0f9c9a716fe7c552e4156325d4f1a803ab40a71e Simplified XML processing --- diff --git a/xml.c b/xml.c index 53caec5..0c31f73 100644 --- a/xml.c +++ b/xml.c @@ -147,25 +147,16 @@ static void h_error(struct xml_context *ctx) fprintf(stderr, "%s at %u: %s\n", (ctx->err_code < XML_ERR_ERROR) ? "warn" : "error", xml_row(ctx), ctx->err_msg); } -#if 0 - -static void h_stag(struct xml_context *ctx) -{ - printf("STAG %s\n", ctx->node->name); - if (!strcmp(ctx->node->name, "node")) - { - ctx->flags &= ~XML_REPORT_TAGS; - ctx->flags |= XML_ALLOC_ALL; - } -} - -static void h_etag(struct xml_context *ctx) +static void parse_element(struct xml_context *ctx, struct xml_node *e) { - printf("ETAG %s\n", ctx->node->name); + if (!strcmp(e->name, "node")) + parse_node(ctx, e); + else if (!strcmp(e->name, "way")) + parse_way(ctx, e); + else if (!strcmp(e->name, "relation")) + parse_relation(ctx, e); } -#endif - void osm_xml_parse(const char *name) { struct xml_context ctx; @@ -173,55 +164,25 @@ void osm_xml_parse(const char *name) ctx.h_warn = ctx.h_error = ctx.h_fatal = h_error; xml_push_fastbuf(&ctx, bopen_file(name, O_RDONLY, NULL)); -#if 0 - ctx.flags |= XML_REPORT_TAGS; - ctx.h_stag = h_stag; - ctx.h_etag = h_etag; - xml_parse(&ctx); -#endif - -#if 0 - uns state; - while (state = xml_next(&ctx)) + uint state; + while (state = xml_next_state(&ctx, XML_PULL_STAG)) switch (state) { case XML_STATE_STAG: - printf("STAG %s\n", ctx.node->name); - if (!strcmp(ctx.node->name, "node")) + // printf("STAG %s\n", ctx.node->name); + if (strcmp(ctx.node->name, "osm")) { - ctx.pull = XML_PULL_ETAG; ctx.flags |= XML_ALLOC_CHARS | XML_ALLOC_TAGS; + if (xml_skip_element(&ctx) == XML_STATE_ETAG) + { + // printf("ETAG %s\n", ctx.node->name); + parse_element(&ctx, ctx.node); + } } - break; - case XML_STATE_ETAG: - printf("ETAG %s\n", ctx.node->name); - if (!strcmp(ctx.node->name, "node")) - { - ctx.pull = XML_PULL_STAG | XML_PULL_ETAG; - ctx.flags &= ~(XML_ALLOC_CHARS | XML_ALLOC_TAGS); - } - break; } -#endif - - ctx.flags |= XML_ALLOC_ALL; - xml_parse(&ctx); if (ctx.err_code) die("Fatal error in XML parser"); - struct xml_node *root = ctx.dom; - ASSERT(root); - XML_NODE_FOR_EACH(e, root) - if (e->type == XML_NODE_ELEM) - { - if (!strcmp(e->name, "node")) - parse_node(&ctx, e); - else if (!strcmp(e->name, "way")) - parse_way(&ctx, e); - else if (!strcmp(e->name, "relation")) - parse_relation(&ctx, e); - } - xml_cleanup(&ctx); }