39static const not_used char *states[] = {
"START",
"FINISH",
"AIS",
"ENTRY",
"PRIMARY",
"ANCILLARY",
"UNKNOWN",
"ERROR"};
52 state->state = PARSER_START;
53 state->unknown_depth = 0;
54 state->prev_state = PARSER_UNKNOWN;
55 state->error_msg =
"";
57 DBG2(cerr <<
"Parser state: " << states[state->state] << endl);
63 DBG2(cerr <<
"Ending state == " << states[state->state] << endl);
65 if (state->unknown_depth != 0) {
68 DBG(cerr <<
"unknown_depth != 0 (" << state->unknown_depth <<
")" << endl);
81 switch (state->state) {
83 if (strcmp(name,
"ais") != 0) {
84 DBG(cerr <<
"Expecting ais. Got " << name << endl);
93 if (strcmp(name,
"entry") == 0) {
94 state->prev_state = state->state;
97 state->prev_state = state->state;
98 state->state = PARSER_UNKNOWN;
99 state->unknown_depth++;
104 if (strcmp(name,
"primary") == 0) {
105 state->prev_state = state->state;
106 state->state = PRIMARY;
109 if (strcmp(attrs[0],
"url") == 0) {
110 state->regexp =
false;
111 state->primary = attrs[1];
112 }
else if (strcmp(attrs[0],
"regexp") == 0) {
113 state->regexp =
true;
114 state->primary = attrs[1];
118 state,
"Required attribute 'url' or 'regexp' missing from element 'primary'.");
121 }
else if (strcmp(name,
"ancillary") == 0) {
122 state->prev_state = state->state;
123 state->state = ANCILLARY;
126 string rule =
"overwrite";
127 for (
int i = 0; attrs && attrs[i] != 0; i = i + 2) {
128 if (strcmp(attrs[i],
"url") == 0)
130 else if (strcmp(attrs[i],
"rule") == 0)
141 if (rule !=
"overwrite" && rule !=
"replace" && rule !=
"fallback") {
142 string msg = string(
"Optional attribute 'rule' in element 'ancillary' has a bad value: ") + rule +
143 "\nIt should be one of 'overwrite', 'replace' or 'fallback'.";
149 state->rv.push_back(r);
151 state->prev_state = state->state;
152 state->state = PARSER_UNKNOWN;
153 state->unknown_depth++;
164 state->unknown_depth++;
171 DBG2(cerr <<
"Start element " << name <<
" (state " << states[state->state] <<
")" << endl);
182 DBG2(cerr <<
"End element: state " << states[state->state] << endl);
184 switch (state->state) {
186 state->prev_state = state->state;
187 state->state = PARSER_FINISH;
191 state->prev_state = state->state;
201 state->rv.erase(state->rv.begin(), state->rv.end());
205 state->prev_state = state->state;
206 state->state = ENTRY;
210 state->prev_state = state->state;
211 state->state = ENTRY;
216 state->unknown_depth--;
231 return xmlGetPredefinedEntity(name);
241 state->state = PARSER_ERROR;
245 vsnprintf(str, 1024, msg, args);
250 int line = xmlSAX2GetLineNumber(state->ctxt);
252 int line = getLineNumber(state->ctxt);
255 state->error_msg += string(str) + string(
"\n");
265 state->state = PARSER_ERROR;
269 vsnprintf(str, 1024, msg, args);
274 int line = xmlSAX2GetLineNumber(state->ctxt);
276 int line = getLineNumber(state->ctxt);
279 state->error_msg += string(str) + string(
"\n");
288 state->state = PARSER_ERROR;
292 vsnprintf(str, 1024, msg, args);
297 int line = xmlSAX2GetLineNumber(state->ctxt);
299 int line = getLineNumber(state->ctxt);
302 state->error_msg += string(str) + string(
"\n");
309static xmlSAXHandler aisSAXParser = {
355 xmlParserCtxtPtr ctxt;
356 AISParserState state;
358 ctxt = xmlCreateFileParserCtxt(database.c_str());
365 ctxt->sax = &aisSAXParser;
366 ctxt->userData = &state;
367 ctxt->validate =
true;
369 xmlParseDocument(ctxt);
372 if (!ctxt->wellFormed) {
374 xmlFreeParserCtxt(ctxt);
375 throw AISDatabaseReadFailed(
string(
"\nThe database is not a well formed XML document.\n") + state.error_msg);
380 xmlFreeParserCtxt(ctxt);
384 if (state.state == PARSER_ERROR) {
386 xmlFreeParserCtxt(ctxt);
391 xmlFreeParserCtxt(ctxt);
static void aisWarning(AISParserState *state, const char *msg,...)
static void aisStartElement(AISParserState *state, const char *name, const char **attrs)
static xmlEntityPtr aisGetEntity(AISParserState *state, const xmlChar *name)
static void aisStartDocument(AISParserState *state)
void intern(const string &database, AISResources *ais)
static void aisEndElement(AISParserState *state, const char *name)
static void aisEndDocument(AISParserState *state)
static void aisFatalError(AISParserState *state, const char *msg,...)
static void aisError(AISParserState *state, const char *msg,...)
virtual void add_regexp_resource(const string ®exp, const Resource &ancillary)
virtual void add_url_resource(const string &url, const Resource &ancillary)
Associate a rule with an ancillary resource.
top level DAP object to house generic methods
string long_to_string(long val, int base)