This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[patch] CLI separation, take #2 completer.[ch]
- To: gdb-patches at sources dot redhat dot com
- Subject: [patch] CLI separation, take #2 completer.[ch]
- From: Fernando Nasser <fnasser at cygnus dot com>
- Date: Fri, 01 Dec 2000 00:21:20 +0000
- Organization: Red Hat Canada Ltd. - Toronto
This is the small part. The big one is coming.
I added the linespec.h file Andrew asked for in the first pass (or was it
Elena?).
The completer still needs a touch-up to be useful for generic code.
I rather move the code first and do the changes afterwards so things are
properly documented in CVS.
I am checking this in soon, so please use "cvs update -d" to get
the new files.
Fernando
2000-11-30 Fernando Nasser <fnasser@redhat.com>
* linespec.h: New file. Declarations for linespec.c.
* linespec.c, alpha-tdep.c, breakpoint.c, parse.c, source.c,
symtab.c, tracepoint.c: Include the above.
* completer.c: New file. Line completion stuff for GDB.
(get_gdb_completer_word_break_characters,
get_gdb_completer_quote_characters): New functions. Accessors for
useful completer internal data.
(filename_completer, line_completion_function, skip_quoted): Moved
here from top.c.
* completer.h: New file. Declarations for the above.
* linespec.c (decode_line_1): Use
get_gdb_completer_word_break_characters and
get_gdb_completer_quote_characters.
* top.c: Include completer.h.
(filename_completer, line_completion_function, skip_quoted):
Moved to completer.c.
* corefile.c, exec.c, source.c, symfile.c, linespec.c: Include
completer.h.
* Makefile.in (SFILES): Add completer.c.
(COMMON_OBS): Add completer.o.
(completer.o): New target.
(linespec.o, alpha-tdep.o, breakpoint.o, parse.o, source.o,
symtab.o, tracepoint.o): Add linespec.h to dependencies list.
(corefile.o, exec.o, source.o, symfile.o, linespec.o): Add completer.h
to dependencies list.
Index: linespec.h
===================================================================
RCS file: linespec.h
diff -N linespec.h
*** /dev/null Tue May 5 13:32:27 1998
--- linespec.h Thu Nov 30 16:15:23 2000
***************
*** 0 ****
--- 1,27 ----
+ /* Header for GDB line completion.
+ Copyright 2000 Free Software Foundation.
+
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+ #if !defined (LINESPEC_H)
+ #define LINESPEC_H 1
+
+ extern struct symtabs_and_lines
+ decode_line_1 (char **argptr, int funfirstline,
+ struct symtab *default_symtab, int default_line,
+ char ***canonical);
+
+ #endif /* defined (LINESPEC_H) */
Index: completer.c
===================================================================
RCS file: completer.c
diff -N completer.c
*** /dev/null Tue May 5 13:32:27 1998
--- completer.c Thu Nov 30 16:15:23 2000
***************
*** 0 ****
--- 1,470 ----
+ /* Line completion stuff for GDB, the GNU debugger.
+ Copyright 2000 Free Software Foundation, Inc.
+
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+ #include "defs.h"
+ #include "symtab.h"
+ #include "gdbtypes.h"
+ #include "expression.h"
+
+ /* FIXME: This is needed because of lookup_cmd_1().
+ We should be calling a hook instead so we eliminate the CLI dependency. */
+ #include "gdbcmd.h"
+
+ /* Needed for rl_completer_word_break_characters() */
+ #include <readline/readline.h>
+
+ /* readline defines this. */
+ #undef savestring
+
+ #include "completer.h"
+
+ /* Prototypes for local functions */
+
+ /* readline uses the word breaks for two things:
+ (1) In figuring out where to point the TEXT parameter to the
+ rl_completion_entry_function. Since we don't use TEXT for much,
+ it doesn't matter a lot what the word breaks are for this purpose, but
+ it does affect how much stuff M-? lists.
+ (2) If one of the matches contains a word break character, readline
+ will quote it. That's why we switch between
+ gdb_completer_word_break_characters and
+ gdb_completer_command_word_break_characters. I'm not sure when
+ we need this behavior (perhaps for funky characters in C++ symbols?). */
+
+ /* Variables which are necessary for fancy command line editing. */
+ static char *gdb_completer_word_break_characters =
+ " \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,-";
+
+ /* When completing on command names, we remove '-' from the list of
+ word break characters, since we use it in command names. If the
+ readline library sees one in any of the current completion strings,
+ it thinks that the string needs to be quoted and automatically supplies
+ a leading quote. */
+ static char *gdb_completer_command_word_break_characters =
+ " \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,";
+
+ /* When completing on file names, we remove from the list of word
+ break characters any characters that are commonly used in file
+ names, such as '-', '+', '~', etc. Otherwise, readline displays
+ incorrect completion candidates. */
+ static char *gdb_completer_file_name_break_characters = " \t\n*|\"';:?/><";
+
+ /* Characters that can be used to quote completion strings. Note that we
+ can't include '"' because the gdb C parser treats such quoted sequences
+ as strings. */
+ static char *gdb_completer_quote_characters = "'";
+
+ /* Accessor for some completer data that may interest other files. */
+
+ char *
+ get_gdb_completer_word_break_characters (void)
+ {
+ return gdb_completer_word_break_characters;
+ }
+
+ char *
+ get_gdb_completer_quote_characters (void)
+ {
+ return gdb_completer_quote_characters;
+ }
+
+ /* Complete on filenames. */
+ char **
+ filename_completer (char *text, char *word)
+ {
+ /* From readline. */
+ extern char *filename_completion_function (char *, int);
+ int subsequent_name;
+ char **return_val;
+ int return_val_used;
+ int return_val_alloced;
+
+ return_val_used = 0;
+ /* Small for testing. */
+ return_val_alloced = 1;
+ return_val = (char **) xmalloc (return_val_alloced * sizeof (char *));
+
+ subsequent_name = 0;
+ while (1)
+ {
+ char *p;
+ p = filename_completion_function (text, subsequent_name);
+ if (return_val_used >= return_val_alloced)
+ {
+ return_val_alloced *= 2;
+ return_val =
+ (char **) xrealloc (return_val,
+ return_val_alloced * sizeof (char *));
+ }
+ if (p == NULL)
+ {
+ return_val[return_val_used++] = p;
+ break;
+ }
+ /* We need to set subsequent_name to a non-zero value before the
+ continue line below, because otherwise, if the first file seen
+ by GDB is a backup file whose name ends in a `~', we will loop
+ indefinitely. */
+ subsequent_name = 1;
+ /* Like emacs, don't complete on old versions. Especially useful
+ in the "source" command. */
+ if (p[strlen (p) - 1] == '~')
+ continue;
+
+ {
+ char *q;
+ if (word == text)
+ /* Return exactly p. */
+ return_val[return_val_used++] = p;
+ else if (word > text)
+ {
+ /* Return some portion of p. */
+ q = xmalloc (strlen (p) + 5);
+ strcpy (q, p + (word - text));
+ return_val[return_val_used++] = q;
+ free (p);
+ }
+ else
+ {
+ /* Return some of TEXT plus p. */
+ q = xmalloc (strlen (p) + (text - word) + 5);
+ strncpy (q, word, text - word);
+ q[text - word] = '\0';
+ strcat (q, p);
+ return_val[return_val_used++] = q;
+ free (p);
+ }
+ }
+ }
+ #if 0
+ /* There is no way to do this just long enough to affect quote inserting
+ without also affecting the next completion. This should be fixed in
+ readline. FIXME. */
+ /* Insure that readline does the right thing
+ with respect to inserting quotes. */
+ rl_completer_word_break_characters = "";
+ #endif
+ return return_val;
+ }
+
+ /* Here are some useful test cases for completion. FIXME: These should
+ be put in the test suite. They should be tested with both M-? and TAB.
+
+ "show output-" "radix"
+ "show output" "-radix"
+ "p" ambiguous (commands starting with p--path, print, printf, etc.)
+ "p " ambiguous (all symbols)
+ "info t foo" no completions
+ "info t " no completions
+ "info t" ambiguous ("info target", "info terminal", etc.)
+ "info ajksdlfk" no completions
+ "info ajksdlfk " no completions
+ "info" " "
+ "info " ambiguous (all info commands)
+ "p \"a" no completions (string constant)
+ "p 'a" ambiguous (all symbols starting with a)
+ "p b-a" ambiguous (all symbols starting with a)
+ "p b-" ambiguous (all symbols)
+ "file Make" "file" (word break hard to screw up here)
+ "file ../gdb.stabs/we" "ird" (needs to not break word at slash)
+ */
+
+ /* Generate completions one by one for the completer. Each time we are
+ called return another potential completion to the caller.
+ line_completion just completes on commands or passes the buck to the
+ command's completer function, the stuff specific to symbol completion
+ is in make_symbol_completion_list.
+
+ TEXT is the caller's idea of the "word" we are looking at.
+
+ MATCHES is the number of matches that have currently been collected from
+ calling this completion function. When zero, then we need to initialize,
+ otherwise the initialization has already taken place and we can just
+ return the next potential completion string.
+
+ LINE_BUFFER is available to be looked at; it contains the entire text
+ of the line. POINT is the offset in that line of the cursor. You
+ should pretend that the line ends at POINT.
+
+ Returns NULL if there are no more completions, else a pointer to a string
+ which is a possible completion, it is the caller's responsibility to
+ free the string. */
+
+ char *
+ line_completion_function (char *text, int matches, char *line_buffer, int point)
+ {
+ static char **list = (char **) NULL; /* Cache of completions */
+ static int index; /* Next cached completion */
+ char *output = NULL;
+ char *tmp_command, *p;
+ /* Pointer within tmp_command which corresponds to text. */
+ char *word;
+ struct cmd_list_element *c, *result_list;
+
+ if (matches == 0)
+ {
+ /* The caller is beginning to accumulate a new set of completions, so
+ we need to find all of them now, and cache them for returning one at
+ a time on future calls. */
+
+ if (list)
+ {
+ /* Free the storage used by LIST, but not by the strings inside.
+ This is because rl_complete_internal () frees the strings. */
+ free ((PTR) list);
+ }
+ list = 0;
+ index = 0;
+
+ /* Choose the default set of word break characters to break completions.
+ If we later find out that we are doing completions on command strings
+ (as opposed to strings supplied by the individual command completer
+ functions, which can be any string) then we will switch to the
+ special word break set for command strings, which leaves out the
+ '-' character used in some commands. */
+
+ rl_completer_word_break_characters =
+ gdb_completer_word_break_characters;
+
+ /* Decide whether to complete on a list of gdb commands or on symbols. */
+ tmp_command = (char *) alloca (point + 1);
+ p = tmp_command;
+
+ strncpy (tmp_command, line_buffer, point);
+ tmp_command[point] = '\0';
+ /* Since text always contains some number of characters leading up
+ to point, we can find the equivalent position in tmp_command
+ by subtracting that many characters from the end of tmp_command. */
+ word = tmp_command + point - strlen (text);
+
+ if (point == 0)
+ {
+ /* An empty line we want to consider ambiguous; that is, it
+ could be any command. */
+ c = (struct cmd_list_element *) -1;
+ result_list = 0;
+ }
+ else
+ {
+ c = lookup_cmd_1 (&p, cmdlist, &result_list, 1);
+ }
+
+ /* Move p up to the next interesting thing. */
+ while (*p == ' ' || *p == '\t')
+ {
+ p++;
+ }
+
+ if (!c)
+ {
+ /* It is an unrecognized command. So there are no
+ possible completions. */
+ list = NULL;
+ }
+ else if (c == (struct cmd_list_element *) -1)
+ {
+ char *q;
+
+ /* lookup_cmd_1 advances p up to the first ambiguous thing, but
+ doesn't advance over that thing itself. Do so now. */
+ q = p;
+ while (*q && (isalnum (*q) || *q == '-' || *q == '_'))
+ ++q;
+ if (q != tmp_command + point)
+ {
+ /* There is something beyond the ambiguous
+ command, so there are no possible completions. For
+ example, "info t " or "info t foo" does not complete
+ to anything, because "info t" can be "info target" or
+ "info terminal". */
+ list = NULL;
+ }
+ else
+ {
+ /* We're trying to complete on the command which was ambiguous.
+ This we can deal with. */
+ if (result_list)
+ {
+ list = complete_on_cmdlist (*result_list->prefixlist, p,
+ word);
+ }
+ else
+ {
+ list = complete_on_cmdlist (cmdlist, p, word);
+ }
+ /* Insure that readline does the right thing with respect to
+ inserting quotes. */
+ rl_completer_word_break_characters =
+ gdb_completer_command_word_break_characters;
+ }
+ }
+ else
+ {
+ /* We've recognized a full command. */
+
+ if (p == tmp_command + point)
+ {
+ /* There is no non-whitespace in the line beyond the command. */
+
+ if (p[-1] == ' ' || p[-1] == '\t')
+ {
+ /* The command is followed by whitespace; we need to complete
+ on whatever comes after command. */
+ if (c->prefixlist)
+ {
+ /* It is a prefix command; what comes after it is
+ a subcommand (e.g. "info "). */
+ list = complete_on_cmdlist (*c->prefixlist, p, word);
+
+ /* Insure that readline does the right thing
+ with respect to inserting quotes. */
+ rl_completer_word_break_characters =
+ gdb_completer_command_word_break_characters;
+ }
+ else if (c->enums)
+ {
+ list = complete_on_enum (c->enums, p, word);
+ rl_completer_word_break_characters =
+ gdb_completer_command_word_break_characters;
+ }
+ else
+ {
+ /* It is a normal command; what comes after it is
+ completed by the command's completer function. */
+ list = (*c->completer) (p, word);
+ if (c->completer == filename_completer)
+ rl_completer_word_break_characters =
+ gdb_completer_file_name_break_characters;
+ }
+ }
+ else
+ {
+ /* The command is not followed by whitespace; we need to
+ complete on the command itself. e.g. "p" which is a
+ command itself but also can complete to "print", "ptype"
+ etc. */
+ char *q;
+
+ /* Find the command we are completing on. */
+ q = p;
+ while (q > tmp_command)
+ {
+ if (isalnum (q[-1]) || q[-1] == '-' || q[-1] == '_')
+ --q;
+ else
+ break;
+ }
+
+ list = complete_on_cmdlist (result_list, q, word);
+
+ /* Insure that readline does the right thing
+ with respect to inserting quotes. */
+ rl_completer_word_break_characters =
+ gdb_completer_command_word_break_characters;
+ }
+ }
+ else
+ {
+ /* There is non-whitespace beyond the command. */
+
+ if (c->prefixlist && !c->allow_unknown)
+ {
+ /* It is an unrecognized subcommand of a prefix command,
+ e.g. "info adsfkdj". */
+ list = NULL;
+ }
+ else if (c->enums)
+ {
+ list = complete_on_enum (c->enums, p, word);
+ }
+ else
+ {
+ /* It is a normal command. */
+ list = (*c->completer) (p, word);
+ if (c->completer == filename_completer)
+ rl_completer_word_break_characters =
+ gdb_completer_file_name_break_characters;
+ }
+ }
+ }
+ }
+
+ /* If we found a list of potential completions during initialization then
+ dole them out one at a time. The vector of completions is NULL
+ terminated, so after returning the last one, return NULL (and continue
+ to do so) each time we are called after that, until a new list is
+ available. */
+
+ if (list)
+ {
+ output = list[index];
+ if (output)
+ {
+ index++;
+ }
+ }
+
+ #if 0
+ /* Can't do this because readline hasn't yet checked the word breaks
+ for figuring out whether to insert a quote. */
+ if (output == NULL)
+ /* Make sure the word break characters are set back to normal for the
+ next time that readline tries to complete something. */
+ rl_completer_word_break_characters =
+ gdb_completer_word_break_characters;
+ #endif
+
+ return (output);
+ }
+ /* Skip over a possibly quoted word (as defined by the quote characters
+ and word break characters the completer uses). Returns pointer to the
+ location after the "word". */
+
+ char *
+ skip_quoted (char *str)
+ {
+ char quote_char = '\0';
+ char *scan;
+
+ for (scan = str; *scan != '\0'; scan++)
+ {
+ if (quote_char != '\0')
+ {
+ /* Ignore everything until the matching close quote char */
+ if (*scan == quote_char)
+ {
+ /* Found matching close quote. */
+ scan++;
+ break;
+ }
+ }
+ else if (strchr (gdb_completer_quote_characters, *scan))
+ {
+ /* Found start of a quoted string. */
+ quote_char = *scan;
+ }
+ else if (strchr (gdb_completer_word_break_characters, *scan))
+ {
+ break;
+ }
+ }
+ return (scan);
+ }
+
Index: completer.h
===================================================================
RCS file: completer.h
diff -N completer.h
*** /dev/null Tue May 5 13:32:27 1998
--- completer.h Thu Nov 30 16:15:23 2000
***************
*** 0 ****
--- 1,34 ----
+ /* Header for GDB line completion.
+ Copyright 2000 Free Software Foundation.
+
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+ #if !defined (COMPLETER_H)
+ #define COMPLETER_H 1
+
+ extern char *line_completion_function (char *, int, char *, int);
+
+ extern char **filename_completer (char *, char *);
+
+ extern char *get_gdb_completer_word_break_characters (void);
+
+ extern char *get_gdb_completer_quote_characters (void);
+
+ /* Exported to linespec.c */
+
+ extern char *skip_quoted (char *str);
+
+ #endif /* defined (COMPLETER_H) */
Index: gdb/Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.47
diff -c -p -r1.47 Makefile.in
*** Makefile.in 2000/11/10 23:02:56 1.47
--- Makefile.in 2000/11/30 23:30:46
*************** TARGET_FLAGS_TO_PASS = \
*** 477,483 ****
SFILES = ax-general.c ax-gdb.c bcache.c blockframe.c breakpoint.c \
buildsym.c c-exp.y c-lang.c c-typeprint.c c-valprint.c \
ch-exp.c ch-lang.c ch-typeprint.c ch-valprint.c coffread.c \
! command.c complaints.c corefile.c cp-valprint.c dbxread.c \
demangle.c dwarfread.c dwarf2read.c elfread.c environ.c eval.c \
event-loop.c event-top.c \
expprint.c f-exp.y f-lang.c f-typeprint.c f-valprint.c \
--- 477,483 ----
SFILES = ax-general.c ax-gdb.c bcache.c blockframe.c breakpoint.c \
buildsym.c c-exp.y c-lang.c c-typeprint.c c-valprint.c \
ch-exp.c ch-lang.c ch-typeprint.c ch-valprint.c coffread.c \
! command.c complaints.c completer.c corefile.c cp-valprint.c dbxread.c \
demangle.c dwarfread.c dwarf2read.c elfread.c environ.c eval.c \
event-loop.c event-top.c \
expprint.c f-exp.y f-lang.c f-typeprint.c f-valprint.c \
*************** COMMON_OBS = version.o blockframe.o brea
*** 623,629 ****
source.o values.o eval.o valops.o valarith.o valprint.o printcmd.o \
symtab.o symfile.o symmisc.o linespec.o infcmd.o infrun.o command.o \
expprint.o environ.o stack.o thread.o \
! event-loop.o event-top.o inf-loop.o \
gdbarch.o arch-utils.o gdbtypes.o copying.o $(DEPFILES) \
mem-break.o target.o parse.o language.o $(YYOBJ) buildsym.o \
kod.o kod-cisco.o \
--- 623,629 ----
source.o values.o eval.o valops.o valarith.o valprint.o printcmd.o \
symtab.o symfile.o symmisc.o linespec.o infcmd.o infrun.o command.o \
expprint.o environ.o stack.o thread.o \
! event-loop.o event-top.o inf-loop.o completer.o \
gdbarch.o arch-utils.o gdbtypes.o copying.o $(DEPFILES) \
mem-break.o target.o parse.o language.o $(YYOBJ) buildsym.o \
kod.o kod-cisco.o \
*************** a68v-nat.o: a68v-nat.c $(defs_h) $(gdbco
*** 1148,1154 ****
alpha-nat.o: alpha-nat.c $(defs_h) $(gdbcore_h) $(inferior_h) target.h
alpha-tdep.o: alpha-tdep.c $(defs_h) $(gdbcmd_h) $(gdbcore_h) \
! $(inferior_h) $(symtab_h) $(dis-asm.h) gdb_string.h
# OBSOLETE altos-xdep.o: altos-xdep.c $(defs_h) $(gdbcore_h) $(inferior_h)
--- 1148,1154 ----
alpha-nat.o: alpha-nat.c $(defs_h) $(gdbcore_h) $(inferior_h) target.h
alpha-tdep.o: alpha-tdep.c $(defs_h) $(gdbcmd_h) $(gdbcore_h) \
! $(inferior_h) $(symtab_h) $(dis-asm.h) gdb_string.h linespec.h
# OBSOLETE altos-xdep.o: altos-xdep.c $(defs_h) $(gdbcore_h) $(inferior_h)
*************** blockframe.o: blockframe.c $(defs_h) $(g
*** 1170,1176 ****
breakpoint.o: breakpoint.c $(defs_h) $(gdbcmd_h) $(gdbcore_h) \
$(inferior_h) language.h target.h gdbthread.h gdb_string.h \
! gdb-events.h
buildsym.o: buildsym.c $(bfd_h) buildsym.h complaints.h $(defs_h) \
objfiles.h symfile.h $(symtab_h) gdb_string.h
--- 1170,1176 ----
breakpoint.o: breakpoint.c $(defs_h) $(gdbcmd_h) $(gdbcore_h) \
$(inferior_h) language.h target.h gdbthread.h gdb_string.h \
! gdb-events.h linespec.h
buildsym.o: buildsym.c $(bfd_h) buildsym.h complaints.h $(defs_h) \
objfiles.h symfile.h $(symtab_h) gdb_string.h
*************** core-regset.o: core-regset.c $(command_h
*** 1238,1244 ****
$(inferior_h) target.h gdb_string.h
corefile.o: corefile.c $(dis-asm_h) $(defs_h) $(gdbcmd_h) $(gdbcore_h) \
! $(inferior_h) target.h language.h gdb_string.h
corelow.o: corelow.c $(command_h) $(defs_h) $(gdbcore_h) $(inferior_h) \
target.h gdbthread.h gdb_string.h
--- 1238,1244 ----
$(inferior_h) target.h gdb_string.h
corefile.o: corefile.c $(dis-asm_h) $(defs_h) $(gdbcmd_h) $(gdbcore_h) \
! $(inferior_h) target.h language.h gdb_string.h completer.h
corelow.o: corelow.c $(command_h) $(defs_h) $(gdbcore_h) $(inferior_h) \
target.h gdbthread.h gdb_string.h
*************** inf-loop.o: inf-loop.c $(defs_h) $(infer
*** 1292,1298 ****
$(event_top_h)
exec.o: exec.c $(defs_h) $(gdbcmd_h) $(gdbcore_h) $(inferior_h) \
! target.h language.h gdb_string.h
expprint.o: expprint.c $(defs_h) $(expression_h) $(gdbtypes_h) \
language.h parser-defs.h $(symtab_h) $(value_h)
--- 1292,1298 ----
$(event_top_h)
exec.o: exec.c $(defs_h) $(gdbcmd_h) $(gdbcore_h) $(inferior_h) \
! target.h language.h gdb_string.h completer.h
expprint.o: expprint.c $(defs_h) $(expression_h) $(gdbtypes_h) \
language.h parser-defs.h $(symtab_h) $(value_h)
*************** v850-tdep.o: v850-tdep.c $(defs_h) $(fra
*** 1396,1402 ****
tracepoint.o: tracepoint.c $(defs_h) $(symtab_h) $(frame_h) $(tracepoint_h) \
$(gdbtypes_h) $(expression_h) $(gdbcmd_h) $(value_h) target.h \
! language.h gdb_string.h $(readline_headers) $(remote_h)
gdbarch.o: gdbarch.c $(defs_h) $(bfd_h) $(gdbcmd_h)
--- 1396,1402 ----
tracepoint.o: tracepoint.c $(defs_h) $(symtab_h) $(frame_h) $(tracepoint_h) \
$(gdbtypes_h) $(expression_h) $(gdbcmd_h) $(value_h) target.h \
! language.h gdb_string.h $(readline_headers) $(remote_h) linespec.h
gdbarch.o: gdbarch.c $(defs_h) $(bfd_h) $(gdbcmd_h)
*************** hp-symtab-read.o: hp-symtab-read.c hprea
*** 1652,1658 ****
parse.o: parse.c $(command_h) $(defs_h) $(expression_h) $(frame_h) \
$(gdbtypes_h) language.h parser-defs.h $(symtab_h) $(value_h) \
! gdb_string.h
ppc-bdm.o: ppc-bdm.c $(defs_h) $(gdbcore_h) gdb_string.h $(frame_h) \
$(inferior_h) $(bfd_h) symfile.h target.h gdb_wait.h $(gdbcmd_h) \
--- 1652,1658 ----
parse.o: parse.c $(command_h) $(defs_h) $(expression_h) $(frame_h) \
$(gdbtypes_h) language.h parser-defs.h $(symtab_h) $(value_h) \
! gdb_string.h linespec.h
ppc-bdm.o: ppc-bdm.c $(defs_h) $(gdbcore_h) gdb_string.h $(frame_h) \
$(inferior_h) $(bfd_h) symfile.h target.h gdb_wait.h $(gdbcmd_h) \
*************** solib-svr4.o: solib.c $(command_h) $(def
*** 1848,1854 ****
source.o: source.c $(defs_h) $(expression_h) $(frame_h) $(gdbcmd_h) \
$(gdbcore_h) language.h objfiles.h gnu-regex.h symfile.h $(symtab_h) \
! gdb_string.h source.h
sparc-nat.o: sparc-nat.c $(bfd_h) $(defs_h) $(inferior_h) $(gdbcore_h) \
target.h
--- 1848,1854 ----
source.o: source.c $(defs_h) $(expression_h) $(frame_h) $(gdbcmd_h) \
$(gdbcore_h) language.h objfiles.h gnu-regex.h symfile.h $(symtab_h) \
! gdb_string.h source.h completer.h linespec.h
sparc-nat.o: sparc-nat.c $(bfd_h) $(defs_h) $(inferior_h) $(gdbcore_h) \
target.h
*************** sun386-nat.o: sun386-nat.c $(defs_h) $(i
*** 1884,1890 ****
symfile.o: symfile.c $(breakpoint_h) complaints.h $(defs_h) \
$(expression_h) $(gdbcmd_h) $(gdbcore_h) $(gdbtypes_h) \
language.h objfiles.h symfile.h $(symtab_h) target.h \
! gdb_string.h
symm-tdep.o: symm-tdep.c $(defs_h) $(gdbcore_h) $(inferior_h)
--- 1884,1890 ----
symfile.o: symfile.c $(breakpoint_h) complaints.h $(defs_h) \
$(expression_h) $(gdbcmd_h) $(gdbcore_h) $(gdbtypes_h) \
language.h objfiles.h symfile.h $(symtab_h) target.h \
! gdb_string.h completer.h
symm-tdep.o: symm-tdep.c $(defs_h) $(gdbcore_h) $(inferior_h)
*************** symmisc.o: symmisc.c $(bfd_h) $(breakpoi
*** 1897,1906 ****
symtab.o: symtab.c call-cmds.h $(defs_h) $(expression_h) $(frame_h) \
$(gdbcmd_h) $(gdbcore_h) $(gdbtypes_h) language.h objfiles.h \
gnu-regex.h symfile.h $(symtab_h) target.h $(value_h) \
! gdb_string.h
! linespec.o: linespec.c $(defs_h) $(gdbcmd_h) $(gdbtypes_h) objfiles.h \
! symfile.h $(symtab_h) $(INCLUDE_DIR)/demangle.h inferior.h
# OBSOLETE tahoe-tdep.o: tahoe-tdep.c $(OP_INCLUDE)/tahoe.h $(defs_h) \
# OBSOLETE $(symtab_h)
--- 1897,1907 ----
symtab.o: symtab.c call-cmds.h $(defs_h) $(expression_h) $(frame_h) \
$(gdbcmd_h) $(gdbcore_h) $(gdbtypes_h) language.h objfiles.h \
gnu-regex.h symfile.h $(symtab_h) target.h $(value_h) \
! gdb_string.h linespec.h
! linespec.o: linespec.c linespec.h $(defs_h) $(frame_h) $(value_h) \
! objfiles.h symfile.h completer.h $(symtab_h) \
! $(INCLUDE_DIR)/demangle.h command.h
# OBSOLETE tahoe-tdep.o: tahoe-tdep.c $(OP_INCLUDE)/tahoe.h $(defs_h) \
# OBSOLETE $(symtab_h)
*************** target.o: target.c $(bfd_h) $(defs_h) $(
*** 1912,1920 ****
thread.o: thread.c $(defs_h) gdbthread.h $(gdbcmd_h) target.h
top.o: top.c top.h $(bfd_h) $(getopt_h) $(readline_headers) call-cmds.h \
$(defs_h) $(gdbcmd_h) $(inferior_h) language.h signals.h \
! $(remote_utils_h) gdb_string.h $(event_loop_h) $(event_top_h) $(version_h)
typeprint.o: typeprint.c $(defs_h) $(expression_h) $(gdbcmd_h) \
$(gdbcore_h) $(gdbtypes_h) language.h $(symtab_h) target.h \
--- 1913,1925 ----
thread.o: thread.c $(defs_h) gdbthread.h $(gdbcmd_h) target.h
+ completer.o: completer.c completer.h $(gdbtypes_h) $(symtab_h) \
+ $(defs_h) $(gdbcmd_h) $(expression_h) $(readline_headers)
+
top.o: top.c top.h $(bfd_h) $(getopt_h) $(readline_headers) call-cmds.h \
$(defs_h) $(gdbcmd_h) $(inferior_h) language.h signals.h \
! $(remote_utils_h) gdb_string.h $(event_loop_h) $(event_top_h) \
! completer.h $(version_h)
typeprint.o: typeprint.c $(defs_h) $(expression_h) $(gdbcmd_h) \
$(gdbcore_h) $(gdbtypes_h) language.h $(symtab_h) target.h \
Index: gdb/alpha-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/alpha-tdep.c,v
retrieving revision 1.4
diff -c -p -r1.4 alpha-tdep.c
*** alpha-tdep.c 2000/08/03 02:48:09 1.4
--- alpha-tdep.c 2000/11/30 23:30:46
***************
*** 29,34 ****
--- 29,35 ----
#include "symfile.h"
#include "objfiles.h"
#include "gdb_string.h"
+ #include "linespec.h"
/* FIXME: Some of this code should perhaps be merged with mips-tdep.c. */
Index: gdb/breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.20
diff -c -p -r1.20 breakpoint.c
*** breakpoint.c 2000/11/27 02:18:44 1.20
--- breakpoint.c 2000/11/30 23:30:48
***************
*** 39,44 ****
--- 39,45 ----
#include "annotate.h"
#include "symfile.h"
#include "objfiles.h"
+ #include "linespec.h"
#ifdef UI_OUT
#include "ui-out.h"
#endif
Index: gdb/corefile.c
===================================================================
RCS file: /cvs/src/src/gdb/corefile.c,v
retrieving revision 1.7
diff -c -p -r1.7 corefile.c
*** corefile.c 2000/08/10 00:58:09 1.7
--- corefile.c 2000/11/30 23:30:48
***************
*** 37,42 ****
--- 37,43 ----
#include "gdb_stat.h"
#include "symfile.h"
#include "objfiles.h"
+ #include "completer.h"
/* Local function declarations. */
Index: gdb/exec.c
===================================================================
RCS file: /cvs/src/src/gdb/exec.c,v
retrieving revision 1.6
diff -c -p -r1.6 exec.c
*** exec.c 2000/07/30 01:48:25 1.6
--- exec.c 2000/11/30 23:30:49
***************
*** 27,32 ****
--- 27,33 ----
#include "language.h"
#include "symfile.h"
#include "objfiles.h"
+ #include "completer.h"
#ifdef USG
#include <sys/types.h>
Index: gdb/linespec.c
===================================================================
RCS file: /cvs/src/src/gdb/linespec.c,v
retrieving revision 1.2
diff -c -p -r1.2 linespec.c
*** linespec.c 2000/11/19 17:27:38 1.2
--- linespec.c 2000/11/30 23:30:49
***************
*** 21,32 ****
#include "defs.h"
#include "symtab.h"
! #include "gdbtypes.h"
#include "symfile.h"
#include "objfiles.h"
- #include "gdbcmd.h"
#include "demangle.h"
! #include "inferior.h"
/* Prototype for one function in parser-defs.h,
instead of including that entire file. */
--- 21,33 ----
#include "defs.h"
#include "symtab.h"
! #include "frame.h"
! #include "command.h"
#include "symfile.h"
#include "objfiles.h"
#include "demangle.h"
! #include "value.h"
! #include "completer.h"
/* Prototype for one function in parser-defs.h,
instead of including that entire file. */
*************** decode_line_1 (char **argptr, int funfir
*** 573,579 ****
/* Maybe arg is FILE : LINENUM or FILE : FUNCTION */
is_quoted = (**argptr
! && strchr (gdb_completer_quote_characters, **argptr) != NULL);
has_parens = ((pp = strchr (*argptr, '(')) != NULL
&& (pp = strrchr (pp, ')')) != NULL);
--- 574,581 ----
/* Maybe arg is FILE : LINENUM or FILE : FUNCTION */
is_quoted = (**argptr
! && strchr (get_gdb_completer_quote_characters (),
! **argptr) != NULL);
has_parens = ((pp = strchr (*argptr, '(')) != NULL
&& (pp = strrchr (pp, ')')) != NULL);
*************** decode_line_1 (char **argptr, int funfir
*** 727,733 ****
/* Arg token is not digits => try it as a function name
Find the next token(everything up to end or next blank). */
if (**argptr
! && strchr (gdb_completer_quote_characters, **argptr) != NULL)
{
p = skip_quoted (*argptr);
*argptr = *argptr + 1;
--- 729,736 ----
/* Arg token is not digits => try it as a function name
Find the next token(everything up to end or next blank). */
if (**argptr
! && strchr (get_gdb_completer_quote_characters (),
! **argptr) != NULL)
{
p = skip_quoted (*argptr);
*argptr = *argptr + 1;
*************** decode_line_1 (char **argptr, int funfir
*** 766,772 ****
copy[p - *argptr] = '\0';
if (p != *argptr
&& copy[p - *argptr - 1]
! && strchr (gdb_completer_quote_characters,
copy[p - *argptr - 1]) != NULL)
copy[p - *argptr - 1] = '\0';
}
--- 769,775 ----
copy[p - *argptr] = '\0';
if (p != *argptr
&& copy[p - *argptr - 1]
! && strchr (get_gdb_completer_quote_characters (),
copy[p - *argptr - 1]) != NULL)
copy[p - *argptr - 1] = '\0';
}
*************** decode_line_1 (char **argptr, int funfir
*** 1097,1103 ****
if (p != *argptr
&& copy[0]
&& copy[0] == copy[p - *argptr - 1]
! && strchr (gdb_completer_quote_characters, copy[0]) != NULL)
{
copy[p - *argptr - 1] = '\0';
copy++;
--- 1100,1106 ----
if (p != *argptr
&& copy[0]
&& copy[0] == copy[p - *argptr - 1]
! && strchr (get_gdb_completer_quote_characters (), copy[0]) != NULL)
{
copy[p - *argptr - 1] = '\0';
copy++;
Index: gdb/parse.c
===================================================================
RCS file: /cvs/src/src/gdb/parse.c,v
retrieving revision 1.9
diff -c -p -r1.9 parse.c
*** parse.c 2000/08/07 14:27:36 1.9
--- parse.c 2000/11/30 23:30:49
***************
*** 41,46 ****
--- 41,47 ----
#include "command.h"
#include "language.h"
#include "parser-defs.h"
+ #include "linespec.h"
#include "gdbcmd.h"
#include "symfile.h" /* for overlay functions */
#include "inferior.h" /* for NUM_PSEUDO_REGS. NOTE: replace
Index: gdb/ser-unix.c
===================================================================
RCS file: /cvs/src/src/gdb/ser-unix.c,v
retrieving revision 1.8
diff -c -p -r1.8 ser-unix.c
*** ser-unix.c 2000/10/30 21:50:57 1.8
--- ser-unix.c 2000/11/30 23:30:50
*************** do_unix_readchar (serial_t scb, int time
*** 920,930 ****
someone else might have freed it. The ui_loop_hook signals that
we should exit by returning 1. */
! if (ui_loop_hook)
! {
! if (ui_loop_hook (0))
! return SERIAL_TIMEOUT;
! }
status = ser_unix_wait_for (scb, delta);
if (timeout > 0)
--- 920,934 ----
someone else might have freed it. The ui_loop_hook signals that
we should exit by returning 1. */
! /* NOTE: To prevent GUI commands to be issued while we are executing
! a previous one, we just call the GUI hook when we have an infinite
! timeout (that means that our target is running). FN */
!
! if (ui_loop_hook && (timeout < 0))
! {
! if (ui_loop_hook (0))
! return SERIAL_TIMEOUT;
! }
status = ser_unix_wait_for (scb, delta);
if (timeout > 0)
Index: gdb/source.c
===================================================================
RCS file: /cvs/src/src/gdb/source.c,v
retrieving revision 1.4
diff -c -p -r1.4 source.c
*** source.c 2000/07/30 01:48:27 1.4
--- source.c 2000/11/30 23:30:51
***************
*** 38,43 ****
--- 38,45 ----
#include "objfiles.h"
#include "annotate.h"
#include "gdbtypes.h"
+ #include "linespec.h"
+ #include "completer.h"
#ifdef UI_OUT
#include "ui-out.h"
#endif
Index: gdb/symfile.c
===================================================================
RCS file: /cvs/src/src/gdb/symfile.c,v
retrieving revision 1.20
diff -c -p -r1.20 symfile.c
*** symfile.c 2000/10/27 15:02:42 1.20
--- symfile.c 2000/11/30 23:30:52
***************
*** 36,41 ****
--- 36,42 ----
#include "inferior.h" /* for write_pc */
#include "gdb-stabs.h"
#include "obstack.h"
+ #include "completer.h"
#include <assert.h>
#include <sys/types.h>
Index: gdb/symtab.c
===================================================================
RCS file: /cvs/src/src/gdb/symtab.c,v
retrieving revision 1.23
diff -c -p -r1.23 symtab.c
*** symtab.c 2000/11/19 17:27:38 1.23
--- symtab.c 2000/11/30 23:30:52
***************
*** 35,40 ****
--- 35,41 ----
#include "language.h"
#include "demangle.h"
#include "inferior.h"
+ #include "linespec.h"
#include "obstack.h"
Index: gdb/top.c
===================================================================
RCS file: /cvs/src/src/gdb/top.c,v
retrieving revision 1.22
diff -c -p -r1.22 top.c
*** top.c 2000/11/27 02:18:44 1.22
--- top.c 2000/11/30 23:30:55
***************
*** 32,37 ****
--- 32,38 ----
#include "language.h"
#include "terminal.h" /* For job_control. */
#include "annotate.h"
+ #include "completer.h"
#include "top.h"
#include "version.h"
*************** static void init_signals (void);
*** 69,76 ****
static void stop_sig (int);
#endif
- static char *line_completion_function (char *, int, char *, int);
-
static char *readline_line_completion_function (char *, int);
static void while_command (char *, int);
--- 70,75 ----
*************** noop_completer (char *text, char *prefix
*** 1832,2186 ****
return NULL;
}
- /* Complete on filenames. */
- char **
- filename_completer (char *text, char *word)
- {
- /* From readline. */
- extern char *filename_completion_function (char *, int);
- int subsequent_name;
- char **return_val;
- int return_val_used;
- int return_val_alloced;
-
- return_val_used = 0;
- /* Small for testing. */
- return_val_alloced = 1;
- return_val = (char **) xmalloc (return_val_alloced * sizeof (char *));
-
- subsequent_name = 0;
- while (1)
- {
- char *p;
- p = filename_completion_function (text, subsequent_name);
- if (return_val_used >= return_val_alloced)
- {
- return_val_alloced *= 2;
- return_val =
- (char **) xrealloc (return_val,
- return_val_alloced * sizeof (char *));
- }
- if (p == NULL)
- {
- return_val[return_val_used++] = p;
- break;
- }
- /* We need to set subsequent_name to a non-zero value before the
- continue line below, because otherwise, if the first file seen
- by GDB is a backup file whose name ends in a `~', we will loop
- indefinitely. */
- subsequent_name = 1;
- /* Like emacs, don't complete on old versions. Especially useful
- in the "source" command. */
- if (p[strlen (p) - 1] == '~')
- continue;
-
- {
- char *q;
- if (word == text)
- /* Return exactly p. */
- return_val[return_val_used++] = p;
- else if (word > text)
- {
- /* Return some portion of p. */
- q = xmalloc (strlen (p) + 5);
- strcpy (q, p + (word - text));
- return_val[return_val_used++] = q;
- free (p);
- }
- else
- {
- /* Return some of TEXT plus p. */
- q = xmalloc (strlen (p) + (text - word) + 5);
- strncpy (q, word, text - word);
- q[text - word] = '\0';
- strcat (q, p);
- return_val[return_val_used++] = q;
- free (p);
- }
- }
- }
- #if 0
- /* There is no way to do this just long enough to affect quote inserting
- without also affecting the next completion. This should be fixed in
- readline. FIXME. */
- /* Insure that readline does the right thing
- with respect to inserting quotes. */
- rl_completer_word_break_characters = "";
- #endif
- return return_val;
- }
-
- /* Here are some useful test cases for completion. FIXME: These should
- be put in the test suite. They should be tested with both M-? and TAB.
-
- "show output-" "radix"
- "show output" "-radix"
- "p" ambiguous (commands starting with p--path, print, printf, etc.)
- "p " ambiguous (all symbols)
- "info t foo" no completions
- "info t " no completions
- "info t" ambiguous ("info target", "info terminal", etc.)
- "info ajksdlfk" no completions
- "info ajksdlfk " no completions
- "info" " "
- "info " ambiguous (all info commands)
- "p \"a" no completions (string constant)
- "p 'a" ambiguous (all symbols starting with a)
- "p b-a" ambiguous (all symbols starting with a)
- "p b-" ambiguous (all symbols)
- "file Make" "file" (word break hard to screw up here)
- "file ../gdb.stabs/we" "ird" (needs to not break word at slash)
- */
-
- /* Generate completions one by one for the completer. Each time we are
- called return another potential completion to the caller.
- line_completion just completes on commands or passes the buck to the
- command's completer function, the stuff specific to symbol completion
- is in make_symbol_completion_list.
-
- TEXT is the caller's idea of the "word" we are looking at.
-
- MATCHES is the number of matches that have currently been collected from
- calling this completion function. When zero, then we need to initialize,
- otherwise the initialization has already taken place and we can just
- return the next potential completion string.
-
- LINE_BUFFER is available to be looked at; it contains the entire text
- of the line. POINT is the offset in that line of the cursor. You
- should pretend that the line ends at POINT.
-
- Returns NULL if there are no more completions, else a pointer to a string
- which is a possible completion, it is the caller's responsibility to
- free the string. */
-
- static char *
- line_completion_function (char *text, int matches, char *line_buffer, int point)
- {
- static char **list = (char **) NULL; /* Cache of completions */
- static int index; /* Next cached completion */
- char *output = NULL;
- char *tmp_command, *p;
- /* Pointer within tmp_command which corresponds to text. */
- char *word;
- struct cmd_list_element *c, *result_list;
-
- if (matches == 0)
- {
- /* The caller is beginning to accumulate a new set of completions, so
- we need to find all of them now, and cache them for returning one at
- a time on future calls. */
-
- if (list)
- {
- /* Free the storage used by LIST, but not by the strings inside.
- This is because rl_complete_internal () frees the strings. */
- free ((PTR) list);
- }
- list = 0;
- index = 0;
-
- /* Choose the default set of word break characters to break completions.
- If we later find out that we are doing completions on command strings
- (as opposed to strings supplied by the individual command completer
- functions, which can be any string) then we will switch to the
- special word break set for command strings, which leaves out the
- '-' character used in some commands. */
-
- rl_completer_word_break_characters =
- gdb_completer_word_break_characters;
-
- /* Decide whether to complete on a list of gdb commands or on symbols. */
- tmp_command = (char *) alloca (point + 1);
- p = tmp_command;
-
- strncpy (tmp_command, line_buffer, point);
- tmp_command[point] = '\0';
- /* Since text always contains some number of characters leading up
- to point, we can find the equivalent position in tmp_command
- by subtracting that many characters from the end of tmp_command. */
- word = tmp_command + point - strlen (text);
-
- if (point == 0)
- {
- /* An empty line we want to consider ambiguous; that is, it
- could be any command. */
- c = (struct cmd_list_element *) -1;
- result_list = 0;
- }
- else
- {
- c = lookup_cmd_1 (&p, cmdlist, &result_list, 1);
- }
-
- /* Move p up to the next interesting thing. */
- while (*p == ' ' || *p == '\t')
- {
- p++;
- }
-
- if (!c)
- {
- /* It is an unrecognized command. So there are no
- possible completions. */
- list = NULL;
- }
- else if (c == (struct cmd_list_element *) -1)
- {
- char *q;
-
- /* lookup_cmd_1 advances p up to the first ambiguous thing, but
- doesn't advance over that thing itself. Do so now. */
- q = p;
- while (*q && (isalnum (*q) || *q == '-' || *q == '_'))
- ++q;
- if (q != tmp_command + point)
- {
- /* There is something beyond the ambiguous
- command, so there are no possible completions. For
- example, "info t " or "info t foo" does not complete
- to anything, because "info t" can be "info target" or
- "info terminal". */
- list = NULL;
- }
- else
- {
- /* We're trying to complete on the command which was ambiguous.
- This we can deal with. */
- if (result_list)
- {
- list = complete_on_cmdlist (*result_list->prefixlist, p,
- word);
- }
- else
- {
- list = complete_on_cmdlist (cmdlist, p, word);
- }
- /* Insure that readline does the right thing with respect to
- inserting quotes. */
- rl_completer_word_break_characters =
- gdb_completer_command_word_break_characters;
- }
- }
- else
- {
- /* We've recognized a full command. */
-
- if (p == tmp_command + point)
- {
- /* There is no non-whitespace in the line beyond the command. */
-
- if (p[-1] == ' ' || p[-1] == '\t')
- {
- /* The command is followed by whitespace; we need to complete
- on whatever comes after command. */
- if (c->prefixlist)
- {
- /* It is a prefix command; what comes after it is
- a subcommand (e.g. "info "). */
- list = complete_on_cmdlist (*c->prefixlist, p, word);
-
- /* Insure that readline does the right thing
- with respect to inserting quotes. */
- rl_completer_word_break_characters =
- gdb_completer_command_word_break_characters;
- }
- else if (c->enums)
- {
- list = complete_on_enum (c->enums, p, word);
- rl_completer_word_break_characters =
- gdb_completer_command_word_break_characters;
- }
- else
- {
- /* It is a normal command; what comes after it is
- completed by the command's completer function. */
- list = (*c->completer) (p, word);
- if (c->completer == filename_completer)
- rl_completer_word_break_characters =
- gdb_completer_file_name_break_characters;
- }
- }
- else
- {
- /* The command is not followed by whitespace; we need to
- complete on the command itself. e.g. "p" which is a
- command itself but also can complete to "print", "ptype"
- etc. */
- char *q;
-
- /* Find the command we are completing on. */
- q = p;
- while (q > tmp_command)
- {
- if (isalnum (q[-1]) || q[-1] == '-' || q[-1] == '_')
- --q;
- else
- break;
- }
-
- list = complete_on_cmdlist (result_list, q, word);
-
- /* Insure that readline does the right thing
- with respect to inserting quotes. */
- rl_completer_word_break_characters =
- gdb_completer_command_word_break_characters;
- }
- }
- else
- {
- /* There is non-whitespace beyond the command. */
-
- if (c->prefixlist && !c->allow_unknown)
- {
- /* It is an unrecognized subcommand of a prefix command,
- e.g. "info adsfkdj". */
- list = NULL;
- }
- else if (c->enums)
- {
- list = complete_on_enum (c->enums, p, word);
- }
- else
- {
- /* It is a normal command. */
- list = (*c->completer) (p, word);
- if (c->completer == filename_completer)
- rl_completer_word_break_characters =
- gdb_completer_file_name_break_characters;
- }
- }
- }
- }
-
- /* If we found a list of potential completions during initialization then
- dole them out one at a time. The vector of completions is NULL
- terminated, so after returning the last one, return NULL (and continue
- to do so) each time we are called after that, until a new list is
- available. */
-
- if (list)
- {
- output = list[index];
- if (output)
- {
- index++;
- }
- }
-
- #if 0
- /* Can't do this because readline hasn't yet checked the word breaks
- for figuring out whether to insert a quote. */
- if (output == NULL)
- /* Make sure the word break characters are set back to normal for the
- next time that readline tries to complete something. */
- rl_completer_word_break_characters =
- gdb_completer_word_break_characters;
- #endif
-
- return (output);
- }
-
/* Line completion interface function for readline. */
static char *
--- 1831,1836 ----
*************** readline_line_completion_function (char
*** 2189,2230 ****
return line_completion_function (text, matches, rl_line_buffer, rl_point);
}
- /* Skip over a possibly quoted word (as defined by the quote characters
- and word break characters the completer uses). Returns pointer to the
- location after the "word". */
-
- char *
- skip_quoted (char *str)
- {
- char quote_char = '\0';
- char *scan;
-
- for (scan = str; *scan != '\0'; scan++)
- {
- if (quote_char != '\0')
- {
- /* Ignore everything until the matching close quote char */
- if (*scan == quote_char)
- {
- /* Found matching close quote. */
- scan++;
- break;
- }
- }
- else if (strchr (gdb_completer_quote_characters, *scan))
- {
- /* Found start of a quoted string. */
- quote_char = *scan;
- }
- else if (strchr (gdb_completer_word_break_characters, *scan))
- {
- break;
- }
- }
- return (scan);
- }
-
#ifdef STOP_SIGNAL
static void
stop_sig (int signo)
--- 1839,1845 ----
Index: gdb/tracepoint.c
===================================================================
RCS file: /cvs/src/src/gdb/tracepoint.c,v
retrieving revision 1.13
diff -c -p -r1.13 tracepoint.c
*** tracepoint.c 2000/11/16 14:51:49 1.13
--- tracepoint.c 2000/11/30 23:30:56
***************
*** 31,36 ****
--- 31,37 ----
#include "inferior.h"
#include "tracepoint.h"
#include "remote.h"
+ #include "linespec.h"
#include "ax.h"
#include "ax-gdb.h"
--
Fernando Nasser
Red Hat Canada Ltd. E-Mail: fnasser@redhat.com
2323 Yonge Street, Suite #300
Toronto, Ontario M4P 2C9