| /* List lines of source files for GDB, the GNU debugger. | |
| Copyright (C) 1999-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_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 *, std::string &); | |
| extern void add_path (const char *, char **, int); | |
| extern void add_path (const char *, std::string &, int); | |
| extern void directory_switch (const char *, int); | |
| extern std::string 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); | |
| /* A wrapper for find_and_open_source that returns the full name. If | |
| the full name cannot be found, a full name is constructed based on | |
| the parameters, passing them through rewrite_source_path. */ | |
| extern gdb::unique_xmalloc_ptr<char> find_source_or_rewrite | |
| (const char *filename, const char *dirname); | |
| /* 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 (const char *, const 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 |