1*30fdc8d8SChris Lattner //===-- PathMappingList.cpp -------------------------------------*- C++ -*-===// 2*30fdc8d8SChris Lattner // 3*30fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 4*30fdc8d8SChris Lattner // 5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 7*30fdc8d8SChris Lattner // 8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 9*30fdc8d8SChris Lattner 10*30fdc8d8SChris Lattner // C Includes 11*30fdc8d8SChris Lattner // C++ Includes 12*30fdc8d8SChris Lattner // Other libraries and framework includes 13*30fdc8d8SChris Lattner #include "lldb/Core/Error.h" 14*30fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 15*30fdc8d8SChris Lattner // Project includes 16*30fdc8d8SChris Lattner #include "PathMappingList.h" 17*30fdc8d8SChris Lattner 18*30fdc8d8SChris Lattner using namespace lldb; 19*30fdc8d8SChris Lattner using namespace lldb_private; 20*30fdc8d8SChris Lattner 21*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 22*30fdc8d8SChris Lattner // PathMappingList constructor 23*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 24*30fdc8d8SChris Lattner PathMappingList::PathMappingList 25*30fdc8d8SChris Lattner ( 26*30fdc8d8SChris Lattner ChangedCallback callback, 27*30fdc8d8SChris Lattner void *callback_baton 28*30fdc8d8SChris Lattner ) : 29*30fdc8d8SChris Lattner m_pairs (), 30*30fdc8d8SChris Lattner m_callback (callback), 31*30fdc8d8SChris Lattner m_callback_baton (callback_baton) 32*30fdc8d8SChris Lattner { 33*30fdc8d8SChris Lattner } 34*30fdc8d8SChris Lattner 35*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 36*30fdc8d8SChris Lattner // Destructor 37*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 38*30fdc8d8SChris Lattner PathMappingList::~PathMappingList () 39*30fdc8d8SChris Lattner { 40*30fdc8d8SChris Lattner } 41*30fdc8d8SChris Lattner 42*30fdc8d8SChris Lattner void 43*30fdc8d8SChris Lattner PathMappingList::Append (const ConstString &path, 44*30fdc8d8SChris Lattner const ConstString &replacement, 45*30fdc8d8SChris Lattner bool notify) 46*30fdc8d8SChris Lattner { 47*30fdc8d8SChris Lattner m_pairs.push_back(pair(path, replacement)); 48*30fdc8d8SChris Lattner if (notify && m_callback) 49*30fdc8d8SChris Lattner m_callback (*this, m_callback_baton); 50*30fdc8d8SChris Lattner } 51*30fdc8d8SChris Lattner 52*30fdc8d8SChris Lattner void 53*30fdc8d8SChris Lattner PathMappingList::Insert (const ConstString &path, 54*30fdc8d8SChris Lattner const ConstString &replacement, 55*30fdc8d8SChris Lattner uint32_t index, 56*30fdc8d8SChris Lattner bool notify) 57*30fdc8d8SChris Lattner { 58*30fdc8d8SChris Lattner iterator insert_iter; 59*30fdc8d8SChris Lattner if (index >= m_pairs.size()) 60*30fdc8d8SChris Lattner insert_iter = m_pairs.end(); 61*30fdc8d8SChris Lattner else 62*30fdc8d8SChris Lattner insert_iter = m_pairs.begin() + index; 63*30fdc8d8SChris Lattner m_pairs.insert(insert_iter, pair(path, replacement)); 64*30fdc8d8SChris Lattner if (notify && m_callback) 65*30fdc8d8SChris Lattner m_callback (*this, m_callback_baton); 66*30fdc8d8SChris Lattner } 67*30fdc8d8SChris Lattner 68*30fdc8d8SChris Lattner bool 69*30fdc8d8SChris Lattner PathMappingList::Remove (off_t index, bool notify) 70*30fdc8d8SChris Lattner { 71*30fdc8d8SChris Lattner if (index >= m_pairs.size()) 72*30fdc8d8SChris Lattner return false; 73*30fdc8d8SChris Lattner 74*30fdc8d8SChris Lattner iterator iter = m_pairs.begin() + index; 75*30fdc8d8SChris Lattner m_pairs.erase(iter); 76*30fdc8d8SChris Lattner if (notify && m_callback) 77*30fdc8d8SChris Lattner m_callback (*this, m_callback_baton); 78*30fdc8d8SChris Lattner return true; 79*30fdc8d8SChris Lattner } 80*30fdc8d8SChris Lattner 81*30fdc8d8SChris Lattner void 82*30fdc8d8SChris Lattner PathMappingList::Dump (Stream *s) 83*30fdc8d8SChris Lattner { 84*30fdc8d8SChris Lattner unsigned int numPairs = m_pairs.size(); 85*30fdc8d8SChris Lattner unsigned int index; 86*30fdc8d8SChris Lattner 87*30fdc8d8SChris Lattner for (index = 0; index < numPairs; ++index) 88*30fdc8d8SChris Lattner { 89*30fdc8d8SChris Lattner s->Printf("[%d] \"%s\" -> \"%s\"\n", 90*30fdc8d8SChris Lattner index, m_pairs[index].first.GetCString(), m_pairs[index].second.GetCString()); 91*30fdc8d8SChris Lattner } 92*30fdc8d8SChris Lattner } 93*30fdc8d8SChris Lattner 94*30fdc8d8SChris Lattner void 95*30fdc8d8SChris Lattner PathMappingList::Clear (bool notify) 96*30fdc8d8SChris Lattner { 97*30fdc8d8SChris Lattner m_pairs.clear(); 98*30fdc8d8SChris Lattner if (notify && m_callback) 99*30fdc8d8SChris Lattner m_callback (*this, m_callback_baton); 100*30fdc8d8SChris Lattner } 101*30fdc8d8SChris Lattner 102*30fdc8d8SChris Lattner size_t 103*30fdc8d8SChris Lattner PathMappingList::GetSize () 104*30fdc8d8SChris Lattner { 105*30fdc8d8SChris Lattner return m_pairs.size(); 106*30fdc8d8SChris Lattner } 107*30fdc8d8SChris Lattner 108*30fdc8d8SChris Lattner bool 109*30fdc8d8SChris Lattner PathMappingList::RemapPath (const ConstString &path, ConstString &new_path) 110*30fdc8d8SChris Lattner { 111*30fdc8d8SChris Lattner const_iterator pos, end = m_pairs.end(); 112*30fdc8d8SChris Lattner for (pos = m_pairs.begin(); pos != end; ++pos) 113*30fdc8d8SChris Lattner { 114*30fdc8d8SChris Lattner const size_t prefixLen = pos->first.GetLength(); 115*30fdc8d8SChris Lattner 116*30fdc8d8SChris Lattner if (::strncmp (pos->first.GetCString(), path.GetCString(), prefixLen) == 0) 117*30fdc8d8SChris Lattner { 118*30fdc8d8SChris Lattner std::string new_path_str (pos->second.GetCString()); 119*30fdc8d8SChris Lattner new_path_str.append(path.GetCString() + prefixLen); 120*30fdc8d8SChris Lattner new_path.SetCString(new_path_str.c_str()); 121*30fdc8d8SChris Lattner return true; 122*30fdc8d8SChris Lattner } 123*30fdc8d8SChris Lattner } 124*30fdc8d8SChris Lattner return false; 125*30fdc8d8SChris Lattner } 126