20#include "Teuchos_Assert.hpp" 
  102#define XMLPARSER_TFE( T , S ) \ 
  103  TEUCHOS_TEST_FOR_EXCEPTION( T, std::runtime_error, "XML parse error at line " << _lineNo << ": " << S ) 
  111  _entities[
"apos"] = 
"'";
 
  112  _entities[
"quot"] = 
"\"";
 
  113  _entities[
"lt"]   = 
"<";
 
  114  _entities[
"gt"]   = 
">";
 
  115  _entities[
"amp"]  = 
"&";
 
  121  std::stack<string> 
tags;
 
  126    unsigned char c1, 
c2;
 
  133      if ( getSpace(
c1) ) {
 
  140      if (_is->readBytes(&
c1,1) < 1) {
 
  144      if (
c1 == 
'\n') ++_lineNo; 
 
  150      XMLPARSER_TFE( _is->readBytes(&
c2,1) < 1 , 
"stream ended in tag begin/end");
 
  157        XMLPARSER_TFE( 
curopen == 0,  
"document not well-formed: encountered end element '" << 
tag << 
"' while not enclosed." );
 
  158        XMLPARSER_TFE( 
handler->endElement(
tag)!=0, 
"document not well-formed: end element tag = '" << 
tag << 
"'" 
  159                                                    << 
" did not match start element '" << 
tags.top()
 
  165      else if (isLetter(
c2) || 
c2==
':' || 
c2==
'_') {
 
  173          XMLPARSER_TFE(
gotRoot == 
true, 
"document not well-formed: more than one root element specified" );
 
  179          XMLPARSER_TFE( 
handler->endElement(
tag)!=0, 
"unknown failure from handler while processing tag '" << 
tag << 
"'" );
 
  185      else if (
c2 == 
'?') {
 
  187        XMLPARSER_TFE( assertChar(
'x') != 0 , 
"was expecting an XML declaration; element not well-formed or exploits unsupported feature" );
 
  188        XMLPARSER_TFE( assertChar(
'm') != 0 , 
"was expecting an XML declaration; element not well-formed or exploits unsupported feature" );
 
  189        XMLPARSER_TFE( assertChar(
'l') != 0 , 
"was expecting an XML declaration; element not well-formed or exploits unsupported feature" );
 
  190        ignoreXMLDeclaration();
 
  192      else if (
c2 == 
'!') {
 
  198        XMLPARSER_TFE( assertChar(
'-') != 0 , 
"element not well-formed or exploits unsupported feature" );
 
  199        XMLPARSER_TFE( assertChar(
'-') != 0 , 
"element not well-formed or exploits unsupported feature" );
 
  203        XMLPARSER_TFE(
true,  
"element not well-formed or exploits unsupported feature" );
 
  206    else if ( (
curopen > 0) && (
c1 == 
'&') ) {
 
  207      std::string 
chars = 
"";
 
  212      std::string 
chars = 
"";
 
  217      XMLPARSER_TFE(1 , 
"document not well-formed: character data outside of an enclosing tag");
 
  221  XMLPARSER_TFE( 
curopen != 0 ,  
"file ended before closing element '" << 
tags.top() << 
"' from line " << 
tagLineStarts.top() );
 
 
  228void XMLParser::getETag(std::string &
tag)
 
  241  XMLPARSER_TFE( _is->readBytes(&
c,1) < 1 ,  
"EOF before end element was terminated");
 
  242  XMLPARSER_TFE( !isLetter(
c) && 
c!=
'_' && 
c!=
':' ,  
"tag not well-formed");
 
  245    XMLPARSER_TFE( _is->readBytes(&
c,1) < 1 ,  
"EOF before end element was terminated");
 
  246    if ( isNameChar(
c) ) {
 
  248        XMLPARSER_TFE(1,  
"end element not well-formed: expected '>'");
 
  252    else if (isSpace(
c)) {
 
  255      if (
c == 
'\n') ++_lineNo;
 
  262      XMLPARSER_TFE(1,  
"end element not well-formed");
 
  296    XMLPARSER_TFE( _is->readBytes(&
c,1) < 1 ,  
"EOF before start element was terminated");
 
  314      XMLPARSER_TFE( getSpace(
c)!=0, 
"EOF before start element was terminated");
 
  318    if ( (isLetter(
c) || 
c==
'_' || 
c==
':') && 
hadspace ) {
 
  325        XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,  
"EOF before start element was terminated");
 
  326        if ( isNameChar(
c) ) {
 
  329        else if ( isSpace(
c) || 
c==
'=' ) {
 
  333          XMLPARSER_TFE(1,  
"attribute not well-formed: expected whitespace or '='");
 
  343        XMLPARSER_TFE(1,  
"attribute not well-formed: expected '='");
 
  347      XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,  
"EOF before start element was terminated");
 
  358      else if (
c == 
'\"') {
 
  362        XMLPARSER_TFE(1,  
"attribute value must be quoted with either ''' or '\"'");
 
  365        XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,  
"EOF before start element was terminated");
 
  370        else if (!
apost && 
c==
'\"') {
 
  374        else if ( 
c == 
'&' ) {
 
  385          XMLPARSER_TFE(1,  
"invalid character in attribute value");
 
  390      XMLPARSER_TFE( 
attrs.find(
attname) != 
attrs.end() ,  
"cannot have two attributes with the same name");
 
  398      XMLPARSER_TFE(assertChar(
'>')!=0, 
"empty element tag not well-formed: expected '>'");
 
  403      XMLPARSER_TFE(1,  
"start element not well-formed: invalid character");
 
  407    XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,  
"EOF before start element was terminated");
 
  413void XMLParser::getComment(
long )
 
  424    XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,  
"EOF before terminating comment begun at line " << _lineNo );
 
  425    if (
c == 
'\n') ++_lineNo;
 
  429      XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,  
"EOF before terminating comment begun at line " << _lineNo );
 
  430      if (
c == 
'\n') ++_lineNo;
 
  433        XMLPARSER_TFE( assertChar(
'>')!=0, 
"comment not well-formed: missing expected '>' at line " << _lineNo );
 
  436      else if (!isChar(
c)) {
 
  437        XMLPARSER_TFE(1,  
"comment not well-formed: invalid character at line " << _lineNo );
 
  440    else if (!isChar(
c)) {
 
  441      XMLPARSER_TFE(1,  
"comment not well-formed: invalid character at line " << _lineNo );
 
  447void XMLParser::getReference(std::string &
refstr) {
 
  450  unsigned int num, base;
 
  453  XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,  
"EOF before reference was terminated");
 
  459    XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,  
"EOF before reference was terminated");
 
  464    else if (
'0' <= 
c && 
c <= 
'9') {
 
  469      XMLPARSER_TFE(1,  
"invalid character in character reference: expected 'x' or [0-9]");
 
  473      XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,  
"EOF before reference was terminated");
 
  474      XMLPARSER_TFE( 
c != 
';' && !(
'0' <= 
c && 
c <= 
'9') ,  
"invalid character in character reference: expected [0-9] or ';'");
 
  480    XMLPARSER_TFE(
num > 0xFF,  
"character reference value out of range");
 
  483  else if (isLetter(
c) || 
c==
'_' || 
c==
':') {
 
  489      XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,  
"EOF before reference was terminated");
 
  493      else if ( isLetter(
c) || (
'0' <= 
c && 
c <= 
'9')
 
  494                || 
c==
'.' || 
c==
'-' || 
c==
'_' || 
c==
':' 
  499        XMLPARSER_TFE(1,  
"entity reference not well-formed: invalid character");
 
  502    XMLPARSER_TFE( _entities.find(
entname) == _entities.end(),  
"entity reference not well-formed: undefined entity");
 
  506    XMLPARSER_TFE(1,  
"reference not well-formed: expected name or '#'");
 
  511int XMLParser::getSpace(
unsigned char &
lookahead) {
 
  524bool XMLParser::isLetter(
unsigned char c) {
 
  525  if ( (0x41 <= 
c && 
c <= 0x5A) || (0x61 <= 
c && 
c <= 0x7A) ||
 
  526       (0xC0 <= 
c && 
c <= 0xD6) || (0xD8 <= 
c && 
c <= 0xF6) ||
 
  535bool XMLParser::isNameChar(
unsigned char c) {
 
  536  if ( isLetter(
c) || (
'0' <= 
c && 
c <= 
'9') ||
 
  537       c==
'.' || 
c==
'-' || 
c==
'_' || 
c==
':' || 
c==0xB7 )
 
  545bool XMLParser::isSpace(
unsigned char c) {
 
  546  if ( 
c==0x20 || 
c==0x9 || 
c==0xD || 
c==0xA )
 
  554bool XMLParser::isChar(
unsigned char c) {
 
  555  if ( 
c==0x9 || 
c==0xA || 
c==0xD || 0x20 <= 
c) {  
 
  562int XMLParser::assertChar(
unsigned char cexp)
 
  568  if (_is->readBytes(&
c,1) < 1) {
 
  577void XMLParser::ignoreXMLDeclaration()
 
  584    XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,  
"EOF before terminating XML declaration begun at line " << _lineNo );
 
  585    if (
c == 
'\n') ++_lineNo;
 
  589      XMLPARSER_TFE( assertChar(
'>')!=0, 
"XML declaration not well-formed: missing expected '>' at line " << _lineNo );
 
Defines a class for assembling an XMLObject from XML input.
 
A class providing a simple XML parser. Methods can be overloaded to exploit external XML parsing libr...
 
Smart reference counting pointer class for automatic garbage collection.
 
TreeBuildingXMLHandler assembles a XMLObject from your XML input.
 
Representation of an XML data tree. XMLObject is a ref-counted handle to a XMLObjectImplem object,...
 
XMLObject parse()
Consume the XMLInputStream to build an XMLObject.
 
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.