mxmlSave* no longer write all siblings of the passed node, just that node and

its children.
pull/193/head
Michael R Sweet 14 years ago
parent 34424e2757
commit c0f12e6a79
  1. 2
      CHANGES
  2. 376
      mxml-file.c

@ -9,6 +9,8 @@ CHANGES IN Mini-XML 2.7
specific data key on UNIX-based operating systems (STR #103) specific data key on UNIX-based operating systems (STR #103)
- mxmlLoad* did not error out on XML with multiple root nodes (STR #101) - mxmlLoad* did not error out on XML with multiple root nodes (STR #101)
- Fixed an issue with the _mxml_vstrdupf function (STR #107) - Fixed an issue with the _mxml_vstrdupf function (STR #107)
- mxmlSave* no longer write all siblings of the passed node, just that
node and its children (STR #109)
CHANGES IN Mini-XML 2.6 CHANGES IN Mini-XML 2.6

@ -2739,257 +2739,253 @@ mxml_write_node(mxml_node_t *node, /* I - Node to write */
char s[255]; /* Temporary string */ char s[255]; /* Temporary string */
while (node != NULL) /*
* Print the node value...
*/
switch (node->type)
{ {
/* case MXML_ELEMENT :
* Print the node value... col = mxml_write_ws(node, p, cb, MXML_WS_BEFORE_OPEN, col, putc_cb);
*/
if ((*putc_cb)('<', p) < 0)
return (-1);
if (node->value.element.name[0] == '?' ||
!strncmp(node->value.element.name, "!--", 3) ||
!strncmp(node->value.element.name, "![CDATA[", 8))
{
/*
* Comments, CDATA, and processing instructions do not
* use character entities.
*/
switch (node->type) const char *ptr; /* Pointer into name */
{
case MXML_ELEMENT :
col = mxml_write_ws(node, p, cb, MXML_WS_BEFORE_OPEN, col, putc_cb);
if ((*putc_cb)('<', p) < 0)
return (-1);
if (node->value.element.name[0] == '?' ||
!strncmp(node->value.element.name, "!--", 3) ||
!strncmp(node->value.element.name, "![CDATA[", 8))
{
/*
* Comments, CDATA, and processing instructions do not
* use character entities.
*/
const char *ptr; /* Pointer into name */ for (ptr = node->value.element.name; *ptr; ptr ++)
if ((*putc_cb)(*ptr, p) < 0)
return (-1);
}
else if (mxml_write_name(node->value.element.name, p, putc_cb) < 0)
return (-1);
col += strlen(node->value.element.name) + 1;
for (ptr = node->value.element.name; *ptr; ptr ++) for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
if ((*putc_cb)(*ptr, p) < 0) i > 0;
return (-1); i --, attr ++)
} {
else if (mxml_write_name(node->value.element.name, p, putc_cb) < 0) width = strlen(attr->name);
return (-1);
col += strlen(node->value.element.name) + 1; if (attr->value)
width += strlen(attr->value) + 3;
for (i = node->value.element.num_attrs, attr = node->value.element.attrs; if (global->wrap > 0 && (col + width) > global->wrap)
i > 0;
i --, attr ++)
{ {
width = strlen(attr->name); if ((*putc_cb)('\n', p) < 0)
return (-1);
if (attr->value)
width += strlen(attr->value) + 3;
if (global->wrap > 0 && (col + width) > global->wrap)
{
if ((*putc_cb)('\n', p) < 0)
return (-1);
col = 0;
}
else
{
if ((*putc_cb)(' ', p) < 0)
return (-1);
col ++;
}
if (mxml_write_name(attr->name, p, putc_cb) < 0) col = 0;
}
else
{
if ((*putc_cb)(' ', p) < 0)
return (-1); return (-1);
if (attr->value) col ++;
{
if ((*putc_cb)('=', p) < 0)
return (-1);
if ((*putc_cb)('\"', p) < 0)
return (-1);
if (mxml_write_string(attr->value, p, putc_cb) < 0)
return (-1);
if ((*putc_cb)('\"', p) < 0)
return (-1);
}
col += width;
} }
if (node->child) if (mxml_write_name(attr->name, p, putc_cb) < 0)
{ return (-1);
/*
* Write children...
*/
if ((*putc_cb)('>', p) < 0) if (attr->value)
{
if ((*putc_cb)('=', p) < 0)
return (-1);
if ((*putc_cb)('\"', p) < 0)
return (-1);
if (mxml_write_string(attr->value, p, putc_cb) < 0)
return (-1); return (-1);
else if ((*putc_cb)('\"', p) < 0)
col ++; return (-1);
}
col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb); col += width;
}
if ((col = mxml_write_node(node->child, p, cb, col, putc_cb, if (node->child)
global)) < 0) {
return (-1); /*
* Write children...
*/
/* mxml_node_t *child; /* Current child */
* The ? and ! elements are special-cases and have no end tags...
*/
if (node->value.element.name[0] != '!' &&
node->value.element.name[0] != '?')
{
col = mxml_write_ws(node, p, cb, MXML_WS_BEFORE_CLOSE, col, putc_cb);
if ((*putc_cb)('<', p) < 0) if ((*putc_cb)('>', p) < 0)
return (-1); return (-1);
if ((*putc_cb)('/', p) < 0) else
return (-1); col ++;
if (mxml_write_string(node->value.element.name, p, putc_cb) < 0)
return (-1);
if ((*putc_cb)('>', p) < 0)
return (-1);
col += strlen(node->value.element.name) + 3; col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb);
col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_CLOSE, col, putc_cb); for (child = node->child; child; child = child->next)
}
}
else if (node->value.element.name[0] == '!' ||
node->value.element.name[0] == '?')
{ {
/* if ((col = mxml_write_node(child, p, cb, col, putc_cb, global)) < 0)
* The ? and ! elements are special-cases...
*/
if ((*putc_cb)('>', p) < 0)
return (-1); return (-1);
else }
col ++;
col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb); /*
} * The ? and ! elements are special-cases and have no end tags...
else */
if (node->value.element.name[0] != '!' &&
node->value.element.name[0] != '?')
{ {
if ((*putc_cb)(' ', p) < 0) col = mxml_write_ws(node, p, cb, MXML_WS_BEFORE_CLOSE, col, putc_cb);
if ((*putc_cb)('<', p) < 0)
return (-1);
if ((*putc_cb)('/', p) < 0)
return (-1); return (-1);
if ((*putc_cb)('/', p) < 0) if (mxml_write_string(node->value.element.name, p, putc_cb) < 0)
return (-1); return (-1);
if ((*putc_cb)('>', p) < 0) if ((*putc_cb)('>', p) < 0)
return (-1); return (-1);
col += 3; col += strlen(node->value.element.name) + 3;
col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb); col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_CLOSE, col, putc_cb);
} }
break; }
else if (node->value.element.name[0] == '!' ||
node->value.element.name[0] == '?')
{
/*
* The ? and ! elements are special-cases...
*/
case MXML_INTEGER : if ((*putc_cb)('>', p) < 0)
if (node->prev) return (-1);
{ else
if (global->wrap > 0 && col > global->wrap) col ++;
{
if ((*putc_cb)('\n', p) < 0)
return (-1);
col = 0; col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb);
} }
else if ((*putc_cb)(' ', p) < 0) else
{
if ((*putc_cb)(' ', p) < 0)
return (-1);
if ((*putc_cb)('/', p) < 0)
return (-1);
if ((*putc_cb)('>', p) < 0)
return (-1);
col += 3;
col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb);
}
break;
case MXML_INTEGER :
if (node->prev)
{
if (global->wrap > 0 && col > global->wrap)
{
if ((*putc_cb)('\n', p) < 0)
return (-1); return (-1);
else
col ++;
}
sprintf(s, "%d", node->value.integer); col = 0;
if (mxml_write_string(s, p, putc_cb) < 0) }
else if ((*putc_cb)(' ', p) < 0)
return (-1); return (-1);
else
col ++;
}
col += strlen(s); sprintf(s, "%d", node->value.integer);
break; if (mxml_write_string(s, p, putc_cb) < 0)
return (-1);
case MXML_OPAQUE : col += strlen(s);
if (mxml_write_string(node->value.opaque, p, putc_cb) < 0) break;
return (-1);
col += strlen(node->value.opaque); case MXML_OPAQUE :
break; if (mxml_write_string(node->value.opaque, p, putc_cb) < 0)
return (-1);
case MXML_REAL : col += strlen(node->value.opaque);
if (node->prev) break;
{
if (global->wrap > 0 && col > global->wrap)
{
if ((*putc_cb)('\n', p) < 0)
return (-1);
col = 0; case MXML_REAL :
} if (node->prev)
else if ((*putc_cb)(' ', p) < 0) {
if (global->wrap > 0 && col > global->wrap)
{
if ((*putc_cb)('\n', p) < 0)
return (-1); return (-1);
else
col ++;
}
sprintf(s, "%f", node->value.real); col = 0;
if (mxml_write_string(s, p, putc_cb) < 0) }
else if ((*putc_cb)(' ', p) < 0)
return (-1); return (-1);
else
col ++;
}
col += strlen(s); sprintf(s, "%f", node->value.real);
break; if (mxml_write_string(s, p, putc_cb) < 0)
return (-1);
case MXML_TEXT : col += strlen(s);
if (node->value.text.whitespace && col > 0) break;
{
if (global->wrap > 0 && col > global->wrap)
{
if ((*putc_cb)('\n', p) < 0)
return (-1);
col = 0; case MXML_TEXT :
} if (node->value.text.whitespace && col > 0)
else if ((*putc_cb)(' ', p) < 0) {
if (global->wrap > 0 && col > global->wrap)
{
if ((*putc_cb)('\n', p) < 0)
return (-1); return (-1);
else
col ++;
}
if (mxml_write_string(node->value.text.string, p, putc_cb) < 0) col = 0;
}
else if ((*putc_cb)(' ', p) < 0)
return (-1); return (-1);
else
col ++;
}
col += strlen(node->value.text.string); if (mxml_write_string(node->value.text.string, p, putc_cb) < 0)
break; return (-1);
case MXML_CUSTOM :
if (global->custom_save_cb)
{
char *data; /* Custom data string */
const char *newline; /* Last newline in string */
col += strlen(node->value.text.string);
break;
if ((data = (*global->custom_save_cb)(node)) == NULL) case MXML_CUSTOM :
return (-1); if (global->custom_save_cb)
{
char *data; /* Custom data string */
const char *newline; /* Last newline in string */
if (mxml_write_string(data, p, putc_cb) < 0)
return (-1);
if ((newline = strrchr(data, '\n')) == NULL) if ((data = (*global->custom_save_cb)(node)) == NULL)
col += strlen(data); return (-1);
else
col = strlen(newline);
free(data); if (mxml_write_string(data, p, putc_cb) < 0)
break; return (-1);
}
default : /* Should never happen */ if ((newline = strrchr(data, '\n')) == NULL)
return (-1); col += strlen(data);
} else
col = strlen(newline);
/* free(data);
* Next node... break;
*/ }
node = node->next; default : /* Should never happen */
return (-1);
} }
return (col); return (col);

Loading…
Cancel
Save