Copied: tuscany/sca-cpp/trunk/modules/xml/xml.hpp (from r1361918, tuscany/sca-cpp/trunk/kernel/xml.hpp)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/xml/xml.hpp?p2=tuscany/sca-cpp/trunk/modules/xml/xml.hpp&p1=tuscany/sca-cpp/trunk/kernel/xml.hpp&r1=1361918&r2=1419985&rev=1419985&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/xml.hpp (original)
+++ tuscany/sca-cpp/trunk/modules/xml/xml.hpp Tue Dec 11 03:51:03 2012
@@ -38,24 +38,20 @@
#include "monad.hpp"
namespace tuscany {
-
-/**
- * APR-based memory management functions.
- */
-
+namespace xml {
/**
* Initializes the libxml2 library.
*/
class XMLParser {
public:
- XMLParser() {
+ inline XMLParser() {
debug("xml::XMLParser");
xmlMemSetup(gc_pool_free, gc_pool_malloc, gc_pool_realloc, gc_pool_strdup);
xmlInitParser();
}
- ~XMLParser() {
+ inline ~XMLParser() {
}
} xmlParser;
@@ -68,30 +64,19 @@ public:
None = 0, Element = 1, Attribute = 2, Text = 3, EndElement = 15, Identifier = 100,
End = 101
};
- XMLReader(xmlTextReaderPtr xml) : xml(xml), owner(true), tokenType(None), isEmptyElement(false),
hasValue(false), hasAttributes(false) {
+ inline XMLReader(xmlTextReaderPtr xml) : xml(xml), owner(true), tokenType(None), isEmptyElement(false),
hasValue(false), hasAttributes(false) {
debug("xml::XMLReader::xml");
xmlTextReaderSetParserProp(xml, XML_PARSER_DEFAULTATTRS, 1);
xmlTextReaderSetParserProp(xml, XML_PARSER_SUBST_ENTITIES, 1);
}
- XMLReader(const XMLReader& r) : xml(r.xml), owner(false), tokenType(r.tokenType),
isEmptyElement(r.isEmptyElement), hasValue(r.hasValue), hasAttributes(r.hasAttributes) {
+ inline XMLReader(const XMLReader& r) : xml(r.xml), owner(false), tokenType(r.tokenType),
isEmptyElement(r.isEmptyElement), hasValue(r.hasValue), hasAttributes(r.hasAttributes) {
debug("xml::XMLReader::copy");
}
- const XMLReader& operator=(const XMLReader& r) {
- debug("xml::XMLReader::operator=");
- if(this == &r)
- return *this;
- xml = r.xml;
- owner = false;
- tokenType = r.tokenType;
- isEmptyElement = r.isEmptyElement;
- hasValue = r.hasValue;
- hasAttributes = r.hasAttributes;
- return *this;
- }
+ XMLReader& operator=(const XMLReader& r) = delete;
- ~XMLReader() {
+ inline ~XMLReader() {
if (!owner)
return;
xmlTextReaderClose(xml);
@@ -101,7 +86,7 @@ public:
/**
* Read the next XML token and return its type.
*/
- int read() {
+ inline const int read() {
if (tokenType == End)
return tokenType;
if (tokenType == Element) {
@@ -120,13 +105,13 @@ public:
return tokenType = xmlTextReaderNodeType(xml);
}
- operator xmlTextReaderPtr() const {
+ inline operator xmlTextReaderPtr() const {
return xml;
}
private:
- xmlTextReaderPtr xml;
- bool owner;
+ const xmlTextReaderPtr xml;
+ const bool owner;
int tokenType;
bool isEmptyElement;
bool hasValue;
@@ -140,37 +125,55 @@ const value endElement("<");
const value startElement(">");
/**
+ * Read a value from a text string, automatically detects a boolean or number value.
+ */
+const value readTextValue(const char* const val) {
+ if (!strcmp("true", val))
+ return value(true);
+ if (!strcmp("false", val))
+ return value(false);
+
+ char e[2];
+ double d;
+ const int n = sscanf(val, "%lg%1s", &d, e);
+ if (n == 1)
+ return value(d);
+
+ return value(string(val));
+}
+
+/**
* Read an XML identifier.
*/
-const value readIdentifier(XMLReader& reader) {
- const char* name = (const char*)xmlTextReaderConstName(reader);
+inline const value readIdentifier(XMLReader& reader) {
+ const char* const name = (const char*)xmlTextReaderConstName(reader);
return name;
}
/**
* Read XML text.
*/
-const value readText(XMLReader& reader) {
- const char *val = (const char*)xmlTextReaderConstValue(reader);
- return string(val);
+inline const value readText(XMLReader& reader) {
+ const char* const val = (const char*)xmlTextReaderConstValue(reader);
+ return readTextValue(val);
}
/**
* Read an XML attribute.
*/
-const value readAttribute(XMLReader& reader) {
- const char *name = (const char*)xmlTextReaderConstName(reader);
- const char *val = (const char*)xmlTextReaderConstValue(reader);
- return mklist<value>(attribute, name, string(val));
+inline const value readAttribute(XMLReader& reader) {
+ const char* const name = (const char*)xmlTextReaderConstName(reader);
+ const char* const val = (const char*)xmlTextReaderConstValue(reader);
+ return mklist<value>(attribute, name, readTextValue(val));
}
/**
* Read an XML token.
*/
-const value readToken(XMLReader& reader) {
+inline const value readToken(XMLReader& reader) {
const int tokenType = reader.read();
if (tokenType == XMLReader::None || tokenType == XMLReader::End)
- return value();
+ return nilValue;
if (tokenType == XMLReader::Element)
return startElement;
if (tokenType == XMLReader::Identifier)
@@ -187,7 +190,7 @@ const value readToken(XMLReader& reader)
/**
* Read a list of values from XML tokens.
*/
-const list<value> readList(const list<value>& listSoFar, XMLReader& reader)
{
+inline const list<value> readList(const list<value>& listSoFar, XMLReader&
reader) {
const value token = readToken(reader);
if(isNil(token) || endElement == token)
return reverse(listSoFar);
@@ -199,11 +202,11 @@ const list<value> readList(const list<va
/**
* Read a list of values from a libxml2 XML reader.
*/
-const list<value> read(XMLReader& reader) {
- value nextToken = readToken(reader);
+inline const list<value> read(XMLReader& reader) {
+ const value nextToken = readToken(reader);
if (startElement == nextToken)
return mklist<value>(readList(mklist(element), reader));
- return list<value>();
+ return nilListValue;
}
/**
@@ -211,17 +214,18 @@ const list<value> read(XMLReader& reader
*/
class XMLReadContext {
public:
- XMLReadContext(const list<string>& ilist) : ilist(ilist) {
+ inline XMLReadContext(const list<string>& ilist) : ilist(ilist) {
}
- list<string> ilist;
+
+ gc_mutable_ref<list<string> > ilist;
};
/**
* Callback function called by libxml2 to read XML.
*/
-int readCallback(void *context, char* buffer, int len) {
- XMLReadContext& rc = *static_cast<XMLReadContext*>(context);
- if (isNil(rc.ilist))
+inline int readCallback(void *context, char* buffer, int len) {
+ XMLReadContext& rc = *(XMLReadContext*)context;
+ if (isNil((const list<string>)rc.ilist))
return 0;
const list<string> f(fragment(rc.ilist, len));
const string s(car(f));
@@ -233,7 +237,7 @@ int readCallback(void *context, char* bu
/**
* Return true if a list of strings contains an XML document.
*/
-const bool isXML(const list<string>& ls) {
+inline const bool isXML(const list<string>& ls) {
if (isNil(ls))
return false;
return substr(car(ls), 0, 5) == "<?xml";
@@ -242,12 +246,12 @@ const bool isXML(const list<string>& ls)
/**
* Read a list of values from a list of strings representing an XML document.
*/
-const list<value> readXML(const list<string>& ilist) {
- debug(ilist, "xml::readXML");
+inline const failable<list<value> > readElements(const list<string>&
ilist) {
+ debug(ilist, "xml::readElements");
XMLReadContext cx(ilist);
- xmlTextReaderPtr xml = xmlReaderForIO(readCallback, NULL, &cx, NULL, NULL, XML_PARSE_NONET
| XML_PARSE_NODICT);
+ const xmlTextReaderPtr xml = xmlReaderForIO(readCallback, NULL, &cx, NULL, NULL,
XML_PARSE_NONET | XML_PARSE_NODICT);
if (xml == NULL)
- return list<value>();
+ return nilListValue;
XMLReader reader(xml);
return read(reader);
}
@@ -255,19 +259,19 @@ const list<value> readXML(const list<str
/**
* Default encoding used to write XML documents.
*/
-const char* encoding = "UTF-8";
+const char* const encoding = "UTF-8";
/**
* Write a list of XML element or attribute tokens.
*/
-const list<value> expandElementValues(const value& n, const list<value>&
l) {
+inline const list<value> expandElementValues(const value& n, const list<value>&
l) {
if (isNil(l))
return l;
return cons<value>(value(cons<value>(element, cons<value>(n, isList(car(l))?
(list<value>)car(l) : mklist(car(l))))), expandElementValues(n, cdr(l)));
}
-const failable<bool> writeList(const list<value>& l, const xmlTextWriterPtr
xml) {
+inline const failable<bool> writeList(const list<value>& l, const xmlTextWriterPtr
xml) {
if (isNil(l))
return true;
@@ -331,7 +335,7 @@ const failable<bool> writeList(const lis
/**
* Write a list of values to a libxml2 XML writer.
*/
-const failable<bool> write(const list<value>& l, const xmlTextWriterPtr xml,
bool xmlTag) {
+inline const failable<bool> write(const list<value>& l, const xmlTextWriterPtr
xml, bool xmlTag) {
if (xmlTag) {
if (xmlTextWriterStartDocument(xml, NULL, encoding, NULL) < 0)
return mkfailure<bool>("xmlTextWriterStartDocument failed");
@@ -353,17 +357,18 @@ const failable<bool> write(const list<va
*/
template<typename R> class XMLWriteContext {
public:
- XMLWriteContext(const lambda<R(const string&, const R)>& reduce, const
R& accum) : reduce(reduce), accum(accum) {
+ inline XMLWriteContext(const lambda<const R(const string&, const R)>& reduce,
const R& accum) : reduce(reduce), accum(accum) {
}
- const lambda<R(const string&, const R)> reduce;
- R accum;
+
+ const lambda<const R(const string&, const R)> reduce;
+ gc_mutable_ref<R> accum;
};
/**
* Callback function called by libxml2 to write XML out.
*/
-template<typename R> int writeCallback(void *context, const char* buffer, int len)
{
- XMLWriteContext<R>& cx = *static_cast<XMLWriteContext<R>*>(context);
+template<typename R> inline int writeCallback(void *context, const char* buffer, int
len) {
+ XMLWriteContext<R>& cx = *(XMLWriteContext<R>*)context;
cx.accum = cx.reduce(string(buffer, len), cx.accum);
return len;
}
@@ -371,7 +376,7 @@ template<typename R> int writeCallback(v
/**
* Convert a list of values to an XML document.
*/
-template<typename R> const failable<R> writeXML(const lambda<R(const string&,
const R)>& reduce, const R& initial, const list<value>& l, const bool
xmlTag) {
+template<typename R> inline const failable<R> writeElements(const lambda<const
R(const string&, const R)>& reduce, const R& initial, const list<value>&
l, const bool xmlTag) {
XMLWriteContext<R> cx(reduce, initial);
xmlOutputBufferPtr out = xmlOutputBufferCreateIO(writeCallback<R>, NULL, &cx,
NULL);
if (out == NULL)
@@ -379,34 +384,35 @@ template<typename R> const failable<R> w
xmlTextWriterPtr xml = xmlNewTextWriter(out);
if (xml == NULL)
return mkfailure<R>("xmlNewTextWriter failed");
- xmlTextWriterSetIndent(xml, 1);
+ xmlTextWriterSetIndent(xml, 0);
const failable<bool> w = write(l, xml, xmlTag);
xmlFreeTextWriter(xml);
if (!hasContent(w)) {
return mkfailure<R>(w);
}
- return cx.accum;
+ return (R)cx.accum;
}
-template<typename R> const failable<R> writeXML(const lambda<R(const string&,
const R)>& reduce, const R& initial, const list<value>& l) {
- return writeXML(reduce, initial, l, true);
+template<typename R> inline const failable<R> writeElements(const lambda<const
R(const string&, const R)>& reduce, const R& initial, const list<value>&
l) {
+ return writeElements(reduce, initial, l, true);
}
/**
* Convert a list of values to a list of strings representing an XML document.
*/
-const failable<list<string> > writeXML(const list<value>& l, const
bool xmlTag) {
- debug(l, "xml::writeXML");
- const failable<list<string> > ls = writeXML<list<string> >(rcons<string>,
list<string>(), l, xmlTag);
+inline const failable<list<string> > writeElements(const list<value>&
l, const bool xmlTag) {
+ debug(l, "xml::writeElements");
+ const failable<list<string> > ls = writeElements<list<string> >(rcons<string>,
list<string>(), l, xmlTag);
if (!hasContent(ls))
return ls;
return reverse(list<string>(content(ls)));
}
-const failable<list<string> > writeXML(const list<value>& l) {
- return writeXML(l, true);
+inline const failable<list<string> > writeElements(const list<value>&
l) {
+ return writeElements(l, true);
}
}
+}
#endif /* tuscany_xml_hpp */
Copied: tuscany/sca-cpp/trunk/modules/xml/xsd-test.cpp (from r1361918, tuscany/sca-cpp/trunk/kernel/xsd-test.cpp)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/xml/xsd-test.cpp?p2=tuscany/sca-cpp/trunk/modules/xml/xsd-test.cpp&p1=tuscany/sca-cpp/trunk/kernel/xsd-test.cpp&r1=1361918&r2=1419985&rev=1419985&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/xsd-test.cpp (original)
+++ tuscany/sca-cpp/trunk/modules/xml/xsd-test.cpp Tue Dec 11 03:51:03 2012
@@ -30,11 +30,11 @@
namespace tuscany {
-bool printNode(xmlTextReaderPtr reader) {
+const bool printNode(xmlTextReaderPtr reader) {
const xmlChar* name = xmlTextReaderConstName(reader);
if(name == NULL)
name = (xmlChar *)"<unknown>";
- const xmlChar* value = xmlTextReaderConstValue(reader);
+ const xmlChar* const value = xmlTextReaderConstValue(reader);
cerr << xmlTextReaderDepth(reader) << " " << xmlTextReaderNodeType(reader)
<< " " << name << " "
<< xmlTextReaderIsEmptyElement(reader) << " " << xmlTextReaderHasValue(reader);
if(value == NULL)
@@ -53,7 +53,7 @@ int xmlClose(void *context) {
return 0;
}
-bool readFile(const char*xsdfilename, const char *filename) {
+const bool readFile(const char* const xsdfilename, const char* const filename) {
cout << "Loading schema " << xsdfilename << endl;
const xmlDocPtr xsddoc = xmlReadFile(xsdfilename, NULL, XML_PARSE_NONET);
const xmlSchemaParserCtxtPtr xsdctx = xmlSchemaNewDocParserCtxt(xsddoc);
@@ -61,7 +61,7 @@ bool readFile(const char*xsdfilename, co
const xmlSchemaValidCtxtPtr validctx = xmlSchemaNewValidCtxt(xsd);
cout << "Reading file " << filename << endl;
- FILE* file = fopen(filename, "r");
+ FILE* const file = fopen(filename, "r");
if (file != NULL) {
const xmlTextReaderPtr reader = xmlReaderForIO(xmlRead, xmlClose, file, filename,
NULL, XML_PARSE_NONET);
xmlTextReaderSetParserProp(reader, XML_PARSER_DEFAULTATTRS, 1);
@@ -93,7 +93,7 @@ bool readFile(const char*xsdfilename, co
}
-int main(int argc, char **argv) {
+int main(const int argc, const char** const argv) {
tuscany::cout << "Testing..." << tuscany::endl;
if(argc != 3)
return 1;
|