]> mj.ucw.cz Git - libucw.git/blobdiff - sherlock/xml/parse.c
Doc: Described ff-binary.
[libucw.git] / sherlock / xml / parse.c
index d690ead5a0f09b0fae7f897c69251b8eb30a3e24..27141b142287c973d7385a9a30c37d9df9bed16f 100644 (file)
 #include "sherlock/xml/xml.h"
 #include "sherlock/xml/dtd.h"
 #include "sherlock/xml/internals.h"
-#include "lib/fastbuf.h"
-#include "lib/ff-unicode.h"
-#include "lib/unicode.h"
-#include "lib/chartype.h"
-#include "lib/hashfunc.h"
+#include "ucw/fastbuf.h"
+#include "ucw/ff-unicode.h"
+#include "ucw/unicode.h"
+#include "ucw/chartype.h"
+#include "ucw/hashfunc.h"
 
 #include <setjmp.h>
 
@@ -622,7 +622,7 @@ xml_attrs_init_key(struct xml_attrs_table *t UNUSED, struct xml_attr *a, struct
 #define HASH_WANT_FIND
 #define HASH_GIVE_ALLOC
 XML_HASH_GIVE_ALLOC
-#include "lib/hashtable.h"
+#include "ucw/hashtable.h"
 
 static void
 xml_parse_attr(struct xml_context *ctx)
@@ -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);