file & line # reporting on xml syntax errors
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/XML.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/XML.h
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/exception.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/exception.h
_____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/XML.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/XML.cpp
2005-01-06 01:35:01 UTC (rev 12843)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/XML.cpp
2005-01-06 02:06:44 UTC (rev 12844)
@@ -7,7 +7,8 @@
#include <assert.h>
#include "XML.h"
-#include "rbuild.h"
+#include "exception.h"
+#include "ssprintf.h"
using std::string;
using std::vector;
@@ -274,6 +275,19 @@
return true;
}
+string
+XMLFile::Location() const
+{
+ int line = 1;
+ const char* p = strchr ( _buf.c_str(), '\n' );
+ while ( p && p < _p )
+ {
+ ++line;
+ p = strchr ( p+1, '\n' );
+ }
+ return ssprintf ( "%s(%i)",_filename.c_str(), line );
+}
+
XMLAttribute::XMLAttribute()
{
}
@@ -445,7 +459,9 @@
while ( token[0] != '<' || !strncmp ( token.c_str(), "<!--", 4
)
)
{
if ( token[0] != '<' )
- printf ( "syntax error: expecting xml tag, not
'%s'\n", token.c_str() );
+ throw XMLSyntaxErrorException ( f.Location(),
+ "expecting xml
tag, not '%s'",
+ token.c_str() );
if ( !f.get_token(token) )
return NULL;
}
@@ -464,7 +480,10 @@
e->attributes.push_back ( new XMLAttribute ( "top_href",
top_file ) );
XMLFile fInc;
if ( !fInc.open ( file ) )
- throw FileNotFoundException ( file );
+ throw FileNotFoundException (
+ ssprintf("%s (referenced from %s)",
+ file.c_str(),
+ f.Location().c_str() ) );
else
{
Path path2 ( path, att->value );
@@ -485,7 +504,9 @@
else if ( end_tag )
{
delete e;
- printf ( "syntax error: end tag '%s' not
expected\n", token.c_str() );
+ throw XMLSyntaxErrorException ( f.Location(),
+ "end tag '%s'
not expected",
+ token.c_str() );
return NULL;
}
return e;
@@ -497,17 +518,24 @@
{
if ( !f.get_token ( token ) || !token.size() )
{
- printf ( "internal tool error -
get_token() failed when more_tokens() returned true\n" );
+ throw Exception ( "internal tool error -
get_token() failed when more_tokens() returned true" );
break;
}
if ( e->subElements.size() &&
!bThisMixingErrorReported )
{
- printf ( "syntax error: mixing of inner
text with sub elements\n" );
+ throw XMLSyntaxErrorException (
f.Location(),
+ "mixing
of inner text with sub elements" );
bThisMixingErrorReported = true;
}
+ if ( strchr ( token.c_str(), '>' ) )
+ {
+ throw XMLSyntaxErrorException (
f.Location(),
+ "invalid
symbol '>'" );
+ }
if ( e->value.size() )
{
- printf ( "syntax error: multiple
instances of inner text\n" );
+ throw XMLSyntaxErrorException (
f.Location(),
+
"multiple instances of inner text" );
e->value += " " + token;
}
else
@@ -519,13 +547,15 @@
if ( end_tag )
{
if ( e->name != e2->name )
- printf ( "syntax error: end tag
name mismatch\n" );
+ throw XMLSyntaxErrorException (
f.Location(),
+
"end tag name mismatch" );
delete e2;
break;
}
if ( e->value.size() &&
!bThisMixingErrorReported )
{
- printf ( "syntax error: mixing of inner
text with sub elements\n" );
+ throw XMLSyntaxErrorException (
f.Location(),
+ "mixing
of inner text with sub elements" );
bThisMixingErrorReported = true;
}
e->AddSubElement ( e2 );
_____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/XML.h
--- branches/xmlbuildsystem/reactos/tools/rbuild/XML.h 2005-01-06
01:35:01 UTC (rev 12843)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/XML.h 2005-01-06
02:06:44 UTC (rev 12844)
@@ -35,6 +35,7 @@
bool more_tokens();
bool get_token(std::string& token);
const std::string& filename() { return _filename; }
+ std::string Location() const;
private:
std::string _buf, _filename;
_____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/exception.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/exception.cpp
2005-01-06 01:35:01 UTC (rev 12843)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/exception.cpp
2005-01-06 02:06:44 UTC (rev 12844)
@@ -56,7 +56,22 @@
va_end(args);
}
+InvalidBuildFileException::InvalidBuildFileException()
+{
+}
+
+XMLSyntaxErrorException::XMLSyntaxErrorException ( const std::string&
location,
+ const char*
message,
+ ... )
+{
+ va_list args;
+ va_start ( args, message );
+ Message = location + ": " + ssvprintf ( message, args );
+ va_end ( args );
+}
+
+
RequiredAttributeNotFoundException::RequiredAttributeNotFoundException(c
onst std::string& attributeName,
const std::string& elementName)
: InvalidBuildFileException ( "Required attribute '%s' not found
on '%s'.",
_____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/exception.h
--- branches/xmlbuildsystem/reactos/tools/rbuild/exception.h
2005-01-06 01:35:01 UTC (rev 12843)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/exception.h
2005-01-06 02:06:44 UTC (rev 12844)
@@ -36,11 +36,22 @@
class InvalidBuildFileException : public Exception
{
public:
- InvalidBuildFileException(const char* message,
- ...);
+ InvalidBuildFileException ( const char* message,
+ ...);
+protected:
+ InvalidBuildFileException();
};
+class XMLSyntaxErrorException : public InvalidBuildFileException
+{
+public:
+ XMLSyntaxErrorException ( const std::string& location,
+ const char* message,
+ ... );
+};
+
+
class RequiredAttributeNotFoundException : public
InvalidBuildFileException
{
public: