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