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
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic inline void SpecToFilename(const std::string& pSpec, std::string& pFile)
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  pFile = "lib";
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  pFile += pSpec;
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// SearchDirs
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSearchDirs::SearchDirs()
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // a magic number 8, no why.
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // please prove it or change it
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_DirList.reserve(8);
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoSearchDirs::SearchDirs(const sys::fs::Path& pSysRoot)
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  : m_SysRoot(pSysRoot) {
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // a magic number 8, no why.
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // please prove it or change it
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_DirList.reserve(8);
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSearchDirs::~SearchDirs()
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  iterator dir, dirEnd = end();
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for (dir = begin(); dir!=dirEnd; ++dir) {
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    delete (*dir);
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool SearchDirs::insert(const std::string& pPath)
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  MCLDDirectory* dir = new MCLDDirectory(pPath);
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (dir->isInSysroot())
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    dir->setSysroot(m_SysRoot);
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (exists(dir->path()) && is_directory(dir->path())) {
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_DirList.push_back(dir);
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return true;
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  else {
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    delete dir;
616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    return false;
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  }
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return true;
646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesbool SearchDirs::insert(const char* pPath)
676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return insert(std::string(pPath));
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool SearchDirs::insert(const sys::fs::Path& pPath)
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return insert(pPath.native());
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesmcld::sys::fs::Path*
7787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesSearchDirs::find(const std::string& pNamespec, mcld::Input::Type pType)
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  assert(Input::DynObj  == pType ||
8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         Input::Archive == pType ||
8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         Input::Script  == pType);
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  std::string file;
8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  switch(pType) {
8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  case Input::Script:
8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    file.assign(pNamespec);
8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    break;
8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  case Input::DynObj:
8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  case Input::Archive :
9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    SpecToFilename(pNamespec, file);
9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    break;
9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  default:
9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    break;
9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  } // end of switch
9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // for all MCLDDirectorys
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  DirList::iterator mcld_dir, mcld_dir_end = m_DirList.end();
9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  for (mcld_dir = m_DirList.begin(); mcld_dir != mcld_dir_end; ++mcld_dir) {
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // for all entries in MCLDDirectory
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    MCLDDirectory::iterator entry = (*mcld_dir)->begin();
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    MCLDDirectory::iterator enEnd = (*mcld_dir)->end();
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    switch(pType) {
10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    case Input::Script: {
10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      while (entry != enEnd) {
10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        if (file == entry.path()->filename())
10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          return entry.path();
10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        ++entry;
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      break;
11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    }
11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    case Input::DynObj: {
11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      while (entry != enEnd) {
11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        if (file == entry.path()->stem().native() ) {
11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          if (mcld::sys::fs::detail::shared_library_extension ==
11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                entry.path()->extension().native()) {
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            return entry.path();
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          }
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang        }
12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        ++entry;
12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    }
12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    /** Fall through **/
12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    case Input::Archive : {
12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      entry = (*mcld_dir)->begin();
12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      enEnd = (*mcld_dir)->end();
12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      while (entry != enEnd) {
12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        if (file == entry.path()->stem().native() &&
12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            mcld::sys::fs::detail::static_library_extension ==
13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              entry.path()->extension().native()) {
13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          return entry.path();
13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        }
13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        ++entry;
134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      }
13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    }
13687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    default:
13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      break;
138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    } // end of switch
13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  } // end of for
140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  return NULL;
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoconst mcld::sys::fs::Path*
14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoSearchDirs::find(const std::string& pNamespec, mcld::Input::Type pType) const
14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  assert(Input::DynObj  == pType ||
14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         Input::Archive == pType ||
14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         Input::Script  == pType);
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  std::string file;
15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  switch(pType) {
15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  case Input::Script:
15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    file.assign(pNamespec);
15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    break;
15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  case Input::DynObj:
15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  case Input::Archive :
15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    SpecToFilename(pNamespec, file);
15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    break;
15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  default:
16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    break;
16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  } // end of switch
16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // for all MCLDDirectorys
16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  DirList::const_iterator mcld_dir, mcld_dir_end = m_DirList.end();
16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  for (mcld_dir = m_DirList.begin(); mcld_dir != mcld_dir_end; ++mcld_dir) {
16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // for all entries in MCLDDirectory
16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    MCLDDirectory::iterator entry = (*mcld_dir)->begin();
16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    MCLDDirectory::iterator enEnd = (*mcld_dir)->end();
16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
17022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    switch(pType) {
17187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    case Input::Script: {
17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      while (entry != enEnd) {
17387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        if (file == entry.path()->filename())
17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          return entry.path();
17587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        ++entry;
17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      }
17787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      break;
17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    }
17987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    case Input::DynObj: {
18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      while (entry != enEnd) {
18187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        if (file == entry.path()->stem().native() ) {
18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          if (mcld::sys::fs::detail::shared_library_extension ==
18387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                entry.path()->extension().native()) {
18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            return entry.path();
18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          }
18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        }
18787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        ++entry;
18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
18987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    }
19087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    /** Fall through **/
19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    case Input::Archive : {
19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      entry = (*mcld_dir)->begin();
19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      enEnd = (*mcld_dir)->end();
19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      while ( entry!=enEnd ) {
19587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        if (file == entry.path()->stem().native() &&
19687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            mcld::sys::fs::detail::static_library_extension ==
19787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              entry.path()->extension().native()) {
19887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          return entry.path();
19987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        }
20087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        ++entry;
20122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      }
20287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    }
20387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    default:
20487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      break;
20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    } // end of switch
206551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  } // end of for
20722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return NULL;
20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
209