OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [gdb/] [mi/] [mi-cmd-env.c] - Diff between revs 227 and 816

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 227 Rev 816
/* MI Command Set - environment commands.
/* MI Command Set - environment commands.
 
 
   Copyright (C) 2002, 2003, 2004, 2007, 2008, 2009, 2010
   Copyright (C) 2002, 2003, 2004, 2007, 2008, 2009, 2010
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
 
 
   Contributed by Red Hat Inc.
   Contributed by Red Hat Inc.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   This program is free software; you can redistribute it and/or modify
   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
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
#include "defs.h"
#include "defs.h"
#include "inferior.h"
#include "inferior.h"
#include "value.h"
#include "value.h"
#include "mi-out.h"
#include "mi-out.h"
#include "mi-cmds.h"
#include "mi-cmds.h"
#include "mi-getopt.h"
#include "mi-getopt.h"
#include "symtab.h"
#include "symtab.h"
#include "target.h"
#include "target.h"
#include "environ.h"
#include "environ.h"
#include "command.h"
#include "command.h"
#include "ui-out.h"
#include "ui-out.h"
#include "top.h"
#include "top.h"
 
 
#include "gdb_string.h"
#include "gdb_string.h"
#include "gdb_stat.h"
#include "gdb_stat.h"
 
 
static void env_mod_path (char *dirname, char **which_path);
static void env_mod_path (char *dirname, char **which_path);
extern void _initialize_mi_cmd_env (void);
extern void _initialize_mi_cmd_env (void);
 
 
static const char path_var_name[] = "PATH";
static const char path_var_name[] = "PATH";
static char *orig_path = NULL;
static char *orig_path = NULL;
 
 
/* The following is copied from mi-main.c so for m1 and below we can
/* The following is copied from mi-main.c so for m1 and below we can
   perform old behavior and use cli commands.  If ARGS is non-null,
   perform old behavior and use cli commands.  If ARGS is non-null,
   append it to the CMD.  */
   append it to the CMD.  */
static void
static void
env_execute_cli_command (const char *cmd, const char *args)
env_execute_cli_command (const char *cmd, const char *args)
{
{
  if (cmd != 0)
  if (cmd != 0)
    {
    {
      struct cleanup *old_cleanups;
      struct cleanup *old_cleanups;
      char *run;
      char *run;
      if (args != NULL)
      if (args != NULL)
        run = xstrprintf ("%s %s", cmd, args);
        run = xstrprintf ("%s %s", cmd, args);
      else
      else
        run = xstrdup (cmd);
        run = xstrdup (cmd);
      old_cleanups = make_cleanup (xfree, run);
      old_cleanups = make_cleanup (xfree, run);
      execute_command ( /*ui */ run, 0 /*from_tty */ );
      execute_command ( /*ui */ run, 0 /*from_tty */ );
      do_cleanups (old_cleanups);
      do_cleanups (old_cleanups);
      return;
      return;
    }
    }
}
}
 
 
 
 
/* Print working directory.  */
/* Print working directory.  */
void
void
mi_cmd_env_pwd (char *command, char **argv, int argc)
mi_cmd_env_pwd (char *command, char **argv, int argc)
{
{
  if (argc > 0)
  if (argc > 0)
    error (_("mi_cmd_env_pwd: No arguments required"));
    error (_("mi_cmd_env_pwd: No arguments required"));
 
 
  if (mi_version (uiout) < 2)
  if (mi_version (uiout) < 2)
    {
    {
      env_execute_cli_command ("pwd", NULL);
      env_execute_cli_command ("pwd", NULL);
      return;
      return;
    }
    }
 
 
  /* Otherwise the mi level is 2 or higher.  */
  /* Otherwise the mi level is 2 or higher.  */
 
 
  if (! getcwd (gdb_dirbuf, sizeof (gdb_dirbuf)))
  if (! getcwd (gdb_dirbuf, sizeof (gdb_dirbuf)))
    error (_("mi_cmd_env_pwd: error finding name of working directory: %s"),
    error (_("mi_cmd_env_pwd: error finding name of working directory: %s"),
           safe_strerror (errno));
           safe_strerror (errno));
 
 
  ui_out_field_string (uiout, "cwd", gdb_dirbuf);
  ui_out_field_string (uiout, "cwd", gdb_dirbuf);
}
}
 
 
/* Change working directory.  */
/* Change working directory.  */
void
void
mi_cmd_env_cd (char *command, char **argv, int argc)
mi_cmd_env_cd (char *command, char **argv, int argc)
{
{
  if (argc == 0 || argc > 1)
  if (argc == 0 || argc > 1)
    error (_("mi_cmd_env_cd: Usage DIRECTORY"));
    error (_("mi_cmd_env_cd: Usage DIRECTORY"));
 
 
  env_execute_cli_command ("cd", argv[0]);
  env_execute_cli_command ("cd", argv[0]);
}
}
 
 
static void
static void
env_mod_path (char *dirname, char **which_path)
env_mod_path (char *dirname, char **which_path)
{
{
  if (dirname == 0 || dirname[0] == '\0')
  if (dirname == 0 || dirname[0] == '\0')
    return;
    return;
 
 
  /* Call add_path with last arg 0 to indicate not to parse for
  /* Call add_path with last arg 0 to indicate not to parse for
     separator characters.  */
     separator characters.  */
  add_path (dirname, which_path, 0);
  add_path (dirname, which_path, 0);
}
}
 
 
/* Add one or more directories to start of executable search path.  */
/* Add one or more directories to start of executable search path.  */
void
void
mi_cmd_env_path (char *command, char **argv, int argc)
mi_cmd_env_path (char *command, char **argv, int argc)
{
{
  char *exec_path;
  char *exec_path;
  char *env;
  char *env;
  int reset = 0;
  int reset = 0;
  int optind = 0;
  int optind = 0;
  int i;
  int i;
  char *optarg;
  char *optarg;
  enum opt
  enum opt
    {
    {
      RESET_OPT
      RESET_OPT
    };
    };
  static struct mi_opt opts[] =
  static struct mi_opt opts[] =
  {
  {
    {"r", RESET_OPT, 0},
    {"r", RESET_OPT, 0},
    { 0, 0, 0 }
    { 0, 0, 0 }
  };
  };
 
 
  dont_repeat ();
  dont_repeat ();
 
 
  if (mi_version (uiout) < 2)
  if (mi_version (uiout) < 2)
    {
    {
      for (i = argc - 1; i >= 0; --i)
      for (i = argc - 1; i >= 0; --i)
        env_execute_cli_command ("path", argv[i]);
        env_execute_cli_command ("path", argv[i]);
      return;
      return;
    }
    }
 
 
  /* Otherwise the mi level is 2 or higher.  */
  /* Otherwise the mi level is 2 or higher.  */
  while (1)
  while (1)
    {
    {
      int opt = mi_getopt ("mi_cmd_env_path", argc, argv, opts,
      int opt = mi_getopt ("mi_cmd_env_path", argc, argv, opts,
                           &optind, &optarg);
                           &optind, &optarg);
      if (opt < 0)
      if (opt < 0)
        break;
        break;
      switch ((enum opt) opt)
      switch ((enum opt) opt)
        {
        {
        case RESET_OPT:
        case RESET_OPT:
          reset = 1;
          reset = 1;
          break;
          break;
        }
        }
    }
    }
  argv += optind;
  argv += optind;
  argc -= optind;
  argc -= optind;
 
 
 
 
  if (reset)
  if (reset)
    {
    {
      /* Reset implies resetting to original path first.  */
      /* Reset implies resetting to original path first.  */
      exec_path = xstrdup (orig_path);
      exec_path = xstrdup (orig_path);
    }
    }
  else
  else
    {
    {
      /* Otherwise, get current path to modify.  */
      /* Otherwise, get current path to modify.  */
      env = get_in_environ (current_inferior ()->environment, path_var_name);
      env = get_in_environ (current_inferior ()->environment, path_var_name);
 
 
      /* Can be null if path is not set.  */
      /* Can be null if path is not set.  */
      if (!env)
      if (!env)
        env = "";
        env = "";
      exec_path = xstrdup (env);
      exec_path = xstrdup (env);
    }
    }
 
 
  for (i = argc - 1; i >= 0; --i)
  for (i = argc - 1; i >= 0; --i)
    env_mod_path (argv[i], &exec_path);
    env_mod_path (argv[i], &exec_path);
 
 
  set_in_environ (current_inferior ()->environment, path_var_name, exec_path);
  set_in_environ (current_inferior ()->environment, path_var_name, exec_path);
  xfree (exec_path);
  xfree (exec_path);
  env = get_in_environ (current_inferior ()->environment, path_var_name);
  env = get_in_environ (current_inferior ()->environment, path_var_name);
  ui_out_field_string (uiout, "path", env);
  ui_out_field_string (uiout, "path", env);
}
}
 
 
/* Add zero or more directories to the front of the source path.  */
/* Add zero or more directories to the front of the source path.  */
void
void
mi_cmd_env_dir (char *command, char **argv, int argc)
mi_cmd_env_dir (char *command, char **argv, int argc)
{
{
  int i;
  int i;
  int optind = 0;
  int optind = 0;
  int reset = 0;
  int reset = 0;
  char *optarg;
  char *optarg;
  enum opt
  enum opt
    {
    {
      RESET_OPT
      RESET_OPT
    };
    };
  static struct mi_opt opts[] =
  static struct mi_opt opts[] =
  {
  {
    {"r", RESET_OPT, 0},
    {"r", RESET_OPT, 0},
    { 0, 0, 0 }
    { 0, 0, 0 }
  };
  };
 
 
  dont_repeat ();
  dont_repeat ();
 
 
  if (mi_version (uiout) < 2)
  if (mi_version (uiout) < 2)
    {
    {
      for (i = argc - 1; i >= 0; --i)
      for (i = argc - 1; i >= 0; --i)
        env_execute_cli_command ("dir", argv[i]);
        env_execute_cli_command ("dir", argv[i]);
      return;
      return;
    }
    }
 
 
  /* Otherwise mi level is 2 or higher.  */
  /* Otherwise mi level is 2 or higher.  */
  while (1)
  while (1)
    {
    {
      int opt = mi_getopt ("mi_cmd_env_dir", argc, argv, opts,
      int opt = mi_getopt ("mi_cmd_env_dir", argc, argv, opts,
                           &optind, &optarg);
                           &optind, &optarg);
      if (opt < 0)
      if (opt < 0)
        break;
        break;
      switch ((enum opt) opt)
      switch ((enum opt) opt)
        {
        {
        case RESET_OPT:
        case RESET_OPT:
          reset = 1;
          reset = 1;
          break;
          break;
        }
        }
    }
    }
  argv += optind;
  argv += optind;
  argc -= optind;
  argc -= optind;
 
 
  if (reset)
  if (reset)
    {
    {
      /* Reset means setting to default path first.  */
      /* Reset means setting to default path first.  */
      xfree (source_path);
      xfree (source_path);
      init_source_path ();
      init_source_path ();
    }
    }
 
 
  for (i = argc - 1; i >= 0; --i)
  for (i = argc - 1; i >= 0; --i)
    env_mod_path (argv[i], &source_path);
    env_mod_path (argv[i], &source_path);
 
 
  ui_out_field_string (uiout, "source-path", source_path);
  ui_out_field_string (uiout, "source-path", source_path);
  forget_cached_source_info ();
  forget_cached_source_info ();
}
}
 
 
/* Set the inferior terminal device name.  */
/* Set the inferior terminal device name.  */
void
void
mi_cmd_inferior_tty_set (char *command, char **argv, int argc)
mi_cmd_inferior_tty_set (char *command, char **argv, int argc)
{
{
  set_inferior_io_terminal (argv[0]);
  set_inferior_io_terminal (argv[0]);
}
}
 
 
/* Print the inferior terminal device name  */
/* Print the inferior terminal device name  */
void
void
mi_cmd_inferior_tty_show (char *command, char **argv, int argc)
mi_cmd_inferior_tty_show (char *command, char **argv, int argc)
{
{
  const char *inferior_io_terminal = get_inferior_io_terminal ();
  const char *inferior_io_terminal = get_inferior_io_terminal ();
 
 
  if ( !mi_valid_noargs ("mi_cmd_inferior_tty_show", argc, argv))
  if ( !mi_valid_noargs ("mi_cmd_inferior_tty_show", argc, argv))
    error (_("mi_cmd_inferior_tty_show: Usage: No args"));
    error (_("mi_cmd_inferior_tty_show: Usage: No args"));
 
 
  if (inferior_io_terminal)
  if (inferior_io_terminal)
    ui_out_field_string (uiout, "inferior_tty_terminal", inferior_io_terminal);
    ui_out_field_string (uiout, "inferior_tty_terminal", inferior_io_terminal);
}
}
 
 
void
void
_initialize_mi_cmd_env (void)
_initialize_mi_cmd_env (void)
{
{
  struct gdb_environ *environment;
  struct gdb_environ *environment;
  char *env;
  char *env;
 
 
  /* We want original execution path to reset to, if desired later.
  /* We want original execution path to reset to, if desired later.
     At this point, current inferior is not created, so cannot use
     At this point, current inferior is not created, so cannot use
     current_inferior ()->environment.  Also, there's no obvious
     current_inferior ()->environment.  Also, there's no obvious
     place where this code can be moved suchs that it surely run
     place where this code can be moved suchs that it surely run
     before any code possibly mangles original PATH.  */
     before any code possibly mangles original PATH.  */
  environment = make_environ ();
  environment = make_environ ();
  init_environ (environment);
  init_environ (environment);
  env = get_in_environ (environment, path_var_name);
  env = get_in_environ (environment, path_var_name);
 
 
  /* Can be null if path is not set.  */
  /* Can be null if path is not set.  */
  if (!env)
  if (!env)
    env = "";
    env = "";
  orig_path = xstrdup (env);
  orig_path = xstrdup (env);
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.