Do not write siblings of the passed node (Issue #228)

pull/244/head
Michael R Sweet 6 years ago
parent d32a541211
commit f86c2671aa
No known key found for this signature in database
GPG Key ID: 999559A027815955
  1. 2
      CHANGES.md
  2. 2
      doc/mxml.man
  3. 58
      mxml-file.c

@ -9,6 +9,8 @@
trailer "]]" to the string (Issue #216) trailer "]]" to the string (Issue #216)
- Cross-compiling failed on install (Issue #218) - Cross-compiling failed on install (Issue #218)
- Fixed a crash bug in the `mxmlWrite` functions (Issue #228) - 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. - Updated the markdown and ZIP container libraries used for mxmldoc.

@ -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 .SH NAME
mxml \- Mini-XML API mxml \- Mini-XML API
.SH INCLUDE FILE .SH INCLUDE FILE

@ -2972,34 +2972,52 @@ mxml_write_node(mxml_node_t *node, /* I - Node to write */
if ((next = current->child) == NULL) 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] != '!' && while ((next = current->next) == NULL)
current->value.element.name[0] != '?')
{ {
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); * The ? and ! elements are special-cases and have no end tags...
if ((*putc_cb)('/', p) < 0) */
return (-1);
if (mxml_write_string(current->value.element.name, p, putc_cb) < 0) current = current->parent;
return (-1);
if ((*putc_cb)('>', p) < 0) if (current->value.element.name[0] != '!' &&
return (-1); 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;
} }
} }
} }

Loading…
Cancel
Save