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