aboutsummaryrefslogtreecommitdiff
path: root/examples/cxx/hybrid/minimal/driver.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'examples/cxx/hybrid/minimal/driver.cxx')
-rw-r--r--examples/cxx/hybrid/minimal/driver.cxx265
1 files changed, 265 insertions, 0 deletions
diff --git a/examples/cxx/hybrid/minimal/driver.cxx b/examples/cxx/hybrid/minimal/driver.cxx
new file mode 100644
index 0000000..e876b6f
--- /dev/null
+++ b/examples/cxx/hybrid/minimal/driver.cxx
@@ -0,0 +1,265 @@
+// file : examples/cxx/hybrid/minimal/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+#include <stdio.h>
+
+#include "people.hxx"
+
+#include "people-pimpl.hxx"
+#include "people-simpl.hxx"
+
+using namespace std;
+
+// eVC++ 4.0 does not like using xml_schema::strdupx;
+//
+inline char*
+strdupx (const char* s)
+{
+ return xml_schema::strdupx (s);
+}
+
+struct writer: xml_schema::writer
+{
+ virtual bool
+ write (const char* s, size_t n)
+ {
+ return fwrite (s, n, 1, stdout) == 1;
+ }
+
+ virtual bool
+ flush ()
+ {
+ return fflush (stdout) == 0;
+ }
+};
+
+int
+main (int argc, char* argv[])
+{
+ const char* input;
+
+ if (argc < 2)
+ {
+ input = "STDIN";
+ fprintf (stderr, "XML file not specified, reading from STDIN\n");
+ }
+ else
+ input = argv[1];
+
+ // Open the file or use STDIN.
+ //
+ FILE* f = argc > 1 ? fopen (argv[1], "rb") : stdin;
+
+ if (f == 0)
+ {
+ fprintf (stderr, "%s: unable to open\n", input);
+ return 1;
+ }
+
+ // Parse.
+ //
+ using xml_schema::parser_error;
+
+ parser_error pe;
+ bool io_error = false;
+ people* ppl = 0;
+
+ do
+ {
+ people_paggr people_p;
+ xml_schema::document_pimpl doc_p (people_p.root_parser (),
+ people_p.root_name ());
+
+ if (pe = doc_p._error ())
+ break;
+
+ people_p.pre ();
+
+ if (pe = people_p._error ())
+ break;
+
+ char buf[4096];
+
+ do
+ {
+ size_t s = fread (buf, 1, sizeof (buf), f);
+
+ if (s != sizeof (buf) && ferror (f))
+ {
+ io_error = true;
+ break;
+ }
+
+ doc_p.parse (buf, s, feof (f) != 0);
+ pe = doc_p._error ();
+
+ } while (!pe && !feof (f));
+
+ if (io_error || pe)
+ break;
+
+ ppl = people_p.post ();
+
+ pe = people_p._error ();
+
+ } while (false);
+
+ if (argc > 1)
+ fclose (f);
+
+ // Handle parsing errors.
+ //
+ if (io_error)
+ {
+ fprintf (stderr, "%s: read failure\n", input);
+ return 1;
+ }
+
+ if (pe)
+ {
+ switch (pe.type ())
+ {
+ case parser_error::sys:
+ {
+ fprintf (stderr, "%s: %s\n", input, pe.sys_text ());
+ break;
+ }
+ case parser_error::xml:
+ {
+ fprintf (stderr, "%s:%lu:%lu: %s\n",
+ input, pe.line (), pe.column (), pe.xml_text ());
+ break;
+ }
+#ifdef XSDE_PARSER_VALIDATION
+ case parser_error::schema:
+ {
+ fprintf (stderr, "%s:%lu:%lu: %s\n",
+ input, pe.line (), pe.column (), pe.schema_text ());
+ break;
+ }
+#endif
+ case parser_error::app:
+ {
+ fprintf (stderr, "%s:%lu:%lu: application error %d\n",
+ input, pe.line (), pe.column (), pe.app_code ());
+ break;
+ }
+ default:
+ break;
+ }
+
+ return 1;
+ }
+
+ // Print what we've got.
+ //
+ people::person_sequence& ps = ppl->person ();
+
+ for (people::person_const_iterator i = ps.begin (); i != ps.end (); ++i)
+ {
+ printf ("first: %s\n" "last: %s\n" "gender: %s\n" "age: %hu\n\n",
+ i->first_name (),
+ i->last_name (),
+ i->gender ().base_value (),
+ i->age ());
+ }
+
+ // Remove people that are younger than 30.
+ //
+ for (people::person_iterator j = ps.begin (); j != ps.end ();)
+ {
+ if (j->age () < 30)
+ j = ps.erase (j);
+ else
+ ++j;
+ }
+
+ // Insert a new person.
+ //
+ {
+ person* p = new person;
+ p->first_name (strdupx ("Joe"));
+ p->last_name (strdupx ("Dirt"));
+ p->age (36);
+
+ gender* g = new gender;
+ g->base_value (strdupx ("male"));
+ p->gender (g);
+
+ ps.insert (ps.begin (), p);
+ }
+
+ // Serialize.
+ //
+ using xml_schema::serializer_error;
+
+ serializer_error se;
+ writer w;
+
+ do
+ {
+ people_saggr people_s;
+ xml_schema::document_simpl doc_s (people_s.root_serializer (),
+ people_s.root_name ());
+
+ doc_s.add_no_namespace_schema ("people.xsd");
+
+ if (se = doc_s._error ())
+ break;
+
+ people_s.pre (*ppl);
+
+ if (se = people_s._error ())
+ break;
+
+ doc_s.serialize (w);
+
+ if (se = doc_s._error ())
+ break;
+
+ people_s.post ();
+
+ se = people_s._error ();
+
+ } while (false);
+
+ delete ppl;
+
+ // Handle serializer errors.
+ //
+ if (se)
+ {
+ switch (se.type ())
+ {
+ case serializer_error::sys:
+ {
+ fprintf (stderr, "error: %s\n", se.sys_text ());
+ break;
+ }
+ case serializer_error::xml:
+ {
+ fprintf (stderr, "error: %s\n", se.xml_text ());
+ break;
+ }
+#ifdef XSDE_SERIALIZER_VALIDATION
+ case serializer_error::schema:
+ {
+ fprintf (stderr, "error: %s\n", se.schema_text ());
+ break;
+ }
+#endif
+ case serializer_error::app:
+ {
+ fprintf (stderr, "application error: %d\n", se.app_code ());
+ break;
+ }
+ default:
+ break;
+ }
+
+ return 1;
+ }
+
+ return 0;
+}