123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- /* Cache of styled source file text
- Copyright (C) 2018-2022 Free Software Foundation, Inc.
- This file is part of GDB.
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
- #ifndef SOURCE_CACHE_H
- #define SOURCE_CACHE_H
- #include <unordered_map>
- #include <unordered_set>
- /* This caches two things related to source files.
- First, it caches highlighted source text, keyed by the source
- file's full name. A size-limited LRU cache is used.
- Highlighting depends on the GNU Source Highlight library. When not
- available or when highlighting fails for some reason, this cache
- will instead store the un-highlighted source text.
- Second, this will cache the file offsets corresponding to the start
- of each line of a source file. This cache is not size-limited. */
- class source_cache
- {
- public:
- source_cache ()
- {
- }
- /* This returns the vector of file offsets for the symtab S,
- computing the vector first if needed.
- On failure, returns false.
- On success, returns true and sets *OFFSETS. This pointer is not
- guaranteed to remain valid across other calls to get_source_lines
- or get_line_charpos. */
- bool get_line_charpos (struct symtab *s,
- const std::vector<off_t> **offsets);
- /* Get the source text for the source file in symtab S. FIRST_LINE
- and LAST_LINE are the first and last lines to return; line
- numbers are 1-based. If the file cannot be read, or if the line
- numbers are out of range, false is returned. Otherwise,
- LINES_OUT is set to the desired text. The returned text may
- include ANSI terminal escapes. */
- bool get_source_lines (struct symtab *s, int first_line,
- int last_line, std::string *lines_out);
- /* Remove all the items from the source cache. */
- void clear ()
- {
- m_source_map.clear ();
- m_offset_cache.clear ();
- }
- private:
- /* One element in the cache. */
- struct source_text
- {
- /* The full name of the file. */
- std::string fullname;
- /* The contents of the file. */
- std::string contents;
- };
- /* A helper function for get_source_lines reads a source file.
- Returns the contents of the file; or throws an exception on
- error. This also updates m_offset_cache. */
- std::string get_plain_source_lines (struct symtab *s,
- const std::string &fullname);
- /* A helper function that the data for the given symtab is entered
- into both caches. Returns false on error. */
- bool ensure (struct symtab *s);
- /* The contents of the source text cache. */
- std::vector<source_text> m_source_map;
- /* The file offset cache. The key is the full name of the source
- file. */
- std::unordered_map<std::string, std::vector<off_t>> m_offset_cache;
- };
- /* The global source cache. */
- extern source_cache g_source_cache;
- #endif /* SOURCE_CACHE_H */
|