15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- Directory.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//===----------------------------------------------------------------------===//
9f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/Support/Directory.h>
10f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/Support/FileSystem.h>
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld::sys::fs;
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace { // anonymous
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool status_known(FileStatus f)
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return f.type() != StatusError;
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool is_symlink(FileStatus f)
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return f.type() == SymlinkFile;
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
27f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst Path dot_path(".");
28f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst Path dot_dot_path("..");
29f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of anonymous
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Directory
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDirectory::Directory()
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : m_Path(),
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_FileStatus(),
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_SymLinkStatus(),
39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_Handler(0),
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Cache(),
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_CacheFull(false) {
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDirectory::Directory(const Path& pPath,
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     FileStatus st,
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     FileStatus symlink_st)
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : m_Path(pPath),
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_FileStatus(st),
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_SymLinkStatus(symlink_st),
50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_Handler(0),
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Cache(),
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_CacheFull(false) {
53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (m_Path == dot_path)
54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    detail::get_pwd(m_Path);
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_Path.m_append_separator_if_needed();
56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  detail::open_dir(*this);
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDirectory::Directory(const Directory& pCopy)
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : m_Path(pCopy.m_Path),
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_FileStatus(pCopy.m_FileStatus),
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_SymLinkStatus(pCopy.m_SymLinkStatus),
63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    m_Handler(0),
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Cache(),
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_CacheFull(false) {
66f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  detail::open_dir(*this);
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDirectory::~Directory()
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  detail::close_dir(*this);
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool Directory::isGood() const
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return (0 != m_Handler);
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDirectory& Directory::operator=(const Directory& pCopy)
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  assign(pCopy.m_Path, pCopy.m_FileStatus, pCopy.m_SymLinkStatus);
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return *this;
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid Directory::assign(const Path& pPath,
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       FileStatus st,
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       FileStatus symlink_st)
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (isGood())
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    clear();
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_Path = pPath;
93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (m_Path == dot_path)
94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    detail::get_pwd(m_Path);
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_Path.m_append_separator_if_needed();
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_FileStatus = st;
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_SymLinkStatus = symlink_st;
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  detail::open_dir(*this);
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoFileStatus Directory::status() const
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!status_known(m_FileStatus))
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // optimization: if the symlink status is known, and it isn't a symlink,
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // then status and symlink_status are identical so just copy the
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // symlink status to the regular status.
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (status_known(m_SymLinkStatus)
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      && !is_symlink(m_SymLinkStatus))
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    {
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      m_FileStatus = m_SymLinkStatus;
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    else detail::status(m_Path,m_FileStatus);
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_FileStatus;
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoFileStatus Directory::symlinkStatus() const
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!status_known(m_SymLinkStatus))
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     detail::symlink_status(m_Path,m_SymLinkStatus);
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return  m_SymLinkStatus;
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDirectory::iterator Directory::begin()
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_CacheFull && m_Cache.empty())
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return end();
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  PathCache::iterator iter = m_Cache.begin();
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (NULL == iter.getEntry())
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ++iter;
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return iterator(this, iter);
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDirectory::iterator Directory::end()
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return iterator(0, m_Cache.end());
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid Directory::clear()
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_Path.native().clear();
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_FileStatus = FileStatus();
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_SymLinkStatus = FileStatus();
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_Cache.clear();
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  detail::close_dir(*this);
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//==========================
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// DirIterator
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDirIterator::DirIterator(Directory* pParent,
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         const DirIterator::DirCache::iterator& pIter)
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : m_pParent(pParent),
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Iter(pIter) {
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_pEntry = m_Iter.getEntry();
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDirIterator::DirIterator(const DirIterator& pCopy)
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : m_pParent(pCopy.m_pParent),
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_Iter(pCopy.m_Iter),
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_pEntry(pCopy.m_pEntry) {
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDirIterator::~DirIterator()
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath* DirIterator::path()
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  if (NULL == m_pParent)
1736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    return NULL;
1746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return &m_pEntry->value();
1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst Path* DirIterator::path() const
1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  if (NULL == m_pParent)
1806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    return NULL;
1816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return &m_pEntry->value();
1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDirIterator& DirIterator::operator=(const DirIterator& pCopy)
1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_pParent = pCopy.m_pParent;
1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_Iter = pCopy.m_Iter;
1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_pEntry = pCopy.m_pEntry;
1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return (*this);
1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDirIterator& DirIterator::operator++()
1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (0 == m_pParent)
1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return *this;
1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // move forward one step first.
1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ++m_Iter;
1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_pParent->m_Cache.end() == m_Iter) {
2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (!m_pParent->m_CacheFull) {
2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      m_pEntry = detail::bring_one_into_cache(*this);
2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      if (0 == m_pEntry && m_pParent->m_CacheFull)
2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        m_pParent = 0;
2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return *this;
2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_pParent = 0;
2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return *this;
2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_pEntry = m_Iter.getEntry();
2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return *this;
2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDirIterator DirIterator::operator++(int)
2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  DirIterator tmp(*this);
2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // move forward one step first.
2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ++m_Iter;
2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_pParent->m_Cache.end() == m_Iter) {
2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (!m_pParent->m_CacheFull) {
2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      m_pEntry = detail::bring_one_into_cache(*this);
2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      if (0 == m_pEntry && m_pParent->m_CacheFull)
2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        m_pParent = 0;
2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return tmp;
2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_pParent = 0;
2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return tmp;
2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_pEntry = m_Iter.getEntry();
2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return tmp;
2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool DirIterator::operator==(const DirIterator& y) const
2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
2395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_pParent != y.m_pParent)
2405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return false;
2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (0 == m_pParent)
2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return true;
2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const Path* x_path = path();
2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const Path* y_path = y.path();
2455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (0 == x_path && 0 == y_path)
2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return true;
2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (0 == x_path || 0 == y_path)
2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return false;
2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return (*x_path == *y_path);
2505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool DirIterator::operator!=(const DirIterator& y) const
2535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
2545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return !this->operator==(y);
2555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
257