This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[patch] CLI separation, take #2 completer.[ch]


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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]