diff --git a/CHANGES.md b/CHANGES.md index acb54a7..0cc8fee 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,8 @@ trailer "]]" to the string (Issue #216) - Cross-compiling failed on install (Issue #218) - Fixed a crash bug in the `mxmlWrite` functions (Issue #228) +- The `mxmlWrite` functions no longer write the siblings of the passed node + (Issue #228) - Updated the markdown and ZIP container libraries used for mxmldoc. diff --git a/doc/mxml.man b/doc/mxml.man index 7a412a2..86bb5b8 100644 --- a/doc/mxml.man +++ b/doc/mxml.man @@ -1,4 +1,4 @@ -.TH mxml 3 "Mini-XML API" "09/29/18" "Mini-XML API" +.TH mxml 3 "Mini-XML API" "10/01/18" "Mini-XML API" .SH NAME mxml \- Mini-XML API .SH INCLUDE FILE diff --git a/mxml-file.c b/mxml-file.c index b844bc7..3c2b0a8 100644 --- a/mxml-file.c +++ b/mxml-file.c @@ -2972,34 +2972,52 @@ mxml_write_node(mxml_node_t *node, /* I - Node to write */ if ((next = current->child) == NULL) { - while ((next = current->next) == NULL) + if (current == node) { - if (current == node || !current->parent) - break; - /* - * The ? and ! elements are special-cases and have no end tags... - */ + * Don't traverse to sibling node if we are at the "root" node... + */ - current = current->parent; + next = NULL; + } + else + { + /* + * Try the next sibling, and continue traversing upwards as needed... + */ - if (current->value.element.name[0] != '!' && - current->value.element.name[0] != '?') + while ((next = current->next) == NULL) { - col = mxml_write_ws(current, p, cb, MXML_WS_BEFORE_CLOSE, col, putc_cb); + if (current == node || !current->parent) + break; - if ((*putc_cb)('<', p) < 0) - return (-1); - if ((*putc_cb)('/', p) < 0) - return (-1); - if (mxml_write_string(current->value.element.name, p, putc_cb) < 0) - return (-1); - if ((*putc_cb)('>', p) < 0) - return (-1); + /* + * The ? and ! elements are special-cases and have no end tags... + */ + + current = current->parent; + + if (current->value.element.name[0] != '!' && + current->value.element.name[0] != '?') + { + col = mxml_write_ws(current, p, cb, MXML_WS_BEFORE_CLOSE, col, putc_cb); + + if ((*putc_cb)('<', p) < 0) + return (-1); + if ((*putc_cb)('/', p) < 0) + return (-1); + if (mxml_write_string(current->value.element.name, p, putc_cb) < 0) + return (-1); + if ((*putc_cb)('>', p) < 0) + return (-1); - col += strlen(current->value.element.name) + 3; + col += strlen(current->value.element.name) + 3; - col = mxml_write_ws(current, p, cb, MXML_WS_AFTER_CLOSE, col, putc_cb); + col = mxml_write_ws(current, p, cb, MXML_WS_AFTER_CLOSE, col, putc_cb); + } + + if (current == node) + break; } } }