1 //===-- StringList.cpp ------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/Core/StringList.h"
12 #include "lldb/Core/StreamString.h"
13 #include "lldb/Host/FileSpec.h"
17 using namespace lldb_private;
19 StringList::StringList () :
24 StringList::StringList (const char *str) :
28 m_strings.push_back (str);
31 StringList::StringList (const char **strv, int strc) :
34 for (int i = 0; i < strc; ++i)
37 m_strings.push_back (strv[i]);
41 StringList::~StringList ()
46 StringList::AppendString (const char *str)
49 m_strings.push_back (str);
53 StringList::AppendString (const std::string &s)
55 m_strings.push_back (s);
59 StringList::AppendString (std::string &&s)
61 m_strings.push_back (s);
65 StringList::AppendString (const char *str, size_t str_len)
68 m_strings.push_back (std::string (str, str_len));
72 StringList::AppendList (const char **strv, int strc)
74 for (int i = 0; i < strc; ++i)
77 m_strings.push_back (strv[i]);
82 StringList::AppendList (StringList strings)
84 size_t len = strings.GetSize();
86 for (size_t i = 0; i < len; ++i)
87 m_strings.push_back (strings.GetStringAtIndex(i));
91 StringList::ReadFileLines (FileSpec &input_file)
93 return input_file.ReadFileLines (m_strings);
97 StringList::GetSize () const
99 return m_strings.size();
103 StringList::GetMaxStringLength () const
105 size_t max_length = 0;
106 for (const auto &s : m_strings)
108 const size_t len = s.size();
109 if (max_length < len)
117 StringList::GetStringAtIndex (size_t idx) const
119 if (idx < m_strings.size())
120 return m_strings[idx].c_str();
125 StringList::Join (const char *separator, Stream &strm)
127 size_t size = GetSize();
132 for (uint32_t i = 0; i < size; ++i)
135 strm.PutCString(separator);
136 strm.PutCString(GetStringAtIndex(i));
147 StringList::LongestCommonPrefix (std::string &common_prefix)
149 const size_t num_strings = m_strings.size();
151 if (num_strings == 0)
153 common_prefix.clear();
157 common_prefix = m_strings.front();
159 for (size_t idx = 1; idx < num_strings; ++idx)
161 std::string &curr_string = m_strings[idx];
162 size_t new_size = curr_string.size();
164 // First trim common_prefix if it is longer than the current element:
165 if (common_prefix.size() > new_size)
166 common_prefix.erase (new_size);
168 // Then trim it at the first disparity:
169 for (size_t i = 0; i < common_prefix.size(); i++)
171 if (curr_string[i] != common_prefix[i])
173 common_prefix.erase(i);
178 // If we've emptied the common prefix, we're done.
179 if (common_prefix.empty())
186 StringList::InsertStringAtIndex (size_t idx, const char *str)
190 if (idx < m_strings.size())
191 m_strings.insert (m_strings.begin() + idx, str);
193 m_strings.push_back (str);
198 StringList::InsertStringAtIndex (size_t idx, const std::string &str)
200 if (idx < m_strings.size())
201 m_strings.insert (m_strings.begin() + idx, str);
203 m_strings.push_back (str);
207 StringList::InsertStringAtIndex (size_t idx, std::string &&str)
209 if (idx < m_strings.size())
210 m_strings.insert (m_strings.begin() + idx, str);
212 m_strings.push_back (str);
216 StringList::DeleteStringAtIndex (size_t idx)
218 if (idx < m_strings.size())
219 m_strings.erase (m_strings.begin() + idx);
223 StringList::SplitIntoLines (const std::string &lines)
225 return SplitIntoLines (lines.c_str(), lines.size());
229 StringList::SplitIntoLines (const char *lines, size_t len)
231 const size_t orig_size = m_strings.size();
236 const char *k_newline_chars = "\r\n";
237 const char *p = lines;
238 const char *end = lines + len;
241 size_t count = strcspn (p, k_newline_chars);
244 if (p[count] == '\r' || p[count] == '\n')
245 m_strings.push_back(std::string());
253 m_strings.push_back(std::string(p, count));
255 if (p[count] == '\r' && p[count+1] == '\n')
256 count++; // Skip an extra newline char for the DOS newline
257 count++; // Skip the newline character
260 return m_strings.size() - orig_size;
264 StringList::RemoveBlankLines ()
270 while (idx < m_strings.size())
272 if (m_strings[idx].empty())
273 DeleteStringAtIndex(idx);
280 StringList::CopyList(const char* item_preamble, const char* items_sep) const
283 for (size_t i = 0; i < GetSize(); i++)
285 if (i && items_sep && items_sep[0])
288 strm << item_preamble;
289 strm << GetStringAtIndex(i);
291 return std::string(strm.GetData());
295 StringList::operator << (const char* str)
302 StringList::operator << (StringList strings)
309 StringList::AutoComplete (const char *s, StringList &matches, size_t &exact_idx) const
312 exact_idx = SIZE_MAX;
315 const size_t s_len = strlen (s);
316 const size_t num_strings = m_strings.size();
318 for (size_t i=0; i<num_strings; ++i)
320 if (m_strings[i].find(s) == 0)
322 if (exact_idx == SIZE_MAX && m_strings[i].size() == s_len)
323 exact_idx = matches.GetSize();
324 matches.AppendString (m_strings[i]);
330 // No string, so it matches everything
333 return matches.GetSize();