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 36*7e14f91dSGreg Clayton 37*7e14f91dSGreg Clayton PathMappingList::PathMappingList (const PathMappingList &rhs) : 38*7e14f91dSGreg Clayton m_pairs (rhs.m_pairs), 39*7e14f91dSGreg Clayton m_callback (NULL), 40*7e14f91dSGreg Clayton m_callback_baton (NULL) 41*7e14f91dSGreg Clayton { 42*7e14f91dSGreg Clayton 43*7e14f91dSGreg Clayton } 44*7e14f91dSGreg Clayton 45*7e14f91dSGreg Clayton const PathMappingList & 46*7e14f91dSGreg Clayton PathMappingList::operator =(const PathMappingList &rhs) 47*7e14f91dSGreg Clayton { 48*7e14f91dSGreg Clayton if (this != &rhs) 49*7e14f91dSGreg Clayton { 50*7e14f91dSGreg Clayton m_pairs = rhs.m_pairs; 51*7e14f91dSGreg Clayton m_callback = NULL; 52*7e14f91dSGreg Clayton m_callback_baton = NULL; 53*7e14f91dSGreg Clayton } 54*7e14f91dSGreg Clayton return *this; 55*7e14f91dSGreg Clayton } 56*7e14f91dSGreg Clayton 57*7e14f91dSGreg 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 10430fdc8d8SChris Lattner void 10530fdc8d8SChris Lattner PathMappingList::Dump (Stream *s) 10630fdc8d8SChris Lattner { 10730fdc8d8SChris Lattner unsigned int numPairs = m_pairs.size(); 10830fdc8d8SChris Lattner unsigned int index; 10930fdc8d8SChris Lattner 11030fdc8d8SChris Lattner for (index = 0; index < numPairs; ++index) 11130fdc8d8SChris Lattner { 11230fdc8d8SChris Lattner s->Printf("[%d] \"%s\" -> \"%s\"\n", 11330fdc8d8SChris Lattner index, m_pairs[index].first.GetCString(), m_pairs[index].second.GetCString()); 11430fdc8d8SChris Lattner } 11530fdc8d8SChris Lattner } 11630fdc8d8SChris Lattner 11730fdc8d8SChris Lattner void 11830fdc8d8SChris Lattner PathMappingList::Clear (bool notify) 11930fdc8d8SChris Lattner { 12030fdc8d8SChris Lattner m_pairs.clear(); 12130fdc8d8SChris Lattner if (notify && m_callback) 12230fdc8d8SChris Lattner m_callback (*this, m_callback_baton); 12330fdc8d8SChris Lattner } 12430fdc8d8SChris Lattner 12530fdc8d8SChris Lattner size_t 12630fdc8d8SChris Lattner PathMappingList::GetSize () 12730fdc8d8SChris Lattner { 12830fdc8d8SChris Lattner return m_pairs.size(); 12930fdc8d8SChris Lattner } 13030fdc8d8SChris Lattner 13130fdc8d8SChris Lattner bool 13230fdc8d8SChris Lattner PathMappingList::RemapPath (const ConstString &path, ConstString &new_path) 13330fdc8d8SChris Lattner { 13430fdc8d8SChris Lattner const_iterator pos, end = m_pairs.end(); 13530fdc8d8SChris Lattner for (pos = m_pairs.begin(); pos != end; ++pos) 13630fdc8d8SChris Lattner { 13730fdc8d8SChris Lattner const size_t prefixLen = pos->first.GetLength(); 13830fdc8d8SChris Lattner 13930fdc8d8SChris Lattner if (::strncmp (pos->first.GetCString(), path.GetCString(), prefixLen) == 0) 14030fdc8d8SChris Lattner { 14130fdc8d8SChris Lattner std::string new_path_str (pos->second.GetCString()); 14230fdc8d8SChris Lattner new_path_str.append(path.GetCString() + prefixLen); 14330fdc8d8SChris Lattner new_path.SetCString(new_path_str.c_str()); 14430fdc8d8SChris Lattner return true; 14530fdc8d8SChris Lattner } 14630fdc8d8SChris Lattner } 14730fdc8d8SChris Lattner return false; 14830fdc8d8SChris Lattner } 149*7e14f91dSGreg Clayton 150*7e14f91dSGreg Clayton bool 151*7e14f91dSGreg Clayton PathMappingList::Replace (const ConstString &path, const ConstString &new_path, bool notify) 152*7e14f91dSGreg Clayton { 153*7e14f91dSGreg Clayton uint32_t idx = FindIndexForPath (path); 154*7e14f91dSGreg Clayton if (idx < m_pairs.size()) 155*7e14f91dSGreg Clayton { 156*7e14f91dSGreg Clayton m_pairs[idx].second = new_path; 157*7e14f91dSGreg Clayton if (notify && m_callback) 158*7e14f91dSGreg Clayton m_callback (*this, m_callback_baton); 159*7e14f91dSGreg Clayton return true; 160*7e14f91dSGreg Clayton } 161*7e14f91dSGreg Clayton return false; 162*7e14f91dSGreg Clayton } 163*7e14f91dSGreg Clayton 164*7e14f91dSGreg Clayton bool 165*7e14f91dSGreg Clayton PathMappingList::Remove (const ConstString &path, bool notify) 166*7e14f91dSGreg Clayton { 167*7e14f91dSGreg Clayton iterator pos = FindIteratorForPath (path); 168*7e14f91dSGreg Clayton if (pos != m_pairs.end()) 169*7e14f91dSGreg Clayton { 170*7e14f91dSGreg Clayton m_pairs.erase (pos); 171*7e14f91dSGreg Clayton if (notify && m_callback) 172*7e14f91dSGreg Clayton m_callback (*this, m_callback_baton); 173*7e14f91dSGreg Clayton return true; 174*7e14f91dSGreg Clayton } 175*7e14f91dSGreg Clayton return false; 176*7e14f91dSGreg Clayton } 177*7e14f91dSGreg Clayton 178*7e14f91dSGreg Clayton PathMappingList::const_iterator 179*7e14f91dSGreg Clayton PathMappingList::FindIteratorForPath (const ConstString &path) const 180*7e14f91dSGreg Clayton { 181*7e14f91dSGreg Clayton const_iterator pos; 182*7e14f91dSGreg Clayton const_iterator begin = m_pairs.begin(); 183*7e14f91dSGreg Clayton const_iterator end = m_pairs.end(); 184*7e14f91dSGreg Clayton 185*7e14f91dSGreg Clayton for (pos = begin; pos != end; ++pos) 186*7e14f91dSGreg Clayton { 187*7e14f91dSGreg Clayton if (pos->first == path) 188*7e14f91dSGreg Clayton break; 189*7e14f91dSGreg Clayton } 190*7e14f91dSGreg Clayton return pos; 191*7e14f91dSGreg Clayton } 192*7e14f91dSGreg Clayton 193*7e14f91dSGreg Clayton PathMappingList::iterator 194*7e14f91dSGreg Clayton PathMappingList::FindIteratorForPath (const ConstString &path) 195*7e14f91dSGreg Clayton { 196*7e14f91dSGreg Clayton iterator pos; 197*7e14f91dSGreg Clayton iterator begin = m_pairs.begin(); 198*7e14f91dSGreg Clayton iterator end = m_pairs.end(); 199*7e14f91dSGreg Clayton 200*7e14f91dSGreg Clayton for (pos = begin; pos != end; ++pos) 201*7e14f91dSGreg Clayton { 202*7e14f91dSGreg Clayton if (pos->first == path) 203*7e14f91dSGreg Clayton break; 204*7e14f91dSGreg Clayton } 205*7e14f91dSGreg Clayton return pos; 206*7e14f91dSGreg Clayton } 207*7e14f91dSGreg Clayton 208*7e14f91dSGreg Clayton bool 209*7e14f91dSGreg Clayton PathMappingList::GetPathsAtIndex (uint32_t idx, ConstString &path, ConstString &new_path) const 210*7e14f91dSGreg Clayton { 211*7e14f91dSGreg Clayton if (idx < m_pairs.size()) 212*7e14f91dSGreg Clayton { 213*7e14f91dSGreg Clayton path = m_pairs[idx].first; 214*7e14f91dSGreg Clayton new_path = m_pairs[idx].second; 215*7e14f91dSGreg Clayton return true; 216*7e14f91dSGreg Clayton } 217*7e14f91dSGreg Clayton return false; 218*7e14f91dSGreg Clayton } 219*7e14f91dSGreg Clayton 220*7e14f91dSGreg Clayton 221*7e14f91dSGreg Clayton 222*7e14f91dSGreg Clayton uint32_t 223*7e14f91dSGreg Clayton PathMappingList::FindIndexForPath (const ConstString &path) const 224*7e14f91dSGreg Clayton { 225*7e14f91dSGreg Clayton const_iterator pos; 226*7e14f91dSGreg Clayton const_iterator begin = m_pairs.begin(); 227*7e14f91dSGreg Clayton const_iterator end = m_pairs.end(); 228*7e14f91dSGreg Clayton 229*7e14f91dSGreg Clayton for (pos = begin; pos != end; ++pos) 230*7e14f91dSGreg Clayton { 231*7e14f91dSGreg Clayton if (pos->first == path) 232*7e14f91dSGreg Clayton return std::distance (begin, pos); 233*7e14f91dSGreg Clayton } 234*7e14f91dSGreg Clayton return UINT32_MAX; 235*7e14f91dSGreg Clayton } 236*7e14f91dSGreg Clayton 237