#include <ucw/lib.h>
#include <ucw/fastbuf.h>
-#include <xml/xml.h>
+#include <ucw-xml/xml.h>
#include <fcntl.h>
#include <stdio.h>
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;
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);
}