40 #if defined( DEBUG_PARSER ) 41 # if defined( DEBUG ) && defined( _MSC_VER ) 43 # define TIXML_LOG OutputDebugString 45 # define TIXML_LOG printf 52 TiXmlBase::Entity TiXmlBase::entity[ TiXmlBase::NUM_ENTITY ] =
57 {
""", 6,
'\"' },
78 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
79 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
80 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
81 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
82 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
83 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
84 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
85 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
86 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
87 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
88 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
89 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
90 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
91 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
92 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
93 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
99 const unsigned long BYTE_MASK = 0xBF;
100 const unsigned long BYTE_MARK = 0x80;
101 const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
105 else if ( input < 0x800 )
107 else if ( input < 0x10000 )
109 else if ( input < 0x200000 )
112 { *length = 0;
return; }
121 *output = (char)((input | BYTE_MARK) & BYTE_MASK);
125 *output = (char)((input | BYTE_MARK) & BYTE_MASK);
129 *output = (char)((input | BYTE_MARK) & BYTE_MASK);
133 *output = (char)(input | FIRST_BYTE_MARK[*length]);
148 return isalpha( anyByte );
169 return isalnum( anyByte );
216 int row = cursor.row;
217 int col = cursor.col;
218 const char* p = stamp;
224 const unsigned char* pU = (
const unsigned char*)p;
267 col = (col / tabsize + 1) * tabsize;
273 if ( *(p+1) && *(p+2) )
279 else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU )
281 else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU )
316 assert( cursor.row >= -1 );
317 assert( cursor.col >= -1 );
333 const unsigned char* pU = (
const unsigned char*)p;
374 bool TiXmlBase::StreamWhiteSpace( std::istream * in,
TIXML_STRING * tag )
378 if ( !in->good() )
return false;
385 *tag += (char) in->get();
389 bool TiXmlBase::StreamTo( std::istream * in,
int character,
TIXML_STRING * tag )
395 if ( c == character )
426 && (
IsAlpha( (
unsigned char) *p, encoding ) || *p ==
'_' ) )
428 const char* start = p;
430 && (
IsAlphaNum( (
unsigned char ) *p, encoding )
440 name->assign( start, p-start );
454 if ( *(p+1) && *(p+1) ==
'#' && *(p+2) )
456 unsigned long ucs = 0;
463 if ( !*(p+3) )
return 0;
466 q = strchr( q,
';' );
468 if ( !q || !*q )
return 0;
475 if ( *q >=
'0' && *q <=
'9' )
476 ucs += mult * (*q -
'0');
477 else if ( *q >=
'a' && *q <=
'f' )
478 ucs += mult * (*q -
'a' + 10);
479 else if ( *q >=
'A' && *q <=
'F' )
480 ucs += mult * (*q -
'A' + 10 );
490 if ( !*(p+2) )
return 0;
493 q = strchr( q,
';' );
495 if ( !q || !*q )
return 0;
502 if ( *q >=
'0' && *q <=
'9' )
503 ucs += mult * (*q -
'0');
520 return p + delta + 1;
524 for( i=0; i<NUM_ENTITY; ++
i )
526 if ( strncmp( entity[i].str, p, entity[i].strLength ) == 0 )
528 assert( strlen( entity[i].str ) == entity[i].strLength );
529 *value = entity[
i].chr;
531 return ( p + entity[i].strLength );
560 while ( *q && *tag &&
ToLower( *q, encoding ) ==
ToLower( *tag, encoding ) )
571 while ( *q && *tag && *q == *tag )
587 bool caseInsensitive,
592 || !condenseWhiteSpace )
596 && !
StringEqual( p, endTag, caseInsensitive, encoding )
600 char cArr[4] = { 0, 0, 0, 0 };
601 p =
GetChar( p, cArr, &len, encoding );
602 text->append( cArr, len );
607 bool whitespace =
false;
612 && !
StringEqual( p, endTag, caseInsensitive, encoding ) )
614 if ( *p ==
'\r' || *p ==
'\n' )
634 char cArr[4] = { 0, 0, 0, 0 };
635 p =
GetChar( p, cArr, &len, encoding );
639 text->append( cArr, len );
644 p += strlen( endTag );
645 return ( p && *p ) ? p : 0;
650 void TiXmlDocument::StreamIn( std::istream * in,
TIXML_STRING * tag )
659 if ( !StreamTo( in,
'<', tag ) )
667 int tagIndex = (int) tag->length();
668 while ( in->good() && in->peek() !=
'>' )
688 node->StreamIn( in, tag );
746 const unsigned char* pU = (
const unsigned char*)p;
752 useMicrosoftBOM =
true;
768 p = node->
Parse( p, &data, encoding );
818 errorLocation.Clear();
819 if ( pError && data )
821 data->
Stamp( pError, encoding );
822 errorLocation = data->
Cursor();
832 if( !p || !*p || *p !=
'<' )
851 const char* xmlHeader = {
"<?xml" };
852 const char* commentHeader = {
"<!--" };
853 const char* dtdHeader = {
"<!" };
854 const char* cdataHeader = {
"<![CDATA[" };
859 TIXML_LOG(
"XML parsing Declaration\n" );
863 else if (
StringEqual( p, commentHeader,
false, encoding ) )
866 TIXML_LOG(
"XML parsing Comment\n" );
870 else if (
StringEqual( p, cdataHeader,
false, encoding ) )
873 TIXML_LOG(
"XML parsing CDATA\n" );
879 else if (
StringEqual( p, dtdHeader,
false, encoding ) )
882 TIXML_LOG(
"XML parsing Unknown(1)\n" );
886 else if (
IsAlpha( *(p+1), encoding )
890 TIXML_LOG(
"XML parsing Element\n" );
897 TIXML_LOG(
"XML parsing Unknown(2)\n" );
905 returnNode->
parent =
this;
912 void TiXmlElement::StreamIn (std::istream * in,
TIXML_STRING * tag)
932 if ( tag->length() < 3 )
return;
937 if ( tag->at( tag->length() - 1 ) ==
'>' 938 && tag->at( tag->length() - 2 ) ==
'/' )
943 else if ( tag->at( tag->length() - 1 ) ==
'>' )
952 StreamWhiteSpace( in, tag );
955 if ( in->good() && in->peek() !=
'<' )
959 text.StreamIn( in, tag );
968 if ( !in->good() )
return;
969 assert( in->peek() ==
'<' );
970 int tagIndex = (int) tag->length();
972 bool closingTag =
false;
973 bool firstCharFound =
false;
996 if ( c ==
'[' && tag->size() >= 9 )
998 size_t len = tag->size();
999 const char* start = tag->c_str() + len - 9;
1000 if ( strcmp( start,
"<![CDATA[" ) == 0 ) {
1001 assert( !closingTag );
1006 if ( !firstCharFound && c !=
'<' && !
IsWhiteSpace( c ) )
1008 firstCharFound =
true;
1037 const char* tagloc = tag->c_str() + tagIndex;
1041 node->StreamIn( in, tag );
1065 data->
Stamp( p, encoding );
1078 const char* pErr = p;
1112 else if ( *p ==
'>' )
1118 p = ReadValue( p, data, encoding );
1131 if (
StringEqual( p, endTag.c_str(),
false, encoding ) )
1133 p += endTag.length();
1135 if ( p && *p && *p ==
'>' ) {
1159 p = attrib->
Parse( p, data, encoding );
1169 #ifdef TIXML_USE_STL 1181 attributeSet.Add( attrib );
1193 const char* pWithWhiteSpace = p;
1210 p = textNode->
Parse( p, data, encoding );
1216 p = textNode->
Parse( pWithWhiteSpace, data, encoding );
1219 if ( !textNode->
Blank() )
1238 p = node->
Parse( p, data, encoding );
1247 pWithWhiteSpace = p;
1259 #ifdef TIXML_USE_STL 1260 void TiXmlUnknown::StreamIn( std::istream * in,
TIXML_STRING * tag )
1262 while ( in->good() )
1291 data->
Stamp( p, encoding );
1294 if ( !p || !*p || *p !=
'<' )
1302 while ( p && *p && *p !=
'>' )
1313 if ( p && *p ==
'>' )
1318 #ifdef TIXML_USE_STL 1319 void TiXmlComment::StreamIn( std::istream * in,
TIXML_STRING * tag )
1321 while ( in->good() )
1335 && tag->at( tag->length() - 2 ) ==
'-' 1336 && tag->at( tag->length() - 3 ) ==
'-' )
1355 data->
Stamp( p, encoding );
1358 const char* startTag =
"<!--";
1359 const char* endTag =
"-->";
1361 if ( !
StringEqual( p, startTag,
false, encoding ) )
1367 p += strlen( startTag );
1389 while ( p && *p && !
StringEqual( p, endTag,
false, encoding ) )
1391 value.append( p, 1 );
1395 p += strlen( endTag );
1404 if ( !p || !*p )
return 0;
1408 data->
Stamp( p, encoding );
1412 const char* pErr = p;
1413 p =
ReadName( p, &name, encoding );
1420 if ( !p || !*p || *p !=
'=' )
1435 const char SINGLE_QUOTE =
'\'';
1436 const char DOUBLE_QUOTE =
'\"';
1438 if ( *p == SINGLE_QUOTE )
1444 else if ( *p == DOUBLE_QUOTE )
1458 && *p !=
'/' && *p !=
'>' )
1460 if ( *p == SINGLE_QUOTE || *p == DOUBLE_QUOTE ) {
1474 #ifdef TIXML_USE_STL 1475 void TiXmlText::StreamIn( std::istream * in,
TIXML_STRING * tag )
1477 while ( in->good() )
1480 if ( !cdata && (c ==
'<' ) )
1495 if ( cdata && c ==
'>' && tag->size() >= 3 ) {
1496 size_t len = tag->size();
1497 if ( (*tag)[len-2] ==
']' && (*tag)[len-3] ==
']' ) {
1513 data->
Stamp( p, encoding );
1517 const char*
const startTag =
"<![CDATA[";
1518 const char*
const endTag =
"]]>";
1520 if ( cdata ||
StringEqual( p, startTag,
false, encoding ) )
1524 if ( !
StringEqual( p, startTag,
false, encoding ) )
1530 p += strlen( startTag );
1542 p =
ReadText( p, &dummy,
false, endTag,
false, encoding );
1547 bool ignoreWhite =
true;
1549 const char* end =
"<";
1550 p =
ReadText( p, &
value, ignoreWhite, end,
false, encoding );
1557 #ifdef TIXML_USE_STL 1558 void TiXmlDeclaration::StreamIn( std::istream * in,
TIXML_STRING * tag )
1560 while ( in->good() )
1587 if ( !p || !*p || !
StringEqual( p,
"<?xml",
true, _encoding ) )
1594 data->
Stamp( p, _encoding );
1612 if (
StringEqual( p,
"version",
true, _encoding ) )
1615 p = attrib.
Parse( p, data, _encoding );
1616 version = attrib.
Value();
1618 else if (
StringEqual( p,
"encoding",
true, _encoding ) )
1621 p = attrib.
Parse( p, data, _encoding );
1622 encoding = attrib.
Value();
1624 else if (
StringEqual( p,
"standalone",
true, _encoding ) )
1627 p = attrib.
Parse( p, data, _encoding );
1628 standalone = attrib.
Value();
1642 for (
unsigned i=0;
i<
value.length();
i++ )
static const int utf8ByteTable[256]
virtual const char * Parse(const char *p, TiXmlParsingData *data, TiXmlEncoding encoding)
friend class TiXmlElement
virtual const char * Parse(const char *p, TiXmlParsingData *data, TiXmlEncoding encoding)
static int ToLower(int v, TiXmlEncoding encoding)
static int IsAlphaNum(unsigned char anyByte, TiXmlEncoding encoding)
const TIXML_STRING & NameTStr() const
static const char * ReadName(const char *p, TIXML_STRING *name, TiXmlEncoding encoding)
const unsigned char TIXML_UTF_LEAD_2
const char * Value() const
Return the value of this attribute.
static const char * errorString[TIXML_ERROR_STRING_COUNT]
static void ConvertUTF32ToUTF8(unsigned long input, char *output, int *length)
virtual const TiXmlDeclaration * ToDeclaration() const
Cast to a more defined type. Will return null if not of the requested type.
const char * Encoding() const
Encoding. Will return an empty string if none was found.
TiXmlNode * LinkEndChild(TiXmlNode *addThis)
const char * Name() const
Return the name of this attribute.
static bool IsWhiteSpace(char c)
const TiXmlEncoding TIXML_DEFAULT_ENCODING
static bool IsWhiteSpaceCondensed()
Return the current white space setting.
static const char * ReadText(const char *in, TIXML_STRING *text, bool ignoreWhiteSpace, const char *endTag, bool ignoreCase, TiXmlEncoding encoding)
const unsigned char TIXML_UTF_LEAD_1
virtual const char * Parse(const char *p, TiXmlParsingData *data, TiXmlEncoding encoding)
void SetCDATA(bool _cdata)
Turns on or off a CDATA representation of text.
virtual const char * Parse(const char *p, TiXmlParsingData *data, TiXmlEncoding encoding)=0
virtual const char * Parse(const char *p, TiXmlParsingData *data, TiXmlEncoding encoding)
const unsigned char TIXML_UTF_LEAD_0
static const char * SkipWhiteSpace(const char *, TiXmlEncoding encoding)
TiXmlNode * Identify(const char *start, TiXmlEncoding encoding)
virtual const TiXmlElement * ToElement() const
Cast to a more defined type. Will return null if not of the requested type.
const char * ReadValue(const char *in, TiXmlParsingData *prevData, TiXmlEncoding encoding)
const TiXmlDocument * GetDocument() const
static const char * GetEntity(const char *in, char *value, int *length, TiXmlEncoding encoding)
virtual const char * Parse(const char *p, TiXmlParsingData *data, TiXmlEncoding encoding)
static bool StringEqual(const char *p, const char *endTag, bool ignoreCase, TiXmlEncoding encoding)
virtual const char * Parse(const char *p, TiXmlParsingData *data=0, TiXmlEncoding encoding=TIXML_DEFAULT_ENCODING)
void SetError(int err, const char *errorLocation, TiXmlParsingData *prevData, TiXmlEncoding encoding)
void Stamp(const char *now, TiXmlEncoding encoding)
const TiXmlCursor & Cursor() const
static const char * GetChar(const char *p, char *_value, int *length, TiXmlEncoding encoding)
void SetDocument(TiXmlDocument *doc)
static int IsAlpha(unsigned char anyByte, TiXmlEncoding encoding)