summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2012-12-11 03:51:03 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2012-12-11 03:51:03 +0000
commitae0b7c0063db6236be2d7cf01ddbf2159f77c98c (patch)
tree2f64d65d018634b8728623e2ca99514541fab8aa /sca-cpp/trunk/modules
parent1f3796522a078dda5906395ba471d151ad694b6b (diff)
Port kernel to C++11 and refactor some of the core modules. Convert functors to lambdas, and add C++ const, noexcept and inline annotations to get more efficient generated code.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1419985 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
-rw-r--r--sca-cpp/trunk/modules/Makefile.am2
-rw-r--r--sca-cpp/trunk/modules/atom/atom-test.cpp268
-rw-r--r--sca-cpp/trunk/modules/atom/atom.hpp85
-rw-r--r--sca-cpp/trunk/modules/rss/rss-test.cpp208
-rw-r--r--sca-cpp/trunk/modules/rss/rss.hpp70
-rw-r--r--sca-cpp/trunk/modules/scdl/scdl-test.cpp24
-rw-r--r--sca-cpp/trunk/modules/scdl/scdl.hpp29
-rw-r--r--sca-cpp/trunk/modules/scheme/Makefile.am14
-rw-r--r--sca-cpp/trunk/modules/scheme/driver.hpp2
-rw-r--r--sca-cpp/trunk/modules/scheme/element-value.cpp6
-rw-r--r--sca-cpp/trunk/modules/scheme/element-xml.cpp (renamed from sca-cpp/trunk/modules/scheme/value-xml.cpp)6
-rw-r--r--sca-cpp/trunk/modules/scheme/environment.hpp16
-rw-r--r--sca-cpp/trunk/modules/scheme/eval.hpp10
-rw-r--r--sca-cpp/trunk/modules/scheme/io.hpp150
-rw-r--r--sca-cpp/trunk/modules/scheme/primitive.hpp86
-rw-r--r--sca-cpp/trunk/modules/scheme/scheme-shell.cpp2
-rw-r--r--sca-cpp/trunk/modules/scheme/scheme-test.cpp126
-rw-r--r--sca-cpp/trunk/modules/scheme/scheme-test.hpp34
-rw-r--r--sca-cpp/trunk/modules/scheme/test.scm44
-rw-r--r--sca-cpp/trunk/modules/scheme/value-element.cpp6
-rw-r--r--sca-cpp/trunk/modules/scheme/xml-element.cpp (renamed from sca-cpp/trunk/modules/scheme/xml-value.cpp)8
-rw-r--r--sca-cpp/trunk/modules/xml/Makefile.am29
-rw-r--r--sca-cpp/trunk/modules/xml/test.xml2
-rw-r--r--sca-cpp/trunk/modules/xml/xml-test.cpp373
-rw-r--r--sca-cpp/trunk/modules/xml/xml-test.hpp33
-rw-r--r--sca-cpp/trunk/modules/xml/xml.hpp (renamed from sca-cpp/trunk/kernel/xml.hpp)146
-rw-r--r--sca-cpp/trunk/modules/xml/xsd-test.cpp (renamed from sca-cpp/trunk/kernel/xsd-test.cpp)10
27 files changed, 1179 insertions, 610 deletions
diff --git a/sca-cpp/trunk/modules/Makefile.am b/sca-cpp/trunk/modules/Makefile.am
index 16fe2791f7..95694ffef5 100644
--- a/sca-cpp/trunk/modules/Makefile.am
+++ b/sca-cpp/trunk/modules/Makefile.am
@@ -15,5 +15,5 @@
# specific language governing permissions and limitations
# under the License.
-SUBDIRS = scheme atom rss js json scdl http server python opencl java openid oauth wsgi
+SUBDIRS = xml json scheme atom rss js scdl http server python opencl java openid oauth wsgi
diff --git a/sca-cpp/trunk/modules/atom/atom-test.cpp b/sca-cpp/trunk/modules/atom/atom-test.cpp
index 479ed64f29..056e9ea965 100644
--- a/sca-cpp/trunk/modules/atom/atom-test.cpp
+++ b/sca-cpp/trunk/modules/atom/atom-test.cpp
@@ -38,100 +38,100 @@ ostream* writer(const string& s, ostream* os) {
const string itemEntry(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<entry xmlns=\"http://www.w3.org/2005/Atom\">\n"
- " <title type=\"text\">item</title>\n"
- " <id>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</id>\n"
- " <author>\n"
- " <email>jane@example.com</email>\n"
- " </author>\n"
- " <updated>Fri Jan 01 08:11:36 PDT 2012</updated>\n"
- " <content type=\"application/xml\">\n"
- " <item>\n"
- " <name>Apple</name>\n"
- " <price>$2.99</price>\n"
- " </item>\n"
- " </content>\n"
- " <link href=\"cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\"/>\n"
+ "<entry xmlns=\"http://www.w3.org/2005/Atom\">"
+ "<title type=\"text\">item</title>"
+ "<id>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</id>"
+ "<author>"
+ "<email>jane@example.com</email>"
+ "</author>"
+ "<updated>Fri Jan 01 08:11:36 PDT 2012</updated>"
+ "<content type=\"application/xml\">"
+ "<item>"
+ "<name>Apple</name>"
+ "<price>$2.99</price>"
+ "</item>"
+ "</content>"
+ "<link href=\"cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\"/>"
"</entry>\n");
const string itemTextEntry("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<entry xmlns=\"http://www.w3.org/2005/Atom\">\n"
- " <title type=\"text\">item</title>\n"
- " <id>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</id>\n"
- " <author>\n"
- " <email>jane@example.com</email>\n"
- " </author>\n"
- " <updated>Fri Jan 01 08:11:36 PDT 2012</updated>\n"
- " <content type=\"text\">Apple</content>\n"
- " <link href=\"cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\"/>\n"
+ "<entry xmlns=\"http://www.w3.org/2005/Atom\">"
+ "<title type=\"text\">item</title>"
+ "<id>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</id>"
+ "<author>"
+ "<email>jane@example.com</email>"
+ "</author>"
+ "<updated>Fri Jan 01 08:11:36 PDT 2012</updated>"
+ "<content type=\"text\">Apple</content>"
+ "<link href=\"cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\"/>"
"</entry>\n");
const string itemNoContentEntry("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<entry xmlns=\"http://www.w3.org/2005/Atom\">\n"
- " <title type=\"text\">item</title>\n"
- " <id>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</id>\n"
- " <author>\n"
- " <name>jane</name>\n"
- " </author>\n"
- " <updated>Fri Jan 01 08:11:36 PDT 2012</updated>\n"
- " <link href=\"cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\"/>\n"
+ "<entry xmlns=\"http://www.w3.org/2005/Atom\">"
+ "<title type=\"text\">item</title>"
+ "<id>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</id>"
+ "<author>"
+ "<name>jane</name>"
+ "</author>"
+ "<updated>Fri Jan 01 08:11:36 PDT 2012</updated>"
+ "<link href=\"cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\"/>"
"</entry>\n");
const string incompleteEntry("<entry xmlns=\"http://www.w3.org/2005/Atom\">\n"
- " <title>item</title>\n"
- " <content type=\"text/xml\">\n"
- " <Item xmlns=\"http://services/\">\n"
- " <name xmlns=\"\">Orange</name>\n"
- " <price xmlns=\"\">3.55</price>\n"
- " </Item>\n"
- " </content>\n"
+ "<title>item</title>"
+ "<content type=\"text/xml\">"
+ "<Item xmlns=\"http://services/\">"
+ "<name xmlns=\"\">Orange</name>"
+ "<price xmlns=\"\">3.55</price>"
+ "</Item>"
+ "</content>"
"</entry>\n");
const string completedEntry("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<entry xmlns=\"http://www.w3.org/2005/Atom\">\n"
- " <title type=\"text\">item</title>\n"
- " <id></id>\n"
- " <content type=\"application/xml\">\n"
- " <Item xmlns=\"http://services/\">\n"
- " <name xmlns=\"\">Orange</name>\n"
- " <price xmlns=\"\">3.55</price>\n"
- " </Item>\n"
- " </content>\n"
- " <link href=\"\"/>\n"
+ "<entry xmlns=\"http://www.w3.org/2005/Atom\">"
+ "<title type=\"text\">item</title>"
+ "<id></id>"
+ "<content type=\"application/xml\">"
+ "<Item xmlns=\"http://services/\">"
+ "<name xmlns=\"\">Orange</name>"
+ "<price xmlns=\"\">3.55</price>"
+ "</Item>"
+ "</content>"
+ "<link href=\"\"/>"
"</entry>\n");
-bool testEntry() {
+const bool testEntry() {
{
- const list<value> i = list<value>() + element + value("item")
- + value(list<value>() + element + value("name") + value(string("Apple")))
- + value(list<value>() + element + value("price") + value(string("$2.99")));
- const list<value> a = list<value>() + (list<value>() + element + value("entry")
- + value(list<value>() + element + value("title") + value(string("item")))
- + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
- + value(list<value>() + element + value("author") + value(string("jane@example.com")))
- + value(list<value>() + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012")))
- + value(list<value>() + element + value("content") + value(i)));
+ const list<value> i = nilListValue + element + value("item")
+ + value(nilListValue + element + value("name") + value(string("Apple")))
+ + value(nilListValue + element + value("price") + value(string("$2.99")));
+ const list<value> a = nilListValue + (nilListValue + element + value("entry")
+ + value(nilListValue + element + value("title") + value(string("item")))
+ + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
+ + value(nilListValue + element + value("author") + value(string("jane@example.com")))
+ + value(nilListValue + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012")))
+ + value(nilListValue + element + value("content") + value(i)));
ostringstream os;
writeATOMEntry<ostream*>(writer, &os, a);
assert(str(os) == itemEntry);
}
{
- const list<value> a = list<value>() + (list<value>() + element + value("entry")
- + value(list<value>() + element + value("title") + value(string("item")))
- + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
- + value(list<value>() + element + value("author") + value(string("jane@example.com")))
- + value(list<value>() + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012")))
- + value(list<value>() + element + value("content") + value(string("Apple"))));
+ const list<value> a = nilListValue + (nilListValue + element + value("entry")
+ + value(nilListValue + element + value("title") + value(string("item")))
+ + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
+ + value(nilListValue + element + value("author") + value(string("jane@example.com")))
+ + value(nilListValue + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012")))
+ + value(nilListValue + element + value("content") + value(string("Apple"))));
ostringstream os;
writeATOMEntry<ostream*>(writer, &os, a);
assert(str(os) == itemTextEntry);
}
{
- const list<value> a = list<value>() + (list<value>() + element + value("entry")
- + value(list<value>() + element + value("title") + value(string("item")))
- + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
- + value(list<value>() + element + value("author") + value(string("jane")))
- + value(list<value>() + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012"))));
+ const list<value> a = nilListValue + (nilListValue + element + value("entry")
+ + value(nilListValue + element + value("title") + value(string("item")))
+ + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
+ + value(nilListValue + element + value("author") + value(string("jane")))
+ + value(nilListValue + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012"))));
ostringstream os;
writeATOMEntry<ostream*>(writer, &os, a);
assert(str(os) == itemNoContentEntry);
@@ -164,54 +164,54 @@ bool testEntry() {
}
const string emptyFeed("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<feed xmlns=\"http://www.w3.org/2005/Atom\">\n"
- " <title type=\"text\">Feed</title>\n"
- " <id>1234</id>\n"
+ "<feed xmlns=\"http://www.w3.org/2005/Atom\">"
+ "<title type=\"text\">Feed</title>"
+ "<id>1234</id>"
"</feed>\n");
const string itemFeed("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<feed xmlns=\"http://www.w3.org/2005/Atom\">\n"
- " <title type=\"text\">Feed</title>\n"
- " <id>1234</id>\n"
- " <entry xmlns=\"http://www.w3.org/2005/Atom\">\n"
- " <title type=\"text\">item</title>\n"
- " <id>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</id>\n"
- " <author>\n"
- " <email>jane@example.com</email>\n"
- " </author>\n"
- " <updated>Fri Jan 01 08:11:36 PDT 2012</updated>\n"
- " <content type=\"application/xml\">\n"
- " <item>\n"
- " <name>Apple</name>\n"
- " <price>$2.99</price>\n"
- " </item>\n"
- " </content>\n"
- " <link href=\"cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\"/>\n"
- " </entry>\n"
- " <entry xmlns=\"http://www.w3.org/2005/Atom\">\n"
- " <title type=\"text\">item</title>\n"
- " <id>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c</id>\n"
- " <author>\n"
- " <email>jane@example.com</email>\n"
- " </author>\n"
- " <updated>Fri Jan 01 08:11:36 PDT 2012</updated>\n"
- " <content type=\"application/xml\">\n"
- " <item>\n"
- " <name>Orange</name>\n"
- " <price>$3.55</price>\n"
- " </item>\n"
- " </content>\n"
- " <link href=\"cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c\"/>\n"
- " </entry>\n"
+ "<feed xmlns=\"http://www.w3.org/2005/Atom\">"
+ "<title type=\"text\">Feed</title>"
+ "<id>1234</id>"
+ "<entry xmlns=\"http://www.w3.org/2005/Atom\">"
+ "<title type=\"text\">item</title>"
+ "<id>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</id>"
+ "<author>"
+ "<email>jane@example.com</email>"
+ "</author>"
+ "<updated>Fri Jan 01 08:11:36 PDT 2012</updated>"
+ "<content type=\"application/xml\">"
+ "<item>"
+ "<name>Apple</name>"
+ "<price>$2.99</price>"
+ "</item>"
+ "</content>"
+ "<link href=\"cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\"/>"
+ "</entry>"
+ "<entry xmlns=\"http://www.w3.org/2005/Atom\">"
+ "<title type=\"text\">item</title>"
+ "<id>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c</id>"
+ "<author>"
+ "<email>jane@example.com</email>"
+ "</author>"
+ "<updated>Fri Jan 01 08:11:36 PDT 2012</updated>"
+ "<content type=\"application/xml\">"
+ "<item>"
+ "<name>Orange</name>"
+ "<price>$3.55</price>"
+ "</item>"
+ "</content>"
+ "<link href=\"cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c\"/>"
+ "</entry>"
"</feed>\n");
-bool testFeed() {
+const bool testFeed() {
{
- const list<value> a = list<value>() + (list<value>() + element + value("feed")
- + value(list<value>() + element + value("title") + value(string("Feed")))
- + value(list<value>() + element + value("id") + value(string("1234")))
- + value(list<value>() + element + value("author") + value(string("jane@example.com")))
- + value(list<value>() + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012"))));
+ const list<value> a = nilListValue + (nilListValue + element + value("feed")
+ + value(nilListValue + element + value("title") + value(string("Feed")))
+ + value(nilListValue + element + value("id") + value(string("1234")))
+ + value(nilListValue + element + value("author") + value(string("jane@example.com")))
+ + value(nilListValue + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012"))));
ostringstream os;
writeATOMFeed<ostream*>(writer, &os, a);
assert(str(os) == emptyFeed);
@@ -223,31 +223,31 @@ bool testFeed() {
assert(str(os) == emptyFeed);
}
{
- const list<value> i1 = list<value>() + element + "item"
- + (list<value>() + element + "name" + "Apple")
- + (list<value>() + element + "price" + "$2.99");
+ const list<value> i1 = nilListValue + element + "item"
+ + (nilListValue + element + "name" + "Apple")
+ + (nilListValue + element + "price" + "$2.99");
- const list<value> i2 = list<value>() + element + "item"
- + (list<value>() + element + "name" + "Orange")
- + (list<value>() + element + "price" + "$3.55");
+ const list<value> i2 = nilListValue + element + "item"
+ + (nilListValue + element + "name" + "Orange")
+ + (nilListValue + element + "price" + "$3.55");
- const list<value> i = list<value>()
- + value(list<value>() + element + value("entry")
- + value(list<value>() + element + value("title") + value(string("item")))
- + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
- + value(list<value>() + element + value("author") + value(string("jane@example.com")))
- + value(list<value>() + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012")))
- + value(list<value>() + element + value("content") + value(i1)))
- + value(list<value>() + element + value("entry")
- + value(list<value>() + element + value("title") + value(string("item")))
- + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c")))
- + value(list<value>() + element + value("author") + value(string("jane@example.com")))
- + value(list<value>() + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012")))
- + value(list<value>() + element + value("content") + value(i2)));
+ const list<value> i = nilListValue
+ + value(nilListValue + element + value("entry")
+ + value(nilListValue + element + value("title") + value(string("item")))
+ + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
+ + value(nilListValue + element + value("author") + value(string("jane@example.com")))
+ + value(nilListValue + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012")))
+ + value(nilListValue + element + value("content") + value(i1)))
+ + value(nilListValue + element + value("entry")
+ + value(nilListValue + element + value("title") + value(string("item")))
+ + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c")))
+ + value(nilListValue + element + value("author") + value(string("jane@example.com")))
+ + value(nilListValue + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012")))
+ + value(nilListValue + element + value("content") + value(i2)));
- const list<value> a = list<value>() + (append<value>(list<value>() + element + value("feed")
- + value(list<value>() + element + value("title") + value(string("Feed")))
- + value(list<value>() + element + value("id") + value("1234")),
+ const list<value> a = nilListValue + (append<value>(nilListValue + element + value("feed")
+ + value(nilListValue + element + value("title") + value(string("Feed")))
+ + value(nilListValue + element + value("id") + value("1234")),
i));
ostringstream os;
@@ -273,7 +273,7 @@ bool testFeed() {
}
int main() {
- tuscany::gc_scoped_pool p;
+ const tuscany::gc_scoped_pool p;
tuscany::cout << "Testing..." << tuscany::endl;
tuscany::atom::testEntry();
diff --git a/sca-cpp/trunk/modules/atom/atom.hpp b/sca-cpp/trunk/modules/atom/atom.hpp
index 5de3894214..2f6e688bcb 100644
--- a/sca-cpp/trunk/modules/atom/atom.hpp
+++ b/sca-cpp/trunk/modules/atom/atom.hpp
@@ -30,7 +30,7 @@
#include "list.hpp"
#include "value.hpp"
#include "monad.hpp"
-#include "xml.hpp"
+#include "../xml/xml.hpp"
namespace tuscany {
namespace atom {
@@ -46,24 +46,24 @@ const value entry("entry");
*/
const list<value> entryElementValues(const list<value>& e) {
const list<value> lt = filter<value>(selector(mklist<value>(element, "title")), e);
- const list<value> t = list<value>() + element + value("title") + (isNil(lt)? value(emptyString) : elementValue(car(lt)));
+ const list<value> t = nilListValue + element + value("title") + (isNil(lt)? value(emptyString) : elementValue(car(lt)));
const list<value> li = filter<value>(selector(mklist<value>(element, "id")), e);
- const list<value> i = list<value>() + element + value("id") + (isNil(li)? value(emptyString) : elementValue(car(li)));
+ const list<value> i = nilListValue + element + value("id") + (isNil(li)? value(emptyString) : elementValue(car(li)));
const list<value> la = filter<value>(selector(mklist<value>(element, "author")), e);
- const list<value> lan = isNil(la)? list<value>() : filter<value>(selector(mklist<value>(element, "name")), car(la));
- const list<value> lae = isNil(la)? list<value>() : filter<value>(selector(mklist<value>(element, "email")), car(la));
+ const list<value> lan = isNil(la)? nilListValue : filter<value>(selector(mklist<value>(element, "name")), car(la));
+ const list<value> lae = isNil(la)? nilListValue : filter<value>(selector(mklist<value>(element, "email")), car(la));
const list<value> laa = isNil(lan)? lae : lan;
- const list<value> a = isNil(laa)? list<value>() : mklist<value>(list<value>() + element + value("author") + elementValue(car(laa)));
+ const list<value> a = isNil(laa)? nilListValue : mklist<value>(nilListValue + element + value("author") + elementValue(car(laa)));
const list<value> lu = filter<value>(selector(mklist<value>(element, "updated")), e);
- const list<value> u = isNil(lu)? list<value>() : mklist<value>(list<value>() + element + value("updated") + elementValue(car(lu)));
+ const list<value> u = isNil(lu)? nilListValue : mklist<value>(nilListValue + element + value("updated") + elementValue(car(lu)));
const list<value> lc = filter<value>(selector(mklist<value>(element, "content")), e);
- const list<value> c = isNil(lc)? list<value>() : mklist<value>(list<value>() + element + value("content") + elementValue(car(lc)));
+ const list<value> c = isNil(lc)? nilListValue : mklist<value>(nilListValue + element + value("content") + elementValue(car(lc)));
- return append<value>(append<value>(append<value>(list<value>() + element + entry + value(t) + value(i), a), u), c);
+ return append<value>(append<value>(append<value>(nilListValue + element + entry + value(t) + value(i), a), u), c);
}
/**
@@ -79,7 +79,7 @@ const list<value> entriesElementValues(const list<value>& e) {
* Return true if a list of strings contains an ATOM feed.
*/
const bool isATOMFeed(const list<string>& ls) {
- if (!isXML(ls))
+ if (!xml::isXML(ls))
return false;
return contains(car(ls), "<feed") && contains(car(ls), "=\"http://www.w3.org/2005/Atom\"");
}
@@ -88,7 +88,7 @@ const bool isATOMFeed(const list<string>& ls) {
* Return true if a list of strings contains an ATOM entry.
*/
const bool isATOMEntry(const list<string>& ls) {
- if (!isXML(ls))
+ if (!xml::isXML(ls))
return false;
return contains(car(ls), "<entry") && !contains(car(ls), "<feed") && contains(car(ls), "=\"http://www.w3.org/2005/Atom\"");
}
@@ -97,7 +97,7 @@ const bool isATOMEntry(const list<string>& ls) {
* Convert a list of strings to a list of values representing an ATOM entry.
*/
const failable<list<value> > readATOMEntry(const list<string>& ilist) {
- const list<value> e = readXML(ilist);
+ const list<value> e = content(xml::readElements(ilist));
if (isNil(e))
return mkfailure<list<value> >("Empty entry");
return mklist<value>(entryElementValues(car(e)));
@@ -107,32 +107,25 @@ const failable<list<value> > readATOMEntry(const list<string>& ilist) {
* Convert a list of strings to a list of values representing an ATOM feed.
*/
const failable<list<value> > readATOMFeed(const list<string>& ilist) {
- const list<value> f = readXML(ilist);
+ const list<value> f = content(xml::readElements(ilist));
if (isNil(f))
return mkfailure<list<value> >("Empty feed");
const list<value> t = filter<value>(selector(mklist<value>(element, "title")), car(f));
const list<value> i = filter<value>(selector(mklist<value>(element, "id")), car(f));
const list<value> e = filter<value>(selector(mklist<value>(element, entry)), car(f));
- return mklist<value>(append<value>(list<value>() + element + feed
- + value(list<value>() + element + value("title") + elementValue(car(t)))
- + value(list<value>() + element + value("id") + elementValue(car(i))),
+ return mklist<value>(append<value>(nilListValue + element + feed
+ + value(nilListValue + element + value("title") + elementValue(car(t)))
+ + value(nilListValue + element + value("id") + elementValue(car(i))),
entriesElementValues(e)));
}
/**
* Returns children of an ATOM content element.
*/
-struct filterContentElementChildren {
- const value type;
- filterContentElementChildren() : type("type") {
- }
- const bool operator()(const value& v) const {
- return !(isAttribute(v) && attributeName((list<value>)v) == type);
- }
-};
-
const list<value> contentElementChildren(const value& content) {
- return filter<value>(filterContentElementChildren(), elementChildren(content));
+ return filter<value>([](const value& v) {
+ return !(isAttribute(v) && attributeName((list<value>)v) == "type");
+ }, elementChildren(content));
}
/**
@@ -146,18 +139,18 @@ const list<value> entryElement(const list<value>& l) {
const value updated = elementChild("updated", l);
const value content = elementChild("content", l);
const bool text = isNil(content)? false : elementHasValue(content);
- return list<value>()
- + element + entry + (list<value>() + attribute + "xmlns" + "http://www.w3.org/2005/Atom")
- + (list<value>() + element + "title" + (list<value>() + attribute + "type" + "text") + elementValue(title))
- + (list<value>() + element + "id" + elementValue(id))
- + (isNil(author)? list<value>() : (list<value>() + element + "author" +
- (email? (list<value>() + element + "email" + elementValue(author)) : (list<value>() + element + "name" + elementValue(author)))))
- + (isNil(updated)? list<value>() : (list<value>() + element + "updated" + elementValue(updated)))
+ return nilListValue
+ + element + entry + (nilListValue + attribute + "xmlns" + "http://www.w3.org/2005/Atom")
+ + (nilListValue + element + "title" + (nilListValue + attribute + "type" + "text") + elementValue(title))
+ + (nilListValue + element + "id" + elementValue(id))
+ + (isNil(author)? nilListValue : (nilListValue + element + "author" +
+ (email? (nilListValue + element + "email" + elementValue(author)) : (nilListValue + element + "name" + elementValue(author)))))
+ + (isNil(updated)? nilListValue : (nilListValue + element + "updated" + elementValue(updated)))
+ (isNil(content)?
- list<value>() :
- append<value>(list<value>() + element + "content" + (list<value>() + attribute + "type" + (text? "text" : "application/xml")),
+ nilListValue :
+ append<value>(nilListValue + element + "content" + (nilListValue + attribute + "type" + (text? "text" : "application/xml")),
text? mklist<value>(elementValue(content)) : contentElementChildren(content)))
- + (list<value>() + element + "link" + (list<value>() + attribute + "href" + elementValue(id)));
+ + (nilListValue + element + "link" + (nilListValue + attribute + "href" + elementValue(id)));
}
/**
@@ -172,9 +165,9 @@ const list<value> entriesElements(const list<value>& l) {
/**
* Convert a list of element values representing an ATOM entry to an ATOM entry.
*/
-template<typename R> const failable<R> writeATOMEntry(const lambda<R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) {
+template<typename R> const failable<R> writeATOMEntry(const lambda<const R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) {
const list<value> l = isNil(ll)? ll : (list<value>)car(ll);
- return writeXML<R>(reduce, initial, mklist<value>(entryElement(l)));
+ return xml::writeElements<R>(reduce, initial, mklist<value>(entryElement(l)));
}
const failable<list<string> > writeATOMEntry(const list<value>& l) {
@@ -187,31 +180,31 @@ const failable<list<string> > writeATOMEntry(const list<value>& l) {
/**
* Convert a list of element values representing an ATOM feed to an ATOM feed.
*/
-template<typename R> const failable<R> writeATOMFeed(const lambda<R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) {
+template<typename R> const failable<R> writeATOMFeed(const lambda<const R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) {
const list<value> l = isNil(ll)? ll : (list<value>)car(ll);
const list<value> lt = filter<value>(selector(mklist<value>(element, "title")), l);
const value t = isNil(lt)? value(emptyString) : elementValue(car(lt));
const list<value> li = filter<value>(selector(mklist<value>(element, "id")), l);
const value i = isNil(li)? value(emptyString) : elementValue(car(li));
- const list<value> f = list<value>()
- + element + feed + (list<value>() + attribute + "xmlns" + "http://www.w3.org/2005/Atom")
- + (list<value>() + element + "title" + (list<value>() + attribute + "type" + "text") + t)
- + (list<value>() + element + "id" + i);
+ const list<value> f = nilListValue
+ + element + feed + (nilListValue + attribute + "xmlns" + "http://www.w3.org/2005/Atom")
+ + (nilListValue + element + "title" + (nilListValue + attribute + "type" + "text") + t)
+ + (nilListValue + element + "id" + i);
// Write ATOM entries
const list<value> le = filter<value>(selector(mklist<value>(element, entry)), l);
if (isNil(le))
- return writeXML<R>(reduce, initial, mklist<value>(f));
+ return xml::writeElements<R>(reduce, initial, mklist<value>(f));
// Write a single ATOM entry element with a list of values
if (!isNil(le) && !isNil(car(le)) && isList(car<value>(caddr<value>(car(le))))) {
const list<value> fe = append(f, entriesElements(caddr<value>(car(le))));
- return writeXML<R>(reduce, initial, mklist<value>(fe));
+ return xml::writeElements<R>(reduce, initial, mklist<value>(fe));
}
// Write separate ATOM entry elements
const list<value> fe = append(f, entriesElements(le));
- return writeXML<R>(reduce, initial, mklist<value>(fe));
+ return xml::writeElements<R>(reduce, initial, mklist<value>(fe));
}
/**
diff --git a/sca-cpp/trunk/modules/rss/rss-test.cpp b/sca-cpp/trunk/modules/rss/rss-test.cpp
index be1dcac574..a6de6ed31a 100644
--- a/sca-cpp/trunk/modules/rss/rss-test.cpp
+++ b/sca-cpp/trunk/modules/rss/rss-test.cpp
@@ -37,78 +37,78 @@ ostream* writer(const string& s, ostream* os) {
}
const string itemEntry("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<item>\n"
- " <title>fruit</title>\n"
- " <link>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</link>\n"
- " <description>\n"
- " <item>\n"
- " <name>Apple</name>\n"
- " <price>$2.99</price>\n"
- " </item>\n"
- " </description>\n"
+ "<item>"
+ "<title>fruit</title>"
+ "<link>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</link>"
+ "<description>"
+ "<item>"
+ "<name>Apple</name>"
+ "<price>$2.99</price>"
+ "</item>"
+ "</description>"
"</item>\n");
const string itemTextEntry("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<item>\n"
- " <title>fruit</title>\n"
- " <link>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</link>\n"
- " <description>Apple</description>\n"
+ "<item>"
+ "<title>fruit</title>"
+ "<link>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</link>"
+ "<description>Apple</description>"
"</item>\n");
const string itemNoDescriptionEntry("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<item>\n"
- " <title>fruit</title>\n"
- " <link>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</link>\n"
+ "<item>"
+ "<title>fruit</title>"
+ "<link>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</link>"
"</item>\n");
const string incompleteEntry("<item>\n"
- " <title>fruit</title>\n"
- " <description>\n"
- " <Item xmlns=\"http://services/\">\n"
- " <name xmlns=\"\">Orange</name>\n"
- " <price xmlns=\"\">3.55</price>\n"
- " </Item>\n"
- " </description>\n"
+ "<title>fruit</title>"
+ "<description>"
+ "<Item xmlns=\"http://services/\">"
+ "<name xmlns=\"\">Orange</name>"
+ "<price xmlns=\"\">3.55</price>"
+ "</Item>"
+ "</description>"
"</item>");
const string completedEntry("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<item>\n"
- " <title>fruit</title>\n"
- " <link></link>\n"
- " <description>\n"
- " <Item xmlns=\"http://services/\">\n"
- " <name xmlns=\"\">Orange</name>\n"
- " <price xmlns=\"\">3.55</price>\n"
- " </Item>\n"
- " </description>\n"
+ "<item>"
+ "<title>fruit</title>"
+ "<link></link>"
+ "<description>"
+ "<Item xmlns=\"http://services/\">"
+ "<name xmlns=\"\">Orange</name>"
+ "<price xmlns=\"\">3.55</price>"
+ "</Item>"
+ "</description>"
"</item>\n");
-bool testEntry() {
+const bool testEntry() {
{
- const list<value> i = list<value>() + element + value("item")
- + value(list<value>() + element + value("name") + value(string("Apple")))
- + value(list<value>() + element + value("price") + value(string("$2.99")));
- const list<value> a = list<value>() + (list<value>() + element + value("entry")
- + value(list<value>() + element + value("title") + value(string("fruit")))
- + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
- + value(list<value>() + element + value("content") + value(i)));
+ const list<value> i = nilListValue + element + value("item")
+ + value(nilListValue + element + value("name") + value(string("Apple")))
+ + value(nilListValue + element + value("price") + value(string("$2.99")));
+ const list<value> a = nilListValue + (nilListValue + element + value("entry")
+ + value(nilListValue + element + value("title") + value(string("fruit")))
+ + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
+ + value(nilListValue + element + value("content") + value(i)));
ostringstream os;
writeRSSEntry<ostream*>(writer, &os, a);
assert(str(os) == itemEntry);
}
{
- const list<value> a = list<value>() + (list<value>() + element + value("entry")
- + value(list<value>() + element + value("title") + value(string("fruit")))
- + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
- + value(list<value>() + element + value("content") + value(string("Apple"))));
+ const list<value> a = nilListValue + (nilListValue + element + value("entry")
+ + value(nilListValue + element + value("title") + value(string("fruit")))
+ + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
+ + value(nilListValue + element + value("content") + value(string("Apple"))));
ostringstream os;
writeRSSEntry<ostream*>(writer, &os, a);
assert(str(os) == itemTextEntry);
}
{
- const list<value> a = list<value>() + (list<value>() + element + value("entry")
- + value(list<value>() + element + value("title") + value(string("fruit")))
- + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))));
+ const list<value> a = nilListValue + (nilListValue + element + value("entry")
+ + value(nilListValue + element + value("title") + value(string("fruit")))
+ + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))));
ostringstream os;
writeRSSEntry<ostream*>(writer, &os, a);
assert(str(os) == itemNoDescriptionEntry);
@@ -141,48 +141,48 @@ bool testEntry() {
}
const string emptyFeed("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<rss version=\"2.0\">\n"
- " <channel>\n"
- " <title>Feed</title>\n"
- " <link>1234</link>\n"
- " <description>Feed</description>\n"
- " </channel>\n"
+ "<rss version=\"2.0\">"
+ "<channel>"
+ "<title>Feed</title>"
+ "<link>1234</link>"
+ "<description>Feed</description>"
+ "</channel>"
"</rss>\n");
const string itemFeed("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<rss version=\"2.0\">\n"
- " <channel>\n"
- " <title>Feed</title>\n"
- " <link>1234</link>\n"
- " <description>Feed</description>\n"
- " <item>\n"
- " <title>fruit</title>\n"
- " <link>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</link>\n"
- " <description>\n"
- " <item>\n"
- " <name>Apple</name>\n"
- " <price>$2.99</price>\n"
- " </item>\n"
- " </description>\n"
- " </item>\n"
- " <item>\n"
- " <title>fruit</title>\n"
- " <link>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c</link>\n"
- " <description>\n"
- " <item>\n"
- " <name>Orange</name>\n"
- " <price>$3.55</price>\n"
- " </item>\n"
- " </description>\n"
- " </item>\n"
- " </channel>\n"
+ "<rss version=\"2.0\">"
+ "<channel>"
+ "<title>Feed</title>"
+ "<link>1234</link>"
+ "<description>Feed</description>"
+ "<item>"
+ "<title>fruit</title>"
+ "<link>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</link>"
+ "<description>"
+ "<item>"
+ "<name>Apple</name>"
+ "<price>$2.99</price>"
+ "</item>"
+ "</description>"
+ "</item>"
+ "<item>"
+ "<title>fruit</title>"
+ "<link>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c</link>"
+ "<description>"
+ "<item>"
+ "<name>Orange</name>"
+ "<price>$3.55</price>"
+ "</item>"
+ "</description>"
+ "</item>"
+ "</channel>"
"</rss>\n");
-bool testFeed() {
+const bool testFeed() {
{
- const list<value> a = list<value>() + (list<value>() + element + value("feed")
- + value(list<value>() + element + value("title") + value(string("Feed")))
- + value(list<value>() + element + value("id") + value(string("1234"))));
+ const list<value> a = nilListValue + (nilListValue + element + value("feed")
+ + value(nilListValue + element + value("title") + value(string("Feed")))
+ + value(nilListValue + element + value("id") + value(string("1234"))));
ostringstream os;
writeRSSFeed<ostream*>(writer, &os, a);
assert(str(os) == emptyFeed);
@@ -194,27 +194,27 @@ bool testFeed() {
assert(str(os) == emptyFeed);
}
{
- const list<value> i1 = list<value>() + element + "item"
- + (list<value>() + element + "name" + "Apple")
- + (list<value>() + element + "price" + "$2.99");
-
- const list<value> i2 = list<value>() + element + "item"
- + (list<value>() + element + "name" + "Orange")
- + (list<value>() + element + "price" + "$3.55");
-
- const list<value> i = list<value>()
- + value(list<value>() + element + value("entry")
- + value(list<value>() + element + value("title") + value(string("fruit")))
- + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
- + value(list<value>() + element + value("content") + value(i1)))
- + value(list<value>() + element + value("entry")
- + value(list<value>() + element + value("title") + value(string("fruit")))
- + value(list<value>() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c")))
- + value(list<value>() + element + value("content") + value(i2)));
+ const list<value> i1 = nilListValue + element + "item"
+ + (nilListValue + element + "name" + "Apple")
+ + (nilListValue + element + "price" + "$2.99");
+
+ const list<value> i2 = nilListValue + element + "item"
+ + (nilListValue + element + "name" + "Orange")
+ + (nilListValue + element + "price" + "$3.55");
+
+ const list<value> i = nilListValue
+ + value(nilListValue + element + value("entry")
+ + value(nilListValue + element + value("title") + value(string("fruit")))
+ + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b")))
+ + value(nilListValue + element + value("content") + value(i1)))
+ + value(nilListValue + element + value("entry")
+ + value(nilListValue + element + value("title") + value(string("fruit")))
+ + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c")))
+ + value(nilListValue + element + value("content") + value(i2)));
- const list<value> a = list<value>() + (append<value>(list<value>() + element + value("feed")
- + value(list<value>() + element + value("title") + value(string("Feed")))
- + value(list<value>() + element + value("id") + value("1234")),
+ const list<value> a = nilListValue + (append<value>(nilListValue + element + value("feed")
+ + value(nilListValue + element + value("title") + value(string("Feed")))
+ + value(nilListValue + element + value("id") + value("1234")),
i));
ostringstream os;
@@ -240,7 +240,7 @@ bool testFeed() {
}
int main() {
- tuscany::gc_scoped_pool p;
+ const tuscany::gc_scoped_pool p;
tuscany::cout << "Testing..." << tuscany::endl;
tuscany::rss::testEntry();
diff --git a/sca-cpp/trunk/modules/rss/rss.hpp b/sca-cpp/trunk/modules/rss/rss.hpp
index c62d137adc..7fba736065 100644
--- a/sca-cpp/trunk/modules/rss/rss.hpp
+++ b/sca-cpp/trunk/modules/rss/rss.hpp
@@ -30,7 +30,7 @@
#include "list.hpp"
#include "value.hpp"
#include "monad.hpp"
-#include "xml.hpp"
+#include "../xml/xml.hpp"
namespace tuscany {
namespace rss {
@@ -50,10 +50,10 @@ const list<value> entryElementValues(const list<value>& e) {
const list<value> li = filter<value>(selector(mklist<value>(element, "link")), e);
const value i = isNil(li)? value(emptyString) : elementValue(car(li));
const list<value> ld = filter<value>(selector(mklist<value>(element, "description")), e);
- return append<value>(list<value>() + element + entry
- + value(list<value>() + element + value("title") + t)
- + value(list<value>() + element + value("id") + i),
- isNil(ld)? list<value>() : mklist<value>(value(list<value>() + element + value("content") + elementValue(car(ld)))));
+ return append<value>(nilListValue + element + entry
+ + value(nilListValue + element + value("title") + t)
+ + value(nilListValue + element + value("id") + i),
+ isNil(ld)? nilListValue : mklist<value>(value(nilListValue + element + value("content") + elementValue(car(ld)))));
}
/**
@@ -69,7 +69,7 @@ const list<value> entriesElementValues(const list<value>& e) {
* Return true if a list of strings contains an RSS feed.
*/
const bool isRSSFeed(const list<string>& ls) {
- if (!isXML(ls))
+ if (!xml::isXML(ls))
return false;
return contains(car(ls), "<rss");
}
@@ -78,7 +78,7 @@ const bool isRSSFeed(const list<string>& ls) {
* Convert a list of strings to a list of values representing an RSS entry.
*/
const failable<list<value> > readRSSEntry(const list<string>& ilist) {
- const list<value> e = readXML(ilist);
+ const list<value> e = content(xml::readElements(ilist));
if (isNil(e))
return mkfailure<list<value> >("Empty entry");
return mklist<value>(entryElementValues(car(e)));
@@ -88,16 +88,16 @@ const failable<list<value> > readRSSEntry(const list<string>& ilist) {
* Convert a list of strings to a list of values representing an RSS feed.
*/
const failable<list<value> > readRSSFeed(const list<string>& ilist) {
- const list<value> f = readXML(ilist);
+ const list<value> f = content(xml::readElements(ilist));
if (isNil(f))
return mkfailure<list<value> >("Empty feed");
const list<value> c = filter<value>(selector(mklist<value>(element, "channel")), car(f));
const list<value> t = filter<value>(selector(mklist<value>(element, "title")), car(c));
const list<value> i = filter<value>(selector(mklist<value>(element, "link")), car(c));
const list<value> e = filter<value>(selector(mklist<value>(element, "item")), car(c));
- return mklist<value>(append<value>(list<value>() + element + feed
- + value(list<value>() + element + value("title") + elementValue(car(t)))
- + value(list<value>() + element + value("id") + elementValue(car(i))),
+ return mklist<value>(append<value>(nilListValue + element + feed
+ + value(nilListValue + element + value("title") + elementValue(car(t)))
+ + value(nilListValue + element + value("id") + elementValue(car(i))),
entriesElementValues(e)));
}
@@ -109,13 +109,13 @@ const list<value> entryElement(const list<value>& l) {
const value id = elementValue(elementChild("id", l));
const value content = elementChild("content", l);
const bool text = isNil(content)? false : elementHasValue(content);
- return append<value>(list<value>()
+ return append<value>(nilListValue
+ element + "item"
- + (list<value>() + element + "title" + title)
- + (list<value>() + element + "link" + id),
+ + (nilListValue + element + "title" + title)
+ + (nilListValue + element + "link" + id),
isNil(content)?
- list<value>() :
- mklist<value>(append<value>(list<value>() + element + "description",
+ nilListValue :
+ mklist<value>(append<value>(nilListValue + element + "description",
text? mklist<value>(elementValue(content)) : elementChildren(content))));
}
@@ -132,9 +132,9 @@ const list<value> entriesElements(const list<value>& l) {
* Convert a list of values representing an RSS entry to an RSS entry.
* The first two values in the list are the entry id and title.
*/
-template<typename R> const failable<R> writeRSSEntry(const lambda<R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) {
+template<typename R> const failable<R> writeRSSEntry(const lambda<const R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) {
const list<value> l = isNil(ll)? ll : (list<value>)car(ll);
- return writeXML<R>(reduce, initial, mklist<value>(entryElement(l)));
+ return xml::writeElements<R>(reduce, initial, mklist<value>(entryElement(l)));
}
const failable<list<string> > writeRSSEntry(const list<value>& l) {
@@ -148,41 +148,41 @@ const failable<list<string> > writeRSSEntry(const list<value>& l) {
* Convert a list of values representing an RSS feed to an RSS feed.
* The first two values in the list are the feed id and title.
*/
-template<typename R> const failable<R> writeRSSFeed(const lambda<R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) {
+template<typename R> const failable<R> writeRSSFeed(const lambda<const R(const string&, const R)>& reduce, const R& initial, const list<value>& ll) {
const list<value> l = isNil(ll)? ll : (list<value>)car(ll);
const list<value> lt = filter<value>(selector(mklist<value>(element, "title")), l);
const value t = isNil(lt)? value(emptyString) : elementValue(car(lt));
const list<value> li = filter<value>(selector(mklist<value>(element, "id")), l);
const value i = isNil(li)? value(emptyString) : elementValue(car(li));
- const list<value> c = list<value>()
- + (list<value>() + element + "title" + t)
- + (list<value>() + element + "link" + i)
- + (list<value>() + element + "description" + t);
+ const list<value> c = nilListValue
+ + (nilListValue + element + "title" + t)
+ + (nilListValue + element + "link" + i)
+ + (nilListValue + element + "description" + t);
// Write RSS entries
const list<value> le = filter<value>(selector(mklist<value>(element, entry)), l);
if (isNil(le)) {
- const list<value> fe = list<value>()
- + element + "rss" + (list<value>() + attribute + "version" + "2.0")
- + append(list<value>() + element + "channel", c);
- return writeXML<R>(reduce, initial, mklist<value>(fe));
+ const list<value> fe = nilListValue
+ + element + "rss" + (nilListValue + attribute + "version" + "2.0")
+ + append(nilListValue + element + "channel", c);
+ return xml::writeElements<R>(reduce, initial, mklist<value>(fe));
}
// Write a single RSS entry element with a list of values
if (!isNil(le) && !isNil(car(le)) && isList(car<value>(caddr<value>(car(le))))) {
const list<value> ce = append(c, entriesElements(caddr<value>(car(le))));
- const list<value> fe = list<value>()
- + element + "rss" + (list<value>() + attribute + "version" + "2.0")
- + append(list<value>() + element + "channel", ce);
- return writeXML<R>(reduce, initial, mklist<value>(fe));
+ const list<value> fe = nilListValue
+ + element + "rss" + (nilListValue + attribute + "version" + "2.0")
+ + append(nilListValue + element + "channel", ce);
+ return xml::writeElements<R>(reduce, initial, mklist<value>(fe));
}
// Write separate RSS entry elements
const list<value> ce = append(c, entriesElements(le));
- const list<value> fe = list<value>()
- + element + "rss" + (list<value>() + attribute + "version" + "2.0")
- + append(list<value>() + element + "channel", ce);
- return writeXML<R>(reduce, initial, mklist<value>(fe));
+ const list<value> fe = nilListValue
+ + element + "rss" + (nilListValue + attribute + "version" + "2.0")
+ + append(nilListValue + element + "channel", ce);
+ return xml::writeElements<R>(reduce, initial, mklist<value>(fe));
}
/**
diff --git a/sca-cpp/trunk/modules/scdl/scdl-test.cpp b/sca-cpp/trunk/modules/scdl/scdl-test.cpp
index 4c10f515df..9daacb5559 100644
--- a/sca-cpp/trunk/modules/scdl/scdl-test.cpp
+++ b/sca-cpp/trunk/modules/scdl/scdl-test.cpp
@@ -33,15 +33,15 @@
namespace tuscany {
namespace scdl {
-bool testComposite() {
+const bool testComposite() {
ifstream is("test.composite");
- const list<value> c = readXML(streamList(is));
+ const list<value> c = content(xml::readElements(streamList(is)));
return true;
}
-bool testComponents() {
+const bool testComponents() {
ifstream is("test.composite");
- const list<value> c = components(readXML(streamList(is)));
+ const list<value> c = components(content(xml::readElements(streamList(is))));
assert(length(c) == 4);
const value store = car(c);
@@ -58,9 +58,9 @@ bool testComponents() {
return true;
}
-bool testServices() {
+const bool testServices() {
ifstream is("test.composite");
- const list<value> c = components(readXML(streamList(is)));
+ const list<value> c = components(content(xml::readElements(streamList(is))));
const value store = car(c);
assert(length(services(store)) == 1);
@@ -74,9 +74,9 @@ bool testServices() {
return true;
}
-bool testReferences() {
+const bool testReferences() {
ifstream is("test.composite");
- const list<value> c = components(readXML(streamList(is)));
+ const list<value> c = components(content(xml::readElements(streamList(is))));
const value store = car(c);
assert(length(references(store)) == 3);
@@ -86,7 +86,7 @@ bool testReferences() {
assert(length(bindings(catalog)) == 1);
const value binding = car(bindings(catalog));
- assert(uri(binding) == value());
+ assert(uri(binding) == nilValue);
assert(bindingType(binding) == "binding.jsonrpc");
const list<value> t = mkbtree(sort(referenceToTargetAssoc(references(store))));
@@ -94,9 +94,9 @@ bool testReferences() {
return true;
}
-bool testProperties() {
+const bool testProperties() {
ifstream is("test.composite");
- const list<value> c = components(readXML(streamList(is)));
+ const list<value> c = components(content(xml::readElements(streamList(is))));
const value catalog = named(string("Catalog"), c);
assert(length(properties(catalog)) == 1);
@@ -110,7 +110,7 @@ bool testProperties() {
}
int main() {
- tuscany::gc_scoped_pool p;
+ const tuscany::gc_scoped_pool p;
tuscany::cout << "Testing..." << tuscany::endl;
tuscany::scdl::testComposite();
diff --git a/sca-cpp/trunk/modules/scdl/scdl.hpp b/sca-cpp/trunk/modules/scdl/scdl.hpp
index 7cf43e3b14..35a717d478 100644
--- a/sca-cpp/trunk/modules/scdl/scdl.hpp
+++ b/sca-cpp/trunk/modules/scdl/scdl.hpp
@@ -30,7 +30,7 @@
#include "list.hpp"
#include "value.hpp"
#include "monad.hpp"
-#include "xml.hpp"
+#include "../modules/xml/xml.hpp"
namespace tuscany {
namespace scdl {
@@ -82,33 +82,26 @@ const list<value> nameToElementAssoc(const list<value>& l) {
/**
* Returns the scdl declaration with the given name.
*/
-struct filterName {
- const value n;
- filterName(const value& n) : n(n) {
- }
- const bool operator()(const value& v) const {
+const value named(const value& n, const value& l) {
+ const vblambda filterName = [n](const value& v) -> const bool {
return name(v) == n;
- }
-};
-
-const value named(const value& name, const value& l) {
- const list<value> c = filter<value>(filterName(name), l);
+ };
+ const list<value> c = filter<value>(filterName, l);
if (isNil(c))
- return value();
+ return nilValue;
return car(c);
}
/**
* Returns the implementation of a component.
*/
-const bool filterImplementation(const value& v) {
- return isElement(v) && contains(string(cadr<value>(v)), "implementation.");
-}
-
const value implementation(const value& l) {
+ const vblambda filterImplementation = [](const value& v) -> const bool {
+ return isElement(v) && contains(string(cadr<value>(v)), "implementation.");
+ };
const list<value> n = filter<value>(filterImplementation, l);
if (isNil(n))
- return value();
+ return nilValue;
return car(n);
}
@@ -156,7 +149,7 @@ const list<value> bindings(const value& l) {
*/
const value bindingsTarget(const list<value>& l) {
if (isNil(l))
- return value();
+ return nilValue;
const value u = uri(car(l));
if (!isNil(u))
return u;
diff --git a/sca-cpp/trunk/modules/scheme/Makefile.am b/sca-cpp/trunk/modules/scheme/Makefile.am
index 130fe14303..460dbb3f82 100644
--- a/sca-cpp/trunk/modules/scheme/Makefile.am
+++ b/sca-cpp/trunk/modules/scheme/Makefile.am
@@ -30,18 +30,18 @@ value_element_LDFLAGS =
element_value_SOURCES = element-value.cpp
element_value_LDFLAGS =
-xml_value_SOURCES = xml-value.cpp
-xml_value_LDFLAGS = -lxml2
+xml_element_SOURCES = xml-element.cpp
+xml_element_LDFLAGS = -lxml2
-value_xml_SOURCES = value-xml.cpp
-value_xml_LDFLAGS = -lxml2
+element_xml_SOURCES = element-xml.cpp
+element_xml_LDFLAGS = -lxml2
json_value_SOURCES = json-value.cpp
-json_value_LDFLAGS = -lmozjs
+json_value_LDFLAGS = -ljansson
value_json_SOURCES = value-json.cpp
-value_json_LDFLAGS = -lmozjs
+value_json_LDFLAGS = -ljansson
noinst_PROGRAMS = scheme-test
-mod_PROGRAMS = scheme-shell element-value value-element xml-value value-xml json-value value-json
+mod_PROGRAMS = scheme-shell element-value value-element xml-element element-xml json-value value-json
TESTS = scheme-test
diff --git a/sca-cpp/trunk/modules/scheme/driver.hpp b/sca-cpp/trunk/modules/scheme/driver.hpp
index 112c226ed1..c94af7bbf7 100644
--- a/sca-cpp/trunk/modules/scheme/driver.hpp
+++ b/sca-cpp/trunk/modules/scheme/driver.hpp
@@ -55,7 +55,7 @@ const bool userPrint(const value val, ostream& out) {
const value evalDriverLoop(istream& in, ostream& out, Env& env) {
promptForInput(evalInputPrompt, out);
- value input = readValue(in);
+ const value input = content(readValue(in));
if (isNil(input))
return input;
const value output = evalExpr(input, env);
diff --git a/sca-cpp/trunk/modules/scheme/element-value.cpp b/sca-cpp/trunk/modules/scheme/element-value.cpp
index 8a443dbdb2..bce6042615 100644
--- a/sca-cpp/trunk/modules/scheme/element-value.cpp
+++ b/sca-cpp/trunk/modules/scheme/element-value.cpp
@@ -31,9 +31,9 @@
namespace tuscany {
namespace scheme {
-int elementValue() {
- const value v = elementsToValues(readValue(cin));
- cout << writeValue(v);
+const int elementValue() {
+ const value v = elementsToValues(content(readValue(cin)));
+ write(content(writeValue(v)), cout);
return 0;
}
diff --git a/sca-cpp/trunk/modules/scheme/value-xml.cpp b/sca-cpp/trunk/modules/scheme/element-xml.cpp
index ff785899c6..c7bc7661ab 100644
--- a/sca-cpp/trunk/modules/scheme/value-xml.cpp
+++ b/sca-cpp/trunk/modules/scheme/element-xml.cpp
@@ -25,15 +25,15 @@
#include "fstream.hpp"
#include "string.hpp"
-#include "xml.hpp"
#include "element.hpp"
+#include "../xml/xml.hpp"
#include "eval.hpp"
namespace tuscany {
namespace scheme {
-int valueXML() {
- failable<list<string> > s = writeXML(readValue(cin));
+const int valueXML() {
+ const failable<list<string> > s = xml::writeElements(content(readValue(cin)));
if (!hasContent(s)) {
cerr << reason(s) << " : " << rcode(s);
return 1;
diff --git a/sca-cpp/trunk/modules/scheme/environment.hpp b/sca-cpp/trunk/modules/scheme/environment.hpp
index 303a37cb3c..1a295c74f4 100644
--- a/sca-cpp/trunk/modules/scheme/environment.hpp
+++ b/sca-cpp/trunk/modules/scheme/environment.hpp
@@ -45,7 +45,7 @@ const value setSymbol("set!");
const value dotSymbol(".");
const Env theEmptyEnvironment() {
- return list<value>();
+ return nilListValue;
}
const bool isDefinition(const value& exp) {
@@ -68,11 +68,11 @@ const gc_ptr<Frame> firstFrame(const Env& env) {
return car(env);
}
-list<value> frameVariables(const Frame& frame) {
+const list<value> frameVariables(const Frame& frame) {
return car((list<value> )frame);
}
-list<value> frameValues(const Frame& frame) {
+const list<value> frameValues(const Frame& frame) {
return cdr((list<value> )frame);
}
@@ -103,8 +103,7 @@ const Frame makeBinding(const Frame& frameSoFar, const list<value>& variables, c
}
const gc_ptr<Frame> makeFrame(const list<value>& variables, const list<value> values) {
- gc_ptr<Frame> frame = new (gc_new<Frame>()) Frame();
- *frame = value(makeBinding(cons(value(list<value>()), list<value>()), variables, values));
+ const gc_ptr<Frame> frame = new (gc_new<Frame>()) Frame(makeBinding(cons(value(nilListValue), nilListValue), variables, values));
return frame;
}
@@ -120,7 +119,7 @@ const value definitionValue(const value& exp) {
const list<value> exps(exp);
if(isSymbol(car(cdr(exps)))) {
if (isNil(cdr(cdr(exps))))
- return value();
+ return nilValue;
return car(cdr(cdr(exps)));
}
const list<value> lexps(car(cdr(exps)));
@@ -140,7 +139,8 @@ const Frame addBindingToFrame(const value& var, const value& val, const Frame& f
}
const bool defineVariable(const value& var, const value& val, Env& env) {
- *firstFrame(env) = addBindingToFrame(var, val, *firstFrame(env));
+ const Frame newFrame = addBindingToFrame(var, val, *firstFrame(env));
+ setvalue(*firstFrame(env), addBindingToFrame(var, val, *firstFrame(env)));
return true;
}
@@ -168,7 +168,7 @@ const value lookupEnvScan(const value& var, const list<value>& vars, const list<
const value lookupEnvLoop(const value& var, const Env& env) {
if(env == theEmptyEnvironment()) {
logStream() << "Unbound variable " << var << endl;
- return value();
+ return nilValue;
}
return lookupEnvScan(var, frameVariables(*firstFrame(env)), frameValues(*firstFrame(env)), env);
}
diff --git a/sca-cpp/trunk/modules/scheme/eval.hpp b/sca-cpp/trunk/modules/scheme/eval.hpp
index 34d1a7bc17..5074471931 100644
--- a/sca-cpp/trunk/modules/scheme/eval.hpp
+++ b/sca-cpp/trunk/modules/scheme/eval.hpp
@@ -147,7 +147,7 @@ const value applyProcedure(const value& procedure, list<value>& arguments) {
return evalSequence(procedureBody(procedure), env);
}
logStream() << "Unknown procedure type " << procedure << endl;
- return value();
+ return nilValue;
}
const value sequenceToExp(const list<value> exps) {
@@ -209,16 +209,16 @@ const value expandClauses(const list<value>& clauses) {
if(isNil(rest))
return sequenceToExp(condActions(first));
logStream() << "else clause isn't last " << clauses << endl;
- return value();
+ return nilValue;
}
return makeIf(condPredicate(first), sequenceToExp(condActions(first)), expandClauses(rest));
}
-value condToIf(const value& exp) {
+const value condToIf(const value& exp) {
return expandClauses(condClauses(exp));
}
-value evalIf(const value& exp, Env& env) {
+const value evalIf(const value& exp, Env& env) {
if(isTrue(evalExpr(ifPredicate(exp), env)))
return evalExpr(ifConsequent(exp), env);
return evalExpr(ifAlternative(exp), env);
@@ -255,7 +255,7 @@ const value evalExpr(const value& exp, Env& env) {
return applyProcedure(evalExpr(operat(exp), env), operandValues);
}
logStream() << "Unknown expression type " << exp << endl;
- return value();
+ return nilValue;
}
const list<value> quotedParameters(const list<value>& p) {
diff --git a/sca-cpp/trunk/modules/scheme/io.hpp b/sca-cpp/trunk/modules/scheme/io.hpp
index 8f9d70e7fe..02f6923c86 100644
--- a/sca-cpp/trunk/modules/scheme/io.hpp
+++ b/sca-cpp/trunk/modules/scheme/io.hpp
@@ -37,39 +37,38 @@
namespace tuscany {
namespace scheme {
-const value rightParenthesis(mklist<value>(")"));
-const value leftParenthesis(mklist<value>("("));
-const value comment(mklist<value>(";"));
+const value rightParenthesis(")");
+const value leftParenthesis("(");
-const double stringToNumber(const string& str) {
+inline const double stringToNumber(const string& str) {
return atof(c_str(str));
}
-const bool isWhitespace(const char ch) {
+inline const bool isWhitespace(const char ch) {
return ch != -1 && isspace(ch);
}
-const bool isIdentifierStart(const char ch) {
+inline const bool isIdentifierStart(const char ch) {
return ch != -1 && !isspace(ch) && !isdigit(ch);
}
-const bool isIdentifierPart(const char ch) {
+inline const bool isIdentifierPart(const char ch) {
return ch != -1 && !isspace(ch) && ch != '(' && ch != ')';
}
-const bool isDigit(const char ch) {
+inline const bool isDigit(const char ch) {
return isdigit(ch) || ch == '.';
}
-const bool isLeftParenthesis(const value& token) {
+inline const bool isLeftParenthesis(const value& token) {
return leftParenthesis == token;
}
-const bool isRightParenthesis(const value& token) {
+inline const bool isRightParenthesis(const value& token) {
return rightParenthesis == token;
}
-const char readChar(istream& in) {
+inline const char readChar(istream& in) {
if(in.eof()) {
return -1;
}
@@ -77,14 +76,14 @@ const char readChar(istream& in) {
return c;
}
-const char peekChar(istream& in) {
+inline const char peekChar(istream& in) {
if(eof(in))
return -1;
char c = (char)peek(in);
return c;
}
-const bool isQuote(const value& token) {
+inline const bool isQuote(const value& token) {
return token == quoteSymbol;
}
@@ -93,9 +92,9 @@ const value readQuoted(istream& in);
const value readIdentifier(const char chr, istream& in);
const value readString(istream& in);
const value readNumber(const char chr, istream& in);
-const value readValue(istream& in);
+const failable<value> readValue(istream& in);
-const failable<value> readToken(istream& in) {
+inline const failable<value> readToken(istream& in) {
const char firstChar = readChar(in);
if(isWhitespace(firstChar))
return readToken(in);
@@ -119,18 +118,19 @@ const failable<value> readToken(istream& in) {
return readToken(in);
}
-const failable<value> skipComment(istream& in) {
- const char nextChar = readChar(in);
- if (nextChar == '\n')
- return readToken(in);
- return skipComment(in);
+inline const failable<value> skipComment(istream& in) {
+ while(true) {
+ const char nextChar = readChar(in);
+ if (nextChar == '\n')
+ return readToken(in);
+ }
}
-const value readQuoted(istream& in) {
- return mklist(quoteSymbol, readValue(in));
+inline const value readQuoted(istream& in) {
+ return mklist(quoteSymbol, content(readValue(in)));
}
-const list<value> readList(const list<value>& listSoFar, istream& in) {
+inline const list<value> readList(const list<value>& listSoFar, istream& in) {
const failable<value> ftoken = readToken(in);
if (!hasContent(ftoken))
return reverse(listSoFar);
@@ -142,95 +142,97 @@ const list<value> readList(const list<value>& listSoFar, istream& in) {
return readList(cons(token, listSoFar), in);
}
-const string listToString(const list<char>& l) {
- if(isNil(l))
- return "";
- const char buf[1] = { car(l) };
- return string(buf, 1) + listToString(cdr(l));
-}
-
-const list<char> readIdentifierHelper(const list<char>& listSoFar, istream& in) {
- const char nextChar = peekChar(in);
- if(isIdentifierPart(nextChar))
- return readIdentifierHelper(cons(readChar(in), listSoFar), in);
- return reverse(listSoFar);
+inline const string readIdentifierHelper(const char chr, istream& in) {
+ ostringstream buf;
+ buf << chr;
+ while(true) {
+ const char nextChar = peekChar(in);
+ if(!isIdentifierPart(nextChar))
+ return str(buf);
+ buf << readChar(in);
+ }
}
-const value readIdentifier(const char chr, istream& in) {
- const value val = c_str(listToString(readIdentifierHelper(mklist(chr), in)));
+inline const value readIdentifier(const char chr, istream& in) {
+ const value val = c_str(readIdentifierHelper(chr, in));
if (val == "false")
return value((bool)false);
if (val == "true")
return value((bool)true);
if (val == "nil")
- return value();
+ return nilValue;
return val;
}
-const list<char> readStringHelper(const list<char>& listSoFar, istream& in) {
- const char nextChar = readChar(in);
- if(nextChar == -1 || nextChar == '"')
- return reverse(listSoFar);
- if (nextChar == '\\') {
- const char escapedChar = readChar(in);
- if (escapedChar == -1)
- return reverse(listSoFar);
- return readStringHelper(cons(escapedChar, listSoFar), in);
+inline const value readString(istream& in) {
+ ostringstream buf;
+ while(true) {
+ const char nextChar = readChar(in);
+ if(nextChar == -1 || nextChar == '"')
+ return (value)str(buf);
+ if (nextChar == '\\') {
+ const char escapedChar = readChar(in);
+ if (escapedChar == -1)
+ return (value)str(buf);
+ buf << escapedChar;
+ }
+ buf << nextChar;
}
- return readStringHelper(cons(nextChar, listSoFar), in);
}
-const value readString(istream& in) {
- return listToString(readStringHelper(list<char>(), in));
-}
-
-const list<char> readNumberHelper(const list<char>& listSoFar, istream& in) {
- const char nextChar = peekChar(in);
- if(isDigit(nextChar))
- return readNumberHelper(cons(readChar(in), listSoFar), in);
- return reverse(listSoFar);
-}
-
-const value readNumber(const char chr, istream& in) {
- return stringToNumber(listToString(readNumberHelper(mklist(chr), in)));
+inline const value readNumber(const char chr, istream& in) {
+ ostringstream buf;
+ buf << chr;
+ while(true) {
+ const char nextChar = peekChar(in);
+ if(!isDigit(nextChar))
+ return stringToNumber(str(buf));
+ buf << readChar(in);
+ }
}
-const value readValue(istream& in) {
+inline const failable<value> readValue(istream& in) {
const failable<value> fnextToken = readToken(in);
if (!hasContent(fnextToken))
- return value();
+ return nilValue;
const value nextToken = content(fnextToken);
if(isLeftParenthesis(nextToken))
- return readList(list<value>(), in);
+ return (value)readList(nilListValue, in);
return nextToken;
}
-const value readValue(const string s) {
+inline const failable<value> readValue(const string& s) {
istringstream in(s);
const failable<value> fnextToken = readToken(in);
if (!hasContent(fnextToken))
- return value();
+ return nilValue;
const value nextToken = content(fnextToken);
if(isLeftParenthesis(nextToken))
- return readList(list<value>(), in);
+ return (value)readList(nilListValue, in);
return nextToken;
}
-const bool writeValue(const value& val, ostream& out) {
+inline const failable<value> readValue(const list<string>& l) {
+ ostringstream os;
+ write(l, os);
+ return readValue(str(os));
+}
+
+inline const failable<ostream&> writeValue(const value& val, ostream& out) {
out << val;
- return true;
+ return out;
}
-const string writeValue(const value& val) {
+inline const failable<list<string> > writeValue(const value& val) {
ostringstream out;
out << val;
- return str(out);
+ return mklist<string>(str(out));
}
-const value readScript(istream& in) {
- const value val = readValue(in);
+inline const value readScript(istream& in) {
+ const value val = content(readValue(in));
if (isNil(val))
- return list<value>();
+ return nilListValue;
return cons(val, (list<value>)readScript(in));
}
diff --git a/sca-cpp/trunk/modules/scheme/primitive.hpp b/sca-cpp/trunk/modules/scheme/primitive.hpp
index 59aee12073..2e0c4f62dd 100644
--- a/sca-cpp/trunk/modules/scheme/primitive.hpp
+++ b/sca-cpp/trunk/modules/scheme/primitive.hpp
@@ -40,7 +40,7 @@ const value quoteSymbol("'");
const value lambdaSymbol("lambda");
#ifdef WANT_THREADS
-perthread_ptr<ostream> displayOutStream;
+const perthread_ptr<ostream> displayOutStream;
#else
ostream* displayOutStream = NULL;
#endif
@@ -51,49 +51,49 @@ perthread_ptr<ostream> logOutStream;
ostream* logOutStream = NULL;
#endif
-const bool setupDisplay(ostream& out) {
+inline const bool setupDisplay(ostream& out) {
displayOutStream = &out;
return true;
}
-ostream& displayStream() {
+inline ostream& displayStream() {
if (displayOutStream == NULL)
return cout;
return *displayOutStream;
}
-const bool setupLog(ostream& out) {
+inline const bool setupLog(ostream& out) {
logOutStream = &out;
return true;
}
-ostream& logStream() {
+inline ostream& logStream() {
if (logOutStream == NULL)
return cerr;
return *logOutStream;
}
-const value carProc(const list<value>& args) {
+inline const value carProc(const list<value>& args) {
return car((list<value> )car(args));
}
-const value cdrProc(const list<value>& args) {
+inline const value cdrProc(const list<value>& args) {
return cdr((list<value> )car(args));
}
-const value consProc(const list<value>& args) {
+inline const value consProc(const list<value>& args) {
return cons(car(args), (list<value> )cadr(args));
}
-const value listProc(const list<value>& args) {
+inline const value listProc(const list<value>& args) {
return args;
}
-const value assocProc(const list<value>& args) {
+inline const value assocProc(const list<value>& args) {
return assoc(car(args), (list<list<value> >)cadr(args));
}
-const value nulProc(const list<value>& args) {
+inline const value nulProc(const list<value>& args) {
const value v(car(args));
if (isNil(v))
return true;
@@ -102,31 +102,31 @@ const value nulProc(const list<value>& args) {
return false;
}
-const value equalProc(const list<value>& args) {
+inline const value equalProc(const list<value>& args) {
return (bool)(car(args) == cadr(args));
}
-const value addProc(const list<value>& args) {
+inline const value addProc(const list<value>& args) {
if (isNil(cdr(args)))
return (double)car(args);
return (double)car(args) + (double)cadr(args);
}
-const value subProc(const list<value>& args) {
+inline const value subProc(const list<value>& args) {
if (isNil(cdr(args)))
return (double)0 - (double)car(args);
return (double)car(args) - (double)cadr(args);
}
-const value mulProc(const list<value>& args) {
+inline const value mulProc(const list<value>& args) {
return (double)car(args) * (double)cadr(args);
}
-const value divProc(const list<value>& args) {
+inline const value divProc(const list<value>& args) {
return (double)car(args) / (double)cadr(args);
}
-const value displayProc(const list<value>& args) {
+inline const value displayProc(const list<value>& args) {
if (isNil(args)) {
displayStream() << endl;
return true;
@@ -135,7 +135,7 @@ const value displayProc(const list<value>& args) {
return displayProc(cdr(args));
}
-const value logProc(const list<value>& args) {
+inline const value logProc(const list<value>& args) {
if (isNil(args)) {
logStream() << endl;
return true;
@@ -144,52 +144,52 @@ const value logProc(const list<value>& args) {
return logProc(cdr(args));
}
-const value uuidProc(unused const list<value>& args) {
+inline const value uuidProc(unused const list<value>& args) {
return mkuuid();
}
-const value cadrProc(const list<value>& args) {
+inline const value cadrProc(const list<value>& args) {
return cadr((list<value> )car(args));
}
-const value caddrProc(const list<value>& args) {
+inline const value caddrProc(const list<value>& args) {
return caddr((list<value> )car(args));
}
-const value cadddrProc(const list<value>& args) {
+inline const value cadddrProc(const list<value>& args) {
return cadddr((list<value> )car(args));
}
-const value cddrProc(const list<value>& args) {
+inline const value cddrProc(const list<value>& args) {
return cddr((list<value> )car(args));
}
-const value cdddrProc(const list<value>& args) {
+inline const value cdddrProc(const list<value>& args) {
return cdddr((list<value> )car(args));
}
-const value appendProc(const list<value>& args) {
+inline const value appendProc(const list<value>& args) {
return append((list<value> )car(args), (list<value>)cadr(args));
}
-const value startProc(unused const list<value>& args) {
- return lambda<value(const list<value>&)>();
+inline const value startProc(unused const list<value>& args) {
+ return lvvlambda();
}
-const value stopProc(unused const list<value>& args) {
- return lambda<value(const list<value>&)>();
+inline const value stopProc(unused const list<value>& args) {
+ return lvvlambda();
}
-const value applyPrimitiveProcedure(const value& proc, list<value>& args) {
- const lambda<value(const list<value>&)> func(cadr((list<value>)proc));
+inline const value applyPrimitiveProcedure(const value& proc, list<value>& args) {
+ const lvvlambda func(cadr((list<value>)proc));
return func(args);
}
-const bool isPrimitiveProcedure(const value& proc) {
+inline const bool isPrimitiveProcedure(const value& proc) {
return isTaggedList(proc, primitiveSymbol);
}
-const bool isSelfEvaluating(const value& exp) {
+inline const bool isSelfEvaluating(const value& exp) {
if(isNil(exp))
return true;
if(isNumber(exp))
@@ -203,15 +203,15 @@ const bool isSelfEvaluating(const value& exp) {
return false;
}
-const value primitiveImplementation(const list<value>& proc) {
+inline const value primitiveImplementation(const list<value>& proc) {
return car(cdr(proc));
}
-template<typename F> const value primitiveProcedure(const F& f) {
- return mklist<value>(primitiveSymbol, (lambda<value(const list<value>&)>)f);
+template<typename F> inline const value primitiveProcedure(const F& f) {
+ return mklist<value>(primitiveSymbol, (lvvlambda)f);
}
-const list<value> primitiveProcedureNames() {
+inline const list<value> primitiveProcedureNames() {
return mklist<value>("car")
+ "cdr"
+ "cons"
@@ -237,7 +237,7 @@ const list<value> primitiveProcedureNames() {
+ "stop";
}
-const list<value> primitiveProcedureObjects() {
+inline const list<value> primitiveProcedureObjects() {
return mklist(primitiveProcedure(carProc))
+ primitiveProcedure(cdrProc)
+ primitiveProcedure(consProc)
@@ -263,23 +263,23 @@ const list<value> primitiveProcedureObjects() {
+ primitiveProcedure(stopProc);
}
-const bool isFalse(const value& exp) {
+inline const bool isFalse(const value& exp) {
return (bool)exp == false;
}
-const bool isTrue(const value& exp) {
+inline const bool isTrue(const value& exp) {
return (bool)exp == true;
}
-const bool isQuoted(const value& exp) {
+inline const bool isQuoted(const value& exp) {
return isTaggedList(exp, quoteSymbol);
}
-const value textOfQuotation(const value& exp) {
+inline const value textOfQuotation(const value& exp) {
return car(cdr((list<value> )exp));
}
-const value makeLambda(const list<value>& parameters, const list<value>& body) {
+inline const value makeLambda(const list<value>& parameters, const list<value>& body) {
return cons(lambdaSymbol, cons<value>(parameters, body));
}
diff --git a/sca-cpp/trunk/modules/scheme/scheme-shell.cpp b/sca-cpp/trunk/modules/scheme/scheme-shell.cpp
index 4aa67c2375..96ea5e834e 100644
--- a/sca-cpp/trunk/modules/scheme/scheme-shell.cpp
+++ b/sca-cpp/trunk/modules/scheme/scheme-shell.cpp
@@ -30,7 +30,7 @@
#include "driver.hpp"
int main() {
- tuscany::gc_scoped_pool pool;
+ const tuscany::gc_scoped_pool pool;
tuscany::scheme::evalDriverRun(tuscany::cin, tuscany::cout);
return 0;
}
diff --git a/sca-cpp/trunk/modules/scheme/scheme-test.cpp b/sca-cpp/trunk/modules/scheme/scheme-test.cpp
index 5b69b8e588..e83f99456f 100644
--- a/sca-cpp/trunk/modules/scheme/scheme-test.cpp
+++ b/sca-cpp/trunk/modules/scheme/scheme-test.cpp
@@ -26,14 +26,16 @@
#include <assert.h>
#include "stream.hpp"
#include "string.hpp"
+#include "perf.hpp"
#include "driver.hpp"
+#include "scheme-test.hpp"
namespace tuscany {
namespace scheme {
-bool testEnv() {
- gc_scoped_pool pool;
- Env globalEnv = list<value>();
+const bool testEnv() {
+ const gc_scoped_pool pool;
+ Env globalEnv = nilListValue;
Env env = extendEnvironment(mklist<value>("a"), mklist<value>(1), globalEnv);
defineVariable("x", env, env);
assert(lookupVariableValue(value("x"), env) == env);
@@ -41,7 +43,7 @@ bool testEnv() {
return true;
}
-bool testEnvGC() {
+const bool testEnvGC() {
resetLambdaCounters();
resetListCounters();
resetValueCounters();
@@ -52,49 +54,49 @@ bool testEnvGC() {
return true;
}
-bool testRead() {
+const bool testRead() {
istringstream is("abcd");
- assert(readValue(is) == "abcd");
+ assert(content(readValue(is)) == "abcd");
istringstream is2("123");
- assert(readValue(is2) == value(123));
+ assert(content(readValue(is2)) == value(123));
istringstream is3("(abcd)");
- assert(readValue(is3) == mklist(value("abcd")));
+ assert(content(readValue(is3)) == mklist(value("abcd")));
istringstream is4("(abcd xyz)");
- assert(readValue(is4) == mklist<value>("abcd", "xyz"));
+ assert(content(readValue(is4)) == mklist<value>("abcd", "xyz"));
istringstream is5("(abcd (xyz tuv))");
- assert(readValue(is5) == mklist<value>("abcd", mklist<value>("xyz", "tuv")));
+ assert(content(readValue(is5)) == mklist<value>("abcd", mklist<value>("xyz", "tuv")));
return true;
}
-bool testWrite() {
+const bool testWrite() {
{
- const list<value> i = list<value>()
- + (list<value>() + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"
- + (list<value>() + "item"
- + (list<value>() + "name" + "Apple")
- + (list<value>() + "price" + "$2.99")))
- + (list<value>() + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c"
- + (list<value>() + "item"
- + (list<value>() + "name" + "Orange")
- + (list<value>() + "price" + "$3.55")));
+ const list<value> i = nilListValue
+ + (nilListValue + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"
+ + (nilListValue + "item"
+ + (nilListValue + "name" + "Apple")
+ + (nilListValue + "price" + "$2.99")))
+ + (nilListValue + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c"
+ + (nilListValue + "item"
+ + (nilListValue + "name" + "Orange")
+ + (nilListValue + "price" + "$3.55")));
const list<value> a = cons<value>("Feed", cons<value>("feed-1234", i));
ostringstream os;
writeValue(a, os);
istringstream is(str(os));
- assert(readValue(is) == a);
+ assert(content(readValue(is)) == a);
}
{
- const list<value> i = mklist<value>("x", value());
+ const list<value> i = mklist<value>("x", nilValue);
const list<value> a = mklist<value>(i);
ostringstream os;
writeValue(a, os);
istringstream is(str(os));
- assert(readValue(is) == a);
+ assert(content(readValue(is)) == a);
}
return true;
}
@@ -147,8 +149,8 @@ const string evalOutput(const string& scm) {
return str(os);
}
-bool testEval() {
- gc_scoped_pool pool;
+const bool testEval() {
+ const gc_scoped_pool pool;
assert(contains(evalOutput(testSchemeNumber), "testNumber ok"));
assert(contains(evalOutput(testSchemeString), "testString ok"));
assert(contains(evalOutput(testSchemeDefinition), "testDefinition ok"));
@@ -161,8 +163,8 @@ bool testEval() {
return true;
}
-bool testEvalExpr() {
- gc_scoped_pool pool;
+const bool testEvalExpr() {
+ const gc_scoped_pool pool;
const value exp = mklist<value>("+", 2, 3);
Env env = setupEnvironment();
const value r = evalExpr(exp, env);
@@ -170,8 +172,8 @@ bool testEvalExpr() {
return true;
}
-bool testEvalRun() {
- gc_scoped_pool pool;
+const bool testEvalRun() {
+ const gc_scoped_pool pool;
evalDriverRun(cin, cout);
return true;
}
@@ -188,8 +190,8 @@ const string testReturnLambda(
const string testCallLambda(
"(define (testCallLambda l x y) (l x y))");
-bool testEvalLambda() {
- gc_scoped_pool pool;
+const bool testEvalLambda() {
+ const gc_scoped_pool pool;
Env env = setupEnvironment();
const value trl = mklist<value>("testReturnLambda");
@@ -208,7 +210,18 @@ bool testEvalLambda() {
return true;
}
-bool testEvalGC() {
+const bool testEvalScript() {
+ const gc_scoped_pool pool;
+ Env env = setupEnvironment();
+ ifstream is("test.scm");
+ const value script = readScript(is);
+ const value expr = mklist<value>("echo", string("x"));
+ const value res = evalScript(expr, script, env);
+ assert(res == string("x"));
+ return true;
+}
+
+const bool testEvalGC() {
resetLambdaCounters();
resetListCounters();
resetValueCounters();
@@ -221,11 +234,55 @@ bool testEvalGC() {
return true;
}
+const string testCustomer = "((customer (@name \"jdoe\") (account (id \"1234\") (@balance 1000)) (address (@city \"san francisco\") (@state \"ca\"))))";
+
+const bool testReadWrite() {
+ const gc_scoped_pool pool;
+
+ istringstream is(testCustomer);
+ const value r = content(readValue(is));
+
+ ostringstream os;
+ writeValue(r, os);
+ //assert(str(os) == testCustomer);
+ return true;
+}
+
+const bool testReadWritePerf() {
+ const gc_scoped_pool pool;
+
+ const blambda rwl = blambda(testReadWrite);
+ cout << "Scheme read + write test " << time(rwl, 5, 200) << " ms" << endl;
+
+ return true;
+}
+
+const bool testReadWriteBigDoc() {
+ const gc_scoped_pool pool;
+
+ istringstream is(testBigDoc);
+ const value r = content(readValue(is));
+
+ ostringstream os;
+ writeValue(r, os);
+ //assert(str(os) == testBigDoc);
+ return true;
+}
+
+const bool testReadWriteBigDocPerf() {
+ const gc_scoped_pool pool;
+
+ const blambda rwl = blambda(testReadWriteBigDoc);
+ cout << "Scheme big doc read + write test " << time(rwl, 5, 200) << " ms" << endl;
+
+ return true;
+}
+
}
}
int main() {
- tuscany::gc_scoped_pool p;
+ const tuscany::gc_scoped_pool p;
tuscany::cout << "Testing..." << tuscany::endl;
tuscany::scheme::testEnv();
@@ -235,7 +292,10 @@ int main() {
tuscany::scheme::testEval();
tuscany::scheme::testEvalExpr();
tuscany::scheme::testEvalLambda();
+ tuscany::scheme::testEvalScript();
tuscany::scheme::testEvalGC();
+ tuscany::scheme::testReadWritePerf();
+ tuscany::scheme::testReadWriteBigDocPerf();
tuscany::cout << "OK" << tuscany::endl;
return 0;
diff --git a/sca-cpp/trunk/modules/scheme/scheme-test.hpp b/sca-cpp/trunk/modules/scheme/scheme-test.hpp
new file mode 100644
index 0000000000..67f32344a8
--- /dev/null
+++ b/sca-cpp/trunk/modules/scheme/scheme-test.hpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* $Rev$ $Date$ */
+
+/**
+ * Test Scheme doc.
+ */
+
+namespace tuscany {
+namespace scheme {
+
+const string testBigDoc = "((feed (title \"Search Results\") (id \"search\") (entry (title \"An empty app template\") (id \"new\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"An empty test app\") (id \"test\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Check my public social data\") (id \"me360\") (author \"admin@example.com\") (updated \"Apr 28, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"nearme\") (id \"nearme\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"nearme2\") (id \"nearme2\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Our photos of an event\") (id \"ourphotos\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"My online store\") (id \"shoppingcart\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Slice\") (id \"slice\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test animation components\") (id \"testanimation\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test database components\") (id \"testdb\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test event components\") (id \"testevents\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test HTTP components\") (id \"testhttp\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test logic components\") (id \"testlogic\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test search components\") (id \"testsearch\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test HTTP components\") (id \"testhttp\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test social components\") (id \"testsocial\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test text processing components\") (id \"testtext\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test URL components\") (id \"testurl\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test values and lists\") (id \"testvalues\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test widgets\") (id \"testwidgets\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test more widgets\") (id \"testwidgets2\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test HTML generator components\") (id \"testwidgets3\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"jsdtest\") (id \"jsdtest\") (author \"jsdelfino\") (updated \"Jul 27, 2012\") (content (stats (description \"Test app\")))) (entry (title \"SMS send service\") (id \"twsms\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"boao\") (id \"boao\") (author \"jsdelfino\") (updated \"2012-10-12T12:06:59+00:00\") (content (stats (description \"Sample app\")))) (entry (title \"An empty test app\") (id \"test\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"An empty app template\") (id \"new\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"nearme\") (id \"nearme\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"nearme2\") (id \"nearme2\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Our photos of an event\") (id \"ourphotos\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"My online store\") (id \"shoppingcart\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Slice\") (id \"slice\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test animation components\") (id \"testanimation\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test database components\") (id \"testdb\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test event components\") (id \"testevents\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test social components\") (id \"testsocial\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test HTTP components\") (id \"testhttp\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test logic components\") (id \"testlogic\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test search components\") (id \"testsearch\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test HTTP components\") (id \"testhttp\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test text processing components\") (id \"testtext\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test URL components\") (id \"testurl\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test values and lists\") (id \"testvalues\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test widgets\") (id \"testwidgets\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test more widgets\") (id \"testwidgets2\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Test HTML generator components\") (id \"testwidgets3\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"test9\") (id \"test9\") (author \"jsdelfino\") (updated \"2012-09-25T06:17:18+00:00\") (content (stats (description \"Sample app\")))) (entry (title \"SMS send service\") (id \"twsms\") (author \"admin@example.com\") (updated \"Jan 01, 2012\") (content (stats (description \"Sample app\")))) (entry (title \"Check my public social data\") (id \"me360\") (author \"admin@example.com\") (updated \"Apr 28, 2012\") (content (stats (description \"Sample app\"))))))";
+
+
+}
+}
+
diff --git a/sca-cpp/trunk/modules/scheme/test.scm b/sca-cpp/trunk/modules/scheme/test.scm
new file mode 100644
index 0000000000..4bbff6e5c2
--- /dev/null
+++ b/sca-cpp/trunk/modules/scheme/test.scm
@@ -0,0 +1,44 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements. See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership. The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License. You may obtain a copy of the License at
+;
+; http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied. See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+; JSON-RPC test case
+
+(define (echo x) x)
+
+; ATOMPub test case
+
+(define (get id)
+ (if (nul id)
+ '((feed (title "Sample Feed") (id "123456789") (entry
+ (((title "Item") (id "111") (content (item (name "Apple") (currencyCode "USD") (currencySymbol "$") (price 2.99))))
+ ((title "Item") (id "222") (content (item (name "Orange") (currencyCode "USD") (currencySymbol "$") (price 3.55))))
+ ((title "Item") (id "333") (content (item (name "Pear") (currencyCode "USD") (currencySymbol "$") (price 1.55))))))))
+
+ (list (list 'entry '(title "Item") (list 'id (car id)) '(content (item (name "Apple") (currencyCode "USD") (currencySymbol "$") (price 2.99))))))
+)
+
+(define (post collection item)
+ '("123456789")
+)
+
+(define (put id item)
+ true
+)
+
+(define (delete id)
+ true
+)
diff --git a/sca-cpp/trunk/modules/scheme/value-element.cpp b/sca-cpp/trunk/modules/scheme/value-element.cpp
index a4acdaf2d7..af5eac9b57 100644
--- a/sca-cpp/trunk/modules/scheme/value-element.cpp
+++ b/sca-cpp/trunk/modules/scheme/value-element.cpp
@@ -31,9 +31,9 @@
namespace tuscany {
namespace scheme {
-int valueElement() {
- const value v = valuesToElements(readValue(cin));
- cout << writeValue(v);
+const int valueElement() {
+ const value v = valuesToElements(content(readValue(cin)));
+ write(content(writeValue(v)), cout);
return 0;
}
diff --git a/sca-cpp/trunk/modules/scheme/xml-value.cpp b/sca-cpp/trunk/modules/scheme/xml-element.cpp
index d88f754aa5..2050004895 100644
--- a/sca-cpp/trunk/modules/scheme/xml-value.cpp
+++ b/sca-cpp/trunk/modules/scheme/xml-element.cpp
@@ -25,16 +25,16 @@
#include "fstream.hpp"
#include "string.hpp"
-#include "xml.hpp"
#include "element.hpp"
+#include "../xml/xml.hpp"
#include "eval.hpp"
namespace tuscany {
namespace scheme {
-int xmlValue() {
- const value v = readXML(streamList(cin));
- cout << writeValue(v);
+const int xmlValue() {
+ const value v = content(xml::readElements(streamList(cin)));
+ write(content(writeValue(v)), cout);
return 0;
}
diff --git a/sca-cpp/trunk/modules/xml/Makefile.am b/sca-cpp/trunk/modules/xml/Makefile.am
new file mode 100644
index 0000000000..e99218a736
--- /dev/null
+++ b/sca-cpp/trunk/modules/xml/Makefile.am
@@ -0,0 +1,29 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+incl_HEADERS = *.hpp
+incldir = $(prefix)/include/modules/xml
+
+xml_test_SOURCES = xml-test.cpp
+xml_test_LDFLAGS = -lxml2
+
+xsd_test_SOURCES = xsd-test.cpp
+xsd_test_LDFLAGS = -lxml2
+
+noinst_PROGRAMS = xml-test xsd-test
+TESTS = xml-test
+
diff --git a/sca-cpp/trunk/modules/xml/test.xml b/sca-cpp/trunk/modules/xml/test.xml
new file mode 100644
index 0000000000..501d9ac477
--- /dev/null
+++ b/sca-cpp/trunk/modules/xml/test.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed><title>Search Results</title><id>search</id><entry><title>An empty app template</title><id>new</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>An empty test app</title><id>test</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Check my public social data</title><id>me360</id><author>admin@example.com</author><updated>Apr 28, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>nearme</title><id>nearme</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>nearme2</title><id>nearme2</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Our photos of an event</title><id>ourphotos</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>My online store</title><id>shoppingcart</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Slice</title><id>slice</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test animation components</title><id>testanimation</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test database components</title><id>testdb</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test event components</title><id>testevents</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test HTTP components</title><id>testhttp</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test logic components</title><id>testlogic</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test search components</title><id>testsearch</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test HTTP components</title><id>testhttp</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test social components</title><id>testsocial</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test text processing components</title><id>testtext</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test URL components</title><id>testurl</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test values and lists</title><id>testvalues</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test widgets</title><id>testwidgets</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test more widgets</title><id>testwidgets2</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test HTML generator components</title><id>testwidgets3</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>jsdtest</title><id>jsdtest</id><author>jsdelfino</author><updated>Jul 27, 2012</updated><content><stats><description>Test app</description></stats></content></entry><entry><title>SMS send service</title><id>twsms</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>boao</title><id>boao</id><author>jsdelfino</author><updated>2012-10-12T12:06:59+00:00</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>An empty test app</title><id>test</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>An empty app template</title><id>new</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>nearme</title><id>nearme</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>nearme2</title><id>nearme2</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Our photos of an event</title><id>ourphotos</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>My online store</title><id>shoppingcart</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Slice</title><id>slice</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test animation components</title><id>testanimation</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test database components</title><id>testdb</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test event components</title><id>testevents</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test social components</title><id>testsocial</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test HTTP components</title><id>testhttp</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test logic components</title><id>testlogic</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test search components</title><id>testsearch</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test HTTP components</title><id>testhttp</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test text processing components</title><id>testtext</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test URL components</title><id>testurl</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test values and lists</title><id>testvalues</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test widgets</title><id>testwidgets</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test more widgets</title><id>testwidgets2</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test HTML generator components</title><id>testwidgets3</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>test9</title><id>test9</id><author>jsdelfino</author><updated>2012-09-25T06:17:18+00:00</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>SMS send service</title><id>twsms</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Check my public social data</title><id>me360</id><author>admin@example.com</author><updated>Apr 28, 2012</updated><content><stats><description>Sample app</description></stats></content></entry></feed>
diff --git a/sca-cpp/trunk/modules/xml/xml-test.cpp b/sca-cpp/trunk/modules/xml/xml-test.cpp
new file mode 100644
index 0000000000..dd2be2f9c2
--- /dev/null
+++ b/sca-cpp/trunk/modules/xml/xml-test.cpp
@@ -0,0 +1,373 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* $Rev$ $Date$ */
+
+/**
+ * Test XML handling functions.
+ */
+
+#include <assert.h>
+#include "stream.hpp"
+#include "string.hpp"
+#include "list.hpp"
+#include "value.hpp"
+#include "element.hpp"
+#include "perf.hpp"
+#include "xml.hpp"
+#include "xml-test.hpp"
+
+namespace tuscany {
+namespace xml {
+
+const string currencyXML =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<composite xmlns=\"http://docs.oasis-open.org/ns/opencsa/sca/200912\" targetNamespace=\"http://services\" name=\"currency\">"
+ "<component name=\"CurrencyConverterWebService\">"
+ "<implementation.java class=\"services.CurrencyConverterImpl\"/>"
+ "<service name=\"CurrencyConverter\">"
+ "<binding.ws/>"
+ "</service>"
+ "</component>"
+ "<component name=\"CurrencyConverterWebService2\">"
+ "<implementation.java class=\"services.CurrencyConverterImpl2\"/>"
+ "<service name=\"CurrencyConverter2\">"
+ "<binding.atom/>"
+ "</service>"
+ "<property name=\"currency\">US</property>"
+ "</component>"
+"</composite>\n";
+
+const string customerXML =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<customer>"
+ "<name>jdoe</name>"
+ "<address>"
+ "<city>san francisco</city>"
+ "<state>ca</state>"
+ "</address>"
+ "<account>"
+ "<id>1234</id>"
+ "<balance>1000</balance>"
+ "</account>"
+ "<account>"
+ "<id>6789</id>"
+ "<balance>2000</balance>"
+ "</account>"
+ "<account>"
+ "<id>4567</id>"
+ "<balance>3000</balance>"
+ "</account>"
+"</customer>\n";
+
+const string abcXML =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<a>"
+ "<m>abc</m>"
+ "<m>def</m>"
+ "<m>xyz</m>"
+ "<m>tuv</m>"
+"</a>\n";
+
+const string xyzXML =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<a>"
+ "<m>"
+ "<id>123</id>"
+ "<name>abc</name>"
+ "</m>"
+ "<m>"
+ "<id>234</id>"
+ "<name>def</name>"
+ "</m>"
+ "<m>"
+ "<id>345</id>"
+ "<name>xyz</name>"
+ "</m>"
+ "<m>"
+ "<id>456</id>"
+ "<name>tuv</name>"
+ "</m>"
+"</a>\n";
+
+const string boolXML =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<x>true</x>\n";
+
+const string numberXML =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<x>123.4</x>\n";
+
+const bool isName(const value& token) {
+ return isTaggedList(token, attribute) && attributeName(token) == "name";
+}
+
+const bool testReadXML() {
+ {
+ istringstream is(customerXML);
+ const list<value> c = content(readElements(streamList(is)));
+ }
+ {
+ istringstream is(currencyXML);
+ const list<value> c = content(readElements(streamList(is)));
+
+ const value composite = car(c);
+ assert(isTaggedList(composite, element));
+ assert(elementName(composite) == "composite");
+ assert(attributeValue(car(filter<value>(isName, elementChildren(composite)))) == string("currency"));
+ }
+ {
+ istringstream is(boolXML);
+ const list<value> c = content(readElements(streamList(is)));
+ assert(caddr<value>(car(c)) == value(true));
+ }
+ {
+ istringstream is(numberXML);
+ const list<value> c = content(readElements(streamList(is)));
+ assert(caddr<value>(car(c)) == value(123.4));
+ }
+ return true;
+}
+
+ostream* xmlWriter(const string& s, ostream* os) {
+ (*os) << s;
+ return os;
+}
+
+const bool testWriteXML() {
+ {
+ istringstream is(customerXML);
+ const list<value> c = content(readElements(streamList(is)));
+ ostringstream os;
+ writeElements<ostream*>(xmlWriter, &os, c);
+ assert(str(os) == customerXML);
+ }
+ {
+ istringstream is(currencyXML);
+ const list<value> c = content(readElements(streamList(is)));
+ ostringstream os;
+ writeElements<ostream*>(xmlWriter, &os, c);
+ assert(str(os) == currencyXML);
+ }
+ return true;
+}
+
+const bool testElements() {
+ {
+ const list<value> ad = mklist<value>(mklist<value>("city", string("san francisco")), mklist<value>("state", string("ca")));
+ const list<value> ac1 = mklist<value>(mklist<value>("id", string("1234")), mklist<value>("balance", 1000));
+ const list<value> ac2 = mklist<value>(mklist<value>("id", string("6789")), mklist<value>("balance", 2000));
+ const list<value> ac3 = mklist<value>(mklist<value>("id", string("4567")), mklist<value>("balance", 3000));
+ {
+ const list<value> c = mklist<value>(mklist<value>("customer", mklist<value>("name", string("jdoe")), cons<value>("address", ad), mklist<value>("account", mklist<value>(ac1, ac2, ac3))));
+ const list<value> e = valuesToElements(c);
+ const list<value> v = elementsToValues(e);
+ assert(v == c);
+
+ ostringstream os;
+ writeElements<ostream*>(xmlWriter, &os, e);
+ assert(str(os) == customerXML);
+ }
+ {
+ const list<value> c = mklist<value>(mklist<value>("customer", mklist<value>("name", string("jdoe")), cons<value>("address", ad), cons<value>("account", ac1), cons<value>("account", ac2), cons<value>("account", ac3)));
+ const list<value> e = valuesToElements(c);
+ const list<value> v = elementsToValues(e);
+
+ ostringstream os;
+ writeElements<ostream*>(xmlWriter, &os, e);
+ assert(str(os) == customerXML);
+ }
+ }
+ {
+ istringstream is(abcXML);
+ const list<value> c = content(readElements(streamList(is)));
+ const list<value> v = elementsToValues(c);
+ const list<value> e = valuesToElements(v);
+ ostringstream os;
+ writeElements<ostream*>(xmlWriter, &os, e);
+ assert(str(os) == abcXML);
+ }
+ {
+ istringstream is(xyzXML);
+ const list<value> c = content(readElements(streamList(is)));
+ const list<value> v = elementsToValues(c);
+ const list<value> e = valuesToElements(v);
+ ostringstream os;
+ writeElements<ostream*>(xmlWriter, &os, e);
+ assert(str(os) == xyzXML);
+ }
+ {
+ istringstream is(customerXML);
+ const list<value> c = content(readElements(streamList(is)));
+ const list<value> v = elementsToValues(c);
+ const list<value> e = valuesToElements(v);
+ ostringstream os;
+ writeElements<ostream*>(xmlWriter, &os, e);
+ assert(str(os) == customerXML);
+ }
+ return true;
+}
+
+const bool testValues() {
+ {
+ const list<value> l = mklist<value>(nilListValue + "ns1:echoString" + (nilListValue + "@xmlns:ns1" + string("http://ws.apache.org/axis2/services/echo")) + (nilListValue + "text" + string("Hello World!")));
+ const list<value> e = valuesToElements(l);
+ const failable<list<string> > lx = writeElements(e);
+ ostringstream os;
+ write(content(lx), os);
+ istringstream is(str(os));
+ const list<value> x = content(readElements(streamList(is)));
+ const list<value> v = elementsToValues(x);
+ assert(v == l);
+ }
+ return true;
+}
+
+const bool testReadWrite() {
+ const gc_scoped_pool pool;
+
+ istringstream is(customerXML);
+ const list<string> il = streamList(is);
+ const list<value> r = elementsToValues(content(readElements(il)));
+
+ ostringstream os;
+ writeElements<ostream*>(xmlWriter, &os, valuesToElements(r));
+ //assert(str(os) == customerXML);
+ return true;
+}
+
+const bool testReadWritePerf() {
+ const gc_scoped_pool pool;
+
+ const blambda rwl = blambda(testReadWrite);
+ cout << "XML read + write test " << time(rwl, 5, 200) << " ms" << endl;
+
+ return true;
+}
+
+const bool testReadWriteBigDoc() {
+ const gc_scoped_pool pool;
+
+ istringstream is(testBigDoc);
+ const list<string> il = streamList(is);
+ const list<value> r = elementsToValues(content(readElements(il)));
+
+ ostringstream os;
+ writeElements<ostream*>(xmlWriter, &os, valuesToElements(r));
+ //assert(str(os) == testBigDoc);
+ return true;
+}
+
+const bool testReadWriteBigDocPerf() {
+ const gc_scoped_pool pool;
+
+ const blambda rwl = blambda(testReadWriteBigDoc);
+ cout << "XML big doc read + write test " << time(rwl, 5, 200) << " ms" << endl;
+
+ return true;
+}
+
+const string customersXML =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<customers>"
+ "<customer>"
+ "<name>jane doe</name>"
+ "<address>"
+ "<city>san francisco</city>"
+ "<state>ca</state>"
+ "</address>"
+ "<account>"
+ "<id>1234</id>"
+ "<balance>1000</balance>"
+ "</account>"
+ "<account>"
+ "<id>6789</id>"
+ "<balance>4000</balance>"
+ "</account>"
+ "</customer>"
+ "<customer>"
+ "<name>john doe</name>"
+ "<address>"
+ "<city>new york</city>"
+ "<state>ny</state>"
+ "</address>"
+ "<account>"
+ "<id>5678</id>"
+ "<balance>2000</balance>"
+ "</account>"
+ "<account>"
+ "<id>4321</id>"
+ "<balance>1000</balance>"
+ "</account>"
+ "</customer>"
+"</customers>\n";
+
+const bool testQuery() {
+ {
+ const gc_scoped_pool pool;
+
+ // Read XML doc containing customers
+ istringstream is(customersXML);
+ const list<value> c = content(readElements(streamList(is)));
+ //cout << c << endl;
+
+ // Map list of customers to a list of (customer name, customer balance) pairs
+ const list<value> nb = map<value, value>([](value e) -> const value {
+
+ // Map list of accounts to a list of balances
+ list<value> bals = map<value, value>([](value e) -> const value {
+ return (double)elementValue(elementChild("balance", e));
+ }, elementChildren("account", e));
+
+ // Reduce list of balances to compute customer balance
+ value total = reduce<value, value>([](value accum, value v) -> const value {
+ return (double)accum + (double)v;
+ }, value(0), bals);
+
+ // Return (customer name, customer balance) pair
+ return mklist<value>(elementValue(elementChild("name", e)), total);
+
+ }, elementChildren("customer", elementChild("customers", c)));
+
+ // The resulting list of (customer name, customer balance) pairs
+ //cout << nb << endl;
+ assert(nb == mklist<value>(mklist<value>("jane doe", 5000), mklist<value>("john doe", 3000)));
+ }
+ return true;
+}
+
+}
+}
+
+int main() {
+ const tuscany::gc_scoped_pool p;
+ tuscany::cout << "Testing..." << tuscany::endl;
+
+ tuscany::xml::testReadXML();
+ tuscany::xml::testWriteXML();
+ tuscany::xml::testElements();
+ tuscany::xml::testValues();
+ tuscany::xml::testReadWritePerf();
+ tuscany::xml::testReadWriteBigDocPerf();
+ tuscany::xml::testQuery();
+
+ tuscany::cout << "OK" << tuscany::endl;
+
+ return 0;
+}
diff --git a/sca-cpp/trunk/modules/xml/xml-test.hpp b/sca-cpp/trunk/modules/xml/xml-test.hpp
new file mode 100644
index 0000000000..470ba40880
--- /dev/null
+++ b/sca-cpp/trunk/modules/xml/xml-test.hpp
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* $Rev$ $Date$ */
+
+/**
+ * Test XML doc.
+ */
+
+namespace tuscany {
+namespace xml {
+
+const string testBigDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<feed><title>Search Results</title><id>search</id><entry><title>An empty app template</title><id>new</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>An empty test app</title><id>test</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Check my public social data</title><id>me360</id><author>admin@example.com</author><updated>Apr 28, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>nearme</title><id>nearme</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>nearme2</title><id>nearme2</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Our photos of an event</title><id>ourphotos</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>My online store</title><id>shoppingcart</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Slice</title><id>slice</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test animation components</title><id>testanimation</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test database components</title><id>testdb</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test event components</title><id>testevents</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test HTTP components</title><id>testhttp</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test logic components</title><id>testlogic</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test search components</title><id>testsearch</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test HTTP components</title><id>testhttp</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test social components</title><id>testsocial</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test text processing components</title><id>testtext</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test URL components</title><id>testurl</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test values and lists</title><id>testvalues</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test widgets</title><id>testwidgets</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test more widgets</title><id>testwidgets2</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test HTML generator components</title><id>testwidgets3</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>jsdtest</title><id>jsdtest</id><author>jsdelfino</author><updated>Jul 27, 2012</updated><content><stats><description>Test app</description></stats></content></entry><entry><title>SMS send service</title><id>twsms</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>boao</title><id>boao</id><author>jsdelfino</author><updated>2012-10-12T12:06:59+00:00</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>An empty test app</title><id>test</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>An empty app template</title><id>new</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>nearme</title><id>nearme</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>nearme2</title><id>nearme2</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Our photos of an event</title><id>ourphotos</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>My online store</title><id>shoppingcart</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Slice</title><id>slice</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test animation components</title><id>testanimation</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test database components</title><id>testdb</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test event components</title><id>testevents</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test social components</title><id>testsocial</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test HTTP components</title><id>testhttp</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test logic components</title><id>testlogic</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test search components</title><id>testsearch</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test HTTP components</title><id>testhttp</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test text processing components</title><id>testtext</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test URL components</title><id>testurl</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test values and lists</title><id>testvalues</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test widgets</title><id>testwidgets</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test more widgets</title><id>testwidgets2</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Test HTML generator components</title><id>testwidgets3</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>test9</title><id>test9</id><author>jsdelfino</author><updated>2012-09-25T06:17:18+00:00</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>SMS send service</title><id>twsms</id><author>admin@example.com</author><updated>Jan 01, 2012</updated><content><stats><description>Sample app</description></stats></content></entry><entry><title>Check my public social data</title><id>me360</id><author>admin@example.com</author><updated>Apr 28, 2012</updated><content><stats><description>Sample app</description></stats></content></entry></feed>\n";
+
+}
+}
+
diff --git a/sca-cpp/trunk/kernel/xml.hpp b/sca-cpp/trunk/modules/xml/xml.hpp
index d00a2905fb..0a04d5f90a 100644
--- a/sca-cpp/trunk/kernel/xml.hpp
+++ b/sca-cpp/trunk/modules/xml/xml.hpp
@@ -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<value>& listSoFar, XMLReader& reader) {
/**
* 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* buffer, int len) {
/**
* 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<string>& ilist) {
/**
* 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 list<value>& l, const xmlTextWriterPtr xml)
/**
* 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<value>& l, const xmlTextWriterPtr xml, boo
*/
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(void *context, const char* buffer, int le
/**
* 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> writeXML(const lambda<R(const string&, co
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 */
diff --git a/sca-cpp/trunk/kernel/xsd-test.cpp b/sca-cpp/trunk/modules/xml/xsd-test.cpp
index fbd2ee6dca..b10ad27379 100644
--- a/sca-cpp/trunk/kernel/xsd-test.cpp
+++ b/sca-cpp/trunk/modules/xml/xsd-test.cpp
@@ -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, const char *filename) {
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, const char *filename) {
}
-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;