Proposed patch for gdb/mi 741
Elena Zannoni
ezannoni@redhat.com
Mon Dec 9 20:59:00 GMT 2002
J. Johnston writes:
> No problem. Hopefully the last iteration. I added the
> reset option to -environment-path and also added new tests
> to mi-basics.exp. The Makefile.in has been cleaned
> up properly w/r the header files and I fixed the typo you noticed
> in the call to mi_getopt.
>
> Ok to commit?
Yep.
thanks
Elena
>
> -- Jeff J.
>
> gdb/ChangeLog:
>
> 2002-12-09 Jeff Johnston <jjohnstn@redhat.com>
>
> * defs.h (init_last_source_visited): New prototype.
> (add_path): Ditto.
> * source.c (add_path): New function that adds to a specified path.
> (mod_path): Change to call add_path.
> (init_last_source_visited): New function to allow interfaces to
> initialize static variable: last_source_visited. Part of fix
> for PR gdb/741.
> * Makefile.in: Add support for mi/mi-cmd-env.c.
>
> gdb/mi/ChangeLog:
>
> 2002-12-09 Jeff Johnston <jjohnstn@redhat.com>
>
> * mi-cmds.c (-environment-directory) Change to use mi_cmd_env_dir,
> (-environment-cd): Change to use mi_cmd_env_cd,.
> (-environment-pwd): Change to use mi_cmd_env_pwd.
> (-environment-path): Change to use mi_cmd_env_path.
> * mi-cmds.h (mi_cmd_env_cd, mi_cmd_env_dir): New prototypes.
> (mi_cmd_env_path, mi_cmd_env_pwd): Ditto.
> * mi-cmd-env.c: New file. Part of fix for PR gdb/741.
> * gdbmi.texinfo (environment-cd): Update output and example.
> (environment-pwd): Ditto.
> (environment-dir): Update output, description, and examples.
> (environment-path): Ditto.
>
> gdb/testsuite/gdb.mi/ChangeLog:
>
> 2002-12-09 Jeff Johnston <jjohnstn@redhat.com>
>
> * mi-basics.exp: Change tests for -environment-directory. Also add
> tests for -environment-cd, -environment-pwd, and -environment-path.
> Part of fix for PR gdb/741.
>
> Elena Zannoni wrote:
> > J. Johnston writes:
> > >
> >
> > Ok I noticed a few more things in mi-cmd-env.c, the rest is ok.
> >
> > Sorry, another iteration....
> >
> > See below.
> >
> >
> >
> > > gdb/ChangeLog:
> > >
> > > 2002-11-11 Jeff Johnston <jjohnstn@redhat.com>
> > >
> > > * defs.h (init_last_source_visited): New prototype.
> > > (add_path): Ditto.
> > > * source.c (add_path): New function that adds to a specified path.
> > > (mod_path): Change to call add_path.
> > > (init_last_source_visited): New function to allow interfaces to
> > > initialize static variable: last_source_visited. Part of fix
> > > for PR gdb/741.
> > > * Makefile.in: Add support for mi/mi-cmd-env.c.
> > >
> > > gdb/mi/ChangeLog:
> > >
> > > 2002-11-11 Jeff Johnston <jjohnstn@redhat.com>
> > >
> > > * mi-cmds.c (-environment-directory) Change to use mi_cmd_env_dir,
> > > (-environment-cd): Change to use mi_cmd_env_cd,.
> > > (-environment-pwd): Change to use mi_cmd_env_pwd.
> > > (-environment-path): Change to use mi_cmd_env_path.
> > > * mi-cmds.h (mi_cmd_env_cd, mi_cmd_env_dir): New prototypes.
> > > (mi_cmd_env_path, mi_cmd_env_pwd): Ditto.
> > > * mi-cmd-env.c: New file. Part of fix for PR gdb/741.
> > > * gdbmi.texinfo (environment-cd): Update output and example.
> > > (environment-pwd): Ditto.
> > > (environment-dir): Update output, description, and examples.
> > > (environment-path): Ditto.
> > >
> > > gdb/testsuite/gdb.mi/ChangeLog:
> > >
> > > 2002-11-11 Jeff Johnston <jjohnstn@redhat.com>
> > >
> > > * mi-basics.exp: Change tests for -environment-directory. Also add
> > > tests for -environment-cd and -environment-pwd. Part of fix for
> > > PR gdb/741.Index: defs.h
> > > ===================================================================
> > > RCS file: /cvs/src/src/gdb/defs.h,v
> > > retrieving revision 1.102
> > > diff -u -r1.102 defs.h
> > > --- defs.h 15 Oct 2002 02:16:51 -0000 1.102
> > > +++ defs.h 9 Nov 2002 00:33:14 -0000
> > > @@ -572,9 +572,15 @@
> > >
> > > extern void mod_path (char *, char **);
> > >
> > > +extern void add_path (char *, char **, int);
> > > +
> > > extern void directory_command (char *, int);
> > >
> > > +extern char *source_path;
> > > +
> > > extern void init_source_path (void);
> > > +
> > > +extern void init_last_source_visited (void);
> > >
> > > extern char *symtab_to_filename (struct symtab *);
> > >
> > > Index: source.c
> > > ===================================================================
> > > RCS file: /cvs/src/src/gdb/source.c,v
> > > retrieving revision 1.36
> > > diff -u -r1.36 source.c
> > > --- source.c 24 Oct 2002 21:02:53 -0000 1.36
> > > +++ source.c 9 Nov 2002 00:33:14 -0000
> > > @@ -357,6 +357,12 @@
> > > forget_cached_source_info ();
> > > }
> > >
> > > +void
> > > +init_last_source_visited (void)
> > > +{
> > > + last_source_visited = NULL;
> > > +}
> > > +
> > > /* Add zero or more directories to the front of the source path. */
> > >
> > > void
> > > @@ -387,6 +393,18 @@
> > > void
> > > mod_path (char *dirname, char **which_path)
> > > {
> > > + add_path (dirname, which_path, 1);
> > > +}
> > > +
> > > +/* Workhorse of mod_path. Takes an extra argument to determine
> > > + if dirname should be parsed for separators that indicate multiple
> > > + directories. This allows for interfaces that pre-parse the dirname
> > > + and allow specification of traditional separator characters such
> > > + as space or tab. */
> > > +
> > > +void
> > > +add_path (char *dirname, char **which_path, int parse_separators)
> > > +{
> > > char *old = *which_path;
> > > int prefix = 0;
> > >
> > > @@ -403,9 +421,16 @@
> > > struct stat st;
> > >
> > > {
> > > - char *separator = strchr (name, DIRNAME_SEPARATOR);
> > > - char *space = strchr (name, ' ');
> > > - char *tab = strchr (name, '\t');
> > > + char *separator = NULL;
> > > + char *space = NULL;
> > > + char *tab = NULL;
> > > +
> > > + if (parse_separators)
> > > + {
> > > + separator = strchr (name, DIRNAME_SEPARATOR);
> > > + space = strchr (name, ' ');
> > > + tab = strchr (name, '\t');
> > > + }
> > >
> > > if (separator == 0 && space == 0 && tab == 0)
> > > p = dirname = name + strlen (name);
> > > @@ -536,7 +561,8 @@
> > > tinybuf[0] = DIRNAME_SEPARATOR;
> > > tinybuf[1] = '\0';
> > >
> > > - /* If we have already tacked on a name(s) in this command, be sure they stay on the front as we tack on some more. */
> > > + /* If we have already tacked on a name(s) in this command, be sure they stay
> > > + on the front as we tack on some more. */
> > > if (prefix)
> > > {
> > > char *temp, c;
> > > Index: Makefile.in
> > > ===================================================================
> > > RCS file: /cvs/src/src/gdb/Makefile.in,v
> > > retrieving revision 1.278
> > > diff -u -r1.278 Makefile.in
> > > --- Makefile.in 8 Nov 2002 20:48:54 -0000 1.278
> > > +++ Makefile.in 9 Nov 2002 00:33:14 -0000
> > > @@ -166,12 +166,12 @@
> > > #
> > > SUBDIR_MI_OBS = \
> > > mi-out.o mi-console.o \
> > > - mi-cmds.o mi-cmd-var.o mi-cmd-break.o mi-cmd-stack.o \
> > > + mi-cmds.o mi-cmd-env.o mi-cmd-var.o mi-cmd-break.o mi-cmd-stack.o \
> > > mi-cmd-disas.o \
> > > mi-main.o mi-parse.o mi-getopt.o
> > > SUBDIR_MI_SRCS = \
> > > mi/mi-out.c mi/mi-console.c \
> > > - mi/mi-cmds.c \
> > > + mi/mi-cmds.c mi/mi-cmd-env.c \
> > > mi/mi-cmd-var.c mi/mi-cmd-break.c mi/mi-cmd-stack.c \
> > > mi/mi-cmd-disas.c \
> > > mi/mi-main.c mi/mi-parse.c mi/mi-getopt.c
> > > @@ -2487,6 +2487,10 @@
> > > mi-cmd-disas.o: $(srcdir)/mi/mi-cmd-disas.c $(defs_h) $(target_h) $(value_h) \
> > > $(mi_cmds_h) $(mi_getopt_h) $(ui_out_h) $(gdb_string_h) $(disasm_h)
> > > $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-cmd-disas.c
> > > +mi-cmd-env.o: $(srcdir)/mi/mi-cmd-env.c $(defs_h) $(mi_cmds_h) $(ui_out_h) \
> > > + $(mi_out_h) $(varobj_h) $(value_h) $(gdb_string_h) $(inferior.h) \
> > > + $(mi_getopt_h)
> > > + $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-cmd-env.c
> > > mi-cmd-stack.o: $(srcdir)/mi/mi-cmd-stack.c $(defs_h) $(target_h) $(frame_h) \
> > > $(value_h) $(mi_cmds_h) $(ui_out_h) $(symtab_h)
> > > $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-cmd-stack.c
> > > Index: mi/mi-cmd-env.c
> > > ===================================================================
> > > RCS file: mi/mi-cmd-env.c
> > > diff -N mi/mi-cmd-env.c
> > > --- mi/mi-cmd-env.c 1 Jan 1970 00:00:00 -0000
> > > +++ mi/mi-cmd-env.c 9 Nov 2002 00:33:14 -0000
> > > @@ -0,0 +1,202 @@
> > > +/* MI Command Set - environment commands.
> > > + Copyright 2002 Free Software Foundation, Inc.
> > > + Contributed by Red Hat 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 2 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, write to the Free Software
> > > + Foundation, Inc., 59 Temple Place - Suite 330,
> > > + Boston, MA 02111-1307, USA. */
> > > +
> > > +#include <string.h>
> > > +#include <sys/stat.h>
> > > +
> > > +#include "defs.h"
> > > +#include "target.h"
> > > +#include "frame.h"
> > > +#include "value.h"
> > > +#include "mi-cmds.h"
> > > +#include "mi-out.h"
> > > +#include "mi-getopt.h"
> > > +#include "ui-out.h"
> > > +#include "symtab.h"
> > > +#include "filenames.h"
> > > +#include "environ.h"
> > > +#include "command.h"
> > > +#include "top.h"
> > > +#include "inferior.h"
> > > +
> >
> > Are all these includes needed? they are not listed in the Makefile
> > dependencies.
> >
> >
> > > +static void env_cli_command (const char *cli, char *args);
> > > +static void env_mod_path (char *dirname, char **which_path);
> > > +
> > > +static const char path_var_name[] = "PATH";
> > > +
> > > +/* The following is copied from mi-main.c so for m1 and below we
> > > + can perform old behavior and use cli commands. */
> > > +static void
> > > +env_execute_cli_command (const char *cli, char *args)
> > > +{
> > > + if (cli != 0)
> > > + {
> > > + struct cleanup *old_cleanups;
> > > + char *run;
> > > + xasprintf (&run, cli, args);
> > > + old_cleanups = make_cleanup (xfree, run);
> > > + execute_command ( /*ui */ run, 0 /*from_tty */ );
> > > + do_cleanups (old_cleanups);
> > > + return;
> > > + }
> > > +}
> > > +
> > > +
> > > +/* Print working directory. */
> > > +enum mi_cmd_result
> > > +mi_cmd_env_pwd (char *command, char **argv, int argc)
> > > +{
> > > + if (argc > 0)
> > > + error ("mi_cmd_env_pwd: No arguments required");
> > > +
> > > + if (mi_version (uiout) < 2)
> > > + {
> > > + env_execute_cli_command ("pwd", NULL);
> > > + return MI_CMD_DONE;
> > > + }
> > > +
> > > + /* Otherwise the mi level is 2 or higher. */
> > > +
> > > + getcwd (gdb_dirbuf, sizeof (gdb_dirbuf));
> > > + ui_out_field_string (uiout, "cwd", gdb_dirbuf);
> > > +
> > > + return MI_CMD_DONE;
> > > +}
> > > +
> > > +/* Change working directory. */
> > > +enum mi_cmd_result
> > > +mi_cmd_env_cd (char *command, char **argv, int argc)
> > > +{
> > > + if (argc == 0 || argc > 1)
> > > + error ("mi_cmd_env_cd: Usage DIRECTORY");
> > > +
> > > + env_execute_cli_command ("cd %s", argv[0]);
> > > +
> > > + return MI_CMD_DONE;
> > > +}
> > > +
> > > +static void
> > > +env_mod_path (char *dirname, char **which_path)
> > > +{
> > > + if (dirname == 0 || dirname[0] == '\0')
> > > + return;
> > > +
> > > + /* Call add_path with last arg 0 to indicate not to parse for
> > > + separator characters. */
> > > + add_path (dirname, which_path, 0);
> > > +}
> > > +
> > > +/* Add one or more directories to start of executable search path. */
> > > +enum mi_cmd_result
> > > +mi_cmd_env_path (char *command, char **argv, int argc)
> > > +{
> > > + char *exec_path;
> > > + char *env;
> > > + int i;
> > > +
> > > + if (mi_version (uiout) < 2)
> > > + {
> > > + for (i = argc - 1; i >= 0; --i)
> > > + env_execute_cli_command ("path %s", argv[i]);
> > > + return MI_CMD_DONE;
> > > + }
> > > +
> > > + /* Otherwise the mi level is 2 or higher. */
> > > + dont_repeat ();
> > > + env = get_in_environ (inferior_environ, path_var_name);
> > > +
> > > + /* Can be null if path is not set. */
> > > + if (!env)
> > > + env = "";
> > > + exec_path = xstrdup (env);
> > > +
> > > + for (i = argc - 1; i >= 0; --i)
> > > + env_mod_path (argv[i], &exec_path);
> > > +
> >
> >
> > Could you add a -reset option here too? We might as well have some symmetry.
> >
> > > + set_in_environ (inferior_environ, path_var_name, exec_path);
> > > + xfree (exec_path);
> > > + env = get_in_environ (inferior_environ, path_var_name);
> > > + ui_out_field_string (uiout, "path", env);
> > > +
> > > + return MI_CMD_DONE;
> > > +}
> > > +
> > > +/* Add zero or more directories to the front of the source path. */
> > > +enum mi_cmd_result
> > > +mi_cmd_env_dir (char *command, char **argv, int argc)
> > > +{
> > > + int i;
> > > + int optind = 0;
> > > + int reset = 0;
> > > + char *optarg;
> > > + enum opt
> > > + {
> > > + RESET_OPT
> > > + };
> > > + static struct mi_opt opts[] =
> > > + {
> > > + {"r", RESET_OPT, 0},
> > > + 0
> > > + };
> > > +
> > > + dont_repeat ();
> > > +
> > > + if (mi_version (uiout) < 2)
> > > + {
> > > + for (i = argc - 1; i >= 0; --i)
> > > + env_execute_cli_command ("dir %s", argv[i]);
> > > + return MI_CMD_DONE;
> > > + }
> > > +
> > > + /* Otherwise mi level is 2 or higher. */
> > > + while (1)
> > > + {
> > > + int opt = mi_getopt ("mi_cmd_data_read_memory", argc, argv, opts,
> > ^^^^^^^^^^^^^^^^^^^^^^^
> >
> >
> > > + &optind, &optarg);
> > > + if (opt < 0)
> > > + break;
> > > + switch ((enum opt) opt)
> > > + {
> > > + case RESET_OPT:
> > > + reset = 1;
> > > + break;
> > > + }
> > > + }
> > > + argv += optind;
> > > + argc -= optind;
> > > +
> > > + if (reset)
> > > + {
> > > + /* No args implies reset to default path. */
> > > + xfree (source_path);
> > > + init_source_path ();
> > > + }
> > > +
> > > + for (i = argc - 1; i >= 0; --i)
> > > + env_mod_path (argv[i], &source_path);
> > > + init_last_source_visited ();
> > > +
> > > + ui_out_field_string (uiout, "source-path", source_path);
> > > + forget_cached_source_info ();
> > > +
> > > + return MI_CMD_DONE;
> > > +}
> > > +
> > > Index: mi/mi-cmds.h
> > > ===================================================================
> > > RCS file: /cvs/src/src/gdb/mi/mi-cmds.h,v
> > > retrieving revision 1.5
> > > diff -u -r1.5 mi-cmds.h
> > > --- mi/mi-cmds.h 6 Mar 2001 08:21:45 -0000 1.5
> > > +++ mi/mi-cmds.h 9 Nov 2002 00:33:14 -0000
> > > @@ -64,6 +64,10 @@
> > > extern mi_cmd_argv_ftype mi_cmd_data_read_memory;
> > > extern mi_cmd_argv_ftype mi_cmd_data_write_memory;
> > > extern mi_cmd_argv_ftype mi_cmd_data_write_register_values;
> > > +extern mi_cmd_argv_ftype mi_cmd_env_cd;
> > > +extern mi_cmd_argv_ftype mi_cmd_env_dir;
> > > +extern mi_cmd_argv_ftype mi_cmd_env_path;
> > > +extern mi_cmd_argv_ftype mi_cmd_env_pwd;
> > > extern mi_cmd_args_ftype mi_cmd_exec_continue;
> > > extern mi_cmd_args_ftype mi_cmd_exec_finish;
> > > extern mi_cmd_args_ftype mi_cmd_exec_next;
> > > Index: mi/mi-cmds.c
> > > ===================================================================
> > > RCS file: /cvs/src/src/gdb/mi/mi-cmds.c,v
> > > retrieving revision 1.8
> > > diff -u -r1.8 mi-cmds.c
> > > --- mi/mi-cmds.c 6 Mar 2001 08:21:45 -0000 1.8
> > > +++ mi/mi-cmds.c 9 Nov 2002 00:33:14 -0000
> > > @@ -56,10 +56,10 @@
> > > {"display-enable", 0, 0},
> > > {"display-insert", 0, 0},
> > > {"display-list", 0, 0},
> > > - {"environment-cd", "cd %s", 0},
> > > - {"environment-directory", "dir %s", 0},
> > > - {"environment-path", "path %s", 0},
> > > - {"environment-pwd", "pwd", 0},
> > > + {"environment-cd", 0, 0, mi_cmd_env_cd},
> > > + {"environment-directory", 0, 0, mi_cmd_env_dir},
> > > + {"environment-path", 0, 0, mi_cmd_env_path},
> > > + {"environment-pwd", 0, 0, mi_cmd_env_pwd},
> > > {"exec-abort", 0, 0},
> > > {"exec-arguments", "set args %s", 0},
> > > {"exec-continue", 0, mi_cmd_exec_continue},
> > > Index: gdbmi.texinfo
> > > ===================================================================
> > > RCS file: /cvs/src/src/gdb/mi/gdbmi.texinfo,v
> > > retrieving revision 1.29
> > > diff -u -r1.29 gdbmi.texinfo
> > > --- gdbmi.texinfo 3 Oct 2002 22:31:31 -0000 1.29
> > > +++ gdbmi.texinfo 9 Nov 2002 00:30:50 -0000
> > > @@ -1665,10 +1665,18 @@
> > > @subsubheading Synopsis
> > >
> > > @example
> > > - -environment-directory @var{pathdir}
> > > + -environment-directory [ -r ] [ @var{pathdir} ]+
> > > @end example
> > >
> > > -Add directory @var{pathdir} to beginning of search path for source files.
> > > +Add directories @var{pathdir} to beginning of search path for source files.
> > > +If the @samp{-r} option is used, the search path is reset to the default
> > > +search path. If directories @var{pathdir} are supplied in addition to the
> > > +@samp{-r} option, the search path is first reset and then addition
> > > +occurs as normal.
> > > +Specifying multiple directories in a single command
> > > +results in the directories added to the beginning of the
> > > +search path in the same order they were presented in the command.
> > > +If no directories are specified, the current search path is displayed.
> > >
> > > @subsubheading @value{GDBN} Command
> > >
> > > @@ -1679,7 +1687,16 @@
> > > @smallexample
> > > (@value{GDBP})
> > > -environment-directory /kwikemart/marge/ezannoni/flathead-dev/devo/gdb
> > > -^done
> > > +^done,source-path="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb:$cdir:$cwd"
> > > +(@value{GDBP})
> > > +-environment-directory ""
> > > +^done,source-path="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb:$cdir:$cwd"
> > > +(@value{GDBP})
> > > +-environment-directory -r /home/jjohnstn/src/gdb
> > > +^done,source-path="/home/jjohnstn/src/gdb:$cdir:$cwd"
> > > +(@value{GDBP})
> > > +-environment-directory -r
> > > +^done,source-path="$cdir:$cwd"
> > > (@value{GDBP})
> > > @end smallexample
> > >
> > > @@ -1690,10 +1707,12 @@
> > > @subsubheading Synopsis
> > >
> > > @example
> > > - -environment-path ( @var{pathdir} )+
> > > + -environment-path [ @var{pathdir} ]+
> > > @end example
> > >
> > > Add directories @var{pathdir} to beginning of search path for object files.
> > > +If no paths or an empty path is specified, the current object search path
> > > +is displayed with no modification.
> > >
> > > @subsubheading @value{GDBN} Command
> > >
> > > @@ -1704,7 +1723,10 @@
> > > @smallexample
> > > (@value{GDBP})
> > > -environment-path /kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb
> > > -^done
> > > +^done,path="/kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb:/usr/bin"
> > > +(@value{GDBP})
> > > +-environment-path
> > > +^done,path="/kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb:/usr/bin"
> > > (@value{GDBP})
> > > @end smallexample
> > >
> > > @@ -1729,8 +1751,7 @@
> > > @smallexample
> > > (@value{GDBP})
> > > -environment-pwd
> > > -~Working directory /kwikemart/marge/ezannoni/flathead-dev/devo/gdb.
> > > -^done
> > > +^done,cwd="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb"
> > > (@value{GDBP})
> > > @end smallexample
> > >
> > > Index: mi-basics.exp
> > > ===================================================================
> > > RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/mi-basics.exp,v
> > > retrieving revision 1.6
> > > diff -u -r1.6 mi-basics.exp
> > > --- mi-basics.exp 27 Jun 2001 17:27:07 -0000 1.6
> > > +++ mi-basics.exp 11 Nov 2002 21:11:07 -0000
> > > @@ -148,26 +148,52 @@
> > > global srcdir
> > > global subdir
> > >
> > > - # Clear the search directories, then specify one to be searched
> > > + # Add to the search directories, display, then reset back to default
> > > # Tests:
> > > - # -environment-directory
> > > # -environment-directory arg
> > > + # -environment-directory
> > > + # -environment-directory -r
> > >
> > > #exp_internal 1
> > > - mi_gdb_test "202-environment-directory" \
> > > - "\\\^done" \
> > > + mi_gdb_test "202-environment-directory ${srcdir}/${subdir}" \
> > > + "\\\^done,source-path=\"${srcdir}/${subdir}:\\\$cdir:\\\$cwd\"" \
> > > + "environment-directory arg operation"
> > > +
> > > + mi_gdb_test "203-environment-directory" \
> > > + "\\\^done,source-path=\"${srcdir}/${subdir}:\\\$cdir:\\\$cwd\"" \
> > > + "environment-directory empty-string operation"
> > > +
> > > + mi_gdb_test "204-environment-directory -r" \
> > > + "\\\^done,source-path=\"\\\$cdir:\\\$cwd\"" \
> > > "environment-directory operation"
> > >
> > > - mi_gdb_test "203-environment-directory ${srcdir}/${subdir}" \
> > > - "\\\^done" \
> > > - "environment-directory arg operation"
> > > #exp_internal 0
> > > }
> > >
> > > +proc test_cwd_specification {} {
> > > + global mi_gdb_prompt
> > > + global objdir
> > > + global subdir
> > > +
> > > + # Change the working directory, then print the current working directory
> > > + # Tests:
> > > + # -environment-cd ${objdir}
> > > + # -environment-pwd
> > > +
> > > + mi_gdb_test "205-environment-cd ${objdir}" \
> > > + "\\\^done" \
> > > + "environment-cd arg operation"
> > > +
> > > + mi_gdb_test "206-environment-pwd" \
> > > + "\\\^done,cwd=\"${objdir}\"" \
> > > + "environment-pwd operation"
> > > +}
> > > +
> > > if [test_mi_interpreter_selection] {
> > > test_exec_and_symbol_mi_operatons
> > > test_breakpoints_deletion
> > > test_dir_specification
> > > + test_cwd_specification
> > > }
> > >
> > > mi_gdb_exit
>
> Index: defs.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/defs.h,v
> retrieving revision 1.102
> diff -u -r1.102 defs.h
> --- defs.h 15 Oct 2002 02:16:51 -0000 1.102
> +++ defs.h 10 Dec 2002 00:15:26 -0000
> @@ -572,9 +572,15 @@
>
> extern void mod_path (char *, char **);
>
> +extern void add_path (char *, char **, int);
> +
> extern void directory_command (char *, int);
>
> +extern char *source_path;
> +
> extern void init_source_path (void);
> +
> +extern void init_last_source_visited (void);
>
> extern char *symtab_to_filename (struct symtab *);
>
> Index: source.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/source.c,v
> retrieving revision 1.36
> diff -u -r1.36 source.c
> --- source.c 24 Oct 2002 21:02:53 -0000 1.36
> +++ source.c 10 Dec 2002 00:15:26 -0000
> @@ -357,6 +357,12 @@
> forget_cached_source_info ();
> }
>
> +void
> +init_last_source_visited (void)
> +{
> + last_source_visited = NULL;
> +}
> +
> /* Add zero or more directories to the front of the source path. */
>
> void
> @@ -387,6 +393,18 @@
> void
> mod_path (char *dirname, char **which_path)
> {
> + add_path (dirname, which_path, 1);
> +}
> +
> +/* Workhorse of mod_path. Takes an extra argument to determine
> + if dirname should be parsed for separators that indicate multiple
> + directories. This allows for interfaces that pre-parse the dirname
> + and allow specification of traditional separator characters such
> + as space or tab. */
> +
> +void
> +add_path (char *dirname, char **which_path, int parse_separators)
> +{
> char *old = *which_path;
> int prefix = 0;
>
> @@ -403,9 +421,16 @@
> struct stat st;
>
> {
> - char *separator = strchr (name, DIRNAME_SEPARATOR);
> - char *space = strchr (name, ' ');
> - char *tab = strchr (name, '\t');
> + char *separator = NULL;
> + char *space = NULL;
> + char *tab = NULL;
> +
> + if (parse_separators)
> + {
> + separator = strchr (name, DIRNAME_SEPARATOR);
> + space = strchr (name, ' ');
> + tab = strchr (name, '\t');
> + }
>
> if (separator == 0 && space == 0 && tab == 0)
> p = dirname = name + strlen (name);
> @@ -536,7 +561,8 @@
> tinybuf[0] = DIRNAME_SEPARATOR;
> tinybuf[1] = '\0';
>
> - /* If we have already tacked on a name(s) in this command, be sure they stay on the front as we tack on some more. */
> + /* If we have already tacked on a name(s) in this command, be sure they stay
> + on the front as we tack on some more. */
> if (prefix)
> {
> char *temp, c;
> Index: Makefile.in
> ===================================================================
> RCS file: /cvs/src/src/gdb/Makefile.in,v
> retrieving revision 1.290
> diff -u -r1.290 Makefile.in
> --- Makefile.in 5 Dec 2002 05:17:39 -0000 1.290
> +++ Makefile.in 10 Dec 2002 00:15:26 -0000
> @@ -168,12 +168,12 @@
> #
> SUBDIR_MI_OBS = \
> mi-out.o mi-console.o \
> - mi-cmds.o mi-cmd-var.o mi-cmd-break.o mi-cmd-stack.o \
> + mi-cmds.o mi-cmd-env.o mi-cmd-var.o mi-cmd-break.o mi-cmd-stack.o \
> mi-cmd-disas.o \
> mi-main.o mi-parse.o mi-getopt.o
> SUBDIR_MI_SRCS = \
> mi/mi-out.c mi/mi-console.c \
> - mi/mi-cmds.c \
> + mi/mi-cmds.c mi/mi-cmd-env.c \
> mi/mi-cmd-var.c mi/mi-cmd-break.c mi/mi-cmd-stack.c \
> mi/mi-cmd-disas.c \
> mi/mi-main.c mi/mi-parse.c mi/mi-getopt.c
> @@ -2526,6 +2526,10 @@
> mi-cmd-disas.o: $(srcdir)/mi/mi-cmd-disas.c $(defs_h) $(target_h) $(value_h) \
> $(mi_cmds_h) $(mi_getopt_h) $(ui_out_h) $(gdb_string_h) $(disasm_h)
> $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-cmd-disas.c
> +mi-cmd-env.o: $(srcdir)/mi/mi-cmd-env.c $(defs_h) $(mi_cmds_h) $(ui_out_h) \
> + $(mi_out_h) $(varobj_h) $(value_h) $(gdb_string_h) $(inferior.h) \
> + $(mi_getopt_h) $(environ_h) $(gdbcmd_h) $(top_h)
> + $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-cmd-env.c
> mi-cmd-stack.o: $(srcdir)/mi/mi-cmd-stack.c $(defs_h) $(target_h) $(frame_h) \
> $(value_h) $(mi_cmds_h) $(ui_out_h) $(symtab_h)
> $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-cmd-stack.c
> Index: mi-cmd-env.c
> ===================================================================
> RCS file: mi-cmd-env.c
> diff -N mi-cmd-env.c
> --- mi-cmd-env.c 1 Jan 1970 00:00:00 -0000
> +++ mi-cmd-env.c 10 Dec 2002 00:16:45 -0000
> @@ -0,0 +1,254 @@
> +/* MI Command Set - environment commands.
> + Copyright 2002 Free Software Foundation, Inc.
> + Contributed by Red Hat 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 2 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, write to the Free Software
> + Foundation, Inc., 59 Temple Place - Suite 330,
> + Boston, MA 02111-1307, USA. */
> +
> +#include <string.h>
> +#include <sys/stat.h>
> +
> +#include "defs.h"
> +#include "inferior.h"
> +#include "value.h"
> +#include "mi-out.h"
> +#include "mi-cmds.h"
> +#include "mi-getopt.h"
> +#include "symtab.h"
> +#include "target.h"
> +#include "environ.h"
> +#include "command.h"
> +#include "ui-out.h"
> +#include "top.h"
> +
> +static void env_cli_command (const char *cli, char *args);
> +static void env_mod_path (char *dirname, char **which_path);
> +extern void _initialize_mi_cmd_env (void);
> +
> +static const char path_var_name[] = "PATH";
> +static char *orig_path = NULL;
> +
> +/* The following is copied from mi-main.c so for m1 and below we
> + can perform old behavior and use cli commands. */
> +static void
> +env_execute_cli_command (const char *cli, char *args)
> +{
> + if (cli != 0)
> + {
> + struct cleanup *old_cleanups;
> + char *run;
> + xasprintf (&run, cli, args);
> + old_cleanups = make_cleanup (xfree, run);
> + execute_command ( /*ui */ run, 0 /*from_tty */ );
> + do_cleanups (old_cleanups);
> + return;
> + }
> +}
> +
> +
> +/* Print working directory. */
> +enum mi_cmd_result
> +mi_cmd_env_pwd (char *command, char **argv, int argc)
> +{
> + if (argc > 0)
> + error ("mi_cmd_env_pwd: No arguments required");
> +
> + if (mi_version (uiout) < 2)
> + {
> + env_execute_cli_command ("pwd", NULL);
> + return MI_CMD_DONE;
> + }
> +
> + /* Otherwise the mi level is 2 or higher. */
> +
> + getcwd (gdb_dirbuf, sizeof (gdb_dirbuf));
> + ui_out_field_string (uiout, "cwd", gdb_dirbuf);
> +
> + return MI_CMD_DONE;
> +}
> +
> +/* Change working directory. */
> +enum mi_cmd_result
> +mi_cmd_env_cd (char *command, char **argv, int argc)
> +{
> + if (argc == 0 || argc > 1)
> + error ("mi_cmd_env_cd: Usage DIRECTORY");
> +
> + env_execute_cli_command ("cd %s", argv[0]);
> +
> + return MI_CMD_DONE;
> +}
> +
> +static void
> +env_mod_path (char *dirname, char **which_path)
> +{
> + if (dirname == 0 || dirname[0] == '\0')
> + return;
> +
> + /* Call add_path with last arg 0 to indicate not to parse for
> + separator characters. */
> + add_path (dirname, which_path, 0);
> +}
> +
> +/* Add one or more directories to start of executable search path. */
> +enum mi_cmd_result
> +mi_cmd_env_path (char *command, char **argv, int argc)
> +{
> + char *exec_path;
> + char *env;
> + int reset = 0;
> + int optind = 0;
> + int i;
> + char *optarg;
> + enum opt
> + {
> + RESET_OPT
> + };
> + static struct mi_opt opts[] =
> + {
> + {"r", RESET_OPT, 0},
> + 0
> + };
> +
> + dont_repeat ();
> +
> + if (mi_version (uiout) < 2)
> + {
> + for (i = argc - 1; i >= 0; --i)
> + env_execute_cli_command ("path %s", argv[i]);
> + return MI_CMD_DONE;
> + }
> +
> + /* Otherwise the mi level is 2 or higher. */
> + while (1)
> + {
> + int opt = mi_getopt ("mi_cmd_env_path", argc, argv, opts,
> + &optind, &optarg);
> + if (opt < 0)
> + break;
> + switch ((enum opt) opt)
> + {
> + case RESET_OPT:
> + reset = 1;
> + break;
> + }
> + }
> + argv += optind;
> + argc -= optind;
> +
> +
> + if (reset)
> + {
> + /* Reset implies resetting to original path first. */
> + exec_path = xstrdup (orig_path);
> + }
> + else
> + {
> + /* Otherwise, get current path to modify. */
> + env = get_in_environ (inferior_environ, path_var_name);
> +
> + /* Can be null if path is not set. */
> + if (!env)
> + env = "";
> + exec_path = xstrdup (env);
> + }
> +
> + for (i = argc - 1; i >= 0; --i)
> + env_mod_path (argv[i], &exec_path);
> +
> + set_in_environ (inferior_environ, path_var_name, exec_path);
> + xfree (exec_path);
> + env = get_in_environ (inferior_environ, path_var_name);
> + ui_out_field_string (uiout, "path", env);
> +
> + return MI_CMD_DONE;
> +}
> +
> +/* Add zero or more directories to the front of the source path. */
> +enum mi_cmd_result
> +mi_cmd_env_dir (char *command, char **argv, int argc)
> +{
> + int i;
> + int optind = 0;
> + int reset = 0;
> + char *optarg;
> + enum opt
> + {
> + RESET_OPT
> + };
> + static struct mi_opt opts[] =
> + {
> + {"r", RESET_OPT, 0},
> + 0
> + };
> +
> + dont_repeat ();
> +
> + if (mi_version (uiout) < 2)
> + {
> + for (i = argc - 1; i >= 0; --i)
> + env_execute_cli_command ("dir %s", argv[i]);
> + return MI_CMD_DONE;
> + }
> +
> + /* Otherwise mi level is 2 or higher. */
> + while (1)
> + {
> + int opt = mi_getopt ("mi_cmd_env_dir", argc, argv, opts,
> + &optind, &optarg);
> + if (opt < 0)
> + break;
> + switch ((enum opt) opt)
> + {
> + case RESET_OPT:
> + reset = 1;
> + break;
> + }
> + }
> + argv += optind;
> + argc -= optind;
> +
> + if (reset)
> + {
> + /* Reset means setting to default path first. */
> + xfree (source_path);
> + init_source_path ();
> + }
> +
> + for (i = argc - 1; i >= 0; --i)
> + env_mod_path (argv[i], &source_path);
> + init_last_source_visited ();
> +
> + ui_out_field_string (uiout, "source-path", source_path);
> + forget_cached_source_info ();
> +
> + return MI_CMD_DONE;
> +}
> +
> +void
> +_initialize_mi_cmd_env (void)
> +{
> + char *env;
> +
> + /* We want original execution path to reset to, if desired later. */
> + env = get_in_environ (inferior_environ, path_var_name);
> +
> + /* Can be null if path is not set. */
> + if (!env)
> + env = "";
> + orig_path = xstrdup (env);
> +}
> Index: mi-cmds.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/mi/mi-cmds.h,v
> retrieving revision 1.5
> diff -u -r1.5 mi-cmds.h
> --- mi-cmds.h 6 Mar 2001 08:21:45 -0000 1.5
> +++ mi-cmds.h 10 Dec 2002 00:16:45 -0000
> @@ -64,6 +64,10 @@
> extern mi_cmd_argv_ftype mi_cmd_data_read_memory;
> extern mi_cmd_argv_ftype mi_cmd_data_write_memory;
> extern mi_cmd_argv_ftype mi_cmd_data_write_register_values;
> +extern mi_cmd_argv_ftype mi_cmd_env_cd;
> +extern mi_cmd_argv_ftype mi_cmd_env_dir;
> +extern mi_cmd_argv_ftype mi_cmd_env_path;
> +extern mi_cmd_argv_ftype mi_cmd_env_pwd;
> extern mi_cmd_args_ftype mi_cmd_exec_continue;
> extern mi_cmd_args_ftype mi_cmd_exec_finish;
> extern mi_cmd_args_ftype mi_cmd_exec_next;
> Index: mi-cmds.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/mi/mi-cmds.c,v
> retrieving revision 1.8
> diff -u -r1.8 mi-cmds.c
> --- mi-cmds.c 6 Mar 2001 08:21:45 -0000 1.8
> +++ mi-cmds.c 10 Dec 2002 00:16:45 -0000
> @@ -56,10 +56,10 @@
> {"display-enable", 0, 0},
> {"display-insert", 0, 0},
> {"display-list", 0, 0},
> - {"environment-cd", "cd %s", 0},
> - {"environment-directory", "dir %s", 0},
> - {"environment-path", "path %s", 0},
> - {"environment-pwd", "pwd", 0},
> + {"environment-cd", 0, 0, mi_cmd_env_cd},
> + {"environment-directory", 0, 0, mi_cmd_env_dir},
> + {"environment-path", 0, 0, mi_cmd_env_path},
> + {"environment-pwd", 0, 0, mi_cmd_env_pwd},
> {"exec-abort", 0, 0},
> {"exec-arguments", "set args %s", 0},
> {"exec-continue", 0, mi_cmd_exec_continue},
> Index: testsuite/gdb.mi/mi-basics.exp
> ===================================================================
> RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/mi-basics.exp,v
> retrieving revision 1.6
> diff -u -r1.6 mi-basics.exp
> --- testsuite/gdb.mi/mi-basics.exp 27 Jun 2001 17:27:07 -0000 1.6
> +++ testsuite/gdb.mi/mi-basics.exp 10 Dec 2002 00:18:48 -0000
> @@ -148,26 +148,98 @@
> global srcdir
> global subdir
>
> - # Clear the search directories, then specify one to be searched
> + # Add to the search directories, display, then reset back to default
> # Tests:
> - # -environment-directory
> # -environment-directory arg
> + # -environment-directory
> + # -environment-directory -r
>
> #exp_internal 1
> - mi_gdb_test "202-environment-directory" \
> - "\\\^done" \
> + mi_gdb_test "202-environment-directory ${srcdir}/${subdir}" \
> + "\\\^done,source-path=\"${srcdir}/${subdir}:\\\$cdir:\\\$cwd\"" \
> + "environment-directory arg operation"
> +
> + mi_gdb_test "203-environment-directory" \
> + "\\\^done,source-path=\"${srcdir}/${subdir}:\\\$cdir:\\\$cwd\"" \
> + "environment-directory empty-string operation"
> +
> + mi_gdb_test "204-environment-directory -r" \
> + "\\\^done,source-path=\"\\\$cdir:\\\$cwd\"" \
> "environment-directory operation"
>
> - mi_gdb_test "203-environment-directory ${srcdir}/${subdir}" \
> - "\\\^done" \
> - "environment-directory arg operation"
> #exp_internal 0
> }
>
> +proc test_cwd_specification {} {
> + global mi_gdb_prompt
> + global objdir
> + global subdir
> +
> + # Change the working directory, then print the current working directory
> + # Tests:
> + # -environment-cd ${objdir}
> + # -environment-pwd
> +
> + mi_gdb_test "205-environment-cd ${objdir}" \
> + "\\\^done" \
> + "environment-cd arg operation"
> +
> + mi_gdb_test "206-environment-pwd" \
> + "\\\^done,cwd=\"${objdir}\"" \
> + "environment-pwd operation"
> +}
> +
> +proc test_path_specification {} {
> + global mi_gdb_prompt
> + global orig_path
> + global objdir
> + global srcdir
> +
> + # Add to the path, display, then reset
> + # Tests:
> + # -environment-path
> + # -environment-path dir1 dir2
> + # -environment-path -r dir
> + # -environment-path -r
> +
> +#exp_internal 1
> +
> + send_gdb "-environment-path\n"
> + gdb_expect 20 {
> + -re "\\\^done,path=\"\(.*\)\"\r\n$mi_gdb_prompt" {
> + set orig_path $expect_out(1,string);
> + }
> + timeout {
> + perror "-environment-path (timeout)" ;
> + return
> + }
> + }
> +
> + mi_gdb_test "207-environment-path" \
> + "\\\^done,path=\"$orig_path\"" \
> + "environment-path no-args operation"
> +
> + mi_gdb_test "208-environment-path $srcdir $objdir" \
> + "\\\^done,path=\"$srcdir:$objdir:$orig_path\"" \
> + "environment-path dir1 dir2 operation"
> +
> + mi_gdb_test "209-environment-path -r $objdir" \
> + "\\\^done,path=\"$objdir:$orig_path\"" \
> + "environment-path -r dir operation"
> +
> + mi_gdb_test "210-environment-path -r" \
> + "\\\^done,path=\"$orig_path\"" \
> + "environment-path -r operation"
> +
> +#exp_internal 0
> +}
> +
> if [test_mi_interpreter_selection] {
> test_exec_and_symbol_mi_operatons
> test_breakpoints_deletion
> test_dir_specification
> + test_cwd_specification
> + test_path_specification
> }
>
> mi_gdb_exit
> Index: gdbmi.texinfo
> ===================================================================
> RCS file: /cvs/src/src/gdb/mi/gdbmi.texinfo,v
> retrieving revision 1.30
> diff -u -r1.30 gdbmi.texinfo
> --- gdbmi.texinfo 11 Nov 2002 17:09:50 -0000 1.30
> +++ gdbmi.texinfo 10 Dec 2002 00:12:25 -0000
> @@ -1665,10 +1665,18 @@
> @subsubheading Synopsis
>
> @example
> - -environment-directory @var{pathdir}
> + -environment-directory [ -r ] [ @var{pathdir} ]+
> @end example
>
> -Add directory @var{pathdir} to beginning of search path for source files.
> +Add directories @var{pathdir} to beginning of search path for source files.
> +If the @samp{-r} option is used, the search path is reset to the default
> +search path. If directories @var{pathdir} are supplied in addition to the
> +@samp{-r} option, the search path is first reset and then addition
> +occurs as normal.
> +Specifying multiple directories in a single command
> +results in the directories added to the beginning of the
> +search path in the same order they were presented in the command.
> +If no directories are specified, the current search path is displayed.
>
> @subsubheading @value{GDBN} Command
>
> @@ -1679,7 +1687,16 @@
> @smallexample
> (@value{GDBP})
> -environment-directory /kwikemart/marge/ezannoni/flathead-dev/devo/gdb
> -^done
> +^done,source-path="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb:$cdir:$cwd"
> +(@value{GDBP})
> +-environment-directory ""
> +^done,source-path="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb:$cdir:$cwd"
> +(@value{GDBP})
> +-environment-directory -r /home/jjohnstn/src/gdb
> +^done,source-path="/home/jjohnstn/src/gdb:$cdir:$cwd"
> +(@value{GDBP})
> +-environment-directory -r
> +^done,source-path="$cdir:$cwd"
> (@value{GDBP})
> @end smallexample
>
> @@ -1690,10 +1707,19 @@
> @subsubheading Synopsis
>
> @example
> - -environment-path ( @var{pathdir} )+
> + -environment-path [ -r ] [ @var{pathdir} ]+
> @end example
>
> Add directories @var{pathdir} to beginning of search path for object files.
> +If the @samp{-r} option is used, the search path is reset to the original
> +search path that existed at gdb start-up. If directories @var{pathdir} are
> +supplied in addition to the
> +@samp{-r} option, the search path is first reset and then addition
> +occurs as normal.
> +Specifying multiple directories in a single command
> +results in the directories added to the beginning of the
> +search path in the same order they were presented in the command.
> +If no directories are specified, the current path is displayed.
>
> @subsubheading @value{GDBN} Command
>
> @@ -1703,8 +1729,14 @@
>
> @smallexample
> (@value{GDBP})
> +-environment-path
> +^done,path="/usr/bin"
> +(@value{GDBP})
> -environment-path /kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb
> -^done
> +^done,path="/kwikemart/marge/ezannoni/flathead-dev/ppc-eabi/gdb:/usr/bin"
> +(@value{GDBP})
> +-environment-path -r /usr/local/bin
> +^done,path="/usr/local/bin:/usr/bin"
> (@value{GDBP})
> @end smallexample
>
> @@ -1729,8 +1761,7 @@
> @smallexample
> (@value{GDBP})
> -environment-pwd
> -~Working directory /kwikemart/marge/ezannoni/flathead-dev/devo/gdb.
> -^done
> +^done,cwd="/kwikemart/marge/ezannoni/flathead-dev/devo/gdb"
> (@value{GDBP})
> @end smallexample
>
More information about the Gdb-patches
mailing list