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