/* List lines of source files for GDB, the GNU debugger.
- Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
- 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+ Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
+ 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
This file is part of GDB.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
#include "defs.h"
#include "symtab.h"
#include "ui-out.h"
#include "readline/readline.h"
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
-
-#ifdef CRLF_SOURCE_FILES
-
-/* Define CRLF_SOURCE_FILES in an xm-*.h file if source files on the
- host use \r\n rather than just \n. Defining CRLF_SOURCE_FILES is
- much faster than defining LSEEK_NOT_LINEAR. */
#define OPEN_MODE (O_RDONLY | O_BINARY)
#define FDOPEN_MODE FOPEN_RB
-#else /* ! defined (CRLF_SOURCE_FILES) */
-
-#define OPEN_MODE O_RDONLY
-#define FDOPEN_MODE FOPEN_RT
-
-#endif /* ! defined (CRLF_SOURCE_FILES) */
-
/* Prototypes for exported functions. */
void _initialize_source (void);
things are wrapping, but that would be a fair amount of work. */
int lines_to_list = 10;
+static void
+show_lines_to_list (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ fprintf_filtered (file, _("\
+Number of source lines gdb will list by default is %s.\n"),
+ value);
+}
/* Line number of last line printed. Default for various commands.
current_source_line is usually, but not always, the same as this. */
struct symtab_and_line
get_current_source_symtab_and_line (void)
{
- struct symtab_and_line cursal;
+ struct symtab_and_line cursal = { };
cursal.symtab = current_source_symtab;
cursal.line = current_source_line;
struct symtab_and_line cursal;
if (!have_full_symbols () && !have_partial_symbols ())
- error ("No symbol table is loaded. Use the \"file\" command.");
+ error (_("No symbol table is loaded. Use the \"file\" command."));
/* Pull in a current source symtab if necessary */
if (current_source_symtab == 0)
struct symtab_and_line
set_current_source_symtab_and_line (const struct symtab_and_line *sal)
{
- struct symtab_and_line cursal;
+ struct symtab_and_line cursal = { };
cursal.symtab = current_source_symtab;
cursal.line = current_source_line;
{
for (s = ofp->symtabs; s; s = s->next)
{
- char *name = s->filename;
+ const char *name = s->filename;
int len = strlen (name);
- if (!(len > 2 && (DEPRECATED_STREQ (&name[len - 2], ".h"))))
- {
- current_source_symtab = s;
- }
+ if (!(len > 2 && strcmp(&name[len - 2], ".h") == 0))
+ current_source_symtab = s;
}
}
if (current_source_symtab)
{
for (ps = ofp->psymtabs; ps != NULL; ps = ps->next)
{
- char *name = ps->filename;
+ const char *name = ps->filename;
int len = strlen (name);
- if (!(len > 2 && (DEPRECATED_STREQ (&name[len - 2], ".h"))))
- {
- cs_pst = ps;
- }
+ if (!(len > 2 && strcmp (&name[len - 2], ".h") == 0))
+ cs_pst = ps;
}
}
if (cs_pst)
if (cs_pst->readin)
{
internal_error (__FILE__, __LINE__,
- "select_source_symtab: "
- "readin pst found and no symtabs.");
+ _("select_source_symtab: "
+ "readin pst found and no symtabs."));
}
else
{
if (current_source_symtab)
return;
- error ("Can't find a default source file");
+ error (_("Can't find a default source file"));
}
\f
static void
/* FIXME, this goes to "delete dir"... */
if (dirname == 0)
{
- if (from_tty && query ("Reinitialize source path to empty? "))
+ if (from_tty && query (_("Reinitialize source path to empty? ")))
{
xfree (source_path);
init_source_path ();
forget_cached_source_info ();
}
+/* Add a path given with the -d command line switch.
+ This will not be quoted so we must not treat spaces as separators. */
+
+void
+directory_switch (char *dirname, int from_tty)
+{
+ add_path (dirname, &source_path, 0);
+}
+
/* Add zero or more directories to the front of an arbitrary path. */
void
{
char *old = *which_path;
int prefix = 0;
+ char **argv = NULL;
+ char *arg;
+ int argv_index = 0;
if (dirname == 0)
return;
- dirname = xstrdup (dirname);
- make_cleanup (xfree, dirname);
+ if (parse_separators)
+ {
+ /* This will properly parse the space and tab separators
+ and any quotes that may exist. DIRNAME_SEPARATOR will
+ be dealt with later. */
+ argv = buildargv (dirname);
+ make_cleanup_freeargv (argv);
+
+ if (argv == NULL)
+ nomem (0);
+
+ arg = argv[0];
+ }
+ else
+ {
+ arg = xstrdup (dirname);
+ make_cleanup (xfree, arg);
+ }
do
{
- char *name = dirname;
+ char *name = arg;
char *p;
struct stat st;
{
char *separator = NULL;
- char *space = NULL;
- char *tab = NULL;
+ /* Spaces and tabs will have been removed by buildargv().
+ The directories will there be split into a list but
+ each entry may still contain DIRNAME_SEPARATOR. */
if (parse_separators)
- {
- separator = strchr (name, DIRNAME_SEPARATOR);
- space = strchr (name, ' ');
- tab = strchr (name, '\t');
- }
+ separator = strchr (name, DIRNAME_SEPARATOR);
- if (separator == 0 && space == 0 && tab == 0)
- p = dirname = name + strlen (name);
+ if (separator == 0)
+ p = arg = name + strlen (name);
else
{
- p = 0;
- if (separator != 0 && (p == 0 || separator < p))
- p = separator;
- if (space != 0 && (p == 0 || space < p))
- p = space;
- if (tab != 0 && (p == 0 || tab < p))
- p = tab;
- dirname = p + 1;
- while (*dirname == DIRNAME_SEPARATOR
- || *dirname == ' '
- || *dirname == '\t')
- ++dirname;
+ p = separator;
+ arg = p + 1;
+ while (*arg == DIRNAME_SEPARATOR)
+ ++arg;
}
+
+ /* If there are no more directories in this argument then start
+ on the next argument next time round the loop (if any). */
+ if (*arg == '\0')
+ arg = parse_separators ? argv[++argv_index] : NULL;
}
- if (!(IS_DIR_SEPARATOR (*name) && p <= name + 1) /* "/" */
+ /* name is the start of the directory.
+ p is the separator (or null) following the end. */
+
+ while (!(IS_DIR_SEPARATOR (*name) && p <= name + 1) /* "/" */
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
/* On MS-DOS and MS-Windows, h:\ is different from h: */
- && !(p == name + 3 && name[1] == ':') /* "d:/" */
+ && !(p == name + 3 && name[1] == ':') /* "d:/" */
#endif
- && IS_DIR_SEPARATOR (p[-1]))
+ && IS_DIR_SEPARATOR (p[-1]))
/* Sigh. "foo/" => "foo" */
--p;
*p = '\0';
name = tilde_expand (name);
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
else if (IS_ABSOLUTE_PATH (name) && p == name + 2) /* "d:" => "d:." */
- name = concat (name, ".", NULL);
+ name = concat (name, ".", (char *)NULL);
#endif
else if (!IS_ABSOLUTE_PATH (name) && name[0] != '$')
- name = concat (current_directory, SLASH_STRING, name, NULL);
+ name = concat (current_directory, SLASH_STRING, name, (char *)NULL);
else
name = savestring (name, p - name);
make_cleanup (xfree, name);
print_sys_errmsg (name, save_errno);
}
else if ((st.st_mode & S_IFMT) != S_IFDIR)
- warning ("%s is not a directory.", name);
+ warning (_("%s is not a directory."), name);
}
append:
c = old[prefix];
old[prefix] = '\0';
- temp = concat (old, tinybuf, name, NULL);
+ temp = concat (old, tinybuf, name, (char *)NULL);
old[prefix] = c;
- *which_path = concat (temp, "", &old[prefix], NULL);
+ *which_path = concat (temp, "", &old[prefix], (char *)NULL);
prefix = strlen (temp);
xfree (temp);
}
else
{
- *which_path = concat (name, (old[0] ? tinybuf : old), old, NULL);
+ *which_path = concat (name, (old[0] ? tinybuf : old),
+ old, (char *)NULL);
prefix = strlen (name);
}
xfree (old);
}
skip_dup:;
}
- while (*dirname != '\0');
+ while (arg != NULL);
}
if (!s)
{
- printf_filtered ("No current source file.\n");
+ printf_filtered (_("No current source file.\n"));
return;
}
- printf_filtered ("Current source file is %s\n", s->filename);
+ printf_filtered (_("Current source file is %s\n"), s->filename);
if (s->dirname)
- printf_filtered ("Compilation directory is %s\n", s->dirname);
+ printf_filtered (_("Compilation directory is %s\n"), s->dirname);
if (s->fullname)
- printf_filtered ("Located in %s\n", s->fullname);
+ printf_filtered (_("Located in %s\n"), s->fullname);
if (s->nlines)
- printf_filtered ("Contains %d line%s.\n", s->nlines,
+ printf_filtered (_("Contains %d line%s.\n"), s->nlines,
s->nlines == 1 ? "" : "s");
- printf_filtered ("Source language is %s.\n", language_str (s->language));
- printf_filtered ("Compiled with %s debugging format.\n", s->debugformat);
- printf_filtered ("%s preprocessor macro info.\n",
+ printf_filtered (_("Source language is %s.\n"), language_str (s->language));
+ printf_filtered (_("Compiled with %s debugging format.\n"), s->debugformat);
+ printf_filtered (_("%s preprocessor macro info.\n"),
s->macro_table ? "Includes" : "Does not include");
}
\f
char *f = concat (current_directory,
IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
? "" : SLASH_STRING,
- filename, NULL);
+ filename, (char *)NULL);
*filename_opened = xfullpath (f);
xfree (f);
}
mtime = bfd_get_mtime (exec_bfd);
if (mtime && mtime < st.st_mtime)
- {
- warning ("Source file is more recent than executable.\n");
- }
+ warning (_("Source file is more recent than executable."));
#ifdef LSEEK_NOT_LINEAR
{
if (line < 1 || line > s->nlines)
{
close (desc);
- error ("Line number %d out of range; %s has %d lines.",
+ error (_("Line number %d out of range; %s has %d lines."),
line, s->filename, s->nlines);
}
}
else if (c == 0177)
ui_out_text (uiout, "^?");
-#ifdef CRLF_SOURCE_FILES
else if (c == '\r')
{
/* Skip a \r character, but only before a \n. */
if (c1 != EOF)
ungetc (c1, stream);
}
-#endif
else
{
sprintf (buf, "%c", c);
if (sal.symtab == 0)
{
- printf_filtered ("No line number information available");
+ printf_filtered (_("No line number information available"));
if (sal.pc != 0)
{
/* This is useful for "info line *0x7f34". If we can't tell the
/* Is there any case in which we get here, and have an address
which the user would want to see? If we have debugging symbols
and no line numbers? */
- printf_filtered ("Line number %d is out of range for \"%s\".\n",
+ printf_filtered (_("Line number %d is out of range for \"%s\".\n"),
sal.line, sal.symtab->filename);
}
xfree (sals.sals);
msg = (char *) re_comp (regex);
if (msg)
- error ("%s", msg);
+ error (("%s"), msg);
if (current_source_symtab == 0)
select_source_symtab (0);
if (line < 1 || line > current_source_symtab->nlines)
{
close (desc);
- error ("Expression not found");
+ error (_("Expression not found"));
}
if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
}
while (c != '\n' && (c = getc (stream)) >= 0);
-#ifdef CRLF_SOURCE_FILES
/* Remove the \r, if any, at the end of the line, otherwise
regular expressions that end with $ or \n won't work. */
if (p - buf > 1 && p[-2] == '\r')
p--;
p[-1] = '\n';
}
-#endif
/* we now have a source line in buf, null terminate and match */
*p = 0;
line++;
}
- printf_filtered ("Expression not found\n");
+ printf_filtered (_("Expression not found\n"));
fclose (stream);
}
msg = (char *) re_comp (regex);
if (msg)
- error ("%s", msg);
+ error (("%s"), msg);
if (current_source_symtab == 0)
select_source_symtab (0);
if (line < 1 || line > current_source_symtab->nlines)
{
close (desc);
- error ("Expression not found");
+ error (_("Expression not found"));
}
if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
}
while (c != '\n' && (c = getc (stream)) >= 0);
-#ifdef CRLF_SOURCE_FILES
/* Remove the \r, if any, at the end of the line, otherwise
regular expressions that end with $ or \n won't work. */
if (p - buf > 1 && p[-2] == '\r')
p--;
p[-1] = '\n';
}
-#endif
/* We now have a source line in buf; null terminate and match. */
*p = 0;
}
}
- printf_filtered ("Expression not found\n");
+ printf_filtered (_("Expression not found\n"));
fclose (stream);
return;
}
just an approximation. */
re_set_syntax (RE_SYNTAX_GREP);
- c = add_cmd ("directory", class_files, directory_command,
- "Add directory DIR to beginning of search path for source files.\n\
+ c = add_cmd ("directory", class_files, directory_command, _("\
+Add directory DIR to beginning of search path for source files.\n\
Forget cached info on source file locations and line positions.\n\
DIR can also be $cwd for the current working directory, or $cdir for the\n\
directory in which the source file was compiled into object code.\n\
-With no argument, reset the search path to $cdir:$cwd, the default.",
+With no argument, reset the search path to $cdir:$cwd, the default."),
&cmdlist);
if (dbx_commands)
set_cmd_completer (c, filename_completer);
- add_cmd ("directories", no_class, show_directories,
- "Current search path for finding source files.\n\
+ add_cmd ("directories", no_class, show_directories, _("\
+Current search path for finding source files.\n\
$cwd in the path means the current working directory.\n\
-$cdir in the path means the compilation directory of the source file.",
+$cdir in the path means the compilation directory of the source file."),
&showlist);
if (xdb_commands)
{
add_com_alias ("D", "directory", class_files, 0);
- add_cmd ("ld", no_class, show_directories,
- "Current search path for finding source files.\n\
+ add_cmd ("ld", no_class, show_directories, _("\
+Current search path for finding source files.\n\
$cwd in the path means the current working directory.\n\
-$cdir in the path means the compilation directory of the source file.",
+$cdir in the path means the compilation directory of the source file."),
&cmdlist);
}
add_info ("source", source_info,
- "Information about the current source file.");
+ _("Information about the current source file."));
- add_info ("line", line_info,
- concat ("Core addresses of the code for a source line.\n\
+ add_info ("line", line_info, _("\
+Core addresses of the code for a source line.\n\
Line can be specified as\n\
LINENUM, to list around that line in current file,\n\
FILE:LINENUM, to list around that line in that file,\n\
FUNCTION, to list around beginning of that function,\n\
FILE:FUNCTION, to distinguish among like-named static functions.\n\
-", "\
Default is to describe the last source line that was listed.\n\n\
This sets the default address for \"x\" to the line's first instruction\n\
so that \"x/i\" suffices to start examining the machine code.\n\
-The address is also stored as the value of \"$_\".", NULL));
+The address is also stored as the value of \"$_\"."));
- add_com ("forward-search", class_files, forward_search_command,
- "Search for regular expression (see regex(3)) from last line listed.\n\
-The matching line number is also stored as the value of \"$_\".");
+ add_com ("forward-search", class_files, forward_search_command, _("\
+Search for regular expression (see regex(3)) from last line listed.\n\
+The matching line number is also stored as the value of \"$_\"."));
add_com_alias ("search", "forward-search", class_files, 0);
- add_com ("reverse-search", class_files, reverse_search_command,
- "Search backward for regular expression (see regex(3)) from last line listed.\n\
-The matching line number is also stored as the value of \"$_\".");
+ add_com ("reverse-search", class_files, reverse_search_command, _("\
+Search backward for regular expression (see regex(3)) from last line listed.\n\
+The matching line number is also stored as the value of \"$_\"."));
if (xdb_commands)
{
add_com_alias ("?", "reverse-search", class_files, 0);
}
- deprecated_add_show_from_set
- (add_set_cmd ("listsize", class_support, var_uinteger,
- (char *) &lines_to_list,
- "Set number of source lines gdb will list by default.",
- &setlist),
- &showlist);
+ add_setshow_integer_cmd ("listsize", class_support, &lines_to_list, _("\
+Set number of source lines gdb will list by default."), _("\
+Show number of source lines gdb will list by default."), NULL,
+ NULL,
+ show_lines_to_list,
+ &setlist, &showlist);
}