handle xml comments and added handling for some possible error
conditions
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
_____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
2005-01-04 14:02:04 UTC (rev 12787)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
2005-01-04 14:27:27 UTC (rev 12788)
@@ -234,8 +234,16 @@
XMLFile::get_token(string& token)
{
const char* tokend;
- if ( *_p == '<' )
+ if ( !strncmp ( _p, "<!--", 4 ) )
{
+ tokend = strstr ( _p, "-->" );
+ if ( !tokend )
+ tokend = _end;
+ else
+ tokend += 3;
+ }
+ else if ( *_p == '<' )
+ {
tokend = strchr ( _p, '>' );
if ( !tokend )
tokend = _end;
@@ -301,8 +309,17 @@
{
const char* p = token.c_str();
assert ( *p == '<' );
- p++;
+ ++p;
p += strspn ( p, WS );
+
+ // check if this is a comment
+ if ( !strncmp ( p, "!--", 3 ) )
+ {
+ name = "!--";
+ end_tag = false;
+ return false; // never look for end tag to a comment
+ }
+
end_tag = ( *p == '/' );
if ( end_tag )
{
@@ -415,9 +432,16 @@
string token;
if ( !f.get_token(token) )
return NULL;
- XMLElement* e = new XMLElement;
bool end_tag;
+ while ( token[0] != '<' )
+ {
+ printf ( "syntax error: expecting xml tag, not '%s'\n",
token.c_str() );
+ if ( !f.get_token(token) )
+ return NULL;
+ }
+
+ XMLElement* e = new XMLElement;
bool bNeedEnd = e->Parse ( token, end_tag );
if ( e->name == "xi:include" )
@@ -458,6 +482,7 @@
}
return e;
}
+ bool bThisMixingErrorReported = false;
while ( f.more_tokens() )
{
if ( f.next_is_text() )
@@ -467,8 +492,11 @@
printf ( "internal tool error -
get_token() failed when more_tokens() returned true\n" );
break;
}
- if ( e->subElements.size() )
+ if ( e->subElements.size() &&
!bThisMixingErrorReported )
+ {
printf ( "syntax error: mixing of inner
text with sub elements\n" );
+ bThisMixingErrorReported = true;
+ }
if ( e->value.size() )
{
printf ( "syntax error: multiple
instances of inner text\n" );
@@ -487,6 +515,11 @@
delete e2;
break;
}
+ if ( e->value.size() &&
!bThisMixingErrorReported )
+ {
+ printf ( "syntax error: mixing of inner
text with sub elements\n" );
+ bThisMixingErrorReported = true;
+ }
e->AddSubElement ( e2 );
}
}
@@ -558,6 +591,9 @@
if ( !head )
break; // end of file
+ if ( head->name == "!--" )
+ continue; // ignore comments
+
if ( head->name != "project" )
{
printf ( "error: expecting 'project', got
'%s'\n", head->name.c_str() );
Show replies by date