/* MI Command Set for GDB, the GNU debugger.
   Copyright (C) 2000-2021 Free Software Foundation, Inc.

   Contributed by Cygnus Solutions (a Red Hat company).

   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/>.  */

#include "defs.h"
#include "top.h"
#include "mi-cmds.h"
#include "mi-main.h"

struct mi_cmd;
static struct mi_cmd **lookup_table (const char *command);
static void build_table (struct mi_cmd *commands);

static struct mi_cmd mi_cmds[] =
{
/* Define a MI command of NAME, and its corresponding CLI command is
   CLI_NAME.  */
#define DEF_MI_CMD_CLI_1(NAME, CLI_NAME, ARGS_P, CALLED)	\
  { NAME, { CLI_NAME, ARGS_P}, NULL, CALLED }
#define DEF_MI_CMD_CLI(NAME, CLI_NAME, ARGS_P) \
  DEF_MI_CMD_CLI_1(NAME, CLI_NAME, ARGS_P, NULL)

/* Define a MI command of NAME, and implemented by function MI_FUNC.  */
#define DEF_MI_CMD_MI_1(NAME, MI_FUNC, CALLED) \
  { NAME, {NULL, 0}, MI_FUNC, CALLED }
#define DEF_MI_CMD_MI(NAME, MI_FUNC) DEF_MI_CMD_MI_1(NAME, MI_FUNC, NULL)

  DEF_MI_CMD_MI ("ada-task-info", mi_cmd_ada_task_info),
  DEF_MI_CMD_MI ("add-inferior", mi_cmd_add_inferior),
  DEF_MI_CMD_CLI_1 ("break-after", "ignore", 1,
		    &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_MI_1 ("break-condition", mi_cmd_break_condition,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_MI_1 ("break-commands", mi_cmd_break_commands,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_CLI_1 ("break-delete", "delete breakpoint", 1,
		    &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_CLI_1 ("break-disable", "disable breakpoint", 1,
		    &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_CLI_1 ("break-enable", "enable breakpoint", 1,
		     &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_CLI ("break-info", "info break", 1),
  DEF_MI_CMD_MI_1 ("break-insert", mi_cmd_break_insert,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_MI_1 ("dprintf-insert", mi_cmd_dprintf_insert,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_CLI ("break-list", "info break", 0),
  DEF_MI_CMD_MI_1 ("break-passcount", mi_cmd_break_passcount,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_MI_1 ("break-watch", mi_cmd_break_watch,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_MI_1 ("catch-assert", mi_cmd_catch_assert,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_MI_1 ("catch-exception", mi_cmd_catch_exception,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_MI_1 ("catch-handlers", mi_cmd_catch_handlers,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_MI_1 ("catch-load", mi_cmd_catch_load,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_MI_1 ("catch-unload", mi_cmd_catch_unload,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_MI_1 ("catch-throw", mi_cmd_catch_throw,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_MI_1 ("catch-rethrow", mi_cmd_catch_rethrow,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_MI_1 ("catch-catch", mi_cmd_catch_catch,
		   &mi_suppress_notification.breakpoint),
  DEF_MI_CMD_MI ("complete", mi_cmd_complete),
  DEF_MI_CMD_MI ("data-disassemble", mi_cmd_disassemble),
  DEF_MI_CMD_MI ("data-evaluate-expression", mi_cmd_data_evaluate_expression),
  DEF_MI_CMD_MI ("data-list-changed-registers",
		 mi_cmd_data_list_changed_registers),
  DEF_MI_CMD_MI ("data-list-register-names", mi_cmd_data_list_register_names),
  DEF_MI_CMD_MI ("data-list-register-values", mi_cmd_data_list_register_values),
  DEF_MI_CMD_MI ("data-read-memory", mi_cmd_data_read_memory),
  DEF_MI_CMD_MI ("data-read-memory-bytes", mi_cmd_data_read_memory_bytes),
  DEF_MI_CMD_MI_1 ("data-write-memory", mi_cmd_data_write_memory,
		   &mi_suppress_notification.memory),
  DEF_MI_CMD_MI_1 ("data-write-memory-bytes", mi_cmd_data_write_memory_bytes,
		   &mi_suppress_notification.memory),
  DEF_MI_CMD_MI ("data-write-register-values",
		 mi_cmd_data_write_register_values),
  DEF_MI_CMD_MI ("enable-timings", mi_cmd_enable_timings),
  DEF_MI_CMD_MI ("enable-pretty-printing", mi_cmd_enable_pretty_printing),
  DEF_MI_CMD_MI ("enable-frame-filters", mi_cmd_enable_frame_filters),
  DEF_MI_CMD_MI ("environment-cd", mi_cmd_env_cd),
  DEF_MI_CMD_MI ("environment-directory", mi_cmd_env_dir),
  DEF_MI_CMD_MI ("environment-path", mi_cmd_env_path),
  DEF_MI_CMD_MI ("environment-pwd", mi_cmd_env_pwd),
  DEF_MI_CMD_CLI_1 ("exec-arguments", "set args", 1,
		    &mi_suppress_notification.cmd_param_changed),
  DEF_MI_CMD_MI ("exec-continue", mi_cmd_exec_continue),
  DEF_MI_CMD_MI ("exec-finish", mi_cmd_exec_finish),
  DEF_MI_CMD_MI ("exec-jump", mi_cmd_exec_jump),
  DEF_MI_CMD_MI ("exec-interrupt", mi_cmd_exec_interrupt),
  DEF_MI_CMD_MI ("exec-next", mi_cmd_exec_next),
  DEF_MI_CMD_MI ("exec-next-instruction", mi_cmd_exec_next_instruction),
  DEF_MI_CMD_MI ("exec-return", mi_cmd_exec_return),
  DEF_MI_CMD_MI ("exec-run", mi_cmd_exec_run),
  DEF_MI_CMD_MI ("exec-step", mi_cmd_exec_step),
  DEF_MI_CMD_MI ("exec-step-instruction", mi_cmd_exec_step_instruction),
  DEF_MI_CMD_CLI ("exec-until", "until", 1),
  DEF_MI_CMD_CLI ("file-exec-and-symbols", "file", 1),
  DEF_MI_CMD_CLI ("file-exec-file", "exec-file", 1),
  DEF_MI_CMD_MI ("file-list-exec-source-file",
		 mi_cmd_file_list_exec_source_file),
  DEF_MI_CMD_MI ("file-list-exec-source-files",
		 mi_cmd_file_list_exec_source_files),
  DEF_MI_CMD_MI ("file-list-shared-libraries",
		 mi_cmd_file_list_shared_libraries),
  DEF_MI_CMD_CLI ("file-symbol-file", "symbol-file", 1),
  DEF_MI_CMD_MI ("fix-multi-location-breakpoint-output",
		 mi_cmd_fix_multi_location_breakpoint_output),
  DEF_MI_CMD_MI ("gdb-exit", mi_cmd_gdb_exit),
  DEF_MI_CMD_CLI_1 ("gdb-set", "set", 1,
		    &mi_suppress_notification.cmd_param_changed),
  DEF_MI_CMD_CLI ("gdb-show", "show", 1),
  DEF_MI_CMD_CLI ("gdb-version", "show version", 0),
  DEF_MI_CMD_MI ("inferior-tty-set", mi_cmd_inferior_tty_set),
  DEF_MI_CMD_MI ("inferior-tty-show", mi_cmd_inferior_tty_show),
  DEF_MI_CMD_MI ("info-ada-exceptions", mi_cmd_info_ada_exceptions),
  DEF_MI_CMD_MI ("info-gdb-mi-command", mi_cmd_info_gdb_mi_command),
  DEF_MI_CMD_MI ("info-os", mi_cmd_info_os),
  DEF_MI_CMD_MI ("interpreter-exec", mi_cmd_interpreter_exec),
  DEF_MI_CMD_MI ("list-features", mi_cmd_list_features),
  DEF_MI_CMD_MI ("list-target-features", mi_cmd_list_target_features),
  DEF_MI_CMD_MI ("list-thread-groups", mi_cmd_list_thread_groups),
  DEF_MI_CMD_MI ("remove-inferior", mi_cmd_remove_inferior),
  DEF_MI_CMD_MI ("stack-info-depth", mi_cmd_stack_info_depth),
  DEF_MI_CMD_MI ("stack-info-frame", mi_cmd_stack_info_frame),
  DEF_MI_CMD_MI ("stack-list-arguments", mi_cmd_stack_list_args),
  DEF_MI_CMD_MI ("stack-list-frames", mi_cmd_stack_list_frames),
  DEF_MI_CMD_MI ("stack-list-locals", mi_cmd_stack_list_locals),
  DEF_MI_CMD_MI ("stack-list-variables", mi_cmd_stack_list_variables),
  DEF_MI_CMD_MI_1 ("stack-select-frame", mi_cmd_stack_select_frame,
		   &mi_suppress_notification.user_selected_context),
  DEF_MI_CMD_MI ("symbol-list-lines", mi_cmd_symbol_list_lines),
  DEF_MI_CMD_MI ("symbol-info-functions", mi_cmd_symbol_info_functions),
  DEF_MI_CMD_MI ("symbol-info-variables", mi_cmd_symbol_info_variables),
  DEF_MI_CMD_MI ("symbol-info-types", mi_cmd_symbol_info_types),
  DEF_MI_CMD_MI ("symbol-info-modules", mi_cmd_symbol_info_modules),
  DEF_MI_CMD_MI ("symbol-info-module-functions",
		 mi_cmd_symbol_info_module_functions),
  DEF_MI_CMD_MI ("symbol-info-module-variables",
		 mi_cmd_symbol_info_module_variables),
  DEF_MI_CMD_CLI ("target-attach", "attach", 1),
  DEF_MI_CMD_MI ("target-detach", mi_cmd_target_detach),
  DEF_MI_CMD_CLI ("target-disconnect", "disconnect", 0),
  DEF_MI_CMD_CLI ("target-download", "load", 1),
  DEF_MI_CMD_MI ("target-file-delete", mi_cmd_target_file_delete),
  DEF_MI_CMD_MI ("target-file-get", mi_cmd_target_file_get),
  DEF_MI_CMD_MI ("target-file-put", mi_cmd_target_file_put),
  DEF_MI_CMD_MI ("target-flash-erase", mi_cmd_target_flash_erase),
  DEF_MI_CMD_CLI ("target-select", "target", 1),
  DEF_MI_CMD_MI ("thread-info", mi_cmd_thread_info),
  DEF_MI_CMD_MI ("thread-list-ids", mi_cmd_thread_list_ids),
  DEF_MI_CMD_MI_1 ("thread-select", mi_cmd_thread_select,
		   &mi_suppress_notification.user_selected_context),
  DEF_MI_CMD_MI ("trace-define-variable", mi_cmd_trace_define_variable),
  DEF_MI_CMD_MI_1 ("trace-find", mi_cmd_trace_find,
		   &mi_suppress_notification.traceframe),
  DEF_MI_CMD_MI ("trace-frame-collected",
		 mi_cmd_trace_frame_collected),
  DEF_MI_CMD_MI ("trace-list-variables", mi_cmd_trace_list_variables),
  DEF_MI_CMD_MI ("trace-save", mi_cmd_trace_save),
  DEF_MI_CMD_MI ("trace-start", mi_cmd_trace_start),
  DEF_MI_CMD_MI ("trace-status", mi_cmd_trace_status),
  DEF_MI_CMD_MI ("trace-stop", mi_cmd_trace_stop),
  DEF_MI_CMD_MI ("var-assign", mi_cmd_var_assign),
  DEF_MI_CMD_MI ("var-create", mi_cmd_var_create),
  DEF_MI_CMD_MI ("var-delete", mi_cmd_var_delete),
  DEF_MI_CMD_MI ("var-evaluate-expression", mi_cmd_var_evaluate_expression),
  DEF_MI_CMD_MI ("var-info-path-expression", mi_cmd_var_info_path_expression),
  DEF_MI_CMD_MI ("var-info-expression", mi_cmd_var_info_expression),
  DEF_MI_CMD_MI ("var-info-num-children", mi_cmd_var_info_num_children),
  DEF_MI_CMD_MI ("var-info-type", mi_cmd_var_info_type),
  DEF_MI_CMD_MI ("var-list-children", mi_cmd_var_list_children),
  DEF_MI_CMD_MI ("var-set-format", mi_cmd_var_set_format),
  DEF_MI_CMD_MI ("var-set-frozen", mi_cmd_var_set_frozen),
  DEF_MI_CMD_MI ("var-set-update-range", mi_cmd_var_set_update_range),
  DEF_MI_CMD_MI ("var-set-visualizer", mi_cmd_var_set_visualizer),
  DEF_MI_CMD_MI ("var-show-attributes", mi_cmd_var_show_attributes),
  DEF_MI_CMD_MI ("var-show-format", mi_cmd_var_show_format),
  DEF_MI_CMD_MI ("var-update", mi_cmd_var_update),
  { NULL, }
};

/* Pointer to the mi command table (built at run time). */

static struct mi_cmd **mi_table;

/* A prime large enough to accomodate the entire command table.  */
enum
  {
    MI_TABLE_SIZE = 227
  };

/* Exported function used to obtain info from the table.  */
struct mi_cmd *
mi_lookup (const char *command)
{
  return *lookup_table (command);
}

/* Used for collecting hash hit/miss statistics.  */

static struct
{
  int hit;
  int miss;
  int rehash;
} stats;

/* Look up a command.  */

static struct mi_cmd **
lookup_table (const char *command)
{
  const char *chp;
  unsigned int index = 0;

  /* Compute our hash.  */
  for (chp = command; *chp; chp++)
    {
      /* We use a somewhat arbitrary formula.  */
      index = ((index << 6) + (unsigned int) *chp) % MI_TABLE_SIZE;
    }

  while (1)
    {
      struct mi_cmd **entry = &mi_table[index];
      if ((*entry) == 0)
	{
	  /* not found, return pointer to next free. */
	  stats.miss++;
	  return entry;
	}
      if (strcmp (command, (*entry)->name) == 0)
	{
	  stats.hit++;
	  return entry;		/* found */
	}
      index = (index + 1) % MI_TABLE_SIZE;
      stats.rehash++;
    }
}

static void
build_table (struct mi_cmd *commands)
{
  int nr_rehash = 0;
  int nr_entries = 0;
  struct mi_cmd *command;

  mi_table = XCNEWVEC (struct mi_cmd *, MI_TABLE_SIZE);
  for (command = commands; command->name != 0; command++)
    {
      struct mi_cmd **entry = lookup_table (command->name);

      if (*entry)
	internal_error (__FILE__, __LINE__,
			_("command `%s' appears to be duplicated"),
			command->name);
      *entry = command;
      /* FIXME lose these prints */
      if (0)
	{
	  fprintf_unfiltered (gdb_stdlog, "%-30s %2d\n",
			      command->name, stats.rehash - nr_rehash);
	}
      nr_entries++;
      nr_rehash = stats.rehash;
    }
  if (0)
    {
      fprintf_filtered (gdb_stdlog, "Average %3.1f\n",
			(double) nr_rehash / (double) nr_entries);
    }
}

void _initialize_mi_cmds ();
void
_initialize_mi_cmds ()
{
  build_table (mi_cmds);
  memset (&stats, 0, sizeof (stats));
}
