Fix C++ class/struct handling.

Move and separate test files for mxmldoc.
web
Michael R Sweet 20 years ago
parent 711796b7cf
commit c00d7f55a2
  1. 4
      CHANGES
  2. 5
      dotest.sh
  3. 57
      mxmldoc.c
  4. 50
      test/class.cxx
  5. 12
      test/dotest.sh
  6. 7
      test/enum.cxx
  7. 37
      test/function.cxx
  8. 48
      test/struct.cxx
  9. 171
      testfile.cxx

@ -1,4 +1,4 @@
README - 04/29/2004 README - 04/30/2004
------------------- -------------------
CHANGES IN Mini-XML 2.0 CHANGES IN Mini-XML 2.0
@ -9,6 +9,8 @@ CHANGES IN Mini-XML 2.0
between the destination path and install path. This between the destination path and install path. This
caused problems when building and installing with caused problems when building and installing with
MingW. MingW.
- The mxmldoc utility is now capable of documenting C++
structures and classes.
CHANGES IN Mini-XML 1.3 CHANGES IN Mini-XML 1.3

@ -1,5 +0,0 @@
#!/bin/sh
rm -f testfile.xml
valgrind --logfile-fd=3 --leak-check=yes ./mxmldoc testfile.xml testfile.cxx >testfile.html 2>testfile.log 3>testfile.valgrind

@ -1,6 +1,5 @@
#define DEBUG 2
/* /*
* "$Id: mxmldoc.c,v 1.29 2004/04/30 03:40:05 mike Exp $" * "$Id: mxmldoc.c,v 1.30 2004/05/01 04:30:42 mike Exp $"
* *
* Documentation generator using mini-XML, a small XML-like file parsing * Documentation generator using mini-XML, a small XML-like file parsing
* library. * library.
@ -386,21 +385,22 @@ scan_file(const char *filename, /* I - Filename */
* Initialize the finite state machine... * Initialize the finite state machine...
*/ */
state = STATE_NONE; state = STATE_NONE;
braces = 0; braces = 0;
parens = 0; parens = 0;
bufptr = buffer; bufptr = buffer;
comment = mxmlNewElement(MXML_NO_PARENT, "temp"); comment = mxmlNewElement(MXML_NO_PARENT, "temp");
constant = NULL; constant = NULL;
enumeration = NULL; enumeration = NULL;
function = NULL; function = NULL;
variable = NULL; variable = NULL;
returnvalue = NULL; returnvalue = NULL;
type = NULL; type = NULL;
description = NULL; description = NULL;
typedefnode = NULL; typedefnode = NULL;
structclass = NULL; structclass = NULL;
fstructclass = NULL;
/* /*
* Read until end-of-file... * Read until end-of-file...
@ -474,6 +474,8 @@ scan_file(const char *filename, /* I - Filename */
} }
else else
sort_node(tree, function); sort_node(tree, function);
function = NULL;
} }
else if (type && type->child && else if (type && type->child &&
((!strcmp(type->child->value.text.string, "typedef") && ((!strcmp(type->child->value.text.string, "typedef") &&
@ -713,6 +715,7 @@ scan_file(const char *filename, /* I - Filename */
{ {
mxmlDelete(function); mxmlDelete(function);
function = NULL; function = NULL;
variable = NULL;
} }
if (type) if (type)
@ -1645,9 +1648,9 @@ write_documentation(mxml_node_t *doc) /* I - XML documentation */
if (arg) if (arg)
{ {
if (arg->child->value.text.string) write_element(doc, mxmlFindElement(arg, arg, "type", NULL,
write_element(doc, mxmlFindElement(arg, arg, "type", NULL, NULL, MXML_DESCEND_FIRST));
NULL, MXML_DESCEND_FIRST)); putchar(' ');
} }
else if (strcmp(cname, name) && strcmp(cname, name + 1)) else if (strcmp(cname, name) && strcmp(cname, name + 1))
fputs("void ", stdout); fputs("void ", stdout);
@ -1947,9 +1950,9 @@ write_documentation(mxml_node_t *doc) /* I - XML documentation */
scut = mxmlFindElement(scut, doc, "struct", NULL, NULL, scut = mxmlFindElement(scut, doc, "struct", NULL, NULL,
MXML_NO_DESCEND)) MXML_NO_DESCEND))
{ {
name = mxmlElementGetAttr(scut, "name"); cname = mxmlElementGetAttr(scut, "name");
puts("<!-- NEW PAGE -->"); puts("<!-- NEW PAGE -->");
printf("<h3><a name='%s'>%s</a></h3>\n", name, name); printf("<h3><a name='%s'>%s</a></h3>\n", cname, cname);
puts("<hr noshade/>"); puts("<hr noshade/>");
description = mxmlFindElement(scut, scut, "description", NULL, description = mxmlFindElement(scut, scut, "description", NULL,
@ -1965,7 +1968,7 @@ write_documentation(mxml_node_t *doc) /* I - XML documentation */
puts("<h4>Definition</h4>"); puts("<h4>Definition</h4>");
puts("<pre>"); puts("<pre>");
printf("struct %s\n{\n", name); printf("struct %s\n{\n", cname);
for (arg = mxmlFindElement(scut, scut, "variable", NULL, NULL, for (arg = mxmlFindElement(scut, scut, "variable", NULL, NULL,
MXML_DESCEND_FIRST); MXML_DESCEND_FIRST);
arg; arg;
@ -1993,9 +1996,9 @@ write_documentation(mxml_node_t *doc) /* I - XML documentation */
if (arg) if (arg)
{ {
if (arg->child->value.text.string) write_element(doc, mxmlFindElement(arg, arg, "type", NULL,
write_element(doc, mxmlFindElement(arg, arg, "type", NULL, NULL, MXML_DESCEND_FIRST));
NULL, MXML_DESCEND_FIRST)); putchar(' ');
} }
else if (strcmp(cname, name) && strcmp(cname, name + 1)) else if (strcmp(cname, name) && strcmp(cname, name + 1))
fputs("void ", stdout); fputs("void ", stdout);
@ -2409,5 +2412,5 @@ ws_cb(mxml_node_t *node, /* I - Element node */
/* /*
* End of "$Id: mxmldoc.c,v 1.29 2004/04/30 03:40:05 mike Exp $". * End of "$Id: mxmldoc.c,v 1.30 2004/05/01 04:30:42 mike Exp $".
*/ */

@ -0,0 +1,50 @@
class foo_c // Foo class
{
float foo; /* Real number */
int bar; /* Integer */
public:
foo_c(float f, int b);
~foo_c();
// 'get_bar()' - Get the value of bar.
int // O - Value of bar
get_bar()
{
return (bar);
}
// 'get_foo()' - Get the value of foo.
float // O - Value of foo
get_foo()
{
return (foo);
}
// 'set_bar()' - Set the value of bar.
void
set_bar(int b) // I - Value of bar
{
bar = b;
}
// 'set_foo()' - Set the value of foo.
void
set_foo(float f) // I - Value of foo
{
foo = f;
}
}
// 'foo_c::foo_c()' - Create a foo_c class.
foo_c::foo_c(float f, int b)
{
foo = f;
bar = b;
}
// 'foo_c::~foo_c()' - Destroy a foo_c class.
foo_c::~foo_c()
{
}

@ -0,0 +1,12 @@
#!/bin/sh
if test $# -gt 0; then
files=$*
else
files=*.cxx
fi
rm -f test.xml
valgrind --logfile-fd=3 --leak-check=yes ../mxmldoc test.xml \
$files >test.html 2>test.log 3>test.valgrind

@ -0,0 +1,7 @@
typedef enum foo_enum_e /* Sample enumeration type */
{
FOO_ONE, /* One fish */
FOO_TWO, /* Two fish */
FOO_RED, /* Red fish */
FOO_BLUE /* Blue fish */
} foo_enum_t;

@ -0,0 +1,37 @@
/*
* 'foo_void_function()' - Do foo with bar.
*/
void
foo_void_function(int one, /* I - Integer */
float *two, /* O - Real number */
const char *three) /* I - String */
{
if (one)
{
puts("Hello, World!");
}
else
puts(three);
*two = 2.0f;
}
/*
* 'foo_float_function()' - Do foo with bar.
*/
float /* O - Real number */
foo_float_function(int one, /* I - Integer */
const char *two) /* I - String */
{
if (one)
{
puts("Hello, World!");
}
else
puts(two);
return (2.0f);
}

@ -0,0 +1,48 @@
typedef struct foo_s /* Foo structure */
{
float foo; /* Real number */
int bar; /* Integer */
foo_s(float f, int b);
~foo_s();
// 'get_bar()' - Get the value of bar.
int // O - Value of bar
get_bar()
{
return (bar);
}
// 'get_foo()' - Get the value of foo.
float // O - Value of foo
get_foo()
{
return (foo);
}
// 'set_bar()' - Set the value of bar.
void
set_bar(int b) // I - Value of bar
{
bar = b;
}
// 'set_foo()' - Set the value of foo.
void
set_foo(float f) // I - Value of foo
{
foo = f;
}
} foo_t;
// 'foo_s::foo_s()' - Create a foo_s structure.
foo_s::foo_s(float f, int b)
{
foo = f;
bar = b;
}
// 'foo_s::~foo_s()' - Destroy a foo_s structure.
foo_s::~foo_s()
{
}

@ -1,171 +0,0 @@
//
// "$Id: testfile.cxx,v 1.2 2004/04/29 20:48:52 mike Exp $"
//
// Mxmldoc test file for mini-XML, a small XML-like file parsing library.
//
// Copyright 2003-2004 by Michael Sweet.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
typedef enum foo_enum_e /* Sample enumeration type */
{
FOO_ONE, /* One fish */
FOO_TWO, /* Two fish */
FOO_RED, /* Red fish */
FOO_BLUE /* Blue fish */
} foo_enum_t;
/*
* 'foo_void_function()' - Do foo with bar.
*/
void
foo_void_function(int one, /* I - Integer */
float *two, /* O - Real number */
const char *three) /* I - String */
{
if (one)
{
puts("Hello, World!");
}
else
puts(three);
*two = 2.0f;
}
/*
* 'foo_float_function()' - Do foo with bar.
*/
float /* O - Real number */
foo_float_function(int one, /* I - Integer */
const char *two) /* I - String */
{
if (one)
{
puts("Hello, World!");
}
else
puts(two);
return (2.0f);
}
typedef struct foo_s /* Foo structure */
{
float foo; /* Real number */
int bar; /* Integer */
foo_s(float f, int b);
~foo_s();
// 'get_bar()' - Get the value of bar.
int // O - Value of bar
get_bar()
{
return (bar);
}
// 'get_foo()' - Get the value of foo.
float // O - Value of foo
get_foo()
{
return (foo);
}
// 'set_bar()' - Set the value of bar.
void
set_bar(int b) // I - Value of bar
{
bar = b;
}
// 'set_foo()' - Set the value of foo.
void
set_foo(float f) // I - Value of foo
{
foo = f;
}
} foo_t;
// 'foo_s::foo_s()' - Create a foo_s structure.
foo_s::foo_s(float f, int b)
{
foo = f;
bar = b;
}
// 'foo_s::~foo_s()' - Destroy a foo_s structure.
foo_s::~foo_s()
{
}
class foo_c // Foo class
{
float foo; /* Real number */
int bar; /* Integer */
public:
foo_c(float f, int b);
~foo_c();
// 'get_bar()' - Get the value of bar.
int // O - Value of bar
get_bar()
{
return (bar);
}
// 'get_foo()' - Get the value of foo.
float // O - Value of foo
get_foo()
{
return (foo);
}
// 'set_bar()' - Set the value of bar.
void
set_bar(int b) // I - Value of bar
{
bar = b;
}
// 'set_foo()' - Set the value of foo.
void
set_foo(float f) // I - Value of foo
{
foo = f;
}
}
// 'foo_c::foo_c()' - Create a foo_c class.
foo_c::foo_c(float f, int b)
{
foo = f;
bar = b;
}
// 'foo_c::~foo_c()' - Destroy a foo_c class.
foo_c::~foo_c()
{
}
//
// End of "$Id: testfile.cxx,v 1.2 2004/04/29 20:48:52 mike Exp $".
//
Loading…
Cancel
Save