/* List lines of source files for GDB, the GNU debugger.
   Copyright (C) 1999-2020 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_H
#define SOURCE_H

#include "gdbsupport/scoped_fd.h"

struct symtab;

/* See openp function definition for their description.  */

enum openp_flag
{
  OPF_TRY_CWD_FIRST = 0x01,
  OPF_SEARCH_IN_PATH = 0x02,
  OPF_RETURN_REALPATH = 0x04,
};

DEF_ENUM_FLAGS_TYPE(openp_flag, openp_flags);

extern int openp (const char *, openp_flags, const char *, int,
		  gdb::unique_xmalloc_ptr<char> *);

extern int source_full_path_of (const char *, gdb::unique_xmalloc_ptr<char> *);

extern void mod_path (const char *, char **);

extern void add_path (const char *, char **, int);

extern void directory_switch (const char *, int);

extern char *source_path;

extern void init_source_path (void);

/* This function is capable of finding the absolute path to a
   source file, and opening it, provided you give it a FILENAME.  Both the
   DIRNAME and FULLNAME are only added suggestions on where to find the file.

   FILENAME should be the filename to open.
   DIRNAME is the compilation directory of a particular source file.
	   Only some debug formats provide this info.
   FULLNAME can be the last known absolute path to the file in question.
     Space for the path must have been malloc'd.  If a path substitution
     is applied we free the old value and set a new one.

   On Success
     A valid file descriptor is returned (the return value is positive).
     FULLNAME is set to the absolute path to the file just opened.
     The caller is responsible for freeing FULLNAME.

   On Failure
     An invalid file descriptor is returned (the return value is negative).
     FULLNAME is set to NULL.  */
extern scoped_fd find_and_open_source (const char *filename,
				       const char *dirname,
				       gdb::unique_xmalloc_ptr<char> *fullname);

/* Open a source file given a symtab S.  Returns a file descriptor or
   negative number for error.  */
extern scoped_fd open_source_file (struct symtab *s);

extern gdb::unique_xmalloc_ptr<char> rewrite_source_path (const char *path);

extern const char *symtab_to_fullname (struct symtab *s);

/* Returns filename without the compile directory part, basename or absolute
   filename.  It depends on 'set filename-display' value.  */
extern const char *symtab_to_filename_for_display (struct symtab *symtab);

/* Return the first line listed by print_source_lines.  Used by
   command interpreters to request listing from a previous point.  If
   0, then no source lines have yet been listed since the last time
   the current source line was changed.  */
extern int get_first_line_listed (void);

/* Return the default number of lines to print with commands like the
   cli "list".  The caller of print_source_lines must use this to
   calculate the end line and use it in the call to print_source_lines
   as it does not automatically use this value.  */
extern int get_lines_to_list (void);

/* Return the current source file for listing and next line to list.
   NOTE: The returned sal pc and end fields are not valid.  */
extern struct symtab_and_line get_current_source_symtab_and_line (void);

/* If the current source file for listing is not set, try and get a default.
   Usually called before get_current_source_symtab_and_line() is called.
   It may err out if a default cannot be determined.
   We must be cautious about where it is called, as it can recurse as the
   process of determining a new default may call the caller!
   Use get_current_source_symtab_and_line only to get whatever
   we have without erroring out or trying to get a default.  */
extern void set_default_source_symtab_and_line (void);

/* Return the current default file for listing and next line to list
   (the returned sal pc and end fields are not valid.)
   and set the current default to whatever is in SAL.
   NOTE: The returned sal pc and end fields are not valid.  */
extern symtab_and_line set_current_source_symtab_and_line
  (const symtab_and_line &sal);

/* Reset any information stored about a default file and line to print.  */
extern void clear_current_source_symtab_and_line (void);

/* Add a source path substitution rule.  */
extern void add_substitute_path_rule (char *, char *);

/* Flags passed as 4th argument to print_source_lines.  */
enum print_source_lines_flag
  {
    /* Do not print an error message.  */
    PRINT_SOURCE_LINES_NOERROR = (1 << 0),

    /* Print the filename in front of the source lines.  */
    PRINT_SOURCE_LINES_FILENAME = (1 << 1)
  };
DEF_ENUM_FLAGS_TYPE (enum print_source_lines_flag, print_source_lines_flags);

/* Show source lines from the file of symtab S, starting with line
   number LINE and stopping before line number STOPLINE.  If this is
   not the command line version, then the source is shown in the source
   window otherwise it is simply printed.  */
extern void print_source_lines (struct symtab *s, int line, int stopline,
				print_source_lines_flags flags);

/* Wrap up the logic to build a line number range for passing to
   print_source_lines when using get_lines_to_list.  An instance of this
   class can be built from a single line number and a direction (forward or
   backward) the range is then computed using get_lines_to_list.  */
class source_lines_range
{
public:
  /* When constructing the range from a single line number, does the line
     range extend forward, or backward.  */
  enum direction
  {
   FORWARD,
   BACKWARD
  };

  /* Construct a SOURCE_LINES_RANGE starting at STARTLINE and extending in
   direction DIR.  The number of lines is from GET_LINES_TO_LIST.  If the
   direction is backward then the start is actually (STARTLINE -
   GET_LINES_TO_LIST).  There is also logic in place to ensure the start
   is always 1 or more, and the end will be at most INT_MAX.  */
  explicit source_lines_range (int startline, direction dir = FORWARD);

  /* Construct a SOURCE_LINES_RANGE from STARTLINE to STOPLINE.  */
  explicit source_lines_range (int startline, int stopline)
    : m_startline (startline),
      m_stopline (stopline)
  { /* Nothing.  */ }

  /* Return the line to start listing from.  */
  int startline () const
  { return m_startline; }

  /* Return the line after the last line that should be listed.  */
  int stopline () const
  { return m_stopline; }

private:

  /* The start and end of the range.  */
  int m_startline;
  int m_stopline;
};

/* Variation of previous print_source_lines that takes a range instead of a
   start and end line number.  */
extern void print_source_lines (struct symtab *s, source_lines_range r,
				print_source_lines_flags flags);

/* Forget line positions and file names for the symtabs in a
   particular objfile.  */
extern void forget_cached_source_info_for_objfile (struct objfile *);

/* Forget what we learned about line positions in source files, and
   which directories contain them; must check again now since files
   may be found in a different directory now.  */
extern void forget_cached_source_info (void);

/* Set the source file default for the "list" command to be S.

   If S is NULL, and we don't have a default, find one.  This
   should only be called when the user actually tries to use the
   default, since we produce an error if we can't find a reasonable
   default.  Also, since this can cause symbols to be read, doing it
   before we need to would make things slower than necessary.  */
extern void select_source_symtab (struct symtab *s);

#endif
