130fdc8d8SChris Lattner //===-- PathMappingList.cpp -------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner // C Includes
1130fdc8d8SChris Lattner // C++ Includes
1230fdc8d8SChris Lattner // Other libraries and framework includes
1330fdc8d8SChris Lattner #include "lldb/Core/Error.h"
1430fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
1530fdc8d8SChris Lattner // Project includes
1648862d45SEli Friedman #include "lldb/Target/PathMappingList.h"
1748862d45SEli Friedman #include <string.h>
1830fdc8d8SChris Lattner 
1930fdc8d8SChris Lattner using namespace lldb;
2030fdc8d8SChris Lattner using namespace lldb_private;
2130fdc8d8SChris Lattner 
2230fdc8d8SChris Lattner //----------------------------------------------------------------------
2330fdc8d8SChris Lattner // PathMappingList constructor
2430fdc8d8SChris Lattner //----------------------------------------------------------------------
2530fdc8d8SChris Lattner PathMappingList::PathMappingList
2630fdc8d8SChris Lattner (
2730fdc8d8SChris Lattner     ChangedCallback callback,
2830fdc8d8SChris Lattner     void *callback_baton
2930fdc8d8SChris Lattner ) :
3030fdc8d8SChris Lattner     m_pairs (),
3130fdc8d8SChris Lattner     m_callback (callback),
3230fdc8d8SChris Lattner     m_callback_baton (callback_baton)
3330fdc8d8SChris Lattner {
3430fdc8d8SChris Lattner }
3530fdc8d8SChris Lattner 
367e14f91dSGreg Clayton 
377e14f91dSGreg Clayton PathMappingList::PathMappingList (const PathMappingList &rhs) :
387e14f91dSGreg Clayton     m_pairs (rhs.m_pairs),
397e14f91dSGreg Clayton     m_callback (NULL),
407e14f91dSGreg Clayton     m_callback_baton (NULL)
417e14f91dSGreg Clayton {
427e14f91dSGreg Clayton 
437e14f91dSGreg Clayton }
447e14f91dSGreg Clayton 
457e14f91dSGreg Clayton const PathMappingList &
467e14f91dSGreg Clayton PathMappingList::operator =(const PathMappingList &rhs)
477e14f91dSGreg Clayton {
487e14f91dSGreg Clayton     if (this != &rhs)
497e14f91dSGreg Clayton     {
507e14f91dSGreg Clayton         m_pairs = rhs.m_pairs;
517e14f91dSGreg Clayton         m_callback = NULL;
527e14f91dSGreg Clayton         m_callback_baton = NULL;
537e14f91dSGreg Clayton     }
547e14f91dSGreg Clayton     return *this;
557e14f91dSGreg Clayton }
567e14f91dSGreg Clayton 
577e14f91dSGreg Clayton 
5830fdc8d8SChris Lattner //----------------------------------------------------------------------
5930fdc8d8SChris Lattner // Destructor
6030fdc8d8SChris Lattner //----------------------------------------------------------------------
6130fdc8d8SChris Lattner PathMappingList::~PathMappingList ()
6230fdc8d8SChris Lattner {
6330fdc8d8SChris Lattner }
6430fdc8d8SChris Lattner 
6530fdc8d8SChris Lattner void
6630fdc8d8SChris Lattner PathMappingList::Append (const ConstString &path,
6730fdc8d8SChris Lattner                          const ConstString &replacement,
6830fdc8d8SChris Lattner                          bool notify)
6930fdc8d8SChris Lattner {
7030fdc8d8SChris Lattner     m_pairs.push_back(pair(path, replacement));
7130fdc8d8SChris Lattner     if (notify && m_callback)
7230fdc8d8SChris Lattner         m_callback (*this, m_callback_baton);
7330fdc8d8SChris Lattner }
7430fdc8d8SChris Lattner 
7530fdc8d8SChris Lattner void
7630fdc8d8SChris Lattner PathMappingList::Insert (const ConstString &path,
7730fdc8d8SChris Lattner                          const ConstString &replacement,
7830fdc8d8SChris Lattner                          uint32_t index,
7930fdc8d8SChris Lattner                          bool notify)
8030fdc8d8SChris Lattner {
8130fdc8d8SChris Lattner     iterator insert_iter;
8230fdc8d8SChris Lattner     if (index >= m_pairs.size())
8330fdc8d8SChris Lattner         insert_iter = m_pairs.end();
8430fdc8d8SChris Lattner     else
8530fdc8d8SChris Lattner         insert_iter = m_pairs.begin() + index;
8630fdc8d8SChris Lattner     m_pairs.insert(insert_iter, pair(path, replacement));
8730fdc8d8SChris Lattner     if (notify && m_callback)
8830fdc8d8SChris Lattner         m_callback (*this, m_callback_baton);
8930fdc8d8SChris Lattner }
9030fdc8d8SChris Lattner 
9130fdc8d8SChris Lattner bool
9230fdc8d8SChris Lattner PathMappingList::Remove (off_t index, bool notify)
9330fdc8d8SChris Lattner {
9430fdc8d8SChris Lattner     if (index >= m_pairs.size())
9530fdc8d8SChris Lattner         return false;
9630fdc8d8SChris Lattner 
9730fdc8d8SChris Lattner     iterator iter = m_pairs.begin() + index;
9830fdc8d8SChris Lattner     m_pairs.erase(iter);
9930fdc8d8SChris Lattner     if (notify && m_callback)
10030fdc8d8SChris Lattner         m_callback (*this, m_callback_baton);
10130fdc8d8SChris Lattner     return true;
10230fdc8d8SChris Lattner }
10330fdc8d8SChris Lattner 
104*64bab489SJohnny Chen // For clients which do not need the pair index dumped, pass a pair_index >= 0
105*64bab489SJohnny Chen // to only dump the indicated pair.
10630fdc8d8SChris Lattner void
107*64bab489SJohnny Chen PathMappingList::Dump (Stream *s, int pair_index)
10830fdc8d8SChris Lattner {
10930fdc8d8SChris Lattner     unsigned int numPairs = m_pairs.size();
11030fdc8d8SChris Lattner 
111*64bab489SJohnny Chen     if (pair_index < 0)
11230fdc8d8SChris Lattner     {
113*64bab489SJohnny Chen         unsigned int index;
114*64bab489SJohnny Chen         for (index = 0; index < numPairs; ++index)
11530fdc8d8SChris Lattner             s->Printf("[%d] \"%s\" -> \"%s\"\n",
11630fdc8d8SChris Lattner                       index, m_pairs[index].first.GetCString(), m_pairs[index].second.GetCString());
11730fdc8d8SChris Lattner     }
118*64bab489SJohnny Chen     else
119*64bab489SJohnny Chen     {
120*64bab489SJohnny Chen         if (pair_index < numPairs)
121*64bab489SJohnny Chen             s->Printf("%s -> %s",
122*64bab489SJohnny Chen                       m_pairs[pair_index].first.GetCString(), m_pairs[pair_index].second.GetCString());
123*64bab489SJohnny Chen     }
12430fdc8d8SChris Lattner }
12530fdc8d8SChris Lattner 
12630fdc8d8SChris Lattner void
12730fdc8d8SChris Lattner PathMappingList::Clear (bool notify)
12830fdc8d8SChris Lattner {
12930fdc8d8SChris Lattner     m_pairs.clear();
13030fdc8d8SChris Lattner     if (notify && m_callback)
13130fdc8d8SChris Lattner         m_callback (*this, m_callback_baton);
13230fdc8d8SChris Lattner }
13330fdc8d8SChris Lattner 
13430fdc8d8SChris Lattner size_t
13530fdc8d8SChris Lattner PathMappingList::GetSize ()
13630fdc8d8SChris Lattner {
13730fdc8d8SChris Lattner     return m_pairs.size();
13830fdc8d8SChris Lattner }
13930fdc8d8SChris Lattner 
14030fdc8d8SChris Lattner bool
14130fdc8d8SChris Lattner PathMappingList::RemapPath (const ConstString &path, ConstString &new_path)
14230fdc8d8SChris Lattner {
14330fdc8d8SChris Lattner     const_iterator pos, end = m_pairs.end();
14430fdc8d8SChris Lattner     for (pos = m_pairs.begin(); pos != end; ++pos)
14530fdc8d8SChris Lattner     {
14630fdc8d8SChris Lattner         const size_t prefixLen = pos->first.GetLength();
14730fdc8d8SChris Lattner 
14830fdc8d8SChris Lattner         if (::strncmp (pos->first.GetCString(), path.GetCString(), prefixLen) == 0)
14930fdc8d8SChris Lattner         {
15030fdc8d8SChris Lattner             std::string new_path_str (pos->second.GetCString());
15130fdc8d8SChris Lattner             new_path_str.append(path.GetCString() + prefixLen);
15230fdc8d8SChris Lattner             new_path.SetCString(new_path_str.c_str());
15330fdc8d8SChris Lattner             return true;
15430fdc8d8SChris Lattner         }
15530fdc8d8SChris Lattner     }
15630fdc8d8SChris Lattner     return false;
15730fdc8d8SChris Lattner }
1587e14f91dSGreg Clayton 
1597e14f91dSGreg Clayton bool
1607e14f91dSGreg Clayton PathMappingList::Replace (const ConstString &path, const ConstString &new_path, bool notify)
1617e14f91dSGreg Clayton {
1627e14f91dSGreg Clayton     uint32_t idx = FindIndexForPath (path);
1637e14f91dSGreg Clayton     if (idx < m_pairs.size())
1647e14f91dSGreg Clayton     {
1657e14f91dSGreg Clayton         m_pairs[idx].second = new_path;
1667e14f91dSGreg Clayton         if (notify && m_callback)
1677e14f91dSGreg Clayton             m_callback (*this, m_callback_baton);
1687e14f91dSGreg Clayton         return true;
1697e14f91dSGreg Clayton     }
1707e14f91dSGreg Clayton     return false;
1717e14f91dSGreg Clayton }
1727e14f91dSGreg Clayton 
1737e14f91dSGreg Clayton bool
1747e14f91dSGreg Clayton PathMappingList::Remove (const ConstString &path, bool notify)
1757e14f91dSGreg Clayton {
1767e14f91dSGreg Clayton     iterator pos = FindIteratorForPath (path);
1777e14f91dSGreg Clayton     if (pos != m_pairs.end())
1787e14f91dSGreg Clayton     {
1797e14f91dSGreg Clayton         m_pairs.erase (pos);
1807e14f91dSGreg Clayton         if (notify && m_callback)
1817e14f91dSGreg Clayton             m_callback (*this, m_callback_baton);
1827e14f91dSGreg Clayton         return true;
1837e14f91dSGreg Clayton     }
1847e14f91dSGreg Clayton     return false;
1857e14f91dSGreg Clayton }
1867e14f91dSGreg Clayton 
1877e14f91dSGreg Clayton PathMappingList::const_iterator
1887e14f91dSGreg Clayton PathMappingList::FindIteratorForPath (const ConstString &path) const
1897e14f91dSGreg Clayton {
1907e14f91dSGreg Clayton     const_iterator pos;
1917e14f91dSGreg Clayton     const_iterator begin = m_pairs.begin();
1927e14f91dSGreg Clayton     const_iterator end = m_pairs.end();
1937e14f91dSGreg Clayton 
1947e14f91dSGreg Clayton     for (pos = begin; pos != end; ++pos)
1957e14f91dSGreg Clayton     {
1967e14f91dSGreg Clayton         if (pos->first == path)
1977e14f91dSGreg Clayton             break;
1987e14f91dSGreg Clayton     }
1997e14f91dSGreg Clayton     return pos;
2007e14f91dSGreg Clayton }
2017e14f91dSGreg Clayton 
2027e14f91dSGreg Clayton PathMappingList::iterator
2037e14f91dSGreg Clayton PathMappingList::FindIteratorForPath (const ConstString &path)
2047e14f91dSGreg Clayton {
2057e14f91dSGreg Clayton     iterator pos;
2067e14f91dSGreg Clayton     iterator begin = m_pairs.begin();
2077e14f91dSGreg Clayton     iterator end = m_pairs.end();
2087e14f91dSGreg Clayton 
2097e14f91dSGreg Clayton     for (pos = begin; pos != end; ++pos)
2107e14f91dSGreg Clayton     {
2117e14f91dSGreg Clayton         if (pos->first == path)
2127e14f91dSGreg Clayton             break;
2137e14f91dSGreg Clayton     }
2147e14f91dSGreg Clayton     return pos;
2157e14f91dSGreg Clayton }
2167e14f91dSGreg Clayton 
2177e14f91dSGreg Clayton bool
2187e14f91dSGreg Clayton PathMappingList::GetPathsAtIndex (uint32_t idx, ConstString &path, ConstString &new_path) const
2197e14f91dSGreg Clayton {
2207e14f91dSGreg Clayton     if (idx < m_pairs.size())
2217e14f91dSGreg Clayton     {
2227e14f91dSGreg Clayton         path = m_pairs[idx].first;
2237e14f91dSGreg Clayton         new_path = m_pairs[idx].second;
2247e14f91dSGreg Clayton         return true;
2257e14f91dSGreg Clayton     }
2267e14f91dSGreg Clayton     return false;
2277e14f91dSGreg Clayton }
2287e14f91dSGreg Clayton 
2297e14f91dSGreg Clayton 
2307e14f91dSGreg Clayton 
2317e14f91dSGreg Clayton uint32_t
2327e14f91dSGreg Clayton PathMappingList::FindIndexForPath (const ConstString &path) const
2337e14f91dSGreg Clayton {
2347e14f91dSGreg Clayton     const_iterator pos;
2357e14f91dSGreg Clayton     const_iterator begin = m_pairs.begin();
2367e14f91dSGreg Clayton     const_iterator end = m_pairs.end();
2377e14f91dSGreg Clayton 
2387e14f91dSGreg Clayton     for (pos = begin; pos != end; ++pos)
2397e14f91dSGreg Clayton     {
2407e14f91dSGreg Clayton         if (pos->first == path)
2417e14f91dSGreg Clayton             return std::distance (begin, pos);
2427e14f91dSGreg Clayton     }
2437e14f91dSGreg Clayton     return UINT32_MAX;
2447e14f91dSGreg Clayton }
2457e14f91dSGreg Clayton 
246