/* DWARF file and directory

   Copyright (C) 1994-2025 Free Software Foundation, Inc.

   Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology,
   Inc.  with support from Florida State University (under contract
   with the Ada Joint Program Office), and Silicon Graphics, Inc.
   Initial contribution by Brent Benson, Harris Computer Systems, Inc.,
   based on Fred Fish's (Cygnus Support) implementation of DWARF 1
   support.

   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_DWARF2_FILE_AND_DIR_H
#define GDB_DWARF2_FILE_AND_DIR_H

#include "objfiles.h"
#include "source.h"
#include <string>

/* The return type of find_file_and_directory.  Note, the enclosed
   string pointers are only valid while this object is valid.  */

struct file_and_directory
{
  file_and_directory (const char *name, const char *dir)
    : m_name (name),
      m_comp_dir (dir)
  {
  }

  /* Return true if the file name is unknown.  */
  bool is_unknown () const
  {
    return m_name == nullptr;
  }

  /* Set the compilation directory.  */
  void set_comp_dir (std::string &&dir)
  {
    m_comp_dir_storage = std::move (dir);
    m_comp_dir = nullptr;
  }

  /* Fetch the compilation directory.  This may return NULL in some
     circumstances.  Note that the return value here is not stable --
     it may change if this object is moved.  To get a stable pointer,
     you should call intern_comp_dir.  */
  const char *get_comp_dir () const
  {
    if (!m_comp_dir_storage.empty ())
      return m_comp_dir_storage.c_str ();
    return m_comp_dir;
  }

  /* If necessary, intern the compilation directory using OBJFILE's
     string cache.  Returns the compilation directory.  */
  const char *intern_comp_dir (struct objfile *objfile)
  {
    if (!m_comp_dir_storage.empty ())
      {
	m_comp_dir = objfile->intern (m_comp_dir_storage);
	m_comp_dir_storage.clear ();
      }
    return m_comp_dir;
  }

  /* Fetch the filename.  This never returns NULL.  */
  const char *get_name () const
  {
    return m_name == nullptr ? "<unknown>" : m_name;
  }

  /* Set the filename.  */
  void set_name (gdb::unique_xmalloc_ptr<char> name)
  {
    m_name_storage = std::move (name);
    m_name = m_name_storage.get ();
  }

  /* Return the full name, computing it if necessary.  */
  const char *get_fullname ()
  {
    if (m_fullname == nullptr)
      m_fullname = find_source_or_rewrite (get_name (), get_comp_dir ());
    return m_fullname.get ();
  }

  /* Forget the full name.  */
  void forget_fullname ()
  {
    m_fullname.reset ();
  }

private:

  /* The filename.  */
  const char *m_name;

  /* Storage for the filename, if needed.  */
  gdb::unique_xmalloc_ptr<char> m_name_storage;

  /* The compilation directory.  NULL if not known.  If we needed to
     compute a new string, it will be stored in the comp_dir_storage
     member, and this will be NULL.  Otherwise, points directly to the
     DW_AT_comp_dir string attribute.  */
  const char *m_comp_dir;

  /* The compilation directory, if it needed to be allocated.  */
  std::string m_comp_dir_storage;

  /* The full name.  */
  gdb::unique_xmalloc_ptr<char> m_fullname;
};

using file_and_directory_up = std::unique_ptr<file_and_directory>;

#endif /* GDB_DWARF2_FILE_AND_DIR_H */
