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 16*48862d45SEli Friedman #include "lldb/Target/PathMappingList.h" 17*48862d45SEli 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 3630fdc8d8SChris Lattner //---------------------------------------------------------------------- 3730fdc8d8SChris Lattner // Destructor 3830fdc8d8SChris Lattner //---------------------------------------------------------------------- 3930fdc8d8SChris Lattner PathMappingList::~PathMappingList () 4030fdc8d8SChris Lattner { 4130fdc8d8SChris Lattner } 4230fdc8d8SChris Lattner 4330fdc8d8SChris Lattner void 4430fdc8d8SChris Lattner PathMappingList::Append (const ConstString &path, 4530fdc8d8SChris Lattner const ConstString &replacement, 4630fdc8d8SChris Lattner bool notify) 4730fdc8d8SChris Lattner { 4830fdc8d8SChris Lattner m_pairs.push_back(pair(path, replacement)); 4930fdc8d8SChris Lattner if (notify && m_callback) 5030fdc8d8SChris Lattner m_callback (*this, m_callback_baton); 5130fdc8d8SChris Lattner } 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner void 5430fdc8d8SChris Lattner PathMappingList::Insert (const ConstString &path, 5530fdc8d8SChris Lattner const ConstString &replacement, 5630fdc8d8SChris Lattner uint32_t index, 5730fdc8d8SChris Lattner bool notify) 5830fdc8d8SChris Lattner { 5930fdc8d8SChris Lattner iterator insert_iter; 6030fdc8d8SChris Lattner if (index >= m_pairs.size()) 6130fdc8d8SChris Lattner insert_iter = m_pairs.end(); 6230fdc8d8SChris Lattner else 6330fdc8d8SChris Lattner insert_iter = m_pairs.begin() + index; 6430fdc8d8SChris Lattner m_pairs.insert(insert_iter, pair(path, replacement)); 6530fdc8d8SChris Lattner if (notify && m_callback) 6630fdc8d8SChris Lattner m_callback (*this, m_callback_baton); 6730fdc8d8SChris Lattner } 6830fdc8d8SChris Lattner 6930fdc8d8SChris Lattner bool 7030fdc8d8SChris Lattner PathMappingList::Remove (off_t index, bool notify) 7130fdc8d8SChris Lattner { 7230fdc8d8SChris Lattner if (index >= m_pairs.size()) 7330fdc8d8SChris Lattner return false; 7430fdc8d8SChris Lattner 7530fdc8d8SChris Lattner iterator iter = m_pairs.begin() + index; 7630fdc8d8SChris Lattner m_pairs.erase(iter); 7730fdc8d8SChris Lattner if (notify && m_callback) 7830fdc8d8SChris Lattner m_callback (*this, m_callback_baton); 7930fdc8d8SChris Lattner return true; 8030fdc8d8SChris Lattner } 8130fdc8d8SChris Lattner 8230fdc8d8SChris Lattner void 8330fdc8d8SChris Lattner PathMappingList::Dump (Stream *s) 8430fdc8d8SChris Lattner { 8530fdc8d8SChris Lattner unsigned int numPairs = m_pairs.size(); 8630fdc8d8SChris Lattner unsigned int index; 8730fdc8d8SChris Lattner 8830fdc8d8SChris Lattner for (index = 0; index < numPairs; ++index) 8930fdc8d8SChris Lattner { 9030fdc8d8SChris Lattner s->Printf("[%d] \"%s\" -> \"%s\"\n", 9130fdc8d8SChris Lattner index, m_pairs[index].first.GetCString(), m_pairs[index].second.GetCString()); 9230fdc8d8SChris Lattner } 9330fdc8d8SChris Lattner } 9430fdc8d8SChris Lattner 9530fdc8d8SChris Lattner void 9630fdc8d8SChris Lattner PathMappingList::Clear (bool notify) 9730fdc8d8SChris Lattner { 9830fdc8d8SChris Lattner m_pairs.clear(); 9930fdc8d8SChris Lattner if (notify && m_callback) 10030fdc8d8SChris Lattner m_callback (*this, m_callback_baton); 10130fdc8d8SChris Lattner } 10230fdc8d8SChris Lattner 10330fdc8d8SChris Lattner size_t 10430fdc8d8SChris Lattner PathMappingList::GetSize () 10530fdc8d8SChris Lattner { 10630fdc8d8SChris Lattner return m_pairs.size(); 10730fdc8d8SChris Lattner } 10830fdc8d8SChris Lattner 10930fdc8d8SChris Lattner bool 11030fdc8d8SChris Lattner PathMappingList::RemapPath (const ConstString &path, ConstString &new_path) 11130fdc8d8SChris Lattner { 11230fdc8d8SChris Lattner const_iterator pos, end = m_pairs.end(); 11330fdc8d8SChris Lattner for (pos = m_pairs.begin(); pos != end; ++pos) 11430fdc8d8SChris Lattner { 11530fdc8d8SChris Lattner const size_t prefixLen = pos->first.GetLength(); 11630fdc8d8SChris Lattner 11730fdc8d8SChris Lattner if (::strncmp (pos->first.GetCString(), path.GetCString(), prefixLen) == 0) 11830fdc8d8SChris Lattner { 11930fdc8d8SChris Lattner std::string new_path_str (pos->second.GetCString()); 12030fdc8d8SChris Lattner new_path_str.append(path.GetCString() + prefixLen); 12130fdc8d8SChris Lattner new_path.SetCString(new_path_str.c_str()); 12230fdc8d8SChris Lattner return true; 12330fdc8d8SChris Lattner } 12430fdc8d8SChris Lattner } 12530fdc8d8SChris Lattner return false; 12630fdc8d8SChris Lattner } 127