]> mj.ucw.cz Git - leo.git/commitdiff
Simplified XML processing
authorMartin Mares <mj@ucw.cz>
Thu, 12 Feb 2015 17:52:18 +0000 (18:52 +0100)
committerMartin Mares <mj@ucw.cz>
Thu, 12 Feb 2015 17:52:18 +0000 (18:52 +0100)
xml.c

diff --git a/xml.c b/xml.c
index 53caec588ea6c617575e9fb4982d160dac5e5c6f..0c31f73d7846be73d75e79d8819f77127dc43ee6 100644 (file)
--- 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);
 }