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; |
} |