diff -r 000000000000 -r 638b9c697799 apicompatanamdw/compatanalysercmd/headeranalyser/src/NodeIndex.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/apicompatanamdw/compatanalysercmd/headeranalyser/src/NodeIndex.cpp Tue Jan 12 14:52:39 2010 +0530 @@ -0,0 +1,385 @@ +/* +* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "CmdGlobals.h" +#ifdef __WIN__ +#pragma warning(disable:4786) +#endif + +#include +#include +#include +#include +//#include + +#include + +#include "BBCAnalyser.h" +#include "Issues.h" +#include "ReportGenerator.h" +#include "ReportIssue.h" +#include "NodeIndex.h" +#include "XMLStringConst.h" + + + +using namespace std; + +XERCES_CPP_NAMESPACE_USE + +// ---------------------------------------------------------------------------- +// NodeIndex::AddNodeFQNameToMap +// +// ---------------------------------------------------------------------------- +// +const pair& NodeIndex::FindFileByFileId(const XMLCh* fileid) + { + return iIdToFileMap[fileid]; + } + +// ---------------------------------------------------------------------------- +// NodeIndex::AddFileNodeToMap +// +// ---------------------------------------------------------------------------- +// +void NodeIndex::AddFileNodeToMap(const XMLCh* id,pair file) + { + this->iIdToFileMap[id] = file; + } + +// ---------------------------------------------------------------------------- +// NodeIndex::AddNodeFQNameToMap +// +// ---------------------------------------------------------------------------- +// +void NodeIndex::AddNodeFQNameToMap(DOMNode * node, const pair& fqname) + { + this->iFQNameToNodeMap[fqname] = node; + } + + +// ---------------------------------------------------------------------------- +// NodeIndex::clear +// +// ---------------------------------------------------------------------------- +// +void NodeIndex::clear() + { + iIdToNodeMap.clear(); + iFQNameToNodeMap.clear(); + } + +// ---------------------------------------------------------------------------- +// NodeIndex::AddNodeIdToMap +// Add the node with its id to the map +// +// ---------------------------------------------------------------------------- +// +void NodeIndex::AddNodeIdToMap(DOMNode * node) + { + const XMLCh * attributeId = ::GetAttribute(node,KXMLIdString); + + if ( attributeId ) + { + iIdToNodeMap[attributeId] = node; + } + + } + + +// ---------------------------------------------------------------------------- +// NodeIndex::FindNodeById +// Finds the node with id +// +// ---------------------------------------------------------------------------- +// +DOMNode * NodeIndex::FindNodeById(DOMNode * root, const XMLCh* id) + { + map::iterator cur = iIdToNodeMap.find(id); + + if ( cur == iIdToNodeMap.end() ) + { + //The node was not found so start traveling the tree + DOMNode * node = FindNodeByIdFromTree(root,id); + //We have found the node + if ( node ) + { + AddNodeIdToMap(node); + } + return node; + } else + { + return cur->second; + } + } + + +// ---------------------------------------------------------------------------- +// NodeIndex::FindNodeByFQName +// Finds the node with fully qualified name +// +// ---------------------------------------------------------------------------- +// +DOMNode * NodeIndex::FindNodeByFQName(DOMNode * root, pair FQName) + { + fqnamemap::iterator cur = iFQNameToNodeMap.find(FQName); + + if ( cur == iFQNameToNodeMap.end() ) + { + //The node was not found so return NULL + return NULL; + } else + { + return cur->second; + } + } + +// ---------------------------------------------------------------------------- +// NodeIndex::FindNodeByIdFromTree +// Search from the tree +// +// ---------------------------------------------------------------------------- +// +DOMNode * NodeIndex::FindNodeByIdFromTree(DOMNode * root, const XMLCh* id) + { + DOMNodeList * childs = root->getChildNodes(); + + XMLSize_t childcount = childs->getLength(); + + for (unsigned int i = 0; i < childcount; ++i) + { + DOMNode* child = childs->item(i); + + const XMLCh* attributeValue = GetAttribute(child,KXMLIdString); + + if ( attributeValue ) + { + if ( XMLString::equals(id, attributeValue) ) + { + //The node was found + return child; + } + } + + } + // Not found + return NULL; + } + +// ---------------------------------------------------------------------------- +// NodeIndex::DumpTables +// +// ---------------------------------------------------------------------------- +// +void NodeIndex::DumpTables() +{ +/* + map< const XMLCh *,DOMNode*,ltstr >::iterator it = iIdToNodeMap.begin(); + DEBUG_PRINT("NodeIndex: ") + DEBUG_PRINT(this) + DEBUG_PRINT("\n") + for (; it != iIdToNodeMap.end(); ++it) + { + DEBUG_PRINT_XMLCh((*it).first) + DEBUG_PRINT(" ") + DEBUG_PRINT((*it).second) + DEBUG_PRINT("\n") + } + fqnamemap::iterator it2 = iFQNameToNodeMap.begin(); +#ifndef NO_DBG + LOG(" ") + DEBUG_PRINT("NodeIndex: ") + DEBUG_PRINT(this) + DEBUG_PRINT("\n") +#endif + for (; it2 != iFQNameToNodeMap.end(); ++it2) + { + DEBUG_PRINT_XMLCh((*it).first.first) + DEBUG_PRINT(" ") + DEBUG_PRINT_XMLCh((*it).first.second) + DEBUG_PRINT("\n") + } +*/ +} + + +// ---------------------------------------------------------------------------- +// NodeIndex::AddVirtualFunction +// Adds a virtual function to the table vtable +// +// ---------------------------------------------------------------------------- +// +void NodeIndex::AddVirtualFunction(const string& vtablename, const string& functionsig, DOMNode * node) +{ + vtableindex_t::iterator it = iVTableIndex.find(vtablename); + + if ( it != iVTableIndex.end() ) + { + it->second.push_back(pair(functionsig,node)); + } + else + { + vtable_t tmp_vtable; + tmp_vtable.push_back(pair(functionsig,node)); + iVTableIndex.insert(pair(vtablename,tmp_vtable)); + } +} + +// ---------------------------------------------------------------------------- +// NodeIndex::GetVirtualTable +// Gets the virtual table vtable +// +// ---------------------------------------------------------------------------- +// +const NodeIndex::vtable_t* NodeIndex::GetVirtualTable(const string& vtablename) +{ + vtableindex_t::iterator it = iVTableIndex.find(vtablename); + + if ( it != iVTableIndex.end() ) + { + return &(it->second); + } + return NULL; +} + +// ---------------------------------------------------------------------------- +// NodeIndex::AddEmptyVirtualTable +// Inserts empty vtable if one does not already exists. Returns a pointer +// to the vtable. +// +// ---------------------------------------------------------------------------- +// +const NodeIndex::vtable_t* NodeIndex::AddEmptyVirtualTable(const string& vtable) +{ + vtable_t tmp_vtable; + pair ret = iVTableIndex.insert(pair(vtable,tmp_vtable)); + + return &(ret.first->second); +} +// ---------------------------------------------------------------------------- +// NodeIndex::InsertDataMember +// Adds a data member to the given table +// +// ---------------------------------------------------------------------------- +// + void NodeIndex::InsertDataMember(const string& parentName, const DataMember& member, dtableindex_t& dataMap) +{ + dtableindex_t::iterator it = dataMap.find(parentName); + if( it != dataMap.end() ) + { + it->second.push_back(member); + } + else + { + it = dataMap.insert(make_pair(parentName, dtable_t())).first; + it->second.push_back(member); + } +} +// ---------------------------------------------------------------------------- +// NodeIndex::AddDataMember +// Adds a data member to the member data table. +// +// ---------------------------------------------------------------------------- +// +void NodeIndex::AddDataMember(const HANodeIterator& parentNode, const string& parentName, const string& memberName, DOMNode* memberNode, int index, TAccess access,int lineNo) +{ + if( IsAnonymousType(parentNode) ) + { + InsertDataMember(parentName, DataMember(memberName, memberNode, index, access,lineNo), iAnonymousTable); + } + else + { + InsertDataMember(parentName, DataMember(memberName, memberNode, index, access,lineNo), iDTableIndex); + } +} + +// ---------------------------------------------------------------------------- +// NodeIndex::GetDataMemberTable +// Gets the data member table +// +// ---------------------------------------------------------------------------- +// +const NodeIndex::dtable_t* NodeIndex::GetDataMemberTable(const HANodeIterator& node, const string& nodeName) +{ + dtableindex_t::iterator it; + if( IsAnonymousType(node) ) + { + it = iAnonymousTable.find(nodeName); + if( it != iAnonymousTable.end() ) + { + return &(it->second); + } + } + else + { + it = iDTableIndex.find(nodeName); + if( it != iDTableIndex.end() ) + { + return &(it->second); + } + } + return NULL; +} + +// ---------------------------------------------------------------------------- +// NodeIndex::AddEmptyDataMemberTable +// Add empty data table +// +// ---------------------------------------------------------------------------- +// +const NodeIndex::dtable_t* NodeIndex::AddEmptyDataMemberTable(const HANodeIterator& node, const string& nodeName) +{ + if( IsAnonymousType(node) ) + { + return &(iAnonymousTable.insert(make_pair(nodeName, dtable_t()))).first->second; + } + + return &(iDTableIndex.insert(make_pair(nodeName, dtable_t()))).first->second; +} + +// ---------------------------------------------------------------------------- +// ltstr::operator +// Finds the node with id id. Returns NULL if not found +// +// ---------------------------------------------------------------------------- +// +bool ltstr::operator()(const XMLCh * s1,const XMLCh * s2) const + { + return XMLString::compareString(s1, s2) < 0; + } + + +// ---------------------------------------------------------------------------- +// compareFQName::operator +// Finds the node with id id. Returns NULL if not found +// +// ---------------------------------------------------------------------------- +// +bool compareFQName::operator()( + const pair& p1, + const pair& p2) const + { + if ( 0 == XMLString::compareString(p1.first,p2.first) ) + { + return XMLString::compareString(p1.second,p2.second) < 0; + } + else + { + return XMLString::compareString(p1.first,p2.first) < 0; + } + }