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