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::AppendString(llvm::StringRef str)
74 m_strings.push_back(str.str());
78 StringList::AppendList (const char **strv, int strc)
80 for (int i = 0; i < strc; ++i)
83 m_strings.push_back (strv[i]);
88 StringList::AppendList (StringList strings)
90 size_t len = strings.GetSize();
92 for (size_t i = 0; i < len; ++i)
93 m_strings.push_back (strings.GetStringAtIndex(i));
97 StringList::ReadFileLines (FileSpec &input_file)
99 return input_file.ReadFileLines (m_strings);
103 StringList::GetSize () const
105 return m_strings.size();
109 StringList::GetMaxStringLength () const
111 size_t max_length = 0;
112 for (const auto &s : m_strings)
114 const size_t len = s.size();
115 if (max_length < len)
123 StringList::GetStringAtIndex (size_t idx) const
125 if (idx < m_strings.size())
126 return m_strings[idx].c_str();
131 StringList::Join (const char *separator, Stream &strm)
133 size_t size = GetSize();
138 for (uint32_t i = 0; i < size; ++i)
141 strm.PutCString(separator);
142 strm.PutCString(GetStringAtIndex(i));
153 StringList::LongestCommonPrefix (std::string &common_prefix)
155 const size_t num_strings = m_strings.size();
157 if (num_strings == 0)
159 common_prefix.clear();
163 common_prefix = m_strings.front();
165 for (size_t idx = 1; idx < num_strings; ++idx)
167 std::string &curr_string = m_strings[idx];
168 size_t new_size = curr_string.size();
170 // First trim common_prefix if it is longer than the current element:
171 if (common_prefix.size() > new_size)
172 common_prefix.erase (new_size);
174 // Then trim it at the first disparity:
175 for (size_t i = 0; i < common_prefix.size(); i++)
177 if (curr_string[i] != common_prefix[i])
179 common_prefix.erase(i);
184 // If we've emptied the common prefix, we're done.
185 if (common_prefix.empty())
192 StringList::InsertStringAtIndex (size_t idx, const char *str)
196 if (idx < m_strings.size())
197 m_strings.insert (m_strings.begin() + idx, str);
199 m_strings.push_back (str);
204 StringList::InsertStringAtIndex (size_t idx, const std::string &str)
206 if (idx < m_strings.size())
207 m_strings.insert (m_strings.begin() + idx, str);
209 m_strings.push_back (str);
213 StringList::InsertStringAtIndex (size_t idx, std::string &&str)
215 if (idx < m_strings.size())
216 m_strings.insert (m_strings.begin() + idx, str);
218 m_strings.push_back (str);
222 StringList::DeleteStringAtIndex (size_t idx)
224 if (idx < m_strings.size())
225 m_strings.erase (m_strings.begin() + idx);
229 StringList::SplitIntoLines (const std::string &lines)
231 return SplitIntoLines (lines.c_str(), lines.size());
235 StringList::SplitIntoLines (const char *lines, size_t len)
237 const size_t orig_size = m_strings.size();
242 const char *k_newline_chars = "\r\n";
243 const char *p = lines;
244 const char *end = lines + len;
247 size_t count = strcspn (p, k_newline_chars);
250 if (p[count] == '\r' || p[count] == '\n')
251 m_strings.push_back(std::string());
259 m_strings.push_back(std::string(p, count));
261 if (p[count] == '\r' && p[count+1] == '\n')
262 count++; // Skip an extra newline char for the DOS newline
263 count++; // Skip the newline character
266 return m_strings.size() - orig_size;
270 StringList::RemoveBlankLines ()
276 while (idx < m_strings.size())
278 if (m_strings[idx].empty())
279 DeleteStringAtIndex(idx);
286 StringList::CopyList(const char* item_preamble, const char* items_sep) const
289 for (size_t i = 0; i < GetSize(); i++)
291 if (i && items_sep && items_sep[0])
294 strm << item_preamble;
295 strm << GetStringAtIndex(i);
297 return std::string(strm.GetData());
301 StringList::operator << (const char* str)
308 StringList::operator << (StringList strings)
315 StringList::AutoComplete (const char *s, StringList &matches, size_t &exact_idx) const
318 exact_idx = SIZE_MAX;
321 const size_t s_len = strlen (s);
322 const size_t num_strings = m_strings.size();
324 for (size_t i=0; i<num_strings; ++i)
326 if (m_strings[i].find(s) == 0)
328 if (exact_idx == SIZE_MAX && m_strings[i].size() == s_len)
329 exact_idx = matches.GetSize();
330 matches.AppendString (m_strings[i]);
336 // No string, so it matches everything
339 return matches.GetSize();