unoidl/source/unoidl-check.cxx | 1442 ++++++++++++++++++--------------------- unoidl/source/unoidlprovider.cxx | 337 ++++++--- unoidl/source/unoidlprovider.hxx | 15 3 files changed, 960 insertions(+), 834 deletions(-)
New commits: commit 333c6c114b0f21acf0f2525d61850a5f86d84aa7 Author: Stephan Bergmann <sberg...@redhat.com> Date: Tue Nov 18 18:34:56 2014 +0100 Check entity and type name syntax (For types, only checks their syntax, but not whether they semantically fit in a certain situation, e.g., "boolean" cannot be used as a base interface.) Change-Id: I12f617e74ca13ce2afcec8f611bfdb4912c62960 diff --git a/unoidl/source/unoidlprovider.cxx b/unoidl/source/unoidlprovider.cxx index 9b37e78..23de040 100644 --- a/unoidl/source/unoidlprovider.cxx +++ b/unoidl/source/unoidlprovider.cxx @@ -17,6 +17,7 @@ #include "osl/endian.h" #include "osl/file.h" +#include "rtl/character.hxx" #include "rtl/ref.hxx" #include "rtl/textenc.h" #include "rtl/textcvt.h" @@ -30,6 +31,54 @@ namespace unoidl { namespace detail { +class MappedFile: public salhelper::SimpleReferenceObject { +public: + explicit MappedFile(OUString const & fileUrl); + + sal_uInt8 read8(sal_uInt32 offset) const; + + sal_uInt16 read16(sal_uInt32 offset) const; + + sal_uInt32 read32(sal_uInt32 offset) const; + + sal_uInt64 read64(sal_uInt32 offset) const; + + float readIso60599Binary32(sal_uInt32 offset) const; + + double readIso60599Binary64(sal_uInt32 offset) const; + + OUString readNulName(sal_uInt32 offset) /*const*/; + + OUString readIdxName(sal_uInt32 * offset) const + { return readIdxString(offset, RTL_TEXTENCODING_ASCII_US); } + + OUString readIdxString(sal_uInt32 * offset) const + { return readIdxString(offset, RTL_TEXTENCODING_UTF8); } + + OUString uri; + oslFileHandle handle; + sal_uInt64 size; + void * address; + +private: + virtual ~MappedFile(); + + sal_uInt8 get8(sal_uInt32 offset) const; + + sal_uInt16 get16(sal_uInt32 offset) const; + + sal_uInt32 get32(sal_uInt32 offset) const; + + sal_uInt64 get64(sal_uInt32 offset) const; + + float getIso60599Binary32(sal_uInt32 offset) const; + + double getIso60599Binary64(sal_uInt32 offset) const; + + OUString readIdxString(sal_uInt32 * offset, rtl_TextEncoding encoding) + const; +}; + namespace { // sizeof (Memory16) == 2 @@ -116,55 +165,96 @@ struct Memory64 { } }; +bool isSimpleType(OUString const & type) { + return type == "void" || type == "boolean" || type == "byte" + || type == "short" || type == "unsigned short" || type == "long" + || type == "unsigned long" || type == "hyper" + || type == "unsigned hyper" || type == "float" || type == "double" + || type == "char" || type == "string" || type == "type" + || type == "any"; } -class MappedFile: public salhelper::SimpleReferenceObject { -public: - explicit MappedFile(OUString const & fileUrl); - - sal_uInt8 read8(sal_uInt32 offset) const; - - sal_uInt16 read16(sal_uInt32 offset) const; - - sal_uInt32 read32(sal_uInt32 offset) const; - - sal_uInt64 read64(sal_uInt32 offset) const; - - float readIso60599Binary32(sal_uInt32 offset) const; - - double readIso60599Binary64(sal_uInt32 offset) const; - - OUString readNulName(sal_uInt32 offset) const; - - OUString readIdxName(sal_uInt32 * offset) const - { return readIdxString(offset, RTL_TEXTENCODING_ASCII_US); } - - OUString readIdxString(sal_uInt32 * offset) const - { return readIdxString(offset, RTL_TEXTENCODING_UTF8); } - - OUString uri; - oslFileHandle handle; - sal_uInt64 size; - void * address; - -private: - virtual ~MappedFile(); - - sal_uInt8 get8(sal_uInt32 offset) const; - - sal_uInt16 get16(sal_uInt32 offset) const; - - sal_uInt32 get32(sal_uInt32 offset) const; - - sal_uInt64 get64(sal_uInt32 offset) const; +// For backwards compatibility, does not strictly check segments to match +// +// <segment> ::= <blocks> | <block> +// <blocks> ::= <capital> <other>* ("_" <block>)* +// <block> ::= <other>+ +// <other> ::= <capital> | "a"--"z" | "0"--"9" +// <capital> ::= "A"--"Z" +// +bool isIdentifier(OUString const & type, bool scoped) { + if (type.isEmpty()) { + return false; + } + for (sal_Int32 i = 0; i != type.getLength(); ++i) { + sal_Unicode c = type[i]; + if (c == '.') { + if (!scoped || i == 0 || i == type.getLength() - 1 + || type[i - 1] == '.') + { + return false; + } + } else if (!rtl::isAsciiAlphanumeric(c) && c != '_') { + return false; + } + } + return true; +} - float getIso60599Binary32(sal_uInt32 offset) const; +void checkTypeName( + rtl::Reference< MappedFile > const & file, OUString const & type) +{ + OUString nucl(type); + bool args = false; + while (nucl.startsWith("[]", &nucl)) {} + sal_Int32 i = nucl.indexOf('<'); + if (i != -1) { + OUString tmpl(nucl.copy(0, i)); + do { + ++i; // skip '<' or ',' + sal_Int32 j = i; + for (sal_Int32 level = 0; j != nucl.getLength(); ++j) { + sal_Unicode c = nucl[j]; + if (c == ',') { + if (level == 0) { + break; + } + } else if (c == '<') { + ++level; + } else if (c == '>') { + if (level == 0) { + break; + } + --level; + } + } + if (j != nucl.getLength()) { + checkTypeName(file, nucl.copy(i, j - i)); + args = true; + } + i = j; + } while (i != nucl.getLength() && nucl[i] != '>'); + if (i != nucl.getLength() - 1 || nucl[i] != '>' || !args) { + tmpl.clear(); // bad input + } + nucl = tmpl; + } + if (isSimpleType(nucl) ? args : !isIdentifier(nucl, true)) { + throw FileFormatException( + file->uri, "UNOIDL format: bad type \"" + type + "\""); + } +} - double getIso60599Binary64(sal_uInt32 offset) const; +void checkEntityName( + rtl::Reference< MappedFile > const & file, OUString const & name) +{ + if (isSimpleType(name) || !isIdentifier(name, false)) { + throw FileFormatException( + file->uri, "UNOIDL format: bad entity name \"" + name + "\""); + } +} - OUString readIdxString(sal_uInt32 * offset, rtl_TextEncoding encoding) - const; -}; +} MappedFile::MappedFile(OUString const & fileUrl): uri(fileUrl), handle(0) { oslFileError e = osl_openFile(uri.pData, &handle, osl_File_OpenFlag_Read); @@ -244,7 +334,7 @@ double MappedFile::readIso60599Binary64(sal_uInt32 offset) const { return getIso60599Binary64(offset); } -OUString MappedFile::readNulName(sal_uInt32 offset) const { +OUString MappedFile::readNulName(sal_uInt32 offset) { if (offset > size) { throw FileFormatException( uri, "UNOIDL format: offset for string too large"); @@ -272,6 +362,7 @@ OUString MappedFile::readNulName(sal_uInt32 offset) const { { throw FileFormatException(uri, "UNOIDL format: name is not ASCII"); } + checkEntityName(this, name); return name; } @@ -679,6 +770,7 @@ rtl::Reference< Entity > readEntity( std::vector< EnumTypeEntity::Member > mems; for (sal_uInt32 i = 0; i != n; ++i) { OUString memName(file->readIdxName(&offset)); + checkEntityName(file, memName); sal_Int32 memValue = static_cast< sal_Int32 >( file->read32(offset)); //TODO: implementation-defined behavior of conversion from @@ -706,6 +798,7 @@ rtl::Reference< Entity > readEntity( ("UNOIDL format: empty base type name of plain struct" " type")); } + checkTypeName(file, base); } sal_uInt32 n = file->read32(offset); if (n > SAL_MAX_INT32) { @@ -718,7 +811,9 @@ rtl::Reference< Entity > readEntity( std::vector< PlainStructTypeEntity::Member > mems; for (sal_uInt32 i = 0; i != n; ++i) { OUString memName(file->readIdxName(&offset)); + checkEntityName(file, memName); OUString memType(file->readIdxName(&offset)); + checkTypeName(file, memType); mems.push_back( PlainStructTypeEntity::Member( memName, memType, @@ -740,7 +835,9 @@ rtl::Reference< Entity > readEntity( offset += 5; std::vector< OUString > params; for (sal_uInt32 i = 0; i != n; ++i) { - params.push_back(file->readIdxName(&offset)); + OUString param(file->readIdxName(&offset)); + checkEntityName(file, param); + params.push_back(param); } n = file->read32(offset); if (n > SAL_MAX_INT32) { @@ -755,7 +852,9 @@ rtl::Reference< Entity > readEntity( v = file->read8(offset); ++offset; OUString memName(file->readIdxName(&offset)); + checkEntityName(file, memName); OUString memType(file->readIdxName(&offset)); + checkTypeName(file, memType); if (v > 1) { throw FileFormatException( file->uri, @@ -785,6 +884,7 @@ rtl::Reference< Entity > readEntity( ("UNOIDL format: empty base type name of exception" " type")); } + checkTypeName(file, base); } sal_uInt32 n = file->read32(offset); if (n > SAL_MAX_INT32) { @@ -796,7 +896,9 @@ rtl::Reference< Entity > readEntity( std::vector< ExceptionTypeEntity::Member > mems; for (sal_uInt32 i = 0; i != n; ++i) { OUString memName(file->readIdxName(&offset)); + checkEntityName(file, memName); OUString memType(file->readIdxName(&offset)); + checkTypeName(file, memType); mems.push_back( ExceptionTypeEntity::Member( memName, memType, @@ -819,6 +921,7 @@ rtl::Reference< Entity > readEntity( std::vector< AnnotatedReference > mandBases; for (sal_uInt32 i = 0; i != n; ++i) { OUString base(file->readIdxName(&offset)); + checkTypeName(file, base); mandBases.push_back( AnnotatedReference( base, @@ -835,6 +938,7 @@ rtl::Reference< Entity > readEntity( std::vector< AnnotatedReference > optBases; for (sal_uInt32 i = 0; i != n; ++i) { OUString base(file->readIdxName(&offset)); + checkTypeName(file, base); optBases.push_back( AnnotatedReference( base, @@ -853,7 +957,9 @@ rtl::Reference< Entity > readEntity( v = file->read8(offset); ++offset; OUString attrName(file->readIdxName(&offset)); + checkEntityName(file, attrName); OUString attrType(file->readIdxName(&offset)); + checkTypeName(file, attrType); if (v > 0x03) { throw FileFormatException( file->uri, @@ -870,7 +976,9 @@ rtl::Reference< Entity > readEntity( } offset += 4; for (sal_uInt32 j = 0; j != m; ++j) { - getExcs.push_back(file->readIdxName(&offset)); + OUString exc(file->readIdxName(&offset)); + checkTypeName(file, exc); + getExcs.push_back(exc); } std::vector< OUString > setExcs; if ((v & 0x02) == 0) { @@ -884,7 +992,9 @@ rtl::Reference< Entity > readEntity( } offset += 4; for (sal_uInt32 j = 0; j != m; ++j) { - setExcs.push_back(file->readIdxName(&offset)); + OUString exc(file->readIdxName(&offset)); + checkTypeName(file, exc); + setExcs.push_back(exc); } } attrs.push_back( @@ -904,7 +1014,9 @@ rtl::Reference< Entity > readEntity( std::vector< InterfaceTypeEntity::Method > meths; for (sal_uInt32 i = 0; i != nMeths; ++i) { OUString methName(file->readIdxName(&offset)); + checkEntityName(file, methName); OUString methType(file->readIdxName(&offset)); + checkTypeName(file, methType); sal_uInt32 m = file->read32(offset); if (m > SAL_MAX_INT32) { throw FileFormatException( @@ -918,7 +1030,9 @@ rtl::Reference< Entity > readEntity( v = file->read8(offset); ++offset; OUString paramName(file->readIdxName(&offset)); + checkEntityName(file, paramName); OUString paramType(file->readIdxName(&offset)); + checkTypeName(file, paramType); InterfaceTypeEntity::Method::Parameter::Direction dir; switch (v) { case 0: @@ -955,7 +1069,9 @@ rtl::Reference< Entity > readEntity( } offset += 4; for (sal_uInt32 j = 0; j != m; ++j) { - excs.push_back(file->readIdxName(&offset)); + OUString exc(file->readIdxName(&offset)); + checkTypeName(file, exc); + excs.push_back(exc); } meths.push_back( InterfaceTypeEntity::Method( @@ -970,6 +1086,7 @@ rtl::Reference< Entity > readEntity( { ++offset; OUString base(file->readIdxName(&offset)); + checkTypeName(file, base); return new TypedefEntity( published, base, readAnnotations(annotated, file, offset)); } @@ -1010,6 +1127,7 @@ rtl::Reference< Entity > readEntity( { ++offset; OUString base(file->readIdxName(&offset)); + checkTypeName(file, base); std::vector< SingleInterfaceBasedServiceEntity::Constructor > ctors; if (flag) { ctors.push_back( @@ -1025,6 +1143,7 @@ rtl::Reference< Entity > readEntity( offset += 4; for (sal_uInt32 i = 0; i != n; ++i) { OUString ctorName(file->readIdxName(&offset)); + checkEntityName(file, ctorName); sal_uInt32 m = file->read32(offset); if (m > SAL_MAX_INT32) { throw FileFormatException( @@ -1041,7 +1160,9 @@ rtl::Reference< Entity > readEntity( v = file->read8(offset); ++offset; OUString paramName(file->readIdxName(&offset)); + checkEntityName(file, paramName); OUString paramType(file->readIdxName(&offset)); + checkTypeName(file, paramType); bool rest; switch (v) { case 0: @@ -1074,7 +1195,9 @@ rtl::Reference< Entity > readEntity( } offset += 4; for (sal_uInt32 j = 0; j != m; ++j) { - excs.push_back(file->readIdxName(&offset)); + OUString exc(file->readIdxName(&offset)); + checkTypeName(file, exc); + excs.push_back(exc); } ctors.push_back( SingleInterfaceBasedServiceEntity::Constructor( @@ -1099,6 +1222,7 @@ rtl::Reference< Entity > readEntity( std::vector< AnnotatedReference > mandServs; for (sal_uInt32 i = 0; i != n; ++i) { OUString base(file->readIdxName(&offset)); + checkTypeName(file, base); mandServs.push_back( AnnotatedReference( base, @@ -1115,6 +1239,7 @@ rtl::Reference< Entity > readEntity( std::vector< AnnotatedReference > optServs; for (sal_uInt32 i = 0; i != n; ++i) { OUString base(file->readIdxName(&offset)); + checkTypeName(file, base); optServs.push_back( AnnotatedReference( base, @@ -1131,6 +1256,7 @@ rtl::Reference< Entity > readEntity( std::vector< AnnotatedReference > mandIfcs; for (sal_uInt32 i = 0; i != n; ++i) { OUString base(file->readIdxName(&offset)); + checkTypeName(file, base); mandIfcs.push_back( AnnotatedReference( base, @@ -1147,6 +1273,7 @@ rtl::Reference< Entity > readEntity( std::vector< AnnotatedReference > optIfcs; for (sal_uInt32 i = 0; i != n; ++i) { OUString base(file->readIdxName(&offset)); + checkTypeName(file, base); optIfcs.push_back( AnnotatedReference( base, @@ -1165,7 +1292,9 @@ rtl::Reference< Entity > readEntity( sal_uInt16 attrs = file->read16(offset); offset += 2; OUString propName(file->readIdxName(&offset)); + checkEntityName(file, propName); OUString propType(file->readIdxName(&offset)); + checkTypeName(file, propType); if (attrs > 0x01FF) { // see css.beans.PropertyAttribute throw FileFormatException( file->uri, @@ -1190,6 +1319,7 @@ rtl::Reference< Entity > readEntity( { ++offset; OUString base(file->readIdxName(&offset)); + checkTypeName(file, base); return new InterfaceBasedSingletonEntity( published, base, readAnnotations(annotated, file, offset)); } @@ -1197,6 +1327,7 @@ rtl::Reference< Entity > readEntity( { ++offset; OUString base(file->readIdxName(&offset)); + checkTypeName(file, base); return new ServiceBasedSingletonEntity( published, base, readAnnotations(annotated, file, offset)); } commit e7da382244481ad0b2dfb67e5ffde85aac220c2b Author: Stephan Bergmann <sberg...@redhat.com> Date: Tue Nov 18 17:49:22 2014 +0100 Check for recursive maps Change-Id: I50227c41c5b4c5c410939ddfa078b996b5804965 diff --git a/unoidl/source/unoidlprovider.cxx b/unoidl/source/unoidlprovider.cxx index aef380d..9b37e78 100644 --- a/unoidl/source/unoidlprovider.cxx +++ b/unoidl/source/unoidlprovider.cxx @@ -12,6 +12,7 @@ #include <algorithm> #include <cassert> #include <cstring> +#include <set> #include <vector> #include "osl/endian.h" @@ -364,6 +365,11 @@ struct MapEntry { Memory32 data; }; +bool operator <(Map const map1, Map const map2) { + return map1.begin < map2.begin + || (map1.begin == map2.begin && map1.size < map2.size); +} + namespace { enum Compare { COMPARE_LESS, COMPARE_GREATER, COMPARE_EQUAL }; @@ -543,14 +549,20 @@ ConstantValue readConstant( } rtl::Reference< Entity > readEntity( - rtl::Reference< MappedFile > const & file, sal_uInt32 offset); + rtl::Reference< MappedFile > const & file, sal_uInt32 offset, + std::set<Map> const & trace); + +class UnoidlModuleEntity; class UnoidlCursor: public MapCursor { public: UnoidlCursor( - rtl::Reference< MappedFile > file, MapEntry const * mapBegin, - sal_uInt32 mapSize): - file_(file), mapIndex_(mapBegin), mapEnd_(mapBegin + mapSize) + rtl::Reference< MappedFile > file, + rtl::Reference<UnoidlProvider> const & reference1, + rtl::Reference<UnoidlModuleEntity> const & reference2, + NestedMap const & map): + file_(file), reference1_(reference1), reference2_(reference2), + map_(map), index_(0) {} private: @@ -559,17 +571,20 @@ private: virtual rtl::Reference< Entity > getNext(OUString * name) SAL_OVERRIDE; rtl::Reference< MappedFile > file_; - MapEntry const * mapIndex_; - MapEntry const * mapEnd_; + rtl::Reference<UnoidlProvider> reference1_; // HACK to keep alive whatever + rtl::Reference<UnoidlModuleEntity> reference2_; // owner of map_ + NestedMap const & map_; + sal_uInt32 index_; }; rtl::Reference< Entity > UnoidlCursor::getNext(OUString * name) { assert(name != 0); rtl::Reference< Entity > ent; - if (mapIndex_ != mapEnd_) { - *name = file_->readNulName(mapIndex_->name.getUnsigned32()); - ent = readEntity(file_, mapIndex_->data.getUnsigned32()); - ++mapIndex_; + if (index_ != map_.map.size) { + *name = file_->readNulName(map_.map.begin[index_].name.getUnsigned32()); + ent = readEntity( + file_, map_.map.begin[index_].data.getUnsigned32(), map_.trace); + ++index_; } return ent; } @@ -578,37 +593,47 @@ class UnoidlModuleEntity: public ModuleEntity { public: UnoidlModuleEntity( rtl::Reference< MappedFile > const & file, sal_uInt32 mapOffset, - sal_uInt32 mapSize): - file_(file), - mapBegin_( - reinterpret_cast< MapEntry const * >( - static_cast< char const * >(file_->address) + mapOffset)), - mapSize_(mapSize) - { assert(file.is()); } + sal_uInt32 mapSize, std::set<Map> const & trace): + file_(file) + { + assert(file.is()); + map_.map.begin = reinterpret_cast<MapEntry const *>( + static_cast<char const *>(file_->address) + mapOffset); + map_.map.size = mapSize; + map_.trace = trace; + if (!map_.trace.insert(map_.map).second) { + throw FileFormatException( + file_->uri, "UNOIDL format: recursive map"); + } + } private: virtual ~UnoidlModuleEntity() throw () {} virtual std::vector< OUString > getMemberNames() const SAL_OVERRIDE; - virtual rtl::Reference< MapCursor > createCursor() const SAL_OVERRIDE - { return new UnoidlCursor(file_, mapBegin_, mapSize_); } + virtual rtl::Reference< MapCursor > createCursor() const SAL_OVERRIDE { + return new UnoidlCursor( + file_, rtl::Reference<UnoidlProvider>(), + const_cast<UnoidlModuleEntity *>(this), map_); + } rtl::Reference< MappedFile > file_; - MapEntry const * mapBegin_; - sal_uInt32 mapSize_; + NestedMap map_; }; std::vector< OUString > UnoidlModuleEntity::getMemberNames() const { std::vector< OUString > names; - for (sal_uInt32 i = 0; i != mapSize_; ++i) { - names.push_back(file_->readNulName(mapBegin_[i].name.getUnsigned32())); + for (sal_uInt32 i = 0; i != map_.map.size; ++i) { + names.push_back( + file_->readNulName(map_.map.begin[i].name.getUnsigned32())); } return names; } rtl::Reference< Entity > readEntity( - rtl::Reference< MappedFile > const & file, sal_uInt32 offset) + rtl::Reference< MappedFile > const & file, sal_uInt32 offset, + std::set<Map> const & trace) { assert(file.is()); int v = file->read8(offset); @@ -637,7 +662,7 @@ rtl::Reference< Entity > readEntity( file->uri, "UNOIDL format: module map offset + size too large"); } - return new UnoidlModuleEntity(file, offset + 5, n); + return new UnoidlModuleEntity(file, offset + 5, n, trace); } case 1: // enum type { @@ -1193,35 +1218,40 @@ UnoidlProvider::UnoidlProvider(OUString const & uri): file_(new MappedFile(uri)) " 0"); } sal_uInt32 off = file_->read32(8); - mapSize_ = file_->read32(12); - if (off + 8 * sal_uInt64(mapSize_) > file_->size) { // cannot overflow + map_.map.size = file_->read32(12); + if (off + 8 * sal_uInt64(map_.map.size) > file_->size) { // cannot overflow throw FileFormatException( file_->uri, "UNOIDL format: root map offset + size too large"); } - mapBegin_ = reinterpret_cast< MapEntry const * >( + map_.map.begin = reinterpret_cast< MapEntry const * >( static_cast< char const * >(file_->address) + off); + map_.trace.insert(map_.map); } rtl::Reference< MapCursor > UnoidlProvider::createRootCursor() const { - return new UnoidlCursor(file_, mapBegin_, mapSize_); + return new UnoidlCursor( + file_, const_cast<UnoidlProvider *>(this), + rtl::Reference<UnoidlModuleEntity>(), map_); } rtl::Reference< Entity > UnoidlProvider::findEntity(OUString const & name) const { - MapEntry const * mapBegin = mapBegin_; - sal_uInt32 mapSize = mapSize_; + NestedMap map(map_); bool cgroup = false; for (sal_Int32 i = 0;;) { sal_Int32 j = name.indexOf('.', i); if (j == -1) { j = name.getLength(); } - sal_Int32 off = findInMap(file_, mapBegin, mapSize, name, i, j - i); + sal_Int32 off = findInMap( + file_, map.map.begin, map.map.size, name, i, j - i); if (off == 0) { return rtl::Reference< Entity >(); } if (j == name.getLength()) { - return cgroup ? rtl::Reference< Entity >() : readEntity(file_, off); + return cgroup + ? rtl::Reference< Entity >() + : readEntity(file_, off, map.trace); } if (cgroup) { return rtl::Reference< Entity >(); @@ -1240,15 +1270,19 @@ rtl::Reference< Entity > UnoidlProvider::findEntity(OUString const & name) const // prefix of the requested name's segments? } } - mapSize = file_->read32(off + 1); - if (sal_uInt64(off) + 5 + 8 * sal_uInt64(mapSize) > file_->size) + map.map.size = file_->read32(off + 1); + if (sal_uInt64(off) + 5 + 8 * sal_uInt64(map.map.size) > file_->size) // cannot overflow { throw FileFormatException( file_->uri, "UNOIDL format: map offset + size too large"); } - mapBegin = reinterpret_cast< MapEntry const * >( + map.map.begin = reinterpret_cast< MapEntry const * >( static_cast< char const * >(file_->address) + off + 5); + if (!map.trace.insert(map.map).second) { + throw FileFormatException( + file_->uri, "UNOIDL format: recursive map"); + } i = j + 1; } } diff --git a/unoidl/source/unoidlprovider.hxx b/unoidl/source/unoidlprovider.hxx index 2f0728a..9eacfb5 100644 --- a/unoidl/source/unoidlprovider.hxx +++ b/unoidl/source/unoidlprovider.hxx @@ -12,6 +12,8 @@ #include "sal/config.h" +#include <set> + #include "rtl/ref.hxx" #include "sal/types.h" #include "unoidl/unoidl.hxx" @@ -21,6 +23,16 @@ namespace unoidl { namespace detail { class MappedFile; struct MapEntry; +struct Map { + MapEntry const * begin; + sal_uInt32 size; +}; + +struct NestedMap { + Map map; + std::set<Map> trace; +}; + class UnoidlProvider: public Provider { public: // throws FileFormatException, NoSuchFileException: @@ -37,8 +49,7 @@ private: virtual ~UnoidlProvider() throw (); rtl::Reference< detail::MappedFile > file_; - detail::MapEntry const * mapBegin_; - sal_uInt32 mapSize_; + NestedMap map_; }; } } commit b0583c57efc253e4e2f9c86e7900eb02e0e22173 Author: Stephan Bergmann <sberg...@redhat.com> Date: Tue Nov 18 16:48:35 2014 +0100 Revert "cosmetic 'en-passant'...." This reverts commit d4810a814c7c7f3db2df15b62367bd1edc7040f6. Change-Id: Ia062e070c7d7dac5cc4388d1c8e812fb97851d52 diff --git a/unoidl/source/unoidl-check.cxx b/unoidl/source/unoidl-check.cxx index c314b86..22dff88 100644 --- a/unoidl/source/unoidl-check.cxx +++ b/unoidl/source/unoidl-check.cxx @@ -27,12 +27,9 @@ namespace unoidl { -bool operator ==(ConstantValue const & lhs, ConstantValue const & rhs) -{ - if (lhs.type == rhs.type) - { - switch (lhs.type) - { +bool operator ==(ConstantValue const & lhs, ConstantValue const & rhs) { + if (lhs.type == rhs.type) { + switch (lhs.type) { case ConstantValue::TYPE_BOOLEAN: return lhs.booleanValue == rhs.booleanValue; case ConstantValue::TYPE_BYTE: @@ -58,13 +55,13 @@ bool operator ==(ConstantValue const & lhs, ConstantValue const & rhs) return false; } -bool operator !=(ConstantValue const & lhs, ConstantValue const & rhs) -{ +bool operator !=(ConstantValue const & lhs, ConstantValue const & rhs) { return !(lhs == rhs); } -bool operator ==( SingleInterfaceBasedServiceEntity::Constructor::Parameter const & lhs, - SingleInterfaceBasedServiceEntity::Constructor::Parameter const & rhs) +bool operator ==( + SingleInterfaceBasedServiceEntity::Constructor::Parameter const & lhs, + SingleInterfaceBasedServiceEntity::Constructor::Parameter const & rhs) { return lhs.name == rhs.name && lhs.type == rhs.type && lhs.rest == rhs.rest; } @@ -73,18 +70,12 @@ bool operator ==( SingleInterfaceBasedServiceEntity::Constructor::Parameter cons namespace { -void badUsage() -{ +void badUsage() { std::cerr - << "Usage:" - << std::endl - << std::endl + << "Usage:" << std::endl << std::endl << (" unoidl-check [<extra registries A>] <registry A> -- [<extra" " registries B>]") - << std::endl - << " <registry B>" - << std::endl - << std::endl + << std::endl << " <registry B>" << std::endl << std::endl << ("where each <registry> is either a new- or legacy-format .rdb file," " a single .idl") << std::endl @@ -96,14 +87,11 @@ void badUsage() std::exit(EXIT_FAILURE); } -OUString getArgumentUri(sal_uInt32 argument, bool * delimiter) -{ +OUString getArgumentUri(sal_uInt32 argument, bool * delimiter) { OUString arg; rtl_getAppCommandArg(argument, &arg.pData); - if (arg == "--") - { - if (delimiter == 0) - { + if (arg == "--") { + if (delimiter == 0) { badUsage(); } *delimiter = true; @@ -111,18 +99,15 @@ OUString getArgumentUri(sal_uInt32 argument, bool * delimiter) } OUString url; osl::FileBase::RC e1 = osl::FileBase::getFileURLFromSystemPath(arg, url); - if (e1 != osl::FileBase::E_None) - { + if (e1 != osl::FileBase::E_None) { std::cerr << "Cannot convert \"" << arg << "\" to file URL, error code " - << +e1 - << std::endl; + << +e1 << std::endl; std::exit(EXIT_FAILURE); } OUString cwd; oslProcessError e2 = osl_getProcessWorkingDir(&cwd.pData); - if (e2 != osl_Process_E_None) - { + if (e2 != osl_Process_E_None) { std::cerr << "Cannot obtain working directory, error code " << +e2 << std::endl; @@ -130,21 +115,19 @@ OUString getArgumentUri(sal_uInt32 argument, bool * delimiter) } OUString abs; e1 = osl::FileBase::getAbsoluteFileURL(cwd, url, abs); - if (e1 != osl::FileBase::E_None) - { + if (e1 != osl::FileBase::E_None) { std::cerr << "Cannot make \"" << url - << "\" into an absolute file URL, error code " << +e1 - << std::endl; + << "\" into an absolute file URL, error code " << +e1 << std::endl; std::exit(EXIT_FAILURE); } return abs; } -OUString showDirection( unoidl::InterfaceTypeEntity::Method::Parameter::Direction direction) +OUString showDirection( + unoidl::InterfaceTypeEntity::Method::Parameter::Direction direction) { - switch (direction) - { + switch (direction) { case unoidl::InterfaceTypeEntity::Method::Parameter::DIRECTION_IN: return OUString("[in]"); case unoidl::InterfaceTypeEntity::Method::Parameter::DIRECTION_OUT: @@ -156,828 +139,824 @@ OUString showDirection( unoidl::InterfaceTypeEntity::Method::Parameter::Directio } } -struct EqualsAnnotation -{ +struct EqualsAnnotation { EqualsAnnotation(OUString const & name): name_(name) {} bool operator ()(unoidl::AnnotatedReference const & ref) - { return ref.name == name_; } + { return ref.name == name_; } private: OUString name_; }; -void checkMap( rtl::Reference<unoidl::Provider> const & providerB, OUString const & prefix, - rtl::Reference<unoidl::MapCursor> const & cursor) +void checkMap( + rtl::Reference<unoidl::Provider> const & providerB, OUString const & prefix, + rtl::Reference<unoidl::MapCursor> const & cursor) { assert(providerB.is()); assert(cursor.is()); - for (;;) - { + for (;;) { OUString id; rtl::Reference<unoidl::Entity> entA(cursor->getNext(&id)); - if (!entA.is()) - { + if (!entA.is()) { break; } OUString name(prefix + id); - if (entA->getSort() == unoidl::Entity::SORT_MODULE) - { - checkMap( providerB, name + ".", - (static_cast<unoidl::ModuleEntity *>(entA.get())->createCursor())); - } - else - { + if (entA->getSort() == unoidl::Entity::SORT_MODULE) { + checkMap( + providerB, name + ".", + (static_cast<unoidl::ModuleEntity *>(entA.get()) + ->createCursor())); + } else { rtl::Reference<unoidl::Entity> entB(providerB->findEntity(name)); - if (!entB.is()) - { + if (!entB.is()) { std::cerr << "A entity " << name << " is not present in B" << std::endl; std::exit(EXIT_FAILURE); } - if (entA->getSort() != entB->getSort()) - { + if (entA->getSort() != entB->getSort()) { std::cerr << "A entity " << name << " is of different sort in B" << std::endl; std::exit(EXIT_FAILURE); } - if ((dynamic_cast<unoidl::PublishableEntity&>(*entA.get()).isPublished()) && - (!dynamic_cast<unoidl::PublishableEntity&>(*entB.get()).isPublished())) + if ((dynamic_cast<unoidl::PublishableEntity &>(*entA.get()) + .isPublished()) + && (!dynamic_cast<unoidl::PublishableEntity &>(*entB.get()) + .isPublished())) { std::cerr << "A published entity " << name << " is not published in B" << std::endl; std::exit(EXIT_FAILURE); } - switch (entA->getSort()) - { + switch (entA->getSort()) { case unoidl::Entity::SORT_MODULE: assert(false && "this cannot happen"); //deliberate fall-through anyway case unoidl::Entity::SORT_ENUM_TYPE: - { - rtl::Reference<unoidl::EnumTypeEntity> ent2A( + { + rtl::Reference<unoidl::EnumTypeEntity> ent2A( static_cast<unoidl::EnumTypeEntity *>(entA.get())); - rtl::Reference<unoidl::EnumTypeEntity> ent2B( + rtl::Reference<unoidl::EnumTypeEntity> ent2B( static_cast<unoidl::EnumTypeEntity *>(entB.get())); - - if (ent2A->getMembers().size() != ent2B->getMembers().size()) - { - std::cerr - << "enum type " << name - << " number of members changed from " - << ent2A->getMembers().size() << " to " - << ent2B->getMembers().size() - << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::EnumTypeEntity::Member>::const_iterator - i(ent2A->getMembers().begin()), - j(ent2B->getMembers().begin()); - i != ent2A->getMembers().end(); ++i, ++j) - { - if (i->name != j->name || - i->value != j->value) + if (ent2A->getMembers().size() + != ent2B->getMembers().size()) { std::cerr - << "enum type " << name << " member #" - << i - ent2A->getMembers().begin() + 1 - << " changed from " << i->name << " = " - << i->value << " to " << j->name << " = " - << j->value - << std::endl; + << "enum type " << name + << " number of members changed from " + << ent2A->getMembers().size() << " to " + << ent2B->getMembers().size() << std::endl; std::exit(EXIT_FAILURE); } + for (std::vector<unoidl::EnumTypeEntity::Member>::const_iterator + i(ent2A->getMembers().begin()), + j(ent2B->getMembers().begin()); + i != ent2A->getMembers().end(); ++i, ++j) + { + if (i->name != j->name || i->value != j->value) { + std::cerr + << "enum type " << name << " member #" + << i - ent2A->getMembers().begin() + 1 + << " changed from " << i->name << " = " + << i->value << " to " << j->name << " = " + << j->value << std::endl; + std::exit(EXIT_FAILURE); + } + } + break; } - break; - } case unoidl::Entity::SORT_PLAIN_STRUCT_TYPE: - { - rtl::Reference<unoidl::PlainStructTypeEntity> ent2A( - static_cast<unoidl::PlainStructTypeEntity *>(entA.get())); - rtl::Reference<unoidl::PlainStructTypeEntity> ent2B( - static_cast<unoidl::PlainStructTypeEntity *>(entB.get())); - - if (ent2A->getDirectBase() != ent2B->getDirectBase()) - { - std::cerr - << "plain struct type " << name - << " direct base changed from " - << (ent2A->getDirectBase().isEmpty() ? OUString("none") : ent2A->getDirectBase()) - << " to " - << (ent2B->getDirectBase().isEmpty() ? OUString("none") : ent2B->getDirectBase()) - << std::endl; - std::exit(EXIT_FAILURE); - } - if (ent2A->getDirectMembers().size() - != ent2B->getDirectMembers().size()) { - std::cerr - << "plain struct type " << name - << " number of direct members changed from " - << ent2A->getDirectMembers().size() << " to " - << ent2B->getDirectMembers().size() << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::PlainStructTypeEntity::Member>::const_iterator - i(ent2A->getDirectMembers().begin()), - j(ent2B->getDirectMembers().begin()); - i != ent2A->getDirectMembers().end(); ++i, ++j) - { - if (i->name != j->name || - i->type != j->type) - { + rtl::Reference<unoidl::PlainStructTypeEntity> ent2A( + static_cast<unoidl::PlainStructTypeEntity *>( + entA.get())); + rtl::Reference<unoidl::PlainStructTypeEntity> ent2B( + static_cast<unoidl::PlainStructTypeEntity *>( + entB.get())); + if (ent2A->getDirectBase() != ent2B->getDirectBase()) { std::cerr << "plain struct type " << name - << " direct member #" - << i - ent2A->getDirectMembers().begin() + 1 - << " changed from " << i->type << " " << i->name - << " to " << j->type << " " << j->name + << " direct base changed from " + << (ent2A->getDirectBase().isEmpty() + ? OUString("none") : ent2A->getDirectBase()) + << " to " + << (ent2B->getDirectBase().isEmpty() + ? OUString("none") : ent2B->getDirectBase()) << std::endl; std::exit(EXIT_FAILURE); } + if (ent2A->getDirectMembers().size() + != ent2B->getDirectMembers().size()) + { + std::cerr + << "plain struct type " << name + << " number of direct members changed from " + << ent2A->getDirectMembers().size() << " to " + << ent2B->getDirectMembers().size() << std::endl; + std::exit(EXIT_FAILURE); + } + for (std::vector<unoidl::PlainStructTypeEntity::Member>::const_iterator + i(ent2A->getDirectMembers().begin()), + j(ent2B->getDirectMembers().begin()); + i != ent2A->getDirectMembers().end(); ++i, ++j) + { + if (i->name != j->name || i->type != j->type) { + std::cerr + << "plain struct type " << name + << " direct member #" + << i - ent2A->getDirectMembers().begin() + 1 + << " changed from " << i->type << " " << i->name + << " to " << j->type << " " << j->name + << std::endl; + std::exit(EXIT_FAILURE); + } + } + break; } - break; - } case unoidl::Entity::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE: - { - rtl::Reference<unoidl::PolymorphicStructTypeTemplateEntity> - ent2A(static_cast<unoidl::PolymorphicStructTypeTemplateEntity *>(entA.get())); - rtl::Reference<unoidl::PolymorphicStructTypeTemplateEntity> - ent2B(static_cast<unoidl::PolymorphicStructTypeTemplateEntity *>(entB.get())); - - if (ent2A->getTypeParameters().size() != ent2B->getTypeParameters().size()) - { - std::cerr - << "polymorphic struct type template " << name - << " number of type parameters changed from " - << ent2A->getTypeParameters().size() << " to " - << ent2B->getTypeParameters().size() - << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<OUString>::const_iterator - i(ent2A->getTypeParameters().begin()), - j(ent2B->getTypeParameters().begin()); - i != ent2A->getTypeParameters().end(); ++i, ++j) { - if (*i != *j) + rtl::Reference<unoidl::PolymorphicStructTypeTemplateEntity> + ent2A( + static_cast<unoidl::PolymorphicStructTypeTemplateEntity *>( + entA.get())); + rtl::Reference<unoidl::PolymorphicStructTypeTemplateEntity> + ent2B( + static_cast<unoidl::PolymorphicStructTypeTemplateEntity *>( + entB.get())); + if (ent2A->getTypeParameters().size() + != ent2B->getTypeParameters().size()) { std::cerr << "polymorphic struct type template " << name - << " type parameter #" - << i - ent2A->getTypeParameters().begin() + 1 - << " changed from " << *i << " to " << *j - << std::endl; + << " number of type parameters changed from " + << ent2A->getTypeParameters().size() << " to " + << ent2B->getTypeParameters().size() << std::endl; std::exit(EXIT_FAILURE); } - } - if (ent2A->getMembers().size() != ent2B->getMembers().size()) - { - std::cerr - << "polymorphic struct type template " << name - << " number of members changed from " - << ent2A->getMembers().size() << " to " - << ent2B->getMembers().size() << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::PolymorphicStructTypeTemplateEntity::Member>::const_iterator - i(ent2A->getMembers().begin()), - j(ent2B->getMembers().begin()); - i != ent2A->getMembers().end(); ++i, ++j) - { - if (i->name != j->name || - i->type != j->type || - i->parameterized != j->parameterized) + for (std::vector<OUString>::const_iterator + i(ent2A->getTypeParameters().begin()), + j(ent2B->getTypeParameters().begin()); + i != ent2A->getTypeParameters().end(); ++i, ++j) + { + if (*i != *j) { + std::cerr + << "polymorphic struct type template " << name + << " type parameter #" + << i - ent2A->getTypeParameters().begin() + 1 + << " changed from " << *i << " to " << *j + << std::endl; + std::exit(EXIT_FAILURE); + } + } + if (ent2A->getMembers().size() + != ent2B->getMembers().size()) { std::cerr << "polymorphic struct type template " << name - << " member #" - << i - ent2A->getMembers().begin() + 1 - << " changed from " - << (i->parameterized ? OUString("parameterized ") : OUString()) - << i->type << " " << i->name - << " to " - << (j->parameterized ? OUString("parameterized ") : OUString()) - << j->type << " " << j->name - << std::endl; + << " number of members changed from " + << ent2A->getMembers().size() << " to " + << ent2B->getMembers().size() << std::endl; + std::exit(EXIT_FAILURE); + } + for (std::vector<unoidl::PolymorphicStructTypeTemplateEntity::Member>::const_iterator + i(ent2A->getMembers().begin()), + j(ent2B->getMembers().begin()); + i != ent2A->getMembers().end(); ++i, ++j) + { + if (i->name != j->name || i->type != j->type + || i->parameterized != j->parameterized) + { + std::cerr + << "polymorphic struct type template " << name + << " member #" + << i - ent2A->getMembers().begin() + 1 + << " changed from " + << (i->parameterized + ? OUString("parameterized ") : OUString()) + << i->type << " " << i->name + << " to " + << (j->parameterized + ? OUString("parameterized ") : OUString()) + << j->type << " " << j->name + << std::endl; std::exit(EXIT_FAILURE); + } } + break; } - break; - } case unoidl::Entity::SORT_EXCEPTION_TYPE: - { - rtl::Reference<unoidl::ExceptionTypeEntity> ent2A( + { + rtl::Reference<unoidl::ExceptionTypeEntity> ent2A( static_cast<unoidl::ExceptionTypeEntity *>(entA.get())); - rtl::Reference<unoidl::ExceptionTypeEntity> ent2B( + rtl::Reference<unoidl::ExceptionTypeEntity> ent2B( static_cast<unoidl::ExceptionTypeEntity *>(entB.get())); - if (ent2A->getDirectBase() != ent2B->getDirectBase()) - { - std::cerr - << "exception type " << name - << " direct base changed from " - << (ent2A->getDirectBase().isEmpty() ? OUString("none") : ent2A->getDirectBase()) - << " to " - << (ent2B->getDirectBase().isEmpty() ? OUString("none") : ent2B->getDirectBase()) - << std::endl; - std::exit(EXIT_FAILURE); - } - if (ent2A->getDirectMembers().size() != ent2B->getDirectMembers().size()) - { - std::cerr - << "exception type " << name - << " number of direct members changed from " - << ent2A->getDirectMembers().size() << " to " - << ent2B->getDirectMembers().size() << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::ExceptionTypeEntity::Member>::const_iterator - i(ent2A->getDirectMembers().begin()), - j(ent2B->getDirectMembers().begin()); - i != ent2A->getDirectMembers().end(); ++i, ++j) - { - if (i->name != j->name || i->type != j->type) - { + if (ent2A->getDirectBase() != ent2B->getDirectBase()) { std::cerr << "exception type " << name - << " direct member #" - << i - ent2A->getDirectMembers().begin() + 1 - << " changed from " << i->type << " " << i->name - << " to " << j->type << " " << j->name + << " direct base changed from " + << (ent2A->getDirectBase().isEmpty() + ? OUString("none") : ent2A->getDirectBase()) + << " to " + << (ent2B->getDirectBase().isEmpty() + ? OUString("none") : ent2B->getDirectBase()) << std::endl; std::exit(EXIT_FAILURE); } - } - break; - } - case unoidl::Entity::SORT_INTERFACE_TYPE: - { - rtl::Reference<unoidl::InterfaceTypeEntity> ent2A( - static_cast<unoidl::InterfaceTypeEntity *>(entA.get())); - rtl::Reference<unoidl::InterfaceTypeEntity> ent2B( - static_cast<unoidl::InterfaceTypeEntity *>(entB.get())); - if (ent2A->getDirectMandatoryBases().size() != ent2B->getDirectMandatoryBases().size()) - { - std::cerr - << "interface type " << name - << " number of direct mandatory bases changed from " - << ent2A->getDirectMandatoryBases().size() << " to " - << ent2B->getDirectMandatoryBases().size() - << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::AnnotatedReference>::const_iterator - i(ent2A->getDirectMandatoryBases().begin()), - j(ent2B->getDirectMandatoryBases().begin()); - i != ent2A->getDirectMandatoryBases().end(); ++i, ++j) - { - if (i->name != j->name) + if (ent2A->getDirectMembers().size() + != ent2B->getDirectMembers().size()) { std::cerr - << "interface type " << name - << " direct mandatory base #" - << (i - ent2A->getDirectMandatoryBases().begin() - + 1) - << " changed from " << i->name << " to " - << j->name - << std::endl; + << "exception type " << name + << " number of direct members changed from " + << ent2A->getDirectMembers().size() << " to " + << ent2B->getDirectMembers().size() << std::endl; std::exit(EXIT_FAILURE); } + for (std::vector<unoidl::ExceptionTypeEntity::Member>::const_iterator + i(ent2A->getDirectMembers().begin()), + j(ent2B->getDirectMembers().begin()); + i != ent2A->getDirectMembers().end(); ++i, ++j) + { + if (i->name != j->name || i->type != j->type) { + std::cerr + << "exception type " << name + << " direct member #" + << i - ent2A->getDirectMembers().begin() + 1 + << " changed from " << i->type << " " << i->name + << " to " << j->type << " " << j->name + << std::endl; + std::exit(EXIT_FAILURE); + } + } + break; } - if (ent2A->getDirectOptionalBases().size() != ent2B->getDirectOptionalBases().size()) - { - std::cerr - << "interface type " << name - << " number of direct optional bases changed from " - << ent2A->getDirectOptionalBases().size() << " to " - << ent2B->getDirectOptionalBases().size() - << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::AnnotatedReference>::const_iterator - i(ent2A->getDirectOptionalBases().begin()), - j(ent2B->getDirectOptionalBases().begin()); - i != ent2A->getDirectOptionalBases().end(); ++i, ++j) + case unoidl::Entity::SORT_INTERFACE_TYPE: { - if (i->name != j->name) + rtl::Reference<unoidl::InterfaceTypeEntity> ent2A( + static_cast<unoidl::InterfaceTypeEntity *>(entA.get())); + rtl::Reference<unoidl::InterfaceTypeEntity> ent2B( + static_cast<unoidl::InterfaceTypeEntity *>(entB.get())); + if (ent2A->getDirectMandatoryBases().size() + != ent2B->getDirectMandatoryBases().size()) { std::cerr << "interface type " << name - << " direct optional base #" - << (i - ent2A->getDirectOptionalBases().begin() + 1) - << " changed from " << i->name << " to " - << j->name + << " number of direct mandatory bases changed from " + << ent2A->getDirectMandatoryBases().size() << " to " + << ent2B->getDirectMandatoryBases().size() << std::endl; std::exit(EXIT_FAILURE); } - } - if (ent2A->getDirectAttributes().size() - != ent2B->getDirectAttributes().size()) - { - std::cerr - << "interface type " << name - << " number of direct attributes changed from " - << ent2A->getDirectAttributes().size() << " to " - << ent2B->getDirectAttributes().size() << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::InterfaceTypeEntity::Attribute>::const_iterator - i(ent2A->getDirectAttributes().begin()), - j(ent2B->getDirectAttributes().begin()); - i != ent2A->getDirectAttributes().end(); ++i, ++j) - { - if (i->name != j->name || - i->type != j->type || - i->bound != j->bound || - i->readOnly != j->readOnly || - i->getExceptions != j->getExceptions || - i->setExceptions != j->setExceptions) + for (std::vector<unoidl::AnnotatedReference>::const_iterator + i(ent2A->getDirectMandatoryBases().begin()), + j(ent2B->getDirectMandatoryBases().begin()); + i != ent2A->getDirectMandatoryBases().end(); ++i, ++j) + { + if (i->name != j->name) { + std::cerr + << "interface type " << name + << " direct mandatory base #" + << (i - ent2A->getDirectMandatoryBases().begin() + + 1) + << " changed from " << i->name << " to " + << j->name << std::endl; + std::exit(EXIT_FAILURE); + } + } + if (ent2A->getDirectOptionalBases().size() + != ent2B->getDirectOptionalBases().size()) { std::cerr << "interface type " << name - << " direct attribute #" - << i - ent2A->getDirectAttributes().begin() + 1 - << " changed from " - << (i->bound ? OUString("bound ") : OUString()) - << (i->readOnly ? OUString("read-only ") : OUString()) - << i->type << " " << i->name //TODO: exceptions - << " to " - << (j->bound ? OUString("bound ") : OUString()) - << (j->readOnly ? OUString("read-only ") : OUString()) - << j->type << " " << j->name //TODO: exceptions + << " number of direct optional bases changed from " + << ent2A->getDirectOptionalBases().size() << " to " + << ent2B->getDirectOptionalBases().size() << std::endl; std::exit(EXIT_FAILURE); } - } - if (ent2A->getDirectMethods().size() - != ent2B->getDirectMethods().size()) - { - std::cerr - << "interface type " << name - << " number of direct methods changed from " - << ent2A->getDirectMethods().size() << " to " - << ent2B->getDirectMethods().size() << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::InterfaceTypeEntity::Method>::const_iterator - i(ent2A->getDirectMethods().begin()), - j(ent2B->getDirectMethods().begin()); - i != ent2A->getDirectMethods().end(); ++i, ++j) - { - if (i->name != j->name || - i->returnType != j->returnType || - i->exceptions != j->exceptions) + for (std::vector<unoidl::AnnotatedReference>::const_iterator + i(ent2A->getDirectOptionalBases().begin()), + j(ent2B->getDirectOptionalBases().begin()); + i != ent2A->getDirectOptionalBases().end(); ++i, ++j) + { + if (i->name != j->name) { + std::cerr + << "interface type " << name + << " direct optional base #" + << (i - ent2A->getDirectOptionalBases().begin() + + 1) + << " changed from " << i->name << " to " + << j->name << std::endl; + std::exit(EXIT_FAILURE); + } + } + if (ent2A->getDirectAttributes().size() + != ent2B->getDirectAttributes().size()) { std::cerr << "interface type " << name - << " direct method #" - << i - ent2A->getDirectMethods().begin() + 1 - << " changed from " - << i->returnType << " " << i->name //TODO: exceptions - << " to " << j->returnType << " " << j->name //TODO: exceptions - << std::endl; + << " number of direct attributes changed from " + << ent2A->getDirectAttributes().size() << " to " + << ent2B->getDirectAttributes().size() << std::endl; std::exit(EXIT_FAILURE); } - if (i->parameters.size() != j->parameters.size()) + for (std::vector<unoidl::InterfaceTypeEntity::Attribute>::const_iterator + i(ent2A->getDirectAttributes().begin()), + j(ent2B->getDirectAttributes().begin()); + i != ent2A->getDirectAttributes().end(); ++i, ++j) + { + if (i->name != j->name || i->type != j->type + || i->bound != j->bound + || i->readOnly != j->readOnly + || i->getExceptions != j->getExceptions + || i->setExceptions != j->setExceptions) + { + std::cerr + << "interface type " << name + << " direct attribute #" + << i - ent2A->getDirectAttributes().begin() + 1 + << " changed from " + << (i->bound ? OUString("bound ") : OUString()) + << (i->readOnly + ? OUString("read-only ") : OUString()) + << i->type << " " << i->name //TODO: exceptions + << " to " + << (j->bound ? OUString("bound ") : OUString()) + << (j->readOnly + ? OUString("read-only ") : OUString()) + << j->type << " " << j->name //TODO: exceptions + << std::endl; + std::exit(EXIT_FAILURE); + } + } + if (ent2A->getDirectMethods().size() + != ent2B->getDirectMethods().size()) { std::cerr << "interface type " << name - << " direct method " << i->name - << " number of parameters changed from " - << i->parameters.size() << " to " - << j->parameters.size() - << std::endl; + << " number of direct methods changed from " + << ent2A->getDirectMethods().size() << " to " + << ent2B->getDirectMethods().size() << std::endl; std::exit(EXIT_FAILURE); } - for (std::vector<unoidl::InterfaceTypeEntity::Method::Parameter>::const_iterator - k(i->parameters.begin()), - l(j->parameters.begin()); - k != i->parameters.end(); ++k, ++l) + for (std::vector<unoidl::InterfaceTypeEntity::Method>::const_iterator + i(ent2A->getDirectMethods().begin()), + j(ent2B->getDirectMethods().begin()); + i != ent2A->getDirectMethods().end(); ++i, ++j) { - if (k->type != l->type || k->direction != l->direction) + if (i->name != j->name || i->returnType != j->returnType + || i->exceptions != j->exceptions) { std::cerr << "interface type " << name - << " direct method " << i->name - << " parameter #" - << k - i->parameters.begin() + 1 + << " direct method #" + << i - ent2A->getDirectMethods().begin() + 1 << " changed from " - << showDirection(k->direction) << " " - << k->type << " to " - << showDirection(l->direction) << " " - << l->type + << i->returnType << " " << i->name //TODO: exceptions + << " to " << j->returnType << " " << j->name //TODO: exceptions << std::endl; std::exit(EXIT_FAILURE); } - if (k->name != l->name) - { + if (i->parameters.size() != j->parameters.size()) { std::cerr << "interface type " << name << " direct method " << i->name - << " parameter #" - << k - i->parameters.begin() + 1 - << " changed name from " << k->name - << " to " << l->name - << std::endl; + << " number of parameters changed from " + << i->parameters.size() << " to " + << j->parameters.size() << std::endl; std::exit(EXIT_FAILURE); } + for (std::vector<unoidl::InterfaceTypeEntity::Method::Parameter>::const_iterator + k(i->parameters.begin()), + l(j->parameters.begin()); + k != i->parameters.end(); ++k, ++l) + { + if (k->type != l->type || k->direction != l->direction) + { + std::cerr + << "interface type " << name + << " direct method " << i->name + << " parameter #" + << k - i->parameters.begin() + 1 + << " changed from " + << showDirection(k->direction) << " " + << k->type << " to " + << showDirection(l->direction) << " " + << l->type << std::endl; + std::exit(EXIT_FAILURE); + } + if (k->name != l->name) { + std::cerr + << "interface type " << name + << " direct method " << i->name + << " parameter #" + << k - i->parameters.begin() + 1 + << " changed name from " << k->name + << " to " << l->name << std::endl; + std::exit(EXIT_FAILURE); + } + } } + break; } - break; - } case unoidl::Entity::SORT_TYPEDEF: - { - rtl::Reference<unoidl::TypedefEntity> ent2A( + { + rtl::Reference<unoidl::TypedefEntity> ent2A( static_cast<unoidl::TypedefEntity *>(entA.get())); - rtl::Reference<unoidl::TypedefEntity> ent2B( + rtl::Reference<unoidl::TypedefEntity> ent2B( static_cast<unoidl::TypedefEntity *>(entB.get())); - if (ent2A->getType() != ent2B->getType()) - { - std::cerr - << "typedef " << name << " type changed from " - << ent2A->getType() << " to " << ent2B->getType() - << std::endl; - std::exit(EXIT_FAILURE); + if (ent2A->getType() != ent2B->getType()) { + std::cerr + << "typedef " << name << " type changed from " + << ent2A->getType() << " to " << ent2B->getType() + << std::endl; + std::exit(EXIT_FAILURE); + } + break; } - break; - } case unoidl::Entity::SORT_CONSTANT_GROUP: - { - rtl::Reference<unoidl::ConstantGroupEntity> ent2A( + { + rtl::Reference<unoidl::ConstantGroupEntity> ent2A( static_cast<unoidl::ConstantGroupEntity *>(entA.get())); - rtl::Reference<unoidl::ConstantGroupEntity> ent2B( + rtl::Reference<unoidl::ConstantGroupEntity> ent2B( static_cast<unoidl::ConstantGroupEntity *>(entB.get())); - for (std::vector<unoidl::ConstantGroupEntity::Member>::const_iterator - i(ent2A->getMembers().begin()); - i != ent2A->getMembers().end(); ++i) - { - bool found = false; for (std::vector<unoidl::ConstantGroupEntity::Member>::const_iterator - j(ent2B->getMembers().begin()); - j != ent2B->getMembers().end(); ++j) + i(ent2A->getMembers().begin()); + i != ent2A->getMembers().end(); ++i) { - if (i->name == j->name) + bool found = false; + for (std::vector<unoidl::ConstantGroupEntity::Member>::const_iterator + j(ent2B->getMembers().begin()); + j != ent2B->getMembers().end(); ++j) { - if (i->value != j->value) - { - std::cerr - << "constant group " << name - << " member " << i->name - << " changed value" - << std::endl; - std::exit(EXIT_FAILURE); + if (i->name == j->name) { + if (i->value != j->value) { + std::cerr + << "constant group " << name + << " member " << i->name + << " changed value" << std::endl; + std::exit(EXIT_FAILURE); + } + found = true; + break; } - found = true; - break; + } + if (!found) { + std::cerr + << "A constant group " << name << " member " + << i->name << " is not present in B" + << std::endl; + std::exit(EXIT_FAILURE); } } - if (!found) - { + break; + } + case unoidl::Entity::SORT_SINGLE_INTERFACE_BASED_SERVICE: + { + rtl::Reference<unoidl::SingleInterfaceBasedServiceEntity> + ent2A( + static_cast<unoidl::SingleInterfaceBasedServiceEntity *>( + entA.get())); + rtl::Reference<unoidl::SingleInterfaceBasedServiceEntity> + ent2B( + static_cast<unoidl::SingleInterfaceBasedServiceEntity *>( + entB.get())); + if (ent2A->getBase() != ent2B->getBase()) { std::cerr - << "A constant group " << name << " member " - << i->name << " is not present in B" + << "single-interface--based servcie " << name + << " base changed from " << ent2A->getBase() + << " to " << ent2B->getBase() << std::endl; std::exit(EXIT_FAILURE); } - } - break; - } - case unoidl::Entity::SORT_SINGLE_INTERFACE_BASED_SERVICE: - { - rtl::Reference<unoidl::SingleInterfaceBasedServiceEntity> - ent2A( static_cast<unoidl::SingleInterfaceBasedServiceEntity *>( entA.get())); - rtl::Reference<unoidl::SingleInterfaceBasedServiceEntity> - ent2B( static_cast<unoidl::SingleInterfaceBasedServiceEntity *>( entB.get())); - if (ent2A->getBase() != ent2B->getBase()) - { - std::cerr - << "single-interface--based servcie " << name - << " base changed from " << ent2A->getBase() - << " to " << ent2B->getBase() - << std::endl; - std::exit(EXIT_FAILURE); - } - if (ent2A->getConstructors().size() != ent2B->getConstructors().size()) - { - std::cerr - << "single-interface--based service " << name - << " number of constructors changed from " - << ent2A->getConstructors().size() << " to " - << ent2B->getConstructors().size() << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor>::const_iterator - i(ent2A->getConstructors().begin()), - j(ent2B->getConstructors().begin()); - i != ent2A->getConstructors().end(); ++i, ++j) - { - if (i->name != j->name || - i->parameters != j->parameters || - i->exceptions != j->exceptions || - i->defaultConstructor != j->defaultConstructor) + if (ent2A->getConstructors().size() + != ent2B->getConstructors().size()) { std::cerr << "single-interface--based service " << name - << " constructor #" - << i - ent2A->getConstructors().begin() + 1 - << " changed from " - << (i->defaultConstructor ? OUString("default ") : i->name) //TODO: parameters, exceptions - << " to " - << (j->defaultConstructor ? OUString("default ") : j->name) //TODO: parameters, exceptions - << std::endl; + << " number of constructors changed from " + << ent2A->getConstructors().size() << " to " + << ent2B->getConstructors().size() << std::endl; std::exit(EXIT_FAILURE); } + for (std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor>::const_iterator + i(ent2A->getConstructors().begin()), + j(ent2B->getConstructors().begin()); + i != ent2A->getConstructors().end(); ++i, ++j) + { + if (i->name != j->name || i->parameters != j->parameters + || i->exceptions != j->exceptions + || i->defaultConstructor != j->defaultConstructor) + { + std::cerr + << "single-interface--based service " << name + << " constructor #" + << i - ent2A->getConstructors().begin() + 1 + << " changed from " + << (i->defaultConstructor + ? OUString("default ") : i->name) //TODO: parameters, exceptions + << " to " + << (j->defaultConstructor + ? OUString("default ") : j->name) //TODO: parameters, exceptions + << std::endl; + std::exit(EXIT_FAILURE); + } + } + break; } - break; - } case unoidl::Entity::SORT_ACCUMULATION_BASED_SERVICE: - { - rtl::Reference<unoidl::AccumulationBasedServiceEntity> - ent2A( static_cast<unoidl::AccumulationBasedServiceEntity *>( entA.get())); - rtl::Reference<unoidl::AccumulationBasedServiceEntity> - ent2B( static_cast<unoidl::AccumulationBasedServiceEntity *>( entB.get())); - - if (ent2A->getDirectMandatoryBaseServices().size() != ent2B->getDirectMandatoryBaseServices().size()) { - std::cerr - << "accumulation-based service " << name - << " number of direct mandatory base services changed from " - << ent2A->getDirectMandatoryBaseServices().size() - << " to " - << ent2B->getDirectMandatoryBaseServices().size() - << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::AnnotatedReference>::const_iterator - i(ent2A->getDirectMandatoryBaseServices().begin()), - j(ent2B->getDirectMandatoryBaseServices().begin()); - i != ent2A->getDirectMandatoryBaseServices().end(); - ++i, ++j) - { - if (i->name != j->name) + rtl::Reference<unoidl::AccumulationBasedServiceEntity> + ent2A( + static_cast<unoidl::AccumulationBasedServiceEntity *>( + entA.get())); + rtl::Reference<unoidl::AccumulationBasedServiceEntity> + ent2B( + static_cast<unoidl::AccumulationBasedServiceEntity *>( + entB.get())); + if (ent2A->getDirectMandatoryBaseServices().size() + != ent2B->getDirectMandatoryBaseServices().size()) { std::cerr << "accumulation-based service " << name - << " direct mandatory base service #" - << (i - (ent2A->getDirectMandatoryBaseServices().begin()) + 1) - << " changed from " << i->name << " to " - << j->name << std::endl; + << (" number of direct mandatory base services" + " changed from ") + << ent2A->getDirectMandatoryBaseServices().size() + << " to " + << ent2B->getDirectMandatoryBaseServices().size() + << std::endl; std::exit(EXIT_FAILURE); } - } - if (ent2A->getDirectOptionalBaseServices().size() > ent2B->getDirectOptionalBaseServices().size()) - { - std::cerr - << "accumulation-based service " << name - << " number of direct optional base services shrank from " - << ent2A->getDirectOptionalBaseServices().size() - << " to " - << ent2B->getDirectOptionalBaseServices().size() - << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::AnnotatedReference>::const_iterator - i(ent2A->getDirectOptionalBaseServices().begin()); - i != ent2A->getDirectOptionalBaseServices().end(); - ++i) - { - if (std::find_if( - ent2B->getDirectOptionalBaseServices().begin(), - ent2B->getDirectOptionalBaseServices().end(), - EqualsAnnotation(i->name)) - == ent2B->getDirectOptionalBaseServices().end()) + for (std::vector<unoidl::AnnotatedReference>::const_iterator + i(ent2A->getDirectMandatoryBaseServices().begin()), + j(ent2B->getDirectMandatoryBaseServices().begin()); + i != ent2A->getDirectMandatoryBaseServices().end(); + ++i, ++j) { - std::cerr - << "accumulation-based service " << name - << " direct optional base service " << i->name - << " was removed" << std::endl; - std::exit(EXIT_FAILURE); + if (i->name != j->name) { + std::cerr + << "accumulation-based service " << name + << " direct mandatory base service #" + << (i + - (ent2A->getDirectMandatoryBaseServices() + .begin()) + + 1) + << " changed from " << i->name << " to " + << j->name << std::endl; + std::exit(EXIT_FAILURE); + } } - } - if (ent2A->getDirectMandatoryBaseInterfaces().size() - != ent2B->getDirectMandatoryBaseInterfaces().size()) - { - std::cerr - << "accumulation-based service " << name - << (" number of direct mandatory base interfaces" - " changed from ") - << ent2A->getDirectMandatoryBaseInterfaces().size() - << " to " - << ent2B->getDirectMandatoryBaseInterfaces().size() - << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::AnnotatedReference>::const_iterator - i(ent2A->getDirectMandatoryBaseInterfaces().begin()), - j(ent2B->getDirectMandatoryBaseInterfaces().begin()); - i != ent2A->getDirectMandatoryBaseInterfaces().end(); - ++i, ++j) - { - if (i->name != j->name) + if (ent2A->getDirectOptionalBaseServices().size() + > ent2B->getDirectOptionalBaseServices().size()) { std::cerr << "accumulation-based service " << name - << " direct mandatory base interface #" - << (i - (ent2A->getDirectMandatoryBaseInterfaces().begin()) + 1) - << " changed from " << i->name << " to " - << j->name << std::endl; + << (" number of direct optional base services" + " shrank from ") + << ent2A->getDirectOptionalBaseServices().size() + << " to " + << ent2B->getDirectOptionalBaseServices().size() + << std::endl; std::exit(EXIT_FAILURE); } - } - if (ent2A->getDirectOptionalBaseInterfaces().size() > ent2B->getDirectOptionalBaseInterfaces().size()) - { - std::cerr - << "accumulation-based service " << name - << (" number of direct optional base interfaces" - " shrank from ") - << ent2A->getDirectOptionalBaseInterfaces().size() - << " to " - << ent2B->getDirectOptionalBaseInterfaces().size() - << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::AnnotatedReference>::const_iterator - i(ent2A->getDirectOptionalBaseInterfaces().begin()); - i != ent2A->getDirectOptionalBaseInterfaces().end(); - ++i) - { - if (std::find_if( - (ent2B->getDirectOptionalBaseInterfaces().begin()), - ent2B->getDirectOptionalBaseInterfaces().end(), + for (std::vector<unoidl::AnnotatedReference>::const_iterator + i(ent2A->getDirectOptionalBaseServices().begin()); + i != ent2A->getDirectOptionalBaseServices().end(); + ++i) + { + if (std::find_if( + ent2B->getDirectOptionalBaseServices().begin(), + ent2B->getDirectOptionalBaseServices().end(), EqualsAnnotation(i->name)) - == ent2B->getDirectOptionalBaseInterfaces().end()) + == ent2B->getDirectOptionalBaseServices().end()) + { + std::cerr + << "accumulation-based service " << name + << " direct optional base service " << i->name + << " was removed" << std::endl; + std::exit(EXIT_FAILURE); + } + } + if (ent2A->getDirectMandatoryBaseInterfaces().size() + != ent2B->getDirectMandatoryBaseInterfaces().size()) { std::cerr << "accumulation-based service " << name - << " direct optional base interface " << i->name - << " was removed" << std::endl; + << (" number of direct mandatory base interfaces" + " changed from ") + << ent2A->getDirectMandatoryBaseInterfaces().size() + << " to " + << ent2B->getDirectMandatoryBaseInterfaces().size() + << std::endl; std::exit(EXIT_FAILURE); } - } - if (ent2A->getDirectProperties().size() > ent2B->getDirectProperties().size()) - { - std::cerr - << "accumulation-based service " << name - << " number of direct properties changed from " - << ent2A->getDirectProperties().size() << " to " - << ent2B->getDirectProperties().size() << std::endl; - std::exit(EXIT_FAILURE); - } - for (std::vector<unoidl::AccumulationBasedServiceEntity::Property>::const_iterator - i(ent2A->getDirectProperties().begin()), - j(ent2B->getDirectProperties().begin()); - i != ent2A->getDirectProperties().end(); ++i, ++j) - { - if (i->name != j->name || - i->type != j->type || - i->attributes != j->attributes) + for (std::vector<unoidl::AnnotatedReference>::const_iterator + i(ent2A->getDirectMandatoryBaseInterfaces() + .begin()), + j(ent2B->getDirectMandatoryBaseInterfaces() + .begin()); + i != ent2A->getDirectMandatoryBaseInterfaces().end(); + ++i, ++j) + { + if (i->name != j->name) { + std::cerr + << "accumulation-based service " << name + << " direct mandatory base interface #" + << (i + - (ent2A->getDirectMandatoryBaseInterfaces() + .begin()) + + 1) + << " changed from " << i->name << " to " + << j->name << std::endl; + std::exit(EXIT_FAILURE); + } + } + if (ent2A->getDirectOptionalBaseInterfaces().size() + > ent2B->getDirectOptionalBaseInterfaces().size()) { std::cerr << "accumulation-based service " << name - << " direct property #" - << i - ent2A->getDirectProperties().begin() + 1 - << " changed from " - << i->type << " " << i->name //TODO: attributes + << (" number of direct optional base interfaces" + " shrank from ") + << ent2A->getDirectOptionalBaseInterfaces().size() << " to " - << j->type << " " << j->name //TODO: attributes + << ent2B->getDirectOptionalBaseInterfaces().size() << std::endl; std::exit(EXIT_FAILURE); } - } - for (std::vector<unoidl::AccumulationBasedServiceEntity::Property>::const_iterator - i(ent2B->getDirectProperties().begin() - + ent2A->getDirectProperties().size()); - i != ent2B->getDirectProperties().end(); ++i) - { - if ((i->attributes & unoidl::AccumulationBasedServiceEntity::Property::ATTRIBUTE_OPTIONAL) == 0) + for (std::vector<unoidl::AnnotatedReference>::const_iterator + i(ent2A->getDirectOptionalBaseInterfaces() + .begin()); + i != ent2A->getDirectOptionalBaseInterfaces().end(); + ++i) + { + if (std::find_if( + (ent2B->getDirectOptionalBaseInterfaces() + .begin()), + ent2B->getDirectOptionalBaseInterfaces().end(), + EqualsAnnotation(i->name)) + == ent2B->getDirectOptionalBaseInterfaces().end()) + { + std::cerr + << "accumulation-based service " << name + << " direct optional base interface " << i->name + << " was removed" << std::endl; + std::exit(EXIT_FAILURE); + } + } + if (ent2A->getDirectProperties().size() + > ent2B->getDirectProperties().size()) { std::cerr - << "B accumulation-based service " << name - << " additional direct property " << i->name - << " is not optional" << std::endl; + << "accumulation-based service " << name + << " number of direct properties changed from " + << ent2A->getDirectProperties().size() << " to " + << ent2B->getDirectProperties().size() << std::endl; std::exit(EXIT_FAILURE); } + for (std::vector<unoidl::AccumulationBasedServiceEntity::Property>::const_iterator + i(ent2A->getDirectProperties().begin()), + j(ent2B->getDirectProperties().begin()); + i != ent2A->getDirectProperties().end(); ++i, ++j) + { + if (i->name != j->name || i->type != j->type + || i->attributes != j->attributes) + { + std::cerr + << "accumulation-based service " << name + << " direct property #" + << i - ent2A->getDirectProperties().begin() + 1 + << " changed from " + << i->type << " " << i->name //TODO: attributes + << " to " + << j->type << " " << j->name //TODO: attributes + << std::endl; + std::exit(EXIT_FAILURE); + } + } + for (std::vector<unoidl::AccumulationBasedServiceEntity::Property>::const_iterator + i(ent2B->getDirectProperties().begin() ... etc. - the rest is truncated _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits