diff options
author | Tom de Vries <tdevries@suse.de> | 2023-10-17 11:38:06 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2023-10-17 11:38:06 +0200 |
commit | 62dfd02e30e33be7b6acab5e2e50677d60b8ff8c (patch) | |
tree | 189175a08e2ae3f201942404c7c03c92cb7e4d4a | |
parent | 7e5649156720ec6c3aa5e2036b27811bc8195ab9 (diff) | |
download | gdb-62dfd02e30e33be7b6acab5e2e50677d60b8ff8c.zip gdb-62dfd02e30e33be7b6acab5e2e50677d60b8ff8c.tar.gz gdb-62dfd02e30e33be7b6acab5e2e50677d60b8ff8c.tar.bz2 |
[gdb/cli] Factor out try_source_highlight
Function source_cache::ensure contains some code using the GNU
source-highlight library.
The code is a sizable part of the function, and contains conditional
compilation in a slightly convoluted way:
...
if (!already_styled)
#endif /* HAVE_SOURCE_HIGHLIGHT */
{
...
Fix this by factoring out the code into new function try_source_highlight,
such that:
- source_cache::ensure is easier to read, and
- the conditional compilation is at the level of the function body.
Tested on x86_64-linux.
Reviewed-By: Lancelot Six <lancelot.six@amd.com>
-rw-r--r-- | gdb/source-cache.c | 91 |
1 files changed, 55 insertions, 36 deletions
diff --git a/gdb/source-cache.c b/gdb/source-cache.c index ae02d25..a6b035b 100644 --- a/gdb/source-cache.c +++ b/gdb/source-cache.c @@ -191,6 +191,59 @@ get_language_name (enum language lang) #endif /* HAVE_SOURCE_HIGHLIGHT */ +/* Try to highlight CONTENTS from file FULLNAME in language LANG using + the GNU source-higlight library. Return true if highlighting + succeeded. */ + +static bool +try_source_highlight (std::string &contents ATTRIBUTE_UNUSED, + enum language lang ATTRIBUTE_UNUSED, + const std::string &fullname ATTRIBUTE_UNUSED) +{ +#ifdef HAVE_SOURCE_HIGHLIGHT + if (!use_gnu_source_highlight) + return false; + + const char *lang_name = get_language_name (lang); + if (lang_name == nullptr) + return false; + + /* The global source highlight object, or null if one was + never constructed. This is stored here rather than in + the class so that we don't need to include anything or do + conditional compilation in source-cache.h. */ + static srchilite::SourceHighlight *highlighter; + + bool styled = false; + try + { + if (highlighter == nullptr) + { + highlighter = new srchilite::SourceHighlight ("esc.outlang"); + highlighter->setStyleFile ("esc.style"); + } + + std::istringstream input (contents); + std::ostringstream output; + highlighter->highlight (input, output, lang_name, fullname); + contents = std::move (output).str (); + styled = true; + } + catch (...) + { + /* Source Highlight will throw an exception if + highlighting fails. One possible reason it can fail + is if the language is unknown -- which matters to gdb + because Rust support wasn't added until after 3.1.8. + Ignore exceptions here. */ + } + + return styled; +#else + return false; +#endif /* HAVE_SOURCE_HIGHLIGHT */ +} + /* See source-cache.h. */ bool @@ -230,44 +283,10 @@ source_cache::ensure (struct symtab *s) if (source_styling && gdb_stdout->can_emit_style_escape ()) { -#ifdef HAVE_SOURCE_HIGHLIGHT - bool already_styled = false; - const char *lang_name = get_language_name (s->language ()); - if (lang_name != nullptr && use_gnu_source_highlight) - { - /* The global source highlight object, or null if one was - never constructed. This is stored here rather than in - the class so that we don't need to include anything or do - conditional compilation in source-cache.h. */ - static srchilite::SourceHighlight *highlighter; - - try - { - if (highlighter == nullptr) - { - highlighter = new srchilite::SourceHighlight ("esc.outlang"); - highlighter->setStyleFile ("esc.style"); - } - - std::istringstream input (contents); - std::ostringstream output; - highlighter->highlight (input, output, lang_name, fullname); - contents = std::move (output).str (); - already_styled = true; - } - catch (...) - { - /* Source Highlight will throw an exception if - highlighting fails. One possible reason it can fail - is if the language is unknown -- which matters to gdb - because Rust support wasn't added until after 3.1.8. - Ignore exceptions here and fall back to - un-highlighted text. */ - } - } + bool already_styled + = try_source_highlight (contents, s->language (), fullname); if (!already_styled) -#endif /* HAVE_SOURCE_HIGHLIGHT */ { gdb::optional<std::string> ext_contents; ext_contents = ext_lang_colorize (fullname, contents); |