15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- SearchDirs.cpp -----------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/MC/SearchDirs.h> 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/MC/MCLDDirectory.h> 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/FileSystem.h> 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Non-member functions 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic void SpecToFilename(const std::string& pSpec, std::string& pFile) 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pFile = "lib"; 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pFile += pSpec; 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// SearchDirs 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSearchDirs::SearchDirs() 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // a magic number 8, no why. 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // please prove it or change it 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_DirList.reserve(8); 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSearchDirs::~SearchDirs() 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator dir, dirEnd = end(); 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao for (dir = begin(); dir!=dirEnd; ++dir) { 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao delete (*dir); 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid SearchDirs::add(const MCLDDirectory& pDirectory) 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_DirList.push_back(new MCLDDirectory(pDirectory)); 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaomcld::sys::fs::Path* SearchDirs::find(const std::string& pNamespec, mcld::Input::Type pType) 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang assert(Input::DynObj == pType || Input::Archive == pType); 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::string file; 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SpecToFilename(pNamespec, file); 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // for all MCLDDirectorys 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao DirList::iterator mcld_dir, mcld_dir_end = m_DirList.end(); 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao for (mcld_dir=m_DirList.begin(); mcld_dir!=mcld_dir_end; ++mcld_dir) { 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // for all entries in MCLDDirectory 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCLDDirectory::iterator entry = (*mcld_dir)->begin(); 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCLDDirectory::iterator enEnd = (*mcld_dir)->end(); 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao switch(pType) { 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case Input::DynObj: { 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao while (entry!=enEnd) { 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (file == entry.path()->stem().native() ) { 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if(mcld::sys::fs::detail::shared_library_extension == entry.path()->extension().native()) { 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return entry.path(); 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ++entry; 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /** Fall through **/ 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case Input::Archive : { 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao entry = (*mcld_dir)->begin(); 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao enEnd = (*mcld_dir)->end(); 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao while ( entry!=enEnd ) { 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (file == entry.path()->stem().native() && 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao mcld::sys::fs::detail::static_library_extension == entry.path()->extension().native()) { 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return entry.path(); 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ++entry; 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang default: 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang break; 83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } // end of switch 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } // end of while 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return NULL; 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 88