diff options
Diffstat (limited to 'gdb/source-cache.c')
-rw-r--r-- | gdb/source-cache.c | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/gdb/source-cache.c b/gdb/source-cache.c index f5bb641..f0cb6b8 100644 --- a/gdb/source-cache.c +++ b/gdb/source-cache.c @@ -22,6 +22,7 @@ #include "source.h" #include "cli/cli-style.h" #include "symtab.h" +#include "gdbsupport/selftest.h" #ifdef HAVE_SOURCE_HIGHLIGHT /* If Gnulib redirects 'open' and 'close' to its replacements @@ -80,11 +81,12 @@ source_cache::get_plain_source_lines (struct symtab *s, int first_line, return true; } -/* See source-cache.h. */ - -std::string -source_cache::extract_lines (const struct source_text &text, int first_line, - int last_line) +/* A helper function for get_plain_source_lines that extracts the + desired source lines from TEXT, putting them into LINES_OUT. The + arguments are as for get_source_lines. The return value is the + desired lines. */ +static std::string +extract_lines (const std::string &text, int first_line, int last_line) { int lineno = 1; std::string::size_type pos = 0; @@ -92,7 +94,7 @@ source_cache::extract_lines (const struct source_text &text, int first_line, while (pos != std::string::npos && lineno <= last_line) { - std::string::size_type new_pos = text.contents.find ('\n', pos); + std::string::size_type new_pos = text.find ('\n', pos); if (lineno == first_line) first_pos = pos; @@ -103,8 +105,10 @@ source_cache::extract_lines (const struct source_text &text, int first_line, if (first_pos == std::string::npos) return {}; if (pos == std::string::npos) - pos = text.contents.size (); - return text.contents.substr (first_pos, pos - first_pos); + pos = text.size (); + else + ++pos; + return text.substr (first_pos, pos - first_pos); } ++lineno; ++pos; @@ -187,7 +191,7 @@ source_cache::get_source_lines (struct symtab *s, int first_line, { if (item.fullname == fullname) { - *lines = extract_lines (item, first_line, last_line); + *lines = extract_lines (item.contents, first_line, last_line); return true; } } @@ -233,8 +237,8 @@ source_cache::get_source_lines (struct symtab *s, int first_line, if (m_source_map.size () > MAX_ENTRIES) m_source_map.erase (m_source_map.begin ()); - *lines = extract_lines (m_source_map.back (), first_line, - last_line); + *lines = extract_lines (m_source_map.back ().contents, + first_line, last_line); return true; } } @@ -243,3 +247,26 @@ source_cache::get_source_lines (struct symtab *s, int first_line, return get_plain_source_lines (s, first_line, last_line, lines); } + +#if GDB_SELF_TEST +namespace selftests +{ +static void extract_lines_test () +{ + std::string input_text = "abc\ndef\nghi\njkl\n"; + + SELF_CHECK (extract_lines (input_text, 1, 1) == "abc\n"); + SELF_CHECK (extract_lines (input_text, 2, 1) == ""); + SELF_CHECK (extract_lines (input_text, 1, 2) == "abc\ndef\n"); + SELF_CHECK (extract_lines ("abc", 1, 1) == "abc"); +} +} +#endif + +void +_initialize_source_cache () +{ +#if GDB_SELF_TEST + selftests::register_test ("source-cache", selftests::extract_lines_test); +#endif +} |