SearchDirs.cpp revision affc150dc44fab1911775a49636d0ce85333b634
1//===- SearchDirs.cpp -----------------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#include <mcld/MC/SearchDirs.h> 10#include <mcld/MC/MCLDDirectory.h> 11#include <mcld/Support/FileSystem.h> 12 13using namespace mcld; 14 15//===----------------------------------------------------------------------===// 16// Non-member functions 17static void SpecToFilename(const std::string& pSpec, std::string& pFile) 18{ 19 pFile = "lib"; 20 pFile += pSpec; 21} 22 23//===----------------------------------------------------------------------===// 24// SearchDirs 25SearchDirs::SearchDirs() 26{ 27 // a magic number 8, no why. 28 // please prove it or change it 29 m_DirList.reserve(8); 30} 31 32SearchDirs::~SearchDirs() 33{ 34 iterator dir, dirEnd = end(); 35 for (dir = begin(); dir!=dirEnd; ++dir) { 36 delete (*dir); 37 } 38} 39 40void SearchDirs::add(const MCLDDirectory& pDirectory) 41{ 42 m_DirList.push_back(new MCLDDirectory(pDirectory)); 43} 44 45mcld::sys::fs::Path* SearchDirs::find(const std::string& pNamespec, mcld::Input::Type pType) 46{ 47 assert(Input::DynObj == pType || Input::Archive == pType); 48 49 std::string file; 50 SpecToFilename(pNamespec, file); 51 // for all MCLDDirectorys 52 DirList::iterator mcld_dir, mcld_dir_end = m_DirList.end(); 53 for (mcld_dir=m_DirList.begin(); mcld_dir!=mcld_dir_end; ++mcld_dir) { 54 // for all entries in MCLDDirectory 55 MCLDDirectory::iterator entry = (*mcld_dir)->begin(); 56 MCLDDirectory::iterator enEnd = (*mcld_dir)->end(); 57 58 switch(pType) { 59 case Input::DynObj: { 60 while (entry!=enEnd) { 61 if (file == entry.path()->stem().native() ) { 62 if(mcld::sys::fs::detail::shared_library_extension == entry.path()->extension().native()) { 63 return entry.path(); 64 } 65 } 66 ++entry; 67 } 68 } 69 /** Fall through **/ 70 case Input::Archive : { 71 entry = (*mcld_dir)->begin(); 72 enEnd = (*mcld_dir)->end(); 73 while ( entry!=enEnd ) { 74 if (file == entry.path()->stem().native() && 75 mcld::sys::fs::detail::static_library_extension == entry.path()->extension().native()) { 76 return entry.path(); 77 } 78 ++entry; 79 } 80 } 81 default: 82 break; 83 } // end of switch 84 } // end of while 85 return NULL; 86} 87 88