aboutsummaryrefslogtreecommitdiff
path: root/examples/cxx/hybrid/binary/custom
diff options
context:
space:
mode:
Diffstat (limited to 'examples/cxx/hybrid/binary/custom')
-rw-r--r--examples/cxx/hybrid/binary/custom/README77
-rw-r--r--examples/cxx/hybrid/binary/custom/driver.cxx107
-rw-r--r--examples/cxx/hybrid/binary/custom/exceptions.cxx11
-rw-r--r--examples/cxx/hybrid/binary/custom/exceptions.hxx16
-rw-r--r--examples/cxx/hybrid/binary/custom/irawstream.cxx296
-rw-r--r--examples/cxx/hybrid/binary/custom/irawstream.hxx92
-rw-r--r--examples/cxx/hybrid/binary/custom/irawstream.ixx110
-rw-r--r--examples/cxx/hybrid/binary/custom/irawstream.txx72
-rw-r--r--examples/cxx/hybrid/binary/custom/library.xml53
-rw-r--r--examples/cxx/hybrid/binary/custom/library.xsd69
-rw-r--r--examples/cxx/hybrid/binary/custom/makefile138
-rw-r--r--examples/cxx/hybrid/binary/custom/orawstream.cxx224
-rw-r--r--examples/cxx/hybrid/binary/custom/orawstream.hxx91
-rw-r--r--examples/cxx/hybrid/binary/custom/orawstream.ixx110
-rw-r--r--examples/cxx/hybrid/binary/custom/orawstream.txx47
15 files changed, 1513 insertions, 0 deletions
diff --git a/examples/cxx/hybrid/binary/custom/README b/examples/cxx/hybrid/binary/custom/README
new file mode 100644
index 0000000..b7475d8
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/README
@@ -0,0 +1,77 @@
+This example shows how to save/load the C++/Hybrid object model to/from
+a custom format using the raw binary representation as an example. Note
+that if you would like to use this format in your applications, make sure
+that all the targets use exactly the same base type sizes (e.g., int, long,
+float, double, size_t, etc.) and byte order.
+
+The example consists of the following files:
+
+library.xsd
+ XML Schema which describes a library of books.
+
+library.xml
+ Sample XML instance document.
+
+xml-schema.hxx
+xml-schema-pskel.hxx
+xml-schema-sskel.hxx
+ Base object model types (the first file), parser skeletons (the second
+ file), and serializer skeletons (the third file) for the XML Schema
+ built-in types. These header files are generated by the XSD/e compiler
+ using the --generate-xml-schema option. The --generate-parser and
+ --generate-serializer options were also specified.
+
+irawstream.hxx
+irawstream.ixx
+irawstream.txx
+irawstream.cxx
+
+orawstream.hxx
+orawstream.ixx
+orawstream.txx
+orawstream.cxx
+ Implementation of the raw binary representation streams. The header
+ files include xml-schema.hxx to gain access to the base object model
+ types. You can use this implementation as a base for your custom
+ format.
+
+library.hxx
+library.cxx
+
+library-pskel.hxx
+library-pskel.cxx
+library-pimpl.hxx
+library-pimpl.cxx
+
+library-pskel.hxx
+library-pskel.cxx
+library-pimpl.hxx
+library-pimpl.cxx
+ Object model (the first pair of files), parser skeletons (the second
+ pair), parser implementations (the third pair), serializer skeletons
+ (the fourth pair), and serializer implementations (the fifth pair).
+ These files are generated by the XSD/e compiler from library.xsd. The
+ --generate-parser, --generate-serializer, and --generate-aggregate
+ options were used to request the generation of the parsing and
+ serialization code. The --generate-insertion and --generate-extraction
+ options were used to generate the insertion and extraction operations
+ for the orawstream and irawstream, respectively. The --hxx-prologue
+ option was used to include the orawstream.hxx and irawstream.hxx
+ header files at the beginning of library.hxx. Finally, the
+ --extern-xml-schema option was used to include xml-schema* files
+ instead of generating the same code directly.
+
+driver.cxx
+ Driver for the example. It first calls the parser that constructs
+ the object model from the input XML file. It then saves the object
+ model to the raw binary representation and loads it back. Finally,
+ the driver calls the serializer to serialize the loaded object model
+ back to XML.
+
+To run the example on the sample XML instance document simply execute:
+
+$ ./driver library.xml
+
+The example reads from STDIN if input file is not specified:
+
+$ ./driver <library.xml
diff --git a/examples/cxx/hybrid/binary/custom/driver.cxx b/examples/cxx/hybrid/binary/custom/driver.cxx
new file mode 100644
index 0000000..e453a37
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/driver.cxx
@@ -0,0 +1,107 @@
+// file : examples/cxx/hybrid/binary/custom/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+#include <memory> // std::auto_ptr
+#include <iostream>
+
+#include "orawstream.hxx"
+#include "irawstream.hxx"
+
+#include "library.hxx"
+#include "library-pimpl.hxx"
+#include "library-simpl.hxx"
+
+using std::cerr;
+using std::endl;
+
+int
+main (int argc, char* argv[])
+{
+ const char* input;
+
+ if (argc < 2)
+ {
+ input = "STDIN";
+ cerr << "XML file not specified, reading from STDIN" << endl;
+ }
+ else
+ input = argv[1];
+
+ try
+ {
+ using namespace library;
+
+ // Parse.
+ //
+ catalog_paggr catalog_p;
+
+ xml_schema::document_pimpl doc_p (
+ catalog_p.root_parser (),
+ catalog_p.root_namespace (),
+ catalog_p.root_name ());
+
+ catalog_p.pre ();
+
+ if (argc < 2)
+ doc_p.parse (std::cin);
+ else
+ doc_p.parse (argv[1]);
+
+ std::auto_ptr<catalog> c (catalog_p.post ());
+
+ // Save the object model to a RAW stream.
+ //
+ xml_schema::buffer buf;
+ orawstream oraw (buf);
+ oraw << *c;
+
+ cerr << "binary representation size: " << buf.size () << endl
+ << endl;
+
+ // Load the object model from a RAW stream.
+ //
+ irawstream iraw (buf);
+ std::auto_ptr<catalog> copy (new catalog);
+ iraw >> *copy;
+
+ // Serialize the copy back to XML.
+ //
+ catalog_saggr catalog_s;
+
+ xml_schema::document_simpl doc_s (
+ catalog_s.root_serializer (),
+ catalog_s.root_namespace (),
+ catalog_s.root_name ());
+
+ doc_s.add_prefix ("lib", "http://www.codesynthesis.com/library");
+ doc_s.add_schema ("http://www.codesynthesis.com/library", "library.xsd");
+
+ catalog_s.pre (*c);
+ doc_s.serialize (std::cout);
+ catalog_s.post ();
+ }
+ catch (const raw_exception&)
+ {
+ cerr << "RAW stream operation failed" << endl;
+ return 1;
+ }
+ catch (const xml_schema::parser_exception& e)
+ {
+ cerr << input << ":" << e.line () << ":" << e.column () << ": "
+ << e.text () << endl;
+ return 1;
+ }
+ catch (const xml_schema::serializer_exception& e)
+ {
+ cerr << "error: " << e.text () << endl;
+ return 1;
+ }
+ catch (const std::ios_base::failure&)
+ {
+ cerr << input << ": unable to open or read/write failure" << endl;
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/examples/cxx/hybrid/binary/custom/exceptions.cxx b/examples/cxx/hybrid/binary/custom/exceptions.cxx
new file mode 100644
index 0000000..0ad8c4b
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/exceptions.cxx
@@ -0,0 +1,11 @@
+// file : examples/cxx/hybrid/binary/custom/exceptions.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+#include "exceptions.hxx"
+
+const char* raw_exception::
+what () const throw ()
+{
+ return "RAW stream operation failed";
+}
diff --git a/examples/cxx/hybrid/binary/custom/exceptions.hxx b/examples/cxx/hybrid/binary/custom/exceptions.hxx
new file mode 100644
index 0000000..0111799
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/exceptions.hxx
@@ -0,0 +1,16 @@
+// file : examples/cxx/hybrid/binary/custom/exceptions.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+#ifndef EXCEPTIONS_HXX
+#define EXCEPTIONS_HXX
+
+#include <exception> // std::exception
+
+struct raw_exception: std::exception
+{
+ virtual const char*
+ what () const throw ();
+};
+
+#endif // EXCEPTIONS_HXX
diff --git a/examples/cxx/hybrid/binary/custom/irawstream.cxx b/examples/cxx/hybrid/binary/custom/irawstream.cxx
new file mode 100644
index 0000000..d3d6aae
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/irawstream.cxx
@@ -0,0 +1,296 @@
+// file : examples/cxx/hybrid/binary/custom/irawstream.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+#include <string.h> // memcpy
+
+#include "irawstream.hxx"
+
+using namespace xml_schema;
+
+const char* irawstream::
+align (size_t a, size_t n)
+{
+ size_t r = pos_ % a;
+
+ if (r)
+ n += a - r;
+
+ if (buf_.size () - pos_ < n)
+ throw raw_exception ();
+
+ const char* p = buf_.data () + pos_;
+
+ if (r)
+ p += a - r;
+
+ pos_ += n;
+ return p;
+}
+
+void irawstream::
+operator>> (std::string& x)
+{
+ size_t n = *reinterpret_cast<const size_t*> (
+ align (sizeof (size_t), sizeof (size_t)));
+
+ x.clear ();
+
+ if (n != 0)
+ {
+ x.resize (n);
+ memcpy (const_cast<char*> (x.c_str ()), align (1, n), n);
+ }
+}
+
+void irawstream::
+operator>> (buffer& x)
+{
+ size_t n = *reinterpret_cast<const size_t*> (
+ align (sizeof (size_t), sizeof (size_t)));
+
+ x.size (n);
+
+ if (n != 0)
+ memcpy (x.data (), align (1, n), n);
+}
+
+void
+operator>> (irawstream& s, str_seq& x)
+{
+ size_t n;
+ irawstream::as_size as_size (n);
+ s >> as_size;
+
+ x.clear ();
+
+ if (n > 0)
+ {
+ x.reserve (n);
+ std::string i;
+
+ while (n--)
+ {
+ s >> i;
+ x.push_back (i);
+ }
+ }
+}
+
+void
+operator>> (irawstream& s, qname& x)
+{
+ std::string p, n;
+
+ s >> p;
+ s >> n;
+
+ x.prefix (p);
+ x.name (n);
+}
+
+void
+operator>> (irawstream& s, time_zone& x)
+{
+ short h, m;
+ s >> h;
+ s >> m;
+
+ x.zone_hours (h);
+ x.zone_minutes (m);
+}
+
+void
+operator>> (irawstream& s, date& x)
+{
+ int y;
+ unsigned short m, d;
+ bool zp;
+
+ s >> y;
+ s >> m;
+ s >> d;
+ s >> zp;
+
+ x.year (y);
+ x.month (m);
+ x.day (d);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, date_time& x)
+{
+ int y;
+ unsigned short m, d, h, mi;
+ double se;
+ bool zp;
+
+ s >> y;
+ s >> m;
+ s >> d;
+ s >> h;
+ s >> mi;
+ s >> se;
+ s >> zp;
+
+ x.year (y);
+ x.month (m);
+ x.day (d);
+ x.hours (h);
+ x.minutes (mi);
+ x.seconds (se);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, duration& x)
+{
+ bool n;
+ unsigned int y, m, d, h, mi;
+ double se;
+
+ s >> n;
+ s >> y;
+ s >> m;
+ s >> d;
+ s >> h;
+ s >> mi;
+ s >> se;
+
+ x.negative (n);
+ x.years (y);
+ x.months (m);
+ x.days (d);
+ x.hours (h);
+ x.minutes (mi);
+ x.seconds (se);
+}
+
+void
+operator>> (irawstream& s, gday& x)
+{
+ unsigned short d;
+ bool zp;
+
+ s >> d;
+ s >> zp;
+
+ x.day (d);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, gmonth& x)
+{
+ unsigned short m;
+ bool zp;
+
+ s >> m;
+ s >> zp;
+
+ x.month (m);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, gmonth_day& x)
+{
+ unsigned short d, m;
+ bool zp;
+
+ s >> d;
+ s >> m;
+ s >> zp;
+
+ x.day (d);
+ x.month (m);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, gyear& x)
+{
+ int y;
+ bool zp;
+
+ s >> y;
+ s >> zp;
+
+ x.year (y);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, gyear_month& x)
+{
+ int y;
+ unsigned short m;
+ bool zp;
+
+ s >> y;
+ s >> m;
+ s >> zp;
+
+ x.year (y);
+ x.month (m);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, xml_schema::time& x)
+{
+ unsigned short h, m;
+ double se;
+ bool zp;
+
+ s >> h;
+ s >> m;
+ s >> se;
+ s >> zp;
+
+ x.hours (h);
+ x.minutes (m);
+ x.seconds (se);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
diff --git a/examples/cxx/hybrid/binary/custom/irawstream.hxx b/examples/cxx/hybrid/binary/custom/irawstream.hxx
new file mode 100644
index 0000000..94d2382
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/irawstream.hxx
@@ -0,0 +1,92 @@
+// file : examples/cxx/hybrid/binary/custom/irawstream.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+#ifndef IRAWSTREAM_HXX
+#define IRAWSTREAM_HXX
+
+#include <stddef.h> // size_t
+
+#include <string>
+
+#include "exceptions.hxx"
+#include "xml-schema.hxx"
+
+class irawstream
+{
+public:
+ explicit
+ irawstream (const xml_schema::buffer&, size_t start = 0);
+
+public:
+ struct as_size
+ {
+ explicit as_size (size_t& s) : s_ (s) {}
+ size_t& s_;
+ };
+
+public:
+ void operator>> (bool&);
+ void operator>> (signed char&);
+ void operator>> (unsigned char&);
+ void operator>> (short&);
+ void operator>> (unsigned short&);
+ void operator>> (int&);
+ void operator>> (unsigned int&);
+ void operator>> (long&);
+ void operator>> (unsigned long&);
+
+#ifdef XSDE_LONGLONG
+ void operator>> (long long&);
+ void operator>> (unsigned long long&);
+#endif
+
+ void operator>> (as_size&);
+ void operator>> (float&);
+ void operator>> (double&);
+
+ void operator>> (std::string&);
+ void operator>> (xml_schema::buffer&);
+
+private:
+ irawstream (const irawstream&);
+ irawstream& operator= (const irawstream&);
+
+public:
+ const char*
+ align (size_t alignment, size_t size);
+
+private:
+ const xml_schema::buffer& buf_;
+ size_t pos_;
+};
+
+void operator>> (irawstream&, xml_schema::any_type&);
+void operator>> (irawstream&, xml_schema::any_simple_type&);
+void operator>> (irawstream&, xml_schema::qname&);
+void operator>> (irawstream&, xml_schema::time_zone&);
+void operator>> (irawstream&, xml_schema::date&);
+void operator>> (irawstream&, xml_schema::date_time&);
+void operator>> (irawstream&, xml_schema::duration&);
+void operator>> (irawstream&, xml_schema::gday&);
+void operator>> (irawstream&, xml_schema::gmonth&);
+void operator>> (irawstream&, xml_schema::gmonth_day&);
+void operator>> (irawstream&, xml_schema::gyear&);
+void operator>> (irawstream&, xml_schema::gyear_month&);
+void operator>> (irawstream&, xml_schema::time&);
+
+void operator>> (irawstream&, xml_schema::str_seq&);
+
+template <typename T>
+void operator>> (irawstream&, xml_schema::pod_seq<T>&);
+
+template <typename T>
+void operator>> (irawstream&, xml_schema::fix_seq<T>&);
+
+template <typename T>
+void operator>> (irawstream&, xml_schema::var_seq<T>&);
+
+#include "irawstream.ixx"
+#include "irawstream.txx"
+
+#endif // IRAWSTREAM_HXX
diff --git a/examples/cxx/hybrid/binary/custom/irawstream.ixx b/examples/cxx/hybrid/binary/custom/irawstream.ixx
new file mode 100644
index 0000000..bc9ff9a
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/irawstream.ixx
@@ -0,0 +1,110 @@
+// file : examples/cxx/hybrid/binary/custom/irawstream.ixx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+inline irawstream::
+irawstream (const xml_schema::buffer& buf, size_t start)
+ : buf_ (buf), pos_ (start)
+{
+}
+
+inline void irawstream::
+operator>> (bool& x)
+{
+ x = *align (1, 1);
+}
+
+inline void irawstream::
+operator>> (signed char& x)
+{
+ x = *reinterpret_cast<const signed char*> (align (1, 1));
+}
+
+inline void irawstream::
+operator>> (unsigned char& x)
+{
+ x = *reinterpret_cast<const unsigned char*> (align (1, 1));
+}
+
+inline void irawstream::
+operator>> (short& x)
+{
+ x = *reinterpret_cast<const short*> (align (2, 2));
+}
+
+inline void irawstream::
+operator>> (unsigned short& x)
+{
+ x = *reinterpret_cast<const unsigned short*> (align (2, 2));
+}
+
+inline void irawstream::
+operator>> (int& x)
+{
+ x = *reinterpret_cast<const int*> (align (4, 4));
+}
+
+inline void irawstream::
+operator>> (unsigned int& x)
+{
+ x = *reinterpret_cast<const unsigned int*> (align (4, 4));
+}
+
+inline void irawstream::
+operator>> (long& x)
+{
+ x = *reinterpret_cast<const long*> (
+ align (sizeof (long), sizeof (long)));
+}
+
+inline void irawstream::
+operator>> (unsigned long& x)
+{
+ x = *reinterpret_cast<const unsigned long*> (
+ align (sizeof (unsigned long), sizeof (unsigned long)));
+}
+
+#ifdef XSDE_LONGLONG
+inline void irawstream::
+operator>> (long long& x)
+{
+ x = *reinterpret_cast<const long long*> (align (8, 8));
+}
+
+inline void irawstream::
+operator>> (unsigned long long& x)
+{
+ x = *reinterpret_cast<const unsigned long long*> (align (8, 8));
+}
+#endif
+
+inline void irawstream::
+operator>> (as_size& x)
+{
+ x.s_ = *reinterpret_cast<const size_t*> (
+ align (sizeof (size_t), sizeof (size_t)));
+}
+
+inline void irawstream::
+operator>> (float& x)
+{
+ x = *reinterpret_cast<const float*> (
+ align (sizeof (float), sizeof (float)));
+}
+
+inline void irawstream::
+operator>> (double& x)
+{
+ x = *reinterpret_cast<const double*> (
+ align (sizeof (double), sizeof (double)));
+}
+
+inline void
+operator>> (irawstream&, xml_schema::any_type&)
+{
+}
+
+inline void
+operator>> (irawstream&, xml_schema::any_simple_type&)
+{
+}
diff --git a/examples/cxx/hybrid/binary/custom/irawstream.txx b/examples/cxx/hybrid/binary/custom/irawstream.txx
new file mode 100644
index 0000000..2d4965e
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/irawstream.txx
@@ -0,0 +1,72 @@
+// file : examples/cxx/hybrid/binary/custom/irawostream.txx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+#include <string.h> // memcpy
+
+template <typename T>
+void
+operator>> (irawstream& s, xml_schema::pod_seq<T>& x)
+{
+ size_t n;
+ irawstream::as_size as_size (n);
+ s >> as_size;
+
+ x.clear ();
+
+ if (n > 0)
+ {
+ x.reserve (n);
+ size_t mn = sizeof (T) * n;
+ memcpy (x.data_, s.align (sizeof (T), mn), mn);
+ x.size_ = n;
+ }
+}
+
+template <typename T>
+void
+operator>> (irawstream& s, xml_schema::fix_seq<T>& x)
+{
+ size_t n;
+ irawstream::as_size as_size (n);
+ s >> as_size;
+
+ x.clear ();
+
+ if (n > 0)
+ {
+ x.reserve (n);
+
+ while (n--)
+ {
+ T i;
+ s >> i;
+ x.push_back (i);
+ }
+ }
+}
+
+template <typename T>
+void
+operator>> (irawstream& s, xml_schema::var_seq<T>& x)
+{
+ size_t n;
+ irawstream::as_size as_size (n);
+ s >> as_size;
+
+ x.clear ();
+
+ if (n > 0)
+ {
+ x.reserve (n);
+
+ while (n--)
+ {
+ T* p = new T;
+ typename xml_schema::var_seq<T>::guard g (p);
+ s >> *p;
+ g.release ();
+ x.push_back (p);
+ }
+ }
+}
diff --git a/examples/cxx/hybrid/binary/custom/library.xml b/examples/cxx/hybrid/binary/custom/library.xml
new file mode 100644
index 0000000..e93bab4
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/library.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0"?>
+
+<!--
+
+file : examples/cxx/hybrid/binary/custom/library.xml
+author : Boris Kolpackov <boris@codesynthesis.com>
+copyright : not copyrighted - public domain
+
+-->
+
+<lib:catalog xmlns:lib="http://www.codesynthesis.com/library"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.codesynthesis.com/library library.xsd">
+
+ <book available="false">
+ <isbn>0679760806</isbn>
+ <title>The Master and Margarita</title>
+ <genre>fiction</genre>
+
+ <author>
+ <name>Mikhail Bulgakov</name>
+ <born>1891-05-15</born>
+ <died>1940-03-10</died>
+ </author>
+ </book>
+
+
+ <book available="true" >
+ <isbn>0679600841</isbn>
+ <title>War and Peace</title>
+ <genre>history</genre>
+
+ <author>
+ <name>Leo Tolstoy</name>
+ <born>1828-09-09</born>
+ <died>1910-11-20</died>
+ </author>
+ </book>
+
+
+ <book available="false">
+ <isbn>0679420290</isbn>
+ <title>Crime and Punishment</title>
+ <genre>philosophy</genre>
+
+ <author>
+ <name>Fyodor Dostoevsky</name>
+ <born>1821-11-11</born>
+ <died>1881-02-09</died>
+ </author>
+ </book>
+
+</lib:catalog>
diff --git a/examples/cxx/hybrid/binary/custom/library.xsd b/examples/cxx/hybrid/binary/custom/library.xsd
new file mode 100644
index 0000000..7b75c2d
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/library.xsd
@@ -0,0 +1,69 @@
+<?xml version="1.0"?>
+
+<!--
+
+file : examples/cxx/hybrid/binary/custom/library.xsd
+author : Boris Kolpackov <boris@codesynthesis.com>
+copyright : not copyrighted - public domain
+
+-->
+
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:lib="http://www.codesynthesis.com/library"
+ targetNamespace="http://www.codesynthesis.com/library">
+
+ <xsd:simpleType name="isbn">
+ <xsd:restriction base="xsd:unsignedInt"/>
+ </xsd:simpleType>
+
+
+ <xsd:complexType name="title">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="lang" type="xsd:string"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+
+ <xsd:simpleType name="genre">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="romance"/>
+ <xsd:enumeration value="fiction"/>
+ <xsd:enumeration value="horror"/>
+ <xsd:enumeration value="history"/>
+ <xsd:enumeration value="philosophy"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+
+ <xsd:complexType name="author">
+ <xsd:sequence>
+ <xsd:element name="name" type="xsd:string"/>
+ <xsd:element name="born" type="xsd:date"/>
+ <xsd:element name="died" type="xsd:date" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+
+ <xsd:complexType name="book">
+ <xsd:sequence>
+ <xsd:element name="isbn" type="lib:isbn"/>
+ <xsd:element name="title" type="lib:title"/>
+ <xsd:element name="genre" type="lib:genre"/>
+ <xsd:element name="author" type="lib:author" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="available" type="xsd:boolean" use="required"/>
+ </xsd:complexType>
+
+
+ <xsd:complexType name="catalog">
+ <xsd:sequence>
+ <xsd:element name="book" type="lib:book" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+
+ <xsd:element name="catalog" type="lib:catalog"/>
+
+</xsd:schema>
diff --git a/examples/cxx/hybrid/binary/custom/makefile b/examples/cxx/hybrid/binary/custom/makefile
new file mode 100644
index 0000000..7ab91d0
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/makefile
@@ -0,0 +1,138 @@
+# file : examples/cxx/hybrid/binary/custom/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+# license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../build/bootstrap.make
+
+xsd := library.xsd
+cxx := driver.cxx exceptions.cxx orawstream.cxx irawstream.cxx
+
+obj := $(addprefix $(out_base)/,\
+$(cxx:.cxx=.o) \
+$(xsd:.xsd=.o) \
+$(xsd:.xsd=-pskel.o) \
+$(xsd:.xsd=-pimpl.o) \
+$(xsd:.xsd=-sskel.o) \
+$(xsd:.xsd=-simpl.o))
+
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+dist := $(out_base)/.dist
+dist-win := $(out_base)/.dist-win
+clean := $(out_base)/.clean
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+genf := $(xsd:.xsd=.hxx) $(xsd:.xsd=.cxx) \
+ $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.cxx) \
+ $(xsd:.xsd=-pimpl.hxx) $(xsd:.xsd=-pimpl.cxx) \
+ $(xsd:.xsd=-sskel.hxx) $(xsd:.xsd=-sskel.cxx) \
+ $(xsd:.xsd=-simpl.hxx) $(xsd:.xsd=-simpl.cxx)
+
+gen := $(addprefix $(out_base)/,$(genf))
+
+$(gen): $(out_root)/xsde/xsde
+$(gen): xsde := $(out_root)/xsde/xsde
+$(gen): xsde_options += --generate-parser --generate-serializer \
+--generate-aggregate --extern-xml-schema xml-schema.xsd \
+--generate-insertion orawstream --hxx-prologue '\\\#include "orawstream.hxx"' \
+--generate-extraction irawstream --hxx-prologue '\\\#include "irawstream.hxx"'
+
+# Header files for XML Schema namespace.
+#
+$(out_base)/xml-schema%hxx \
+$(out_base)/xml-schema-pskel%hxx \
+$(out_base)/xml-schema-sskel%hxx: $(out_root)/xsde/xsde
+ $(call message,xsde $(src_base)/xml-schema.xsd,\
+$(out_root)/xsde/xsde cxx-hybrid --output-dir $(out_base) \
+--generate-xml-schema --generate-parser --generate-serializer xml-schema.xsd)
+
+genf += xml-schema.hxx xml-schema-pskel.hxx xml-schema-sskel.hxx
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Dist.
+#
+dist-common := $(out_base)/.dist-common
+
+.PHONY: $(dist) $(dist-win) $(dist-common)
+
+$(dist) $(dist-win) $(dist-common): path := $(subst $(src_root)/,,$(src_base))
+
+$(dist-common):
+ $(call install-data,$(src_base)/driver.cxx,$(dist_prefix)/$(path)/driver.cxx)
+ $(call install-data,$(src_base)/exceptions.cxx,$(dist_prefix)/$(path)/exceptions.cxx)
+ $(call install-data,$(src_base)/exceptions.hxx,$(dist_prefix)/$(path)/exceptions.hxx)
+ $(call install-data,$(src_base)/orawstream.hxx,$(dist_prefix)/$(path)/orawstream.hxx)
+ $(call install-data,$(src_base)/orawstream.ixx,$(dist_prefix)/$(path)/orawstream.ixx)
+ $(call install-data,$(src_base)/orawstream.txx,$(dist_prefix)/$(path)/orawstream.txx)
+ $(call install-data,$(src_base)/orawstream.cxx,$(dist_prefix)/$(path)/orawstream.cxx)
+ $(call install-data,$(src_base)/irawstream.hxx,$(dist_prefix)/$(path)/irawstream.hxx)
+ $(call install-data,$(src_base)/irawstream.ixx,$(dist_prefix)/$(path)/irawstream.ixx)
+ $(call install-data,$(src_base)/irawstream.txx,$(dist_prefix)/$(path)/irawstream.txx)
+ $(call install-data,$(src_base)/irawstream.cxx,$(dist_prefix)/$(path)/irawstream.cxx)
+ $(call install-data,$(src_base)/library.xsd,$(dist_prefix)/$(path)/library.xsd)
+ $(call install-data,$(src_base)/library.xml,$(dist_prefix)/$(path)/library.xml)
+
+$(dist): $(dist-common)
+ $(call install-data,$(src_base)/README,$(dist_prefix)/$(path)/README)
+
+$(dist-win): $(dist-common)
+ $(call install-data,$(src_base)/README,$(dist_prefix)/$(path)/README.txt)
+ $(call message,,unix2dos $(dist_prefix)/$(path)/README.txt)
+
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=.cxx.xsd.clean))
+ $(call message,rm $$1,rm -f $$1,$(out_base)/xml-schema.hxx)
+ $(call message,rm $$1,rm -f $$1,$(out_base)/xml-schema-pskel.hxx)
+ $(call message,rm $$1,rm -f $$1,$(out_base)/xml-schema-sskel.hxx)
+
+
+# Generated .gitignore.
+#
+ifeq ($(out_base),$(src_base))
+$(gen): | $(out_base)/.gitignore
+$(driver): | $(out_base)/.gitignore
+
+$(out_base)/.gitignore: files := driver $(genf)
+$(clean): $(out_base)/.gitignore.clean
+
+$(call include,$(bld_root)/git/gitignore.make)
+endif
+
+
+# How to.
+#
+$(call include,$(bld_root)/cxx/o-e.make)
+$(call include,$(bld_root)/cxx/cxx-o.make)
+$(call include,$(bld_root)/cxx/cxx-d.make)
+$(call include,$(bld_root)/install.make)
+$(call include,$(scf_root)/xsde/hybrid/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/examples/cxx/hybrid/binary/custom/orawstream.cxx b/examples/cxx/hybrid/binary/custom/orawstream.cxx
new file mode 100644
index 0000000..dc4b477
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/orawstream.cxx
@@ -0,0 +1,224 @@
+// file : examples/cxx/hybrid/binary/custom/orawstream.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+#include <string.h> // memcpy
+
+#include "orawstream.hxx"
+
+using namespace xml_schema;
+
+char* orawstream::
+align (size_t a, size_t n)
+{
+ size_t s = buf_.size ();
+ size_t c = buf_.capacity ();
+ size_t r = s % a;
+
+ if (r)
+ n += a - r;
+
+ if (c - s < n)
+ {
+ // Do exponential growth.
+ //
+ size_t nc = s + n;
+ c *= 2;
+
+ if (nc < c)
+ nc = c;
+
+ buf_.capacity (nc);
+ }
+
+ char* p = buf_.data () + s;
+
+ if (r)
+ p += a - r;
+
+ buf_.size (s + n);
+ return p;
+}
+
+void orawstream::
+operator<< (const std::string& x)
+{
+ size_t n = x.length ();
+ char* p = align (sizeof (size_t), sizeof (size_t) + n);
+
+ *reinterpret_cast<size_t*> (p) = n;
+ p += sizeof (size_t);
+ memcpy (p, x.c_str (), n);
+}
+
+void orawstream::
+operator<< (const buffer& x)
+{
+ size_t n = x.size ();
+ char* p = align (sizeof (size_t), sizeof (size_t) + n);
+
+ *reinterpret_cast<size_t*> (p) = n;
+ p += sizeof (size_t);
+ memcpy (p, x.data (), n);
+}
+
+void
+operator<< (orawstream& s, const str_seq& x)
+{
+ s << orawstream::as_size (x.size ());
+
+ for (str_seq::const_iterator i = x.begin ();
+ i != x.end (); ++i)
+ {
+ s << *i;
+ }
+}
+
+void
+operator<< (orawstream& s, const qname& x)
+{
+ s << x.prefix ();
+ s << x.name ();
+}
+
+void
+operator<< (orawstream& s, const time_zone& x)
+{
+ s << x.zone_hours ();
+ s << x.zone_minutes ();
+}
+
+void
+operator<< (orawstream& s, const date& x)
+{
+ s << x.year ();
+ s << x.month ();
+ s << x.day ();
+ bool zp = x.zone_present ();
+ s << zp;
+
+ if (zp)
+ {
+ const time_zone& z = x;
+ s << z;
+ }
+}
+
+void
+operator<< (orawstream& s, const date_time& x)
+{
+ s << x.year ();
+ s << x.month ();
+ s << x.day ();
+ s << x.hours ();
+ s << x.minutes ();
+ s << x.seconds ();
+ bool zp = x.zone_present ();
+ s << zp;
+
+ if (zp)
+ {
+ const time_zone& z = x;
+ s << z;
+ }
+}
+
+void
+operator<< (orawstream& s, const duration& x)
+{
+ s << x.negative ();
+ s << x.years ();
+ s << x.months ();
+ s << x.days ();
+ s << x.hours ();
+ s << x.minutes ();
+ s << x.seconds ();
+}
+
+void
+operator<< (orawstream& s, const gday& x)
+{
+ s << x.day ();
+ bool zp = x.zone_present ();
+ s << zp;
+
+ if (zp)
+ {
+ const time_zone& z = x;
+ s << z;
+ }
+}
+
+void
+operator<< (orawstream& s, const gmonth& x)
+{
+ s << x.month ();
+ bool zp = x.zone_present ();
+ s << zp;
+
+ if (zp)
+ {
+ const time_zone& z = x;
+ s << z;
+ }
+}
+
+void
+operator<< (orawstream& s, const gmonth_day& x)
+{
+ s << x.month ();
+ s << x.day ();
+ bool zp = x.zone_present ();
+ s << zp;
+
+ if (zp)
+ {
+ const time_zone& z = x;
+ s << z;
+ }
+}
+
+void
+operator<< (orawstream& s, const gyear& x)
+{
+ s << x.year ();
+ bool zp = x.zone_present ();
+ s << zp;
+
+ if (zp)
+ {
+ const time_zone& z = x;
+ s << z;
+ }
+}
+
+void
+operator<< (orawstream& s, const gyear_month& x)
+{
+ s << x.year ();
+ s << x.month ();
+ bool zp = x.zone_present ();
+ s << zp;
+
+ if (zp)
+ {
+ const time_zone& z = x;
+ s << z;
+ }
+}
+
+void
+operator<< (orawstream& s, const xml_schema::time& x)
+{
+ s << x.hours ();
+ s << x.minutes ();
+ s << x.seconds ();
+ bool zp = x.zone_present ();
+ s << zp;
+
+ if (zp)
+ {
+ const time_zone& z = x;
+ s << z;
+ }
+}
diff --git a/examples/cxx/hybrid/binary/custom/orawstream.hxx b/examples/cxx/hybrid/binary/custom/orawstream.hxx
new file mode 100644
index 0000000..9689e61
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/orawstream.hxx
@@ -0,0 +1,91 @@
+// file : examples/cxx/hybrid/binary/custom/orawstream.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+#ifndef ORAWSTREAM_HXX
+#define ORAWSTREAM_HXX
+
+#include <stddef.h> // size_t
+
+#include <string>
+
+#include "exceptions.hxx"
+#include "xml-schema.hxx"
+
+class orawstream
+{
+public:
+ explicit
+ orawstream (xml_schema::buffer&);
+
+public:
+ struct as_size
+ {
+ explicit as_size (size_t s) : s_ (s) {}
+ size_t s_;
+ };
+
+public:
+ void operator<< (bool);
+ void operator<< (signed char);
+ void operator<< (unsigned char);
+ void operator<< (short);
+ void operator<< (unsigned short);
+ void operator<< (int);
+ void operator<< (unsigned int);
+ void operator<< (long);
+ void operator<< (unsigned long);
+
+#ifdef XSDE_LONGLONG
+ void operator<< (long long);
+ void operator<< (unsigned long long);
+#endif
+
+ void operator<< (as_size);
+ void operator<< (float);
+ void operator<< (double);
+
+ void operator<< (const std::string&);
+ void operator<< (const xml_schema::buffer&);
+
+private:
+ orawstream (const orawstream&);
+ orawstream& operator= (const orawstream&);
+
+public:
+ char*
+ align (size_t alignment, size_t size);
+
+private:
+ xml_schema::buffer& buf_;
+};
+
+void operator<< (orawstream&, const xml_schema::any_type&);
+void operator<< (orawstream&, const xml_schema::any_simple_type&);
+void operator<< (orawstream&, const xml_schema::qname&);
+void operator<< (orawstream&, const xml_schema::time_zone&);
+void operator<< (orawstream&, const xml_schema::date&);
+void operator<< (orawstream&, const xml_schema::date_time&);
+void operator<< (orawstream&, const xml_schema::duration&);
+void operator<< (orawstream&, const xml_schema::gday&);
+void operator<< (orawstream&, const xml_schema::gmonth&);
+void operator<< (orawstream&, const xml_schema::gmonth_day&);
+void operator<< (orawstream&, const xml_schema::gyear&);
+void operator<< (orawstream&, const xml_schema::gyear_month&);
+void operator<< (orawstream&, const xml_schema::time&);
+
+void operator<< (orawstream&, const xml_schema::str_seq&);
+
+template <typename T>
+void operator<< (orawstream&, const xml_schema::pod_seq<T>&);
+
+template <typename T>
+void operator<< (orawstream&, const xml_schema::fix_seq<T>&);
+
+template <typename T>
+void operator<< (orawstream&, const xml_schema::var_seq<T>&);
+
+#include "orawstream.ixx"
+#include "orawstream.txx"
+
+#endif // ORAWSTREAM_HXX
diff --git a/examples/cxx/hybrid/binary/custom/orawstream.ixx b/examples/cxx/hybrid/binary/custom/orawstream.ixx
new file mode 100644
index 0000000..577eb1b
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/orawstream.ixx
@@ -0,0 +1,110 @@
+// file : examples/cxx/hybrid/binary/custom/orawstream.ixx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+inline orawstream::
+orawstream (xml_schema::buffer& buf)
+ : buf_ (buf)
+{
+}
+
+inline void orawstream::
+operator<< (bool x)
+{
+ *align (1, 1) = x;
+}
+
+inline void orawstream::
+operator<< (signed char x)
+{
+ *reinterpret_cast<signed char*> (align (1, 1)) = x;
+}
+
+inline void orawstream::
+operator<< (unsigned char x)
+{
+ *reinterpret_cast<unsigned char*> (align (1, 1)) = x;
+}
+
+inline void orawstream::
+operator<< (short x)
+{
+ *reinterpret_cast<short*> (align (2, 2)) = x;
+}
+
+inline void orawstream::
+operator<< (unsigned short x)
+{
+ *reinterpret_cast<unsigned short*> (align (2, 2)) = x;
+}
+
+inline void orawstream::
+operator<< (int x)
+{
+ *reinterpret_cast<int*> (align (4, 4)) = x;
+}
+
+inline void orawstream::
+operator<< (unsigned int x)
+{
+ *reinterpret_cast<unsigned int*> (align (4, 4)) = x;
+}
+
+inline void orawstream::
+operator<< (long x)
+{
+ *reinterpret_cast<long*> (
+ align (sizeof (long), sizeof (long))) = x;
+}
+
+inline void orawstream::
+operator<< (unsigned long x)
+{
+ *reinterpret_cast<unsigned long*> (
+ align (sizeof (unsigned long), sizeof (unsigned long))) = x;
+}
+
+#ifdef XSDE_LONGLONG
+inline void orawstream::
+operator<< (long long x)
+{
+ *reinterpret_cast<long long*> (align (8, 8)) = x;
+}
+
+inline void orawstream::
+operator<< (unsigned long long x)
+{
+ *reinterpret_cast<unsigned long long*> (align (8, 8)) = x;
+}
+#endif
+
+inline void orawstream::
+operator<< (as_size x)
+{
+ *reinterpret_cast<size_t*> (
+ align (sizeof (size_t), sizeof (size_t))) = x.s_;
+}
+
+inline void orawstream::
+operator<< (float x)
+{
+ *reinterpret_cast<float*> (
+ align (sizeof (float), sizeof (float))) = x;
+}
+
+inline void orawstream::
+operator<< (double x)
+{
+ *reinterpret_cast<double*> (
+ align (sizeof (double), sizeof (double))) = x;
+}
+
+inline void
+operator<< (orawstream&, const xml_schema::any_type&)
+{
+}
+
+inline void
+operator<< (orawstream&, const xml_schema::any_simple_type&)
+{
+}
diff --git a/examples/cxx/hybrid/binary/custom/orawstream.txx b/examples/cxx/hybrid/binary/custom/orawstream.txx
new file mode 100644
index 0000000..46c5b71
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/orawstream.txx
@@ -0,0 +1,47 @@
+// file : examples/cxx/hybrid/binary/custom/orawostream.txx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+#include <string.h> // memcpy
+
+template <typename T>
+void
+operator<< (orawstream& s, const xml_schema::pod_seq<T>& x)
+{
+ size_t n = x.size ();
+
+ s << orawstream::as_size (x.size ());
+
+ if (n != 0)
+ {
+ size_t mn = sizeof (T) * n;
+ char* p = s.align (sizeof (T), mn);
+ memcpy (p, x.begin (), mn);
+ }
+}
+
+template <typename T>
+void
+operator<< (orawstream& s, const xml_schema::fix_seq<T>& x)
+{
+ s << orawstream::as_size (x.size ());
+
+ for (typename xml_schema::fix_seq<T>::const_iterator i = x.begin ();
+ i != x.end (); ++i)
+ {
+ s << *i;
+ }
+}
+
+template <typename T>
+void
+operator<< (orawstream& s, const xml_schema::var_seq<T>& x)
+{
+ s << orawstream::as_size (x.size ());
+
+ for (typename xml_schema::var_seq<T>::const_iterator i = x.begin ();
+ i != x.end (); ++i)
+ {
+ s << *i;
+ }
+}