Commit 465d3e72 authored by Michael R Sweet's avatar Michael R Sweet

Change whitespace callback to return a string.

parent 82fe8625
README - 04/30/2004
README - 05/01/2004
-------------------
CHANGES IN Mini-XML 2.0
- Changed the whitespace callback interface to return
strings instead of a single character, allowing for
greater control over the formatting of XML files
written using Mini-XML. THIS CHANGE WILL REQUIRE
CHANGES TO YOUR CODE IF YOU USE WHITESPACE CALLBACKS.
- The mxmldoc utility is now capable of documenting C++
classes, functions, and structures, and correctly
handles C++ comments.
- Added new modular tests for mxmldoc.
- Updated the mxmldoc output to be more compatible with
embedding in manuals produced with HTMLDOC.
- The makefile incorrectly included a "/" separator
between the destination path and install path. This
caused problems when building and installing with
MingW.
- The mxmldoc utility is now capable of documenting C++
structures and classes.
CHANGES IN Mini-XML 1.3
......
TODO - 04/29/2004
TODO - 05/01/2004
-----------------
- Update write callback to return a string.
-- Return const char *
-- Loop through chars to figure out correct output column
- UTF-16 support.
-- Auto-detect in strings via initial FFFE or FEFF BOM
-- Convert to UTF-8
......@@ -21,10 +18,6 @@ TODO - 04/29/2004
- Add access methods and make node structure opaque.
-- To allow for C++ migration
-- To make future binary compatibility easier
- Build test file for mxmldoc.
-- C++ class documentation doesn't seem to work.
-- Do examples of all types of comments/code that mxmldoc is
supposed to handle.
- Add VC++/VC++.NET project files.
-- Include DLL .def file for making a DLL.
- Add C++ class/struct.
......
......@@ -523,7 +523,7 @@ allocated.</p>
char *
mxmlSaveAllocString(
<a href='#mxml_node_t'>mxml_node_t</a> * node,
int (*cb)(mxml_node_t *node, int ws));
const char * (*cb)(mxml_node_t *node, int ws));
</pre>
<h4>Arguments</h4>
<p class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0' width='80%'>
......@@ -551,7 +551,7 @@ int
mxmlSaveFile(
<a href='#mxml_node_t'>mxml_node_t</a> * node,
FILE * fp,
int (*cb)(mxml_node_t *node, int ws));
const char * (*cb)(mxml_node_t *node, int ws));
</pre>
<h4>Arguments</h4>
<p class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0' width='80%'>
......@@ -579,7 +579,7 @@ mxmlSaveString(
<a href='#mxml_node_t'>mxml_node_t</a> * node,
char * buffer,
int bufsize,
int (*cb)(mxml_node_t *node, int ws));
const char * (*cb)(mxml_node_t *node, int ws));
</pre>
<h4>Arguments</h4>
<p class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0' width='80%'>
......
/*
* "$Id: mxml-file.c,v 1.28 2004/04/06 01:47:20 mike Exp $"
* "$Id: mxml-file.c,v 1.29 2004/05/01 15:20:04 mike Exp $"
*
* File loading code for mini-XML, a small XML-like file parsing library.
*
......@@ -71,13 +71,13 @@ static int mxml_string_putc(int ch, void *p);
static int mxml_write_name(const char *s, void *p,
int (*putc_cb)(int, void *));
static int mxml_write_node(mxml_node_t *node, void *p,
int (*cb)(mxml_node_t *, int),
const char *(*cb)(mxml_node_t *, int),
int col,
int (*putc_cb)(int, void *));
static int mxml_write_string(const char *s, void *p,
int (*putc_cb)(int, void *));
static int mxml_write_ws(mxml_node_t *node, void *p,
int (*cb)(mxml_node_t *, int), int ws,
const char *(*cb)(mxml_node_t *, int), int ws,
int col, int (*putc_cb)(int, void *));
......@@ -143,7 +143,7 @@ mxmlLoadString(mxml_node_t *top, /* I - Top node */
char * /* O - Allocated string or NULL */
mxmlSaveAllocString(mxml_node_t *node, /* I - Node to write */
int (*cb)(mxml_node_t *node, int ws))
const char *(*cb)(mxml_node_t *node, int ws))
/* I - Whitespace callback or MXML_NO_CALLBACK */
{
int bytes; /* Required bytes */
......@@ -201,7 +201,7 @@ mxmlSaveAllocString(mxml_node_t *node, /* I - Node to write */
int /* O - 0 on success, -1 on error. */
mxmlSaveFile(mxml_node_t *node, /* I - Node to write */
FILE *fp, /* I - File to write to */
int (*cb)(mxml_node_t *node, int ws))
const char *(*cb)(mxml_node_t *node, int ws))
/* I - Whitespace callback or MXML_NO_CALLBACK */
{
int col; /* Final column */
......@@ -238,7 +238,7 @@ int /* O - Size of string */
mxmlSaveString(mxml_node_t *node, /* I - Node to write */
char *buffer, /* I - String buffer */
int bufsize, /* I - Size of string buffer */
int (*cb)(mxml_node_t *node, int ws))
const char *(*cb)(mxml_node_t *node, int ws))
/* I - Whitespace callback or MXML_NO_CALLBACK */
{
int col; /* Final column */
......@@ -1426,7 +1426,7 @@ mxml_write_name(const char *s, /* I - Name to write */
static int /* O - Column or -1 on error */
mxml_write_node(mxml_node_t *node, /* I - Node to write */
void *p, /* I - File to write to */
int (*cb)(mxml_node_t *, int),
const char *(*cb)(mxml_node_t *, int),
/* I - Whitespace callback */
int col, /* I - Current column */
int (*putc_cb)(int, void *))
......@@ -1699,29 +1699,34 @@ mxml_write_string(const char *s, /* I - String to write */
static int /* O - New column */
mxml_write_ws(mxml_node_t *node, /* I - Current node */
void *p, /* I - Write pointer */
int (*cb)(mxml_node_t *, int),
const char *(*cb)(mxml_node_t *, int),
/* I - Callback function */
int ws, /* I - Where value */
int col, /* I - Current column */
int (*putc_cb)(int, void *))
/* I - Write callback */
{
int ch; /* Whitespace character */
const char *s; /* Whitespace string */
if (cb && (ch = (*cb)(node, ws)) != 0)
if (cb && (s = (*cb)(node, ws)) != NULL)
{
if ((*putc_cb)(ch, p) < 0)
return (-1);
else if (ch == '\n')
col = 0;
else if (ch == '\t')
while (*s)
{
col += MXML_TAB;
col = col - (col % MXML_TAB);
if ((*putc_cb)(*s, p) < 0)
return (-1);
else if (*s == '\n')
col = 0;
else if (*s == '\t')
{
col += MXML_TAB;
col = col - (col % MXML_TAB);
}
else
col ++;
s ++;
}
else
col ++;
}
return (col);
......@@ -1729,5 +1734,5 @@ mxml_write_ws(mxml_node_t *node, /* I - Current node */
/*
* End of "$Id: mxml-file.c,v 1.28 2004/04/06 01:47:20 mike Exp $".
* End of "$Id: mxml-file.c,v 1.29 2004/05/01 15:20:04 mike Exp $".
*/
/*
* "$Id: mxml.h,v 1.17 2004/04/06 01:47:20 mike Exp $"
* "$Id: mxml.h,v 1.18 2004/05/01 15:20:04 mike Exp $"
*
* Header file for mini-XML, a small XML-like file parsing library.
*
......@@ -160,12 +160,12 @@ __attribute__ ((__format__ (__printf__, 3, 4)))
;
extern void mxmlRemove(mxml_node_t *node);
extern char *mxmlSaveAllocString(mxml_node_t *node,
int (*cb)(mxml_node_t *, int));
const char *(*cb)(mxml_node_t *, int));
extern int mxmlSaveFile(mxml_node_t *node, FILE *fp,
int (*cb)(mxml_node_t *, int));
const char *(*cb)(mxml_node_t *, int));
extern int mxmlSaveString(mxml_node_t *node, char *buffer,
int bufsize,
int (*cb)(mxml_node_t *, int));
const char *(*cb)(mxml_node_t *, int));
extern int mxmlSetElement(mxml_node_t *node, const char *name);
extern void mxmlSetErrorCallback(void (*cb)(const char *));
extern int mxmlSetInteger(mxml_node_t *node, int integer);
......@@ -206,5 +206,5 @@ extern mxml_type_t mxml_real_cb(mxml_node_t *node);
/*
* End of "$Id: mxml.h,v 1.17 2004/04/06 01:47:20 mike Exp $".
* End of "$Id: mxml.h,v 1.18 2004/05/01 15:20:04 mike Exp $".
*/
This diff is collapsed.
/*
* "$Id: mxmldoc.c,v 1.32 2004/05/01 07:08:14 mike Exp $"
* "$Id: mxmldoc.c,v 1.33 2004/05/01 15:20:05 mike Exp $"
*
* Documentation generator using mini-XML, a small XML-like file parsing
* library.
......@@ -135,7 +135,7 @@ static void update_comment(mxml_node_t *parent,
static void write_documentation(mxml_node_t *doc);
static void write_element(mxml_node_t *doc, mxml_node_t *element);
static void write_string(const char *s);
static int ws_cb(mxml_node_t *node, int where);
static const char *ws_cb(mxml_node_t *node, int where);
/*
......@@ -2628,27 +2628,74 @@ write_string(const char *s) /* I - String to write */
* 'ws_cb()' - Whitespace callback for saving.
*/
static int /* O - Whitespace char or 0 for none */
static const char * /* O - Whitespace string or NULL for none */
ws_cb(mxml_node_t *node, /* I - Element node */
int where) /* I - Where value */
{
const char *name; /* Name of element */
const char *name; /* Name of element */
int depth; /* Depth of node */
static const char *spaces = " ";
/* Whitespace (40 spaces) for indent */
name = node->value.element.name;
if ((!strcmp(name, "namespace") || !strcmp(name, "enumeration") ||
!strcmp(name, "typedef") || !strcmp(name, "function") ||
!strcmp(name, "variable") || !strcmp(name, "struct") ||
!strcmp(name, "class") || !strcmp(name, "constant") ||
!strcmp(name, "argument") || !strcmp(name, "returnvalue")) &&
where == MXML_WS_AFTER_CLOSE)
return ('\n');
switch (where)
{
case MXML_WS_BEFORE_CLOSE :
if (strcmp(name, "argument") &&
strcmp(name, "class") &&
strcmp(name, "constant") &&
strcmp(name, "enumeration") &&
strcmp(name, "function") &&
strcmp(name, "namespace") &&
strcmp(name, "returnvalue") &&
strcmp(name, "struct") &&
strcmp(name, "typedef") &&
strcmp(name, "union") &&
strcmp(name, "variable"))
return (NULL);
for (depth = -4; node; node = node->parent, depth += 2);
if (depth > 40)
return (spaces);
else if (depth < 2)
return (NULL);
else
return (spaces + 40 - depth);
return (0);
case MXML_WS_AFTER_CLOSE :
return ("\n");
case MXML_WS_BEFORE_OPEN :
for (depth = -4; node; node = node->parent, depth += 2);
if (depth > 40)
return (spaces);
else if (depth < 2)
return (NULL);
else
return (spaces + 40 - depth);
default :
case MXML_WS_AFTER_OPEN :
if (strcmp(name, "argument") &&
strcmp(name, "class") &&
strcmp(name, "constant") &&
strcmp(name, "enumeration") &&
strcmp(name, "function") &&
strcmp(name, "namespace") &&
strcmp(name, "returnvalue") &&
strcmp(name, "struct") &&
strcmp(name, "typedef") &&
strcmp(name, "union") &&
strcmp(name, "variable"))
return (NULL);
else
return ("\n");
}
}
/*
* End of "$Id: mxmldoc.c,v 1.32 2004/05/01 07:08:14 mike Exp $".
* End of "$Id: mxmldoc.c,v 1.33 2004/05/01 15:20:05 mike Exp $".
*/
/*
* "$Id: testmxml.c,v 1.14 2004/04/06 01:47:20 mike Exp $"
* "$Id: testmxml.c,v 1.15 2004/05/01 15:20:05 mike Exp $"
*
* Test program for mini-XML, a small XML-like file parsing library.
*
......@@ -36,7 +36,7 @@
*/
mxml_type_t type_cb(mxml_node_t *node);
int whitespace_cb(mxml_node_t *node, int where);
const char *whitespace_cb(mxml_node_t *node, int where);
/*
......@@ -377,7 +377,7 @@ type_cb(mxml_node_t *node) /* I - Element node */
* newlines and tabs...
*/
int /* O - Whitespace char or 0 */
const char * /* O - Whitespace string or NULL */
whitespace_cb(mxml_node_t *node, /* I - Element node */
int where) /* I - Open or close tag? */
{
......@@ -400,7 +400,7 @@ whitespace_cb(mxml_node_t *node, /* I - Element node */
*/
if (where == MXML_WS_BEFORE_OPEN || where == MXML_WS_AFTER_CLOSE)
return ('\n');
return ("\n");
}
else if (!strcmp(name, "dl") || !strcmp(name, "ol") || !strcmp(name, "ul"))
{
......@@ -408,7 +408,7 @@ whitespace_cb(mxml_node_t *node, /* I - Element node */
* Put a newline before and after list elements...
*/
return ('\n');
return ("\n");
}
else if (!strcmp(name, "dd") || !strcmp(name, "dt") || !strcmp(name, "li"))
{
......@@ -417,19 +417,19 @@ whitespace_cb(mxml_node_t *node, /* I - Element node */
*/
if (where == MXML_WS_BEFORE_OPEN)
return ('\t');
return ("\t");
else if (where == MXML_WS_AFTER_CLOSE)
return ('\n');
return ("\n");
}
/*
* Return 0 for no added whitespace...
* Return NULL for no added whitespace...
*/
return (0);
return (NULL);
}
/*
* End of "$Id: testmxml.c,v 1.14 2004/04/06 01:47:20 mike Exp $".
* End of "$Id: testmxml.c,v 1.15 2004/05/01 15:20:05 mike Exp $".
*/
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment