Author: cwittich Date: Sat Jan 31 02:48:59 2009 New Revision: 39219
URL: http://svn.reactos.org/svn/reactos?rev=39219&view=rev Log: tabs -> spaces
Modified: trunk/reactos/tools/xml.cpp
Modified: trunk/reactos/tools/xml.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/xml.cpp?rev=39219&... ============================================================================== --- trunk/reactos/tools/xml.cpp [iso-8859-1] (original) +++ trunk/reactos/tools/xml.cpp [iso-8859-1] Sat Jan 31 02:48:59 2009 @@ -70,8 +70,8 @@ if (*str) { strvec[strlen(&strvec[0])] = *str; str++; } while (*str) { - strvec.push_back(*str); - str++; + strvec.push_back(*str); + str++; } strvec.push_back(0); } @@ -88,42 +88,42 @@ }
XMLException::XMLException ( - const std::string& location, - const char* format, ... ) -{ - va_list args; - va_start ( args, format ); - SetExceptionV ( location, format, args ); - va_end ( args ); + const std::string& location, + const char* format, ... ) +{ + va_list args; + va_start ( args, format ); + SetExceptionV ( location, format, args ); + va_end ( args ); }
void XMLException::SetExceptionV ( const std::string& location, const char* format, va_list args ) { - _e = location + ": " + ssvprintf(format,args); + _e = location + ": " + ssvprintf(format,args); }
void XMLException::SetException ( const std::string& location, const char* format, ... ) { - va_list args; - va_start ( args, format ); - SetExceptionV ( location, format, args ); - va_end ( args ); + va_list args; + va_start ( args, format ); + SetExceptionV ( location, format, args ); + va_end ( args ); }
XMLIncludes::~XMLIncludes() { - for ( size_t i = 0; i < this->size(); i++ ) - delete (*this)[i]; + for ( size_t i = 0; i < this->size(); i++ ) + delete (*this)[i]; }
void InitWorkingDirectory() { - // store the current directory for path calculations - working_directory.resize ( MAX_PATH ); - working_directory[0] = 0; - getcwd ( &working_directory[0], working_directory.size() ); - working_directory.resize ( strlen ( working_directory.c_str() ) ); + // store the current directory for path calculations + working_directory.resize ( MAX_PATH ); + working_directory[0] = 0; + getcwd ( &working_directory[0], working_directory.size() ); + working_directory.resize ( strlen ( working_directory.c_str() ) ); }
#ifdef _MSC_VER @@ -134,185 +134,185 @@ filelen ( FILE* f ) { #ifdef WIN32 - return _filelengthi64 ( _fileno(f) ); + return _filelengthi64 ( _fileno(f) ); #else # if defined(__FreeBSD__) || defined(__APPLE__) || defined(__CYGWIN__) - struct stat file_stat; - if ( fstat(fileno(f), &file_stat) != 0 ) + struct stat file_stat; + if ( fstat(fileno(f), &file_stat) != 0 ) # else - struct stat64 file_stat; - if ( fstat64(fileno(f), &file_stat) != 0 ) + struct stat64 file_stat; + if ( fstat64(fileno(f), &file_stat) != 0 ) # endif // __FreeBSD__ - return 0; - return file_stat.st_size; + return 0; + return file_stat.st_size; #endif // WIN32 }
Path::Path() { - if ( !working_directory.size() ) - InitWorkingDirectory(); - string s ( working_directory ); - const char* p = strtok ( &s[0], "/\" ); - while ( p ) - { - if ( *p ) - path.push_back ( p ); - p = strtok ( NULL, "/\" ); - } + if ( !working_directory.size() ) + InitWorkingDirectory(); + string s ( working_directory ); + const char* p = strtok ( &s[0], "/\" ); + while ( p ) + { + if ( *p ) + path.push_back ( p ); + p = strtok ( NULL, "/\" ); + } }
Path::Path ( const Path& cwd, const string& file ) { - string s ( cwd.Fixup ( file, false ) ); - const char* p = strtok ( &s[0], "/\" ); - while ( p ) - { - if ( *p ) - path.push_back ( p ); - p = strtok ( NULL, "/\" ); - } + string s ( cwd.Fixup ( file, false ) ); + const char* p = strtok ( &s[0], "/\" ); + while ( p ) + { + if ( *p ) + path.push_back ( p ); + p = strtok ( NULL, "/\" ); + } }
string Path::Fixup ( const string& file, bool include_filename ) const { - if ( strchr ( "/\", file[0] ) + if ( strchr ( "/\", file[0] ) #ifdef WIN32 - // this squirreliness is b/c win32 has drive letters and *nix doesn't... - || file[1] == ':' + // this squirreliness is b/c win32 has drive letters and *nix doesn't... + || file[1] == ':' #endif//WIN32 - ) - { - return file; - } - vector<string> pathtmp ( path ); - vector<char> tmp = vectorize( file ); - const char* prev = strtok ( &tmp[0], "/\" ); - const char* p = strtok ( NULL, "/\" ); - while ( p ) - { - if ( !strcmp ( prev, "." ) ) - ; // do nothing - else if ( !strcmp ( prev, ".." ) ) - { - // this squirreliness is b/c win32 has drive letters and *nix doesn't... + ) + { + return file; + } + vector<string> pathtmp ( path ); + vector<char> tmp = vectorize( file ); + const char* prev = strtok ( &tmp[0], "/\" ); + const char* p = strtok ( NULL, "/\" ); + while ( p ) + { + if ( !strcmp ( prev, "." ) ) + ; // do nothing + else if ( !strcmp ( prev, ".." ) ) + { + // this squirreliness is b/c win32 has drive letters and *nix doesn't... #ifdef WIN32 - if ( pathtmp.size() > 1 ) + if ( pathtmp.size() > 1 ) #else - if ( pathtmp.size() ) + if ( pathtmp.size() ) #endif - pathtmp.resize ( pathtmp.size() - 1 ); - } - else - pathtmp.push_back ( prev ); - prev = p; - p = strtok ( NULL, "/\" ); - } - if ( include_filename ) - pathtmp.push_back ( prev ); - - // reuse tmp variable to return recombined path - tmp = vectorize(""); - for ( size_t i = 0; i < pathtmp.size(); i++ ) - { - // this squirreliness is b/c win32 has drive letters and *nix doesn't... + pathtmp.resize ( pathtmp.size() - 1 ); + } + else + pathtmp.push_back ( prev ); + prev = p; + p = strtok ( NULL, "/\" ); + } + if ( include_filename ) + pathtmp.push_back ( prev ); + + // reuse tmp variable to return recombined path + tmp = vectorize(""); + for ( size_t i = 0; i < pathtmp.size(); i++ ) + { + // this squirreliness is b/c win32 has drive letters and *nix doesn't... #ifdef WIN32 - if ( i ) vectappend(tmp, "/"); + if ( i ) vectappend(tmp, "/"); #else - vectappend(tmp, "/"); + vectappend(tmp, "/"); #endif - vectappend(tmp, pathtmp[i]); - } - return &tmp[0]; + vectappend(tmp, pathtmp[i]); + } + return &tmp[0]; }
string Path::RelativeFromWorkingDirectory () { - string out = ""; - for ( size_t i = 0; i < path.size(); i++ ) - { - out += "/" + path[i]; - } - return RelativeFromWorkingDirectory ( out ); + string out = ""; + for ( size_t i = 0; i < path.size(); i++ ) + { + out += "/" + path[i]; + } + return RelativeFromWorkingDirectory ( out ); }
string Path::RelativeFromWorkingDirectory ( const string& path ) { - return Path::RelativeFromDirectory ( path, working_directory ); + return Path::RelativeFromDirectory ( path, working_directory ); }
string Path::RelativeFromDirectory ( - const string& path, - const string& base_directory ) -{ - vector<string> vbase, vpath, vout; - Path::Split ( vbase, base_directory, true ); - Path::Split ( vpath, path, true ); + const string& path, + const string& base_directory ) +{ + vector<string> vbase, vpath, vout; + Path::Split ( vbase, base_directory, true ); + Path::Split ( vpath, path, true ); #ifdef WIN32 - // this squirreliness is b/c win32 has drive letters and *nix doesn't... - // not possible to do relative across different drive letters - { - char path_driveletter = (path[1] == ':') ? toupper(path[0]) : 0; - char base_driveletter = (base_directory[1] == ':') ? toupper(base_directory[0]) : 0; - if ( path_driveletter != base_driveletter ) - return path; - } + // this squirreliness is b/c win32 has drive letters and *nix doesn't... + // not possible to do relative across different drive letters + { + char path_driveletter = (path[1] == ':') ? toupper(path[0]) : 0; + char base_driveletter = (base_directory[1] == ':') ? toupper(base_directory[0]) : 0; + if ( path_driveletter != base_driveletter ) + return path; + } #endif - size_t i = 0; - while ( i < vbase.size() && i < vpath.size() && vbase[i] == vpath[i] ) - ++i; - - // did we go through all of the path? - if ( vbase.size() == vpath.size() && i == vpath.size() ) - return "."; - - if ( i < vbase.size() ) - { - // path goes above our base directory, we will need some ..'s - for ( size_t j = i; j < vbase.size(); j++ ) - vout.push_back ( ".." ); - } - - while ( i < vpath.size() ) - vout.push_back ( vpath[i++] ); - - // now merge vout into a string again - string out = vout[0]; - for ( i = 1; i < vout.size(); i++ ) - { - out += "/" + vout[i]; - } - return out; + size_t i = 0; + while ( i < vbase.size() && i < vpath.size() && vbase[i] == vpath[i] ) + ++i; + + // did we go through all of the path? + if ( vbase.size() == vpath.size() && i == vpath.size() ) + return "."; + + if ( i < vbase.size() ) + { + // path goes above our base directory, we will need some ..'s + for ( size_t j = i; j < vbase.size(); j++ ) + vout.push_back ( ".." ); + } + + while ( i < vpath.size() ) + vout.push_back ( vpath[i++] ); + + // now merge vout into a string again + string out = vout[0]; + for ( i = 1; i < vout.size(); i++ ) + { + out += "/" + vout[i]; + } + return out; }
void Path::Split ( - vector<string>& out, - const string& path, - bool include_last ) -{ - string s ( path ); - const char* prev = strtok ( &s[0], "/\" ); - const char* p = strtok ( NULL, "/\" ); - out.resize ( 0 ); - while ( p ) - { - if ( strcmp ( prev, "." ) ) - out.push_back ( prev ); - prev = p; - p = strtok ( NULL, "/\" ); - } - if ( include_last && strcmp ( prev, "." ) ) - out.push_back ( prev ); - // special-case where path only has "." - // don't move this check up higher as it might miss - // some funny paths... - if ( !out.size() && !strcmp ( prev, "." ) ) - out.push_back ( "." ); + vector<string>& out, + const string& path, + bool include_last ) +{ + string s ( path ); + const char* prev = strtok ( &s[0], "/\" ); + const char* p = strtok ( NULL, "/\" ); + out.resize ( 0 ); + while ( p ) + { + if ( strcmp ( prev, "." ) ) + out.push_back ( prev ); + prev = p; + p = strtok ( NULL, "/\" ); + } + if ( include_last && strcmp ( prev, "." ) ) + out.push_back ( prev ); + // special-case where path only has "." + // don't move this check up higher as it might miss + // some funny paths... + if ( !out.size() && !strcmp ( prev, "." ) ) + out.push_back ( "." ); }
XMLFile::XMLFile() @@ -322,26 +322,26 @@ void XMLFile::close() { - _buf.resize(0); - _p = _end = NULL; + _buf.resize(0); + _p = _end = NULL; }
bool XMLFile::open ( const string& filename_ ) { - close(); - FILE* f = fopen ( filename_.c_str(), "rb" ); - if ( !f ) - return false; - unsigned long len = (unsigned long)filelen(f); - _buf.resize ( len ); - fread ( &_buf[0], 1, len, f ); - fclose ( f ); - _p = _buf.c_str(); - _end = _p + len; - _filename = filename_; - next_token(); - return true; + close(); + FILE* f = fopen ( filename_.c_str(), "rb" ); + if ( !f ) + return false; + unsigned long len = (unsigned long)filelen(f); + _buf.resize ( len ); + fread ( &_buf[0], 1, len, f ); + fclose ( f ); + _p = _buf.c_str(); + _end = _p + len; + _filename = filename_; + next_token(); + return true; }
// next_token() moves the pointer to next token, which may be @@ -351,19 +351,19 @@ void XMLFile::next_token() { - _p += strspn ( _p, WS ); + _p += strspn ( _p, WS ); }
bool XMLFile::next_is_text() { - return *_p != '<'; + return *_p != '<'; }
bool XMLFile::more_tokens () { - return _p != _end; + return _p != _end; }
// get_token() is used to return a token, and move the pointer @@ -371,65 +371,65 @@ bool XMLFile::get_token ( string& token ) { - const char* tokend; - if ( !strncmp ( _p, "<!--", 4 ) ) - { - tokend = strstr ( _p, "-->" ); - if ( !tokend ) - tokend = _end; - else - tokend += 3; - } - else if ( !strncmp ( _p, "<?", 2 ) ) - { - tokend = strstr ( _p, "?>" ); - if ( !tokend ) - tokend = _end; - else - tokend += 2; - } - else if ( *_p == '<' ) - { - tokend = strchr ( _p, '>' ); - if ( !tokend ) - tokend = _end; - else - ++tokend; - } - else - { - tokend = strchr ( _p, '<' ); - if ( !tokend ) - tokend = _end; - while ( tokend > _p && isspace(tokend[-1]) ) - --tokend; - } - if ( tokend == _p ) - return false; - token = string ( _p, tokend-_p ); - _p = tokend; - next_token(); - return true; + const char* tokend; + if ( !strncmp ( _p, "<!--", 4 ) ) + { + tokend = strstr ( _p, "-->" ); + if ( !tokend ) + tokend = _end; + else + tokend += 3; + } + else if ( !strncmp ( _p, "<?", 2 ) ) + { + tokend = strstr ( _p, "?>" ); + if ( !tokend ) + tokend = _end; + else + tokend += 2; + } + else if ( *_p == '<' ) + { + tokend = strchr ( _p, '>' ); + if ( !tokend ) + tokend = _end; + else + ++tokend; + } + else + { + tokend = strchr ( _p, '<' ); + if ( !tokend ) + tokend = _end; + while ( tokend > _p && isspace(tokend[-1]) ) + --tokend; + } + if ( tokend == _p ) + return false; + token = string ( _p, tokend-_p ); + _p = tokend; + next_token(); + return true; }
bool XMLFile::get_token ( string& token, string& location ) { - location = Location(); - return get_token ( token ); + location = Location(); + return get_token ( token ); }
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 ); + 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() @@ -437,48 +437,48 @@ }
XMLAttribute::XMLAttribute( - const string& name_, - const string& value_ ) - : name(name_), value(value_) + const string& name_, + const string& value_ ) + : name(name_), value(value_) { }
XMLAttribute::XMLAttribute ( const XMLAttribute& src ) - : name(src.name), value(src.value) + : name(src.name), value(src.value) {
}
XMLAttribute& XMLAttribute::operator = ( const XMLAttribute& src ) { - name = src.name; - value = src.value; - return *this; + name = src.name; + value = src.value; + return *this; }
XMLElement::XMLElement ( - XMLFile* xmlFile, - const string& location ) - : xmlFile ( xmlFile ), - location ( location ), - parentElement ( NULL ) + XMLFile* xmlFile, + const string& location ) + : xmlFile ( xmlFile ), + location ( location ), + parentElement ( NULL ) { }
XMLElement::~XMLElement() { - size_t i; - for ( i = 0; i < attributes.size(); i++ ) - delete attributes[i]; - for ( i = 0; i < subElements.size(); i++ ) - delete subElements[i]; + size_t i; + for ( i = 0; i < attributes.size(); i++ ) + delete attributes[i]; + for ( i = 0; i < subElements.size(); i++ ) + delete subElements[i]; }
void XMLElement::AddSubElement ( XMLElement* e ) { - subElements.push_back ( e ); - e->parentElement = this; + subElements.push_back ( e ); + e->parentElement = this; }
// Parse() @@ -489,171 +489,171 @@ // the one it just parsed... bool XMLElement::Parse ( - const string& token, - bool& end_tag ) -{ - const char* p = token.c_str(); - assert ( *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 ) - { - ++p; - p += strspn ( p, WS ); - } - const char* end = strpbrk ( p, WS ); - if ( !end ) - { - end = strpbrk ( p, "/>" ); - assert ( end ); - } - name = string ( p, end-p ); - p = end; - p += strspn ( p, WS ); - while ( *p != '>' && *p != '/' ) - { - end = strpbrk ( p, WSEQ ); - if ( !end ) - { - end = strpbrk ( p, "/>" ); - assert ( end ); - } - string attribute ( p, end-p ), value; - p = end; - p += strspn ( p, WS ); - if ( *p == '=' ) - { - ++p; - p += strspn ( p, WS ); - char quote = 0; - if ( strchr ( ""'", *p ) ) - { - quote = *p++; - end = strchr ( p, quote ); - } - else - { - end = strpbrk ( p, WS ); - } - if ( !end ) - { - end = strchr ( p, '>' ); - assert(end); - if ( end[-1] == '/' ) - end--; - } - value = string ( p, end-p ); - p = end; - if ( quote && *p == quote ) - p++; - p += strspn ( p, WS ); - } - else if ( name[0] != '!' ) - { - throw XMLSyntaxErrorException ( - location, - "attributes must have values" ); - } - attributes.push_back ( new XMLAttribute ( attribute, value ) ); - } - return !( *p == '/' ) && !end_tag; + const string& token, + bool& end_tag ) +{ + const char* p = token.c_str(); + assert ( *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 ) + { + ++p; + p += strspn ( p, WS ); + } + const char* end = strpbrk ( p, WS ); + if ( !end ) + { + end = strpbrk ( p, "/>" ); + assert ( end ); + } + name = string ( p, end-p ); + p = end; + p += strspn ( p, WS ); + while ( *p != '>' && *p != '/' ) + { + end = strpbrk ( p, WSEQ ); + if ( !end ) + { + end = strpbrk ( p, "/>" ); + assert ( end ); + } + string attribute ( p, end-p ), value; + p = end; + p += strspn ( p, WS ); + if ( *p == '=' ) + { + ++p; + p += strspn ( p, WS ); + char quote = 0; + if ( strchr ( ""'", *p ) ) + { + quote = *p++; + end = strchr ( p, quote ); + } + else + { + end = strpbrk ( p, WS ); + } + if ( !end ) + { + end = strchr ( p, '>' ); + assert(end); + if ( end[-1] == '/' ) + end--; + } + value = string ( p, end-p ); + p = end; + if ( quote && *p == quote ) + p++; + p += strspn ( p, WS ); + } + else if ( name[0] != '!' ) + { + throw XMLSyntaxErrorException ( + location, + "attributes must have values" ); + } + attributes.push_back ( new XMLAttribute ( attribute, value ) ); + } + return !( *p == '/' ) && !end_tag; }
XMLAttribute* XMLElement::GetAttribute ( - const string& attribute, - bool required ) -{ - // this would be faster with a tree-based container, but our attribute - // lists are likely to stay so short as to not be an issue. - for ( size_t i = 0; i < attributes.size(); i++ ) - { - if ( attribute == attributes[i]->name ) - return attributes[i]; - } - if ( required ) - { - throw XMLRequiredAttributeNotFoundException ( - location, - attribute, - name ); - } - return NULL; + const string& attribute, + bool required ) +{ + // this would be faster with a tree-based container, but our attribute + // lists are likely to stay so short as to not be an issue. + for ( size_t i = 0; i < attributes.size(); i++ ) + { + if ( attribute == attributes[i]->name ) + return attributes[i]; + } + if ( required ) + { + throw XMLRequiredAttributeNotFoundException ( + location, + attribute, + name ); + } + return NULL; }
const XMLAttribute* XMLElement::GetAttribute ( - const string& attribute, - bool required ) const -{ - // this would be faster with a tree-based container, but our attribute - // lists are likely to stay so short as to not be an issue. - for ( size_t i = 0; i < attributes.size(); i++ ) - { - if ( attribute == attributes[i]->name ) - return attributes[i]; - } - if ( required ) - { - throw XMLRequiredAttributeNotFoundException ( - location, - attribute, - name ); - } - return NULL; + const string& attribute, + bool required ) const +{ + // this would be faster with a tree-based container, but our attribute + // lists are likely to stay so short as to not be an issue. + for ( size_t i = 0; i < attributes.size(); i++ ) + { + if ( attribute == attributes[i]->name ) + return attributes[i]; + } + if ( required ) + { + throw XMLRequiredAttributeNotFoundException ( + location, + attribute, + name ); + } + return NULL; }
int XMLElement::FindElement ( const std::string& type, int prev ) const { - int done = subElements.size(); - while ( ++prev < done ) - { - XMLElement* e = subElements[prev]; - if ( e->name == type ) - return prev; - } - return -1; + int done = subElements.size(); + while ( ++prev < done ) + { + XMLElement* e = subElements[prev]; + if ( e->name == type ) + return prev; + } + return -1; }
int XMLElement::GetElements ( - const std::string& type, - std::vector<XMLElement*>& v ) -{ - int find = FindElement ( type ); - v.resize ( 0 ); - while ( find != -1 ) - { - v.push_back ( subElements[find] ); - find = FindElement ( type, find ); - } - return v.size(); + const std::string& type, + std::vector<XMLElement*>& v ) +{ + int find = FindElement ( type ); + v.resize ( 0 ); + while ( find != -1 ) + { + v.push_back ( subElements[find] ); + find = FindElement ( type, find ); + } + return v.size(); }
int XMLElement::GetElements ( - const std::string& type, - std::vector<const XMLElement*>& v ) const -{ - int find = FindElement ( type ); - v.resize ( 0 ); - while ( find != -1 ) - { - v.push_back ( subElements[find] ); - find = FindElement ( type, find ); - } - return v.size(); + const std::string& type, + std::vector<const XMLElement*>& v ) const +{ + int find = FindElement ( type ); + v.resize ( 0 ); + while ( find != -1 ) + { + v.push_back ( subElements[find] ); + find = FindElement ( type, find ); + } + return v.size(); }
// XMLParse() @@ -665,301 +665,301 @@ // (no more data) XMLElement* XMLParse ( - XMLFile& f, - XMLIncludes* includes, - const Path& path, - bool* pend_tag = NULL ) -{ - string token, location; - if ( !f.get_token(token,location) ) - return NULL; - bool end_tag, is_include = false; - - while - ( - token[0] != '<' - || !strncmp ( token.c_str (), "<!--", 4 ) - || !strncmp ( token.c_str (), "<?", 2 ) - ) - { - if ( token[0] != '<' ) - { - throw XMLSyntaxErrorException ( - location, - "expecting xml tag, not '%s'", - token.c_str () ); - } - if ( !f.get_token ( token, location ) ) - return NULL; - } - - XMLElement* e = new XMLElement ( - &f, - location ); - bool bNeedEnd = e->Parse ( token, end_tag ); - - if ( e->name == "xi:include" && includes ) - { - XMLAttribute* att; - att = e->GetAttribute ( "href", true ); - assert ( att ); - string includeFile ( path.Fixup ( att->value, true ) ); - string topIncludeFile ( - Path::RelativeFromWorkingDirectory ( includeFile ) ); - includes->push_back ( - new XMLInclude ( e, path, topIncludeFile ) ); - is_include = true; - } - - if ( !bNeedEnd ) - { - if ( pend_tag ) - *pend_tag = end_tag; - else if ( end_tag ) - { - delete e; - throw XMLSyntaxErrorException ( - location, - "end tag '%s' not expected", - token.c_str() ); - return NULL; - } - return e; - } - bool bThisMixingErrorReported = false; - while ( f.more_tokens () ) - { - if ( f.next_is_text () ) - { - if ( !f.get_token ( token, location ) || token.size () == 0 ) - { - throw XMLInvalidBuildFileException ( - location, - "internal tool error - get_token() failed when more_tokens() returned true" ); - break; - } - if ( e->subElements.size() && !bThisMixingErrorReported ) - { - throw XMLSyntaxErrorException ( - location, - "mixing of inner text with sub elements" ); - bThisMixingErrorReported = true; - } - if ( strchr ( token.c_str (), '>' ) ) - { - throw XMLSyntaxErrorException ( - location, - "invalid symbol '>'" ); - } - if ( e->value.size() > 0 ) - { - throw XMLSyntaxErrorException ( - location, - "multiple instances of inner text" ); - e->value += " " + token; - } - else - e->value = token; - } - else - { - XMLElement* e2 = XMLParse ( - f, is_include ? NULL : includes, path, &end_tag ); - if ( !e2 ) - { - string e_location = e->location; - string e_name = e->name; - delete e; - throw XMLInvalidBuildFileException ( - e_location, - "end of file found looking for end tag: </%s>", - e_name.c_str() ); - break; - } - if ( end_tag ) - { - if ( e->name != e2->name ) - { - string e2_location = e2->location; - string e_name = e->name; - string e2_name = e2->name; - delete e; - delete e2; - throw XMLSyntaxErrorException ( - e2_location, - "end tag name mismatch - found </%s> but was expecting </%s>", - e2_name.c_str(), - e_name.c_str() ); - break; - } - delete e2; - break; - } - if ( e->value.size () > 0 && !bThisMixingErrorReported ) - { - string e_location = e->location; - delete e; - throw XMLSyntaxErrorException ( - e_location, - "mixing of inner text with sub elements" ); - bThisMixingErrorReported = true; - } - e->AddSubElement ( e2 ); - } - } - return e; + XMLFile& f, + XMLIncludes* includes, + const Path& path, + bool* pend_tag = NULL ) +{ + string token, location; + if ( !f.get_token(token,location) ) + return NULL; + bool end_tag, is_include = false; + + while + ( + token[0] != '<' + || !strncmp ( token.c_str (), "<!--", 4 ) + || !strncmp ( token.c_str (), "<?", 2 ) + ) + { + if ( token[0] != '<' ) + { + throw XMLSyntaxErrorException ( + location, + "expecting xml tag, not '%s'", + token.c_str () ); + } + if ( !f.get_token ( token, location ) ) + return NULL; + } + + XMLElement* e = new XMLElement ( + &f, + location ); + bool bNeedEnd = e->Parse ( token, end_tag ); + + if ( e->name == "xi:include" && includes ) + { + XMLAttribute* att; + att = e->GetAttribute ( "href", true ); + assert ( att ); + string includeFile ( path.Fixup ( att->value, true ) ); + string topIncludeFile ( + Path::RelativeFromWorkingDirectory ( includeFile ) ); + includes->push_back ( + new XMLInclude ( e, path, topIncludeFile ) ); + is_include = true; + } + + if ( !bNeedEnd ) + { + if ( pend_tag ) + *pend_tag = end_tag; + else if ( end_tag ) + { + delete e; + throw XMLSyntaxErrorException ( + location, + "end tag '%s' not expected", + token.c_str() ); + return NULL; + } + return e; + } + bool bThisMixingErrorReported = false; + while ( f.more_tokens () ) + { + if ( f.next_is_text () ) + { + if ( !f.get_token ( token, location ) || token.size () == 0 ) + { + throw XMLInvalidBuildFileException ( + location, + "internal tool error - get_token() failed when more_tokens() returned true" ); + break; + } + if ( e->subElements.size() && !bThisMixingErrorReported ) + { + throw XMLSyntaxErrorException ( + location, + "mixing of inner text with sub elements" ); + bThisMixingErrorReported = true; + } + if ( strchr ( token.c_str (), '>' ) ) + { + throw XMLSyntaxErrorException ( + location, + "invalid symbol '>'" ); + } + if ( e->value.size() > 0 ) + { + throw XMLSyntaxErrorException ( + location, + "multiple instances of inner text" ); + e->value += " " + token; + } + else + e->value = token; + } + else + { + XMLElement* e2 = XMLParse ( + f, is_include ? NULL : includes, path, &end_tag ); + if ( !e2 ) + { + string e_location = e->location; + string e_name = e->name; + delete e; + throw XMLInvalidBuildFileException ( + e_location, + "end of file found looking for end tag: </%s>", + e_name.c_str() ); + break; + } + if ( end_tag ) + { + if ( e->name != e2->name ) + { + string e2_location = e2->location; + string e_name = e->name; + string e2_name = e2->name; + delete e; + delete e2; + throw XMLSyntaxErrorException ( + e2_location, + "end tag name mismatch - found </%s> but was expecting </%s>", + e2_name.c_str(), + e_name.c_str() ); + break; + } + delete e2; + break; + } + if ( e->value.size () > 0 && !bThisMixingErrorReported ) + { + string e_location = e->location; + delete e; + throw XMLSyntaxErrorException ( + e_location, + "mixing of inner text with sub elements" ); + bThisMixingErrorReported = true; + } + e->AddSubElement ( e2 ); + } + } + return e; }
void XMLReadFile ( - XMLFile& f, - XMLElement& head, - XMLIncludes& includes, - const Path& path ) -{ - for ( ;; ) - { - XMLElement* e = XMLParse ( f, &includes, path ); - if ( !e ) - return; - head.AddSubElement ( e ); - } + XMLFile& f, + XMLElement& head, + XMLIncludes& includes, + const Path& path ) +{ + for ( ;; ) + { + XMLElement* e = XMLParse ( f, &includes, path ); + if ( !e ) + return; + head.AddSubElement ( e ); + } }
XMLElement* XMLLoadInclude ( - XMLInclude& include, - XMLIncludes& includes ) -{ - XMLAttribute* att; - att = include.e->GetAttribute("href", true); - assert(att); - - string file ( include.path.Fixup(att->value, true) ); - string top_file ( Path::RelativeFromWorkingDirectory ( file ) ); - include.e->attributes.push_back ( new XMLAttribute ( "top_href", top_file ) ); - XMLFile* fInc = new XMLFile(); - if ( !fInc->open ( file ) ) - { - include.fileExists = false; - // look for xi:fallback element - for ( size_t i = 0; i < include.e->subElements.size (); i++ ) - { - XMLElement* e2 = include.e->subElements[i]; - if ( e2->name == "xi:fallback" ) - { - // now look for xi:include below... - for ( i = 0; i < e2->subElements.size (); i++ ) - { - XMLElement* e3 = e2->subElements[i]; - if ( e3->name == "xi:include" ) - { - att = e3->GetAttribute ( "href", true ); - assert ( att ); - string includeFile ( - include.path.Fixup ( att->value, true ) ); - string topIncludeFile ( - Path::RelativeFromWorkingDirectory ( includeFile ) ); - XMLInclude* fallbackInclude = - new XMLInclude ( e3, include.path, topIncludeFile ); - - XMLElement* value = XMLLoadInclude (*fallbackInclude, includes ); - delete fallbackInclude; - return value; - } - } - throw XMLInvalidBuildFileException ( - e2->location, - "xi:fallback must have a xi:include sub-element" ); - return NULL; - } - } - return NULL; - } - else - { - include.fileExists = true; - XMLElement* new_e = new XMLElement ( - fInc, - include.e->location ); - new_e->name = "xi:included"; - Path path2 ( include.path, att->value ); - XMLReadFile ( *fInc, *new_e, includes, path2 ); - return new_e; - } + XMLInclude& include, + XMLIncludes& includes ) +{ + XMLAttribute* att; + att = include.e->GetAttribute("href", true); + assert(att); + + string file ( include.path.Fixup(att->value, true) ); + string top_file ( Path::RelativeFromWorkingDirectory ( file ) ); + include.e->attributes.push_back ( new XMLAttribute ( "top_href", top_file ) ); + XMLFile* fInc = new XMLFile(); + if ( !fInc->open ( file ) ) + { + include.fileExists = false; + // look for xi:fallback element + for ( size_t i = 0; i < include.e->subElements.size (); i++ ) + { + XMLElement* e2 = include.e->subElements[i]; + if ( e2->name == "xi:fallback" ) + { + // now look for xi:include below... + for ( i = 0; i < e2->subElements.size (); i++ ) + { + XMLElement* e3 = e2->subElements[i]; + if ( e3->name == "xi:include" ) + { + att = e3->GetAttribute ( "href", true ); + assert ( att ); + string includeFile ( + include.path.Fixup ( att->value, true ) ); + string topIncludeFile ( + Path::RelativeFromWorkingDirectory ( includeFile ) ); + XMLInclude* fallbackInclude = + new XMLInclude ( e3, include.path, topIncludeFile ); + + XMLElement* value = XMLLoadInclude (*fallbackInclude, includes ); + delete fallbackInclude; + return value; + } + } + throw XMLInvalidBuildFileException ( + e2->location, + "xi:fallback must have a xi:include sub-element" ); + return NULL; + } + } + return NULL; + } + else + { + include.fileExists = true; + XMLElement* new_e = new XMLElement ( + fInc, + include.e->location ); + new_e->name = "xi:included"; + Path path2 ( include.path, att->value ); + XMLReadFile ( *fInc, *new_e, includes, path2 ); + return new_e; + } }
XMLElement* XMLLoadFile ( - const string& filename, - const Path& path, - XMLIncludes& includes ) -{ - XMLFile* f = new XMLFile(); - - if ( !f->open ( filename ) ) - { - delete f; - throw XMLFileNotFoundException ( "(virtual)", filename ); - return NULL; - } - - XMLElement* head = new XMLElement ( f, "(virtual)" ); - - XMLReadFile ( *f, *head, includes, path ); - - for ( size_t i = 0; i < includes.size (); i++ ) - { - XMLElement* e = includes[i]->e; - XMLElement* e2 = XMLLoadInclude ( *includes[i], includes ); - if ( !e2 ) - { - throw XMLFileNotFoundException ( - f->Location(), - e->GetAttribute ( "top_href", true )->value ); - } - XMLElement* parent = e->parentElement; - XMLElement** parent_container = NULL; - if ( !parent ) - { - string location = e->location; - delete e; - delete f; - throw XMLException ( location, "internal tool error: xi:include doesn't have a parent" ); - return NULL; - } - for ( size_t j = 0; j < parent->subElements.size (); j++ ) - { - if ( parent->subElements[j] == e ) - { - parent_container = &parent->subElements[j]; - break; - } - } - if ( !parent_container ) - { - string location = e->location; - delete e; - delete f; - throw XMLException ( location, "internal tool error: couldn't find xi:include in parent's sub-elements" ); - return NULL; - } - // replace inclusion tree with the imported tree - e2->parentElement = e->parentElement; - e2->name = e->name; - e2->attributes = e->attributes; - *parent_container = e2; - e->attributes.resize ( 0 ); - delete e; - } - delete f; - return head; + const string& filename, + const Path& path, + XMLIncludes& includes ) +{ + XMLFile* f = new XMLFile(); + + if ( !f->open ( filename ) ) + { + delete f; + throw XMLFileNotFoundException ( "(virtual)", filename ); + return NULL; + } + + XMLElement* head = new XMLElement ( f, "(virtual)" ); + + XMLReadFile ( *f, *head, includes, path ); + + for ( size_t i = 0; i < includes.size (); i++ ) + { + XMLElement* e = includes[i]->e; + XMLElement* e2 = XMLLoadInclude ( *includes[i], includes ); + if ( !e2 ) + { + throw XMLFileNotFoundException ( + f->Location(), + e->GetAttribute ( "top_href", true )->value ); + } + XMLElement* parent = e->parentElement; + XMLElement** parent_container = NULL; + if ( !parent ) + { + string location = e->location; + delete e; + delete f; + throw XMLException ( location, "internal tool error: xi:include doesn't have a parent" ); + return NULL; + } + for ( size_t j = 0; j < parent->subElements.size (); j++ ) + { + if ( parent->subElements[j] == e ) + { + parent_container = &parent->subElements[j]; + break; + } + } + if ( !parent_container ) + { + string location = e->location; + delete e; + delete f; + throw XMLException ( location, "internal tool error: couldn't find xi:include in parent's sub-elements" ); + return NULL; + } + // replace inclusion tree with the imported tree + e2->parentElement = e->parentElement; + e2->name = e->name; + e2->attributes = e->attributes; + *parent_container = e2; + e->attributes.resize ( 0 ); + delete e; + } + delete f; + return head; }
XMLElement* XMLLoadFile ( const string& filename ) { - Path path; - XMLIncludes includes; - return XMLLoadFile ( filename, path, includes ); -} + Path path; + XMLIncludes includes; + return XMLLoadFile ( filename, path, includes ); +}