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