]> mj.ucw.cz Git - libucw.git/blobdiff - sherlock/xml/parse.c
Merge with git+ssh://git.ucw.cz/projects/sherlock/GIT/sherlock.git
[libucw.git] / sherlock / xml / parse.c
index d690ead5a0f09b0fae7f897c69251b8eb30a3e24..5581ed597cc70dce2297d770144aa33bd065e24d 100644 (file)
@@ -749,6 +749,19 @@ xml_push_element(struct xml_context *ctx)
       xml_unget_char(ctx);
       xml_parse_attr(ctx);
     }
+  if (e->dtd)
+    SLIST_FOR_EACH(struct xml_dtd_attr *, a, e->dtd->attrs)
+      if (a->default_mode == XML_ATTR_REQUIRED)
+        {
+         if (!xml_attrs_find(ctx->tab_attrs, e, a->name))
+           xml_error(ctx, "Missing required attribute %s in element <%s>", a->name, e->name);
+       }
+      else if (a->default_mode != XML_ATTR_IMPLIED && ctx->flags & XML_ALLOC_DEFAULT_ATTRS)
+        {
+         struct xml_attr *attr = xml_attrs_lookup(ctx->tab_attrs, e, a->name);
+         if (!attr->val)
+           attr->val = a->default_value;
+       }
   if ((ctx->flags & XML_REPORT_TAGS) && ctx->h_stag)
     ctx->h_stag(ctx);
 }
@@ -1242,6 +1255,7 @@ xml_merge_chars(struct xml_context *ctx UNUSED, struct xml_node *node, struct me
       {
        p = mp_spread(pool, p, son->len + 1);
        memcpy(p, son->text, son->len);
+       p += son->len;
       }
   *p++ = 0;
   return mp_end(pool, p);
@@ -1255,6 +1269,7 @@ xml_append_dom_chars(char *p, struct mempool *pool, struct xml_node *node)
       {
        p = mp_spread(pool, p, son->len + 1);
        memcpy(p, son->text, son->len);
+       p += son->len;
       }
     else if (son->type == XML_NODE_ELEM)
       p = xml_append_dom_chars(p, pool, son);