diff --git a/doc/mxml.3 b/doc/mxml.3 index 1dd6630..146fbb4 100644 --- a/doc/mxml.3 +++ b/doc/mxml.3 @@ -74,20 +74,22 @@ function: fclose(fp); .fi .PP -The "mxmlLoadString()", "mxmlSaveAllocString()", and +The "mxmlLoadString()", "mxmlLoadBuffer()", "mxmlSaveAllocString()", and "mxmlSaveString()" functions load XML node trees from and save XML node trees to strings: .nf - char buffer[8192]; + const char *input; + char output[8192]; char *ptr; + mxml_options_t *options; mxml_node_t *tree; ... - tree = mxmlLoadString(NULL, buffer, MXML_NO_CALLBACK); + tree = mxmlLoadString(NULL, options, input); ... - mxmlSaveString(tree, buffer, sizeof(buffer), + mxmlSaveString(tree, output, sizeof(output), MXML_NO_CALLBACK); ... @@ -841,6 +843,26 @@ MUST be well-formed with a single parent processing instruction node like Load options are provides via the \fBoptions\fR argument. If \fBNULL\fR, all values will be loaded into \fBMXML_TYPE_TEXT\fR nodes. Use the \fImxmlOptionsNew\fR function to create options when loading XML data. +.SS mxmlLoadString +Load a string into an XML node tree. +.PP +.nf +mxml_node_t * mxmlLoadBuffer ( + mxml_node_t *top, + mxml_options_t *options, + const char *buffer, + size_t buflen +); +.fi +.PP +This function loads up to buflen bytes from the buffer into an XML node tree. +The nodes in the specified file are added to the specified node \fBtop\fR - if +\fBNULL\fR the XML file MUST be well-formed with a single parent processing +instruction node like \fB\fR at the start of the file. +.PP +Load options are provides via the \fBoptions\fR argument. If \fBNULL\fR, all values +will be loaded into \fBMXML_TYPE_TEXT\fR nodes. Use the \fImxmlOptionsNew\fR +function to create options when loading XML data. .SS mxmlNewCDATA Create a new CDATA node. .PP diff --git a/mxml-file.c b/mxml-file.c index 8afc14b..daca57b 100644 --- a/mxml-file.c +++ b/mxml-file.c @@ -206,6 +206,42 @@ mxmlLoadIO( } +// +// 'mxmlLoadBuffer()' - Load a buffer into an XML node tree. +// +// This function loads up to buflen bytes from the buffer into an XML node tree. +// The nodes in the specified file are added to the specified node `top` - if +// `NULL` the XML file MUST be well-formed with a single parent processing +// instruction node like `` at the start of the file. +// +// Load options are provides via the `options` argument. If `NULL`, all values +// will be loaded into `MXML_TYPE_TEXT` nodes. Use the @link mxmlOptionsNew@ +// function to create options when loading XML data. +// +mxml_node_t * // O - First node or `NULL` if the string has errors. +mxmlLoadBuffer( + mxml_node_t *top, // I - Top node + mxml_options_t *options, // I - Options + const char *buffer, // I - Buffer to load + size_t buflen) // I - Buffer to load +{ + _mxml_stringbuf_t sb; // String buffer + + // Range check input... + if (!buffer || !buflen) + return (NULL); + + // Setup string buffer... + sb.buffer = (char *)buffer; + sb.bufptr = (char *)buffer; + sb.bufsize = buflen; + sb.bufalloc = false; + + // Read the XML data... + return (mxml_load_data(top, options, (mxml_io_cb_t)mxml_read_cb_string, &sb)); +} + + // // 'mxmlLoadString()' - Load a string into an XML node tree. // @@ -225,24 +261,9 @@ mxmlLoadString( mxml_options_t *options, // I - Options const char *s) // I - String to load { - _mxml_stringbuf_t sb; // String buffer - - - // Range check input... - if (!s) - return (NULL); - - // Setup string buffer... - sb.buffer = (char *)s; - sb.bufptr = (char *)s; - sb.bufsize = strlen(s); - sb.bufalloc = false; - - // Read the XML data... - return (mxml_load_data(top, options, (mxml_io_cb_t)mxml_read_cb_string, &sb)); + return mxmlLoadBuffer(top, options, s, s ? strlen(s) : 0); } - // // 'mxmlSaveAllocString()' - Save an XML tree to an allocated string. // diff --git a/mxml.h b/mxml.h index b97f446..fc363b0 100644 --- a/mxml.h +++ b/mxml.h @@ -180,6 +180,7 @@ extern mxml_node_t *mxmlLoadFile(mxml_node_t *top, mxml_options_t *options, FILE extern mxml_node_t *mxmlLoadFilename(mxml_node_t *top, mxml_options_t *options, const char *filename); extern mxml_node_t *mxmlLoadIO(mxml_node_t *top, mxml_options_t *options, mxml_io_cb_t io_cb, void *io_cbdata); extern mxml_node_t *mxmlLoadString(mxml_node_t *top, mxml_options_t *options, const char *s); +extern mxml_node_t *mxmlLoadBuffer(mxml_node_t *top, mxml_options_t *options, const char *buffer, size_t buflen); extern void mxmlOptionsDelete(mxml_options_t *options); extern mxml_options_t *mxmlOptionsNew(void);