/* Cache of styled source file text
   Copyright (C) 2018-2024 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 GDB_SOURCE_CACHE_H
#define GDB_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 ();
    m_no_styling_files.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 list of files where styling failed.  */
  std::unordered_set<std::string> m_no_styling_files;
};

/* The global source cache.  */
extern source_cache g_source_cache;

#endif /* GDB_SOURCE_CACHE_H */
