| Index: gdb/cli/cli-cmds.c
|
| diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
|
| index c38167a17594b8ad5e6fe56c8182a6238ffac8a1..c905ca28dc4fb9d2120134d85847b42fd8a2fb67 100644
|
| --- a/gdb/cli/cli-cmds.c
|
| +++ b/gdb/cli/cli-cmds.c
|
| @@ -201,7 +201,7 @@ static const char script_ext_off[] = "off";
|
| static const char script_ext_soft[] = "soft";
|
| static const char script_ext_strict[] = "strict";
|
|
|
| -static const char *script_ext_enums[] = {
|
| +static const char *const script_ext_enums[] = {
|
| script_ext_off,
|
| script_ext_soft,
|
| script_ext_strict,
|
| @@ -254,7 +254,8 @@ static void
|
| complete_command (char *arg, int from_tty)
|
| {
|
| int argpoint;
|
| - char **completions, *point, *arg_prefix;
|
| + char *point, *arg_prefix;
|
| + VEC (char_ptr) *completions;
|
|
|
| dont_repeat ();
|
|
|
| @@ -282,33 +283,30 @@ complete_command (char *arg, int from_tty)
|
|
|
| if (completions)
|
| {
|
| - int item, size;
|
| + int ix, size = VEC_length (char_ptr, completions);
|
| + char *item, *prev = NULL;
|
|
|
| - for (size = 0; completions[size]; ++size)
|
| - ;
|
| - qsort (completions, size, sizeof (char *), compare_strings);
|
| + qsort (VEC_address (char_ptr, completions), size,
|
| + sizeof (char *), compare_strings);
|
|
|
| /* We do extra processing here since we only want to print each
|
| unique item once. */
|
| - item = 0;
|
| - while (item < size)
|
| + for (ix = 0; VEC_iterate (char_ptr, completions, ix, item); ++ix)
|
| {
|
| int next_item;
|
|
|
| - printf_unfiltered ("%s%s\n", arg_prefix, completions[item]);
|
| - next_item = item + 1;
|
| - while (next_item < size
|
| - && ! strcmp (completions[item], completions[next_item]))
|
| + if (prev == NULL || strcmp (item, prev) != 0)
|
| {
|
| - xfree (completions[next_item]);
|
| - ++next_item;
|
| + printf_unfiltered ("%s%s\n", arg_prefix, item);
|
| + xfree (prev);
|
| + prev = item;
|
| }
|
| -
|
| - xfree (completions[item]);
|
| - item = next_item;
|
| + else
|
| + xfree (item);
|
| }
|
|
|
| - xfree (completions);
|
| + xfree (prev);
|
| + VEC_free (char_ptr, completions);
|
| }
|
| }
|
|
|
| @@ -417,7 +415,7 @@ cd_command (char *dir, int from_tty)
|
| {
|
| if (IS_DIR_SEPARATOR (p[0]) && p[1] == '.'
|
| && (p[2] == 0 || IS_DIR_SEPARATOR (p[2])))
|
| - strcpy (p, p + 2);
|
| + memmove (p, p + 2, strlen (p + 2) + 1);
|
| else if (IS_DIR_SEPARATOR (p[0]) && p[1] == '.' && p[2] == '.'
|
| && (p[3] == 0 || IS_DIR_SEPARATOR (p[3])))
|
| {
|
| @@ -436,7 +434,7 @@ cd_command (char *dir, int from_tty)
|
| ++p;
|
| else
|
| {
|
| - strcpy (q - 1, p + 3);
|
| + memmove (q - 1, p + 3, strlen (p + 3) + 1);
|
| p = q - 1;
|
| }
|
| }
|
| @@ -513,11 +511,21 @@ find_and_open_script (const char *script_file, int search_path,
|
| do_cleanups (old_cleanups);
|
|
|
| *streamp = fdopen (fd, FOPEN_RT);
|
| + if (*streamp == NULL)
|
| + {
|
| + int save_errno = errno;
|
| +
|
| + close (fd);
|
| + if (full_pathp)
|
| + xfree (*full_pathp);
|
| + errno = save_errno;
|
| + return 0;
|
| + }
|
| +
|
| return 1;
|
| }
|
|
|
| -/* Load script FILE, which has already been opened as STREAM.
|
| - STREAM is closed before we return. */
|
| +/* Load script FILE, which has already been opened as STREAM. */
|
|
|
| static void
|
| source_script_from_stream (FILE *stream, const char *file)
|
| @@ -529,9 +537,7 @@ source_script_from_stream (FILE *stream, const char *file)
|
|
|
| TRY_CATCH (e, RETURN_MASK_ERROR)
|
| {
|
| - /* The python support reopens the file using python functions,
|
| - so there's no point in passing STREAM here. */
|
| - source_python_script (file);
|
| + source_python_script (stream, file);
|
| }
|
| if (e.reason < 0)
|
| {
|
| @@ -545,12 +551,9 @@ source_script_from_stream (FILE *stream, const char *file)
|
| else
|
| {
|
| /* Nope, just punt. */
|
| - fclose (stream);
|
| throw_exception (e);
|
| }
|
| }
|
| - else
|
| - fclose (stream);
|
| }
|
| else
|
| script_from_file (stream, file);
|
| @@ -584,6 +587,7 @@ source_script_with_search (const char *file, int from_tty, int search_path)
|
| }
|
|
|
| old_cleanups = make_cleanup (xfree, full_path);
|
| + make_cleanup_fclose (stream);
|
| /* The python support reopens the file, so we need to pass full_path here
|
| in case the file was found on the search path. It's useful to do this
|
| anyway so that error messages show the actual file used. But only do
|
| @@ -957,7 +961,7 @@ list_command (char *arg, int from_tty)
|
| else
|
| sals_end = decode_line_1 (&arg1, DECODE_LINE_LIST_MODE,
|
| sal.symtab, sal.line);
|
| - filter_sals (&sals);
|
| + filter_sals (&sals_end);
|
| if (sals_end.nelts == 0)
|
| return;
|
| if (sals_end.nelts > 1)
|
| @@ -1091,7 +1095,7 @@ disassemble_current_function (int flags)
|
| struct frame_info *frame;
|
| struct gdbarch *gdbarch;
|
| CORE_ADDR low, high, pc;
|
| - char *name;
|
| + const char *name;
|
|
|
| frame = get_selected_frame (_("No frame selected."));
|
| gdbarch = get_frame_arch (frame);
|
| @@ -1129,7 +1133,7 @@ disassemble_command (char *arg, int from_tty)
|
| {
|
| struct gdbarch *gdbarch = get_current_arch ();
|
| CORE_ADDR low, high;
|
| - char *name;
|
| + const char *name;
|
| CORE_ADDR pc;
|
| int flags;
|
|
|
| @@ -1235,7 +1239,8 @@ show_user (char *args, int from_tty)
|
| char *comname = args;
|
|
|
| c = lookup_cmd (&comname, cmdlist, "", 0, 1);
|
| - if (c->class != class_user)
|
| + /* c->user_commands would be NULL if it's a python command. */
|
| + if (c->class != class_user || !c->user_commands)
|
| error (_("Not a user command."));
|
| show_user_1 (c, "", args, gdb_stdout);
|
| }
|
| @@ -1418,7 +1423,6 @@ alias_command (char *args, int from_tty)
|
| }
|
| else
|
| {
|
| - int i;
|
| dyn_string_t alias_prefix_dyn_string, command_prefix_dyn_string;
|
| char *alias_prefix, *command_prefix;
|
| struct cmd_list_element *c_alias, *c_command;
|
| @@ -1906,7 +1910,7 @@ Two arguments (separated by a comma) are taken as a range of memory to dump,\n\
|
| Run the ``make'' program using the rest of the line as arguments."));
|
| set_cmd_completer (c, filename_completer);
|
| add_cmd ("user", no_class, show_user, _("\
|
| -Show definitions of user defined commands.\n\
|
| +Show definitions of non-python user defined commands.\n\
|
| Argument is the name of the user defined command.\n\
|
| With no argument, show definitions of all user defined commands."), &showlist);
|
| add_com ("apropos", class_support, apropos_command,
|
| @@ -1914,8 +1918,8 @@ With no argument, show definitions of all user defined commands."), &showlist);
|
|
|
| add_setshow_integer_cmd ("max-user-call-depth", no_class,
|
| &max_user_call_depth, _("\
|
| -Set the max call depth for user-defined commands."), _("\
|
| -Show the max call depth for user-defined commands."), NULL,
|
| +Set the max call depth for non-python user-defined commands."), _("\
|
| +Show the max call depth for non-python user-defined commands."), NULL,
|
| NULL,
|
| show_max_user_call_depth,
|
| &setlist, &showlist);
|
|
|