| /* |
| Copyright 2019 Alain Dargelas |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| /* |
| * File: LibrarySet.cpp |
| * Author: alain |
| * |
| * Created on January 27, 2018, 5:28 PM |
| */ |
| #include <vector> |
| #include <set> |
| #include <iostream> |
| #include "../SourceCompile/SymbolTable.h" |
| #include "../ErrorReporting/ErrorContainer.h" |
| #include "LibrarySet.h" |
| |
| using namespace SURELOG; |
| |
| LibrarySet::LibrarySet () { } |
| |
| LibrarySet::LibrarySet (const LibrarySet& orig) { } |
| |
| LibrarySet::~LibrarySet () { } |
| |
| Library* LibrarySet::getLibrary(std::string libName) { |
| for (unsigned int i = 0; i < m_libraries.size(); i++) |
| { |
| if (m_libraries[i].getName () == libName) |
| return &m_libraries[i]; |
| } |
| return NULL; |
| } |
| |
| Library* LibrarySet::getLibrary(SymbolId fileId) |
| { |
| Library* lib = NULL; |
| for (unsigned int i = 0; i < m_libraries.size(); i++) |
| { |
| if (m_libraries[i].isMember (fileId)) |
| { |
| lib = &m_libraries[i]; |
| break; |
| } |
| } |
| if (lib == NULL) |
| { |
| getLibrary("work")->addFileId (fileId); |
| lib = getLibrary("work"); |
| } |
| return lib; |
| } |
| |
| std::string LibrarySet::report(SymbolTable* symbols) { |
| std::string report; |
| for (unsigned int i = 0; i < m_libraries.size(); i++) |
| { |
| report += m_libraries[i].report(symbols) + "\n"; |
| } |
| return report; |
| } |
| |
| void LibrarySet::checkErrors(SymbolTable* symbols, ErrorContainer* errors) { |
| std::map<SymbolId, std::string> fileSet; |
| for (unsigned int i = 0; i < m_libraries.size(); i++) |
| { |
| for (auto file : m_libraries[i].getFiles ()) |
| { |
| std::map<SymbolId, std::string>::iterator itr = fileSet.find(file); |
| if (itr == fileSet.end()) |
| { |
| fileSet.insert(std::make_pair(file, m_libraries[i].getName ())); |
| } |
| else |
| { |
| Location loc1 (symbols->registerSymbol((*itr).second + ", " + m_libraries[i].getName ())); |
| Location loc2 (file); |
| Error err (ErrorDefinition::LIB_FILE_MAPS_TO_MULTIPLE_LIBS, loc1, loc2); |
| errors->addError (err); |
| } |
| } |
| } |
| } |