Implement new utility functions for testing validity of name and token characters.

This commit is contained in:
Martinsh Shaiters 2013-01-26 21:22:57 +02:00
parent 23e7ae6085
commit c6d02f48d5
2 changed files with 16 additions and 13 deletions

View File

@ -136,12 +136,7 @@ char* StrPair::ParseName( char* p )
return 0; return 0;
} }
while( *p && ( while( *p && ( p == start ? XMLUtil::IsNameStartChar( *p ) : XMLUtil::IsNameChar( *p ) )) {
XMLUtil::IsAlphaNum( (unsigned char) *p )
|| *p == '_'
|| *p == ':'
|| (*p == '-' && p>start ) // can be in a name, but not lead it.
|| (*p == '.' && p>start ) )) { // can be in a name, but not lead it.
++p; ++p;
} }
@ -1357,7 +1352,7 @@ char* XMLElement::ParseAttributes( char* p )
} }
// attribute. // attribute.
if ( XMLUtil::IsAlpha( *p ) ) { if (XMLUtil::IsNameStartChar( *p ) ) {
XMLAttribute* attrib = new (_document->_attributePool.Alloc() ) XMLAttribute(); XMLAttribute* attrib = new (_document->_attributePool.Alloc() ) XMLAttribute();
attrib->_memPool = &_document->_attributePool; attrib->_memPool = &_document->_attributePool;
attrib->_memPool->SetTracked(); attrib->_memPool->SetTracked();

View File

@ -465,6 +465,19 @@ public:
return !IsUTF8Continuation(p) && isspace( static_cast<unsigned char>(p) ); return !IsUTF8Continuation(p) && isspace( static_cast<unsigned char>(p) );
} }
inline static bool IsNameStartChar( unsigned char ch ) {
return ( ( ch < 128 ) ? isalpha( ch ) : 1 )
|| ch == ':'
|| ch == '_';
}
inline static bool IsNameChar( unsigned char ch ) {
return IsNameStartChar( ch )
|| isdigit( ch )
|| ch == '.'
|| ch == '-';
}
inline static bool StringEqual( const char* p, const char* q, int nChar=INT_MAX ) { inline static bool StringEqual( const char* p, const char* q, int nChar=INT_MAX ) {
int n = 0; int n = 0;
if ( p == q ) { if ( p == q ) {
@ -480,15 +493,10 @@ public:
} }
return false; return false;
} }
inline static int IsUTF8Continuation( const char p ) { inline static int IsUTF8Continuation( const char p ) {
return p & 0x80; return p & 0x80;
} }
inline static int IsAlphaNum( unsigned char anyByte ) {
return ( anyByte < 128 ) ? isalnum( anyByte ) : 1;
}
inline static int IsAlpha( unsigned char anyByte ) {
return ( anyByte < 128 ) ? isalpha( anyByte ) : 1;
}
static const char* ReadBOM( const char* p, bool* hasBOM ); static const char* ReadBOM( const char* p, bool* hasBOM );
// p is the starting location, // p is the starting location,