blob: 4fd3b47cd8cb49b94e4fc59f7358ed12dabe8768 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
// file : examples/cxx/parser/polymorphism/driver.cxx
// copyright : not copyrighted - public domain
#include <iostream>
#include "supermen-pskel.hxx" // Get the configuration macros (XSDE_*).
#if defined(XSDE_REUSE_STYLE_MIXIN)
# include "supermen-pimpl-mixin.hxx"
#elif defined(XSDE_REUSE_STYLE_TIEIN)
# include "supermen-pimpl-tiein.hxx"
#else
# error this example requires mixin or tiein parser reuse support
#endif
using std::cerr;
using std::endl;
int
main (int argc, char* argv[])
{
// Check that the load in substitution and inheritance hashmaps
// is not too high.
//
#ifndef NDEBUG
float load = (float) xml_schema::parser_smap_elements ();
load /= xml_schema::parser_smap_buckets ();
if (load > 0.8)
{
cerr << "substitution hashmap load is " << load << endl;
cerr << "time to increase XSDE_PARSER_SMAP_BUCKETS" << endl;
}
#ifdef XSDE_PARSER_VALIDATION
load = (float) xml_schema::parser_imap_elements ();
load /= xml_schema::parser_imap_buckets ();
if (load > 0.8)
{
cerr << "inheritance hashmap load is " << load << endl;
cerr << "time to increase XSDE_PARSER_IMAP_BUCKETS" << endl;
}
#endif
#endif
const char* input;
if (argc < 2)
{
input = "STDIN";
cerr << "XML file not specified, reading from STDIN" << endl;
}
else
input = argv[1];
try
{
// Construct the parser.
//
xml_schema::string_pimpl string_p;
xml_schema::boolean_pimpl boolean_p;
xml_schema::unsigned_int_pimpl unsigned_int_p;
person_pimpl person_p;
superman_pimpl superman_p;
batman_pimpl batman_p;
xml_schema::parser_map_impl person_map (5); // 5 hashtable buckets
supermen_pimpl supermen_p;
person_p.parsers (string_p);
superman_p.parsers (string_p, boolean_p);
batman_p.parsers (string_p, boolean_p, unsigned_int_p);
// Here we are specifying several parsers that can be
// used to parse the person element.
//
person_map.insert (person_p);
person_map.insert (superman_p);
person_map.insert (batman_p);
supermen_p.person_parser (person_map);
// Parse the XML document. The last argument to the document's
// constructor indicates that we are parsing polymorphic XML
// documents.
//
xml_schema::document_pimpl doc_p (supermen_p, "supermen", true);
supermen_p.pre ();
if (argc < 2)
doc_p.parse (std::cin);
else
doc_p.parse (argv[1]);
supermen_p.post_supermen ();
}
catch (const xml_schema::parser_exception& e)
{
cerr << input << ":" << e.line () << ":" << e.column () << ": "
<< e.text () << endl;
return 1;
}
catch (const std::ios_base::failure&)
{
cerr << input << ": unable to open or read failure" << endl;
return 1;
}
return 0;
}
|