| Index: gdb/cli/cli-decode.c
|
| diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c
|
| index f168ff19d4c5443b7df4a648bcdb3dd9a4e4220a..6fa929b1d712a223c396500517d752b3286a7a21 100644
|
| --- a/gdb/cli/cli-decode.c
|
| +++ b/gdb/cli/cli-decode.c
|
| @@ -119,9 +119,7 @@ cmd_type (struct cmd_list_element *cmd)
|
| }
|
|
|
| void
|
| -set_cmd_completer (struct cmd_list_element *cmd,
|
| - char **(*completer) (struct cmd_list_element *self,
|
| - char *text, char *word))
|
| +set_cmd_completer (struct cmd_list_element *cmd, completer_ftype *completer)
|
| {
|
| cmd->completer = completer; /* Ok. */
|
| }
|
| @@ -412,7 +410,7 @@ add_setshow_cmd_full (char *name,
|
| void
|
| add_setshow_enum_cmd (char *name,
|
| enum command_class class,
|
| - const char *enumlist[],
|
| + const char *const *enumlist,
|
| const char **var,
|
| const char *set_doc,
|
| const char *show_doc,
|
| @@ -1005,8 +1003,11 @@ print_doc_line (struct ui_file *stream, char *str)
|
| line_buffer = (char *) xmalloc (line_size);
|
| }
|
|
|
| + /* Keep printing '.' or ',' not followed by a whitespace for embedded strings
|
| + like '.gdbinit'. */
|
| p = str;
|
| - while (*p && *p != '\n' && *p != '.' && *p != ',')
|
| + while (*p && *p != '\n'
|
| + && ((*p != '.' && *p != ',') || (p[1] && !isspace (p[1]))))
|
| p++;
|
| if (p - str > line_size - 1)
|
| {
|
| @@ -1018,7 +1019,7 @@ print_doc_line (struct ui_file *stream, char *str)
|
| line_buffer[p - str] = '\0';
|
| if (islower (line_buffer[0]))
|
| line_buffer[0] = toupper (line_buffer[0]);
|
| - ui_out_text (current_uiout, line_buffer);
|
| + fputs_filtered (line_buffer, stream);
|
| }
|
|
|
| /* Print one-line help for command C.
|
| @@ -1639,26 +1640,20 @@ lookup_cmd_composition (char *text,
|
| "foo" and we want to complete to "foobar". If WORD is "oo", return
|
| "oobar"; if WORD is "baz/foo", return "baz/foobar". */
|
|
|
| -char **
|
| +VEC (char_ptr) *
|
| complete_on_cmdlist (struct cmd_list_element *list, char *text, char *word)
|
| {
|
| struct cmd_list_element *ptr;
|
| - char **matchlist;
|
| - int sizeof_matchlist;
|
| - int matches;
|
| + VEC (char_ptr) *matchlist = NULL;
|
| int textlen = strlen (text);
|
| int pass;
|
| int saw_deprecated_match = 0;
|
|
|
| - sizeof_matchlist = 10;
|
| - matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
|
| - matches = 0;
|
| -
|
| /* We do one or two passes. In the first pass, we skip deprecated
|
| commands. If we see no matching commands in the first pass, and
|
| if we did happen to see a matching deprecated command, we do
|
| another loop to collect those. */
|
| - for (pass = 0; matches == 0 && pass < 2; ++pass)
|
| + for (pass = 0; matchlist == 0 && pass < 2; ++pass)
|
| {
|
| for (ptr = list; ptr; ptr = ptr->next)
|
| if (!strncmp (ptr->name, text, textlen)
|
| @@ -1666,6 +1661,8 @@ complete_on_cmdlist (struct cmd_list_element *list, char *text, char *word)
|
| && (ptr->func
|
| || ptr->prefixlist))
|
| {
|
| + char *match;
|
| +
|
| if (pass == 0)
|
| {
|
| if ((ptr->flags & CMD_DEPRECATED) != 0)
|
| @@ -1675,31 +1672,22 @@ complete_on_cmdlist (struct cmd_list_element *list, char *text, char *word)
|
| }
|
| }
|
|
|
| - if (matches == sizeof_matchlist)
|
| - {
|
| - sizeof_matchlist *= 2;
|
| - matchlist = (char **) xrealloc ((char *) matchlist,
|
| - (sizeof_matchlist
|
| - * sizeof (char *)));
|
| - }
|
| -
|
| - matchlist[matches] = (char *)
|
| - xmalloc (strlen (word) + strlen (ptr->name) + 1);
|
| + match = (char *) xmalloc (strlen (word) + strlen (ptr->name) + 1);
|
| if (word == text)
|
| - strcpy (matchlist[matches], ptr->name);
|
| + strcpy (match, ptr->name);
|
| else if (word > text)
|
| {
|
| /* Return some portion of ptr->name. */
|
| - strcpy (matchlist[matches], ptr->name + (word - text));
|
| + strcpy (match, ptr->name + (word - text));
|
| }
|
| else
|
| {
|
| /* Return some of text plus ptr->name. */
|
| - strncpy (matchlist[matches], word, text - word);
|
| - matchlist[matches][text - word] = '\0';
|
| - strcat (matchlist[matches], ptr->name);
|
| + strncpy (match, word, text - word);
|
| + match[text - word] = '\0';
|
| + strcat (match, ptr->name);
|
| }
|
| - ++matches;
|
| + VEC_safe_push (char_ptr, matchlist, match);
|
| }
|
| /* If we saw no matching deprecated commands in the first pass,
|
| just bail out. */
|
| @@ -1707,18 +1695,6 @@ complete_on_cmdlist (struct cmd_list_element *list, char *text, char *word)
|
| break;
|
| }
|
|
|
| - if (matches == 0)
|
| - {
|
| - xfree (matchlist);
|
| - matchlist = 0;
|
| - }
|
| - else
|
| - {
|
| - matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
|
| - * sizeof (char *)));
|
| - matchlist[matches] = (char *) 0;
|
| - }
|
| -
|
| return matchlist;
|
| }
|
|
|
| @@ -1732,64 +1708,39 @@ complete_on_cmdlist (struct cmd_list_element *list, char *text, char *word)
|
| and we want to complete to "foobar". If WORD is "oo", return
|
| "oobar"; if WORD is "baz/foo", return "baz/foobar". */
|
|
|
| -char **
|
| -complete_on_enum (const char *enumlist[],
|
| +VEC (char_ptr) *
|
| +complete_on_enum (const char *const *enumlist,
|
| char *text,
|
| char *word)
|
| {
|
| - char **matchlist;
|
| - int sizeof_matchlist;
|
| - int matches;
|
| + VEC (char_ptr) *matchlist = NULL;
|
| int textlen = strlen (text);
|
| int i;
|
| const char *name;
|
|
|
| - sizeof_matchlist = 10;
|
| - matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
|
| - matches = 0;
|
| -
|
| for (i = 0; (name = enumlist[i]) != NULL; i++)
|
| if (strncmp (name, text, textlen) == 0)
|
| {
|
| - if (matches == sizeof_matchlist)
|
| - {
|
| - sizeof_matchlist *= 2;
|
| - matchlist = (char **) xrealloc ((char *) matchlist,
|
| - (sizeof_matchlist
|
| - * sizeof (char *)));
|
| - }
|
| + char *match;
|
|
|
| - matchlist[matches] = (char *)
|
| - xmalloc (strlen (word) + strlen (name) + 1);
|
| + match = (char *) xmalloc (strlen (word) + strlen (name) + 1);
|
| if (word == text)
|
| - strcpy (matchlist[matches], name);
|
| + strcpy (match, name);
|
| else if (word > text)
|
| {
|
| /* Return some portion of name. */
|
| - strcpy (matchlist[matches], name + (word - text));
|
| + strcpy (match, name + (word - text));
|
| }
|
| else
|
| {
|
| /* Return some of text plus name. */
|
| - strncpy (matchlist[matches], word, text - word);
|
| - matchlist[matches][text - word] = '\0';
|
| - strcat (matchlist[matches], name);
|
| + strncpy (match, word, text - word);
|
| + match[text - word] = '\0';
|
| + strcat (match, name);
|
| }
|
| - ++matches;
|
| + VEC_safe_push (char_ptr, matchlist, match);
|
| }
|
|
|
| - if (matches == 0)
|
| - {
|
| - xfree (matchlist);
|
| - matchlist = 0;
|
| - }
|
| - else
|
| - {
|
| - matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
|
| - * sizeof (char *)));
|
| - matchlist[matches] = (char *) 0;
|
| - }
|
| -
|
| return matchlist;
|
| }
|
|
|
|
|