* gdbtypes.c (gdbtypes_post_init): Change names of decimal float types
[deliverable/binutils-gdb.git] / gdb / completer.c
index 4274241b00e0f6757a93982693968ee0c6663e31..7005a5dc0343423fd05abbc72dbf4201974b71a6 100644 (file)
@@ -1,11 +1,11 @@
 /* Line completion stuff for GDB, the GNU debugger.
-   Copyright 2000, 2001 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2007 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
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    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.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "expression.h"
-#include "filenames.h"         /* for DOSish file names */
+#include "filenames.h"         /* For DOSish file names.  */
+#include "language.h"
 
 #include "cli/cli-decode.h"
 
-/* FIXME: This is needed because of lookup_cmd_1().
-   We should be calling a hook instead so we eliminate the CLI dependency. */
+/* 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() and for
    rl_filename_completion_function.  */
-#include <readline/readline.h>
+#include "readline/readline.h"
 
 /* readline defines this.  */
 #undef savestring
 
 #include "completer.h"
 
-/* Prototypes for local functions */
+/* Prototypes for local functions */
 static
-char *line_completion_function (const char *text, int matches, char *line_buffer,
+char *line_completion_function (const char *text, int matches, 
+                               char *line_buffer,
                                int point);
 
 /* readline uses the word breaks for two things:
@@ -51,19 +51,17 @@ char *line_completion_function (const char *text, int matches, char *line_buffer
    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
+   current_language->la_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. */
+   a leading quote.  */
 static char *gdb_completer_command_word_break_characters =
 " \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,";
 
@@ -85,16 +83,10 @@ static char *gdb_completer_loc_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. */
+   as strings.  */
 static char *gdb_completer_quote_characters = "'";
 \f
-/* Accessor for some completer data that may interest other files. */
-
-char *
-get_gdb_completer_word_break_characters (void)
-{
-  return gdb_completer_word_break_characters;
-}
+/* Accessor for some completer data that may interest other files.  */
 
 char *
 get_gdb_completer_quote_characters (void)
@@ -135,7 +127,7 @@ filename_completer (char *text, char *word)
   subsequent_name = 0;
   while (1)
     {
-      char *p;
+      char *p, *q;
       p = rl_filename_completion_function (text, subsequent_name);
       if (return_val_used >= return_val_alloced)
        {
@@ -157,38 +149,38 @@ filename_completer (char *text, char *word)
       /* Like emacs, don't complete on old versions.  Especially useful
          in the "source" command.  */
       if (p[strlen (p) - 1] == '~')
-       continue;
+       {
+         xfree (p);
+         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;
-           xfree (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;
-           xfree (p);
-         }
-      }
+      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;
+         xfree (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;
+         xfree (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
+  /* Ensure that readline does the right thing
      with respect to inserting quotes.  */
   rl_completer_word_break_characters = "";
 #endif
@@ -237,7 +229,7 @@ location_completer (char *text, char *word)
          if (*p == quote_found)
            quote_found = 0;
          else
-           break;              /* hit the end of text */
+           break;              /* Hit the end of text.  */
        }
 #if HAVE_DOS_BASED_FILE_SYSTEM
       /* If we have a DOS-style absolute file name at the beginning of
@@ -251,7 +243,7 @@ location_completer (char *text, char *word)
          colon = p;
          symbol_start = p + 1;
        }
-      else if (strchr (gdb_completer_word_break_characters, *p))
+      else if (strchr (current_language->la_word_break_characters(), *p))
        symbol_start = p + 1;
     }
 
@@ -287,7 +279,8 @@ location_completer (char *text, char *word)
       list = make_symbol_completion_list (symbol_start, word);
       /* If text includes characters which cannot appear in a file
         name, they cannot be asking for completion on files.  */
-      if (strcspn (text, gdb_completer_file_name_break_characters) == text_len)
+      if (strcspn (text, 
+                  gdb_completer_file_name_break_characters) == text_len)
        fn_list = make_source_files_completion_list (text, text);
     }
 
@@ -337,7 +330,10 @@ location_completer (char *text, char *word)
       /* No completions at all.  As the final resort, try completing
         on the entire text as a symbol.  */
       list = make_symbol_completion_list (orig_text, word);
+      xfree (fn_list);
     }
+  else
+    xfree (fn_list);
 
   return list;
 }
@@ -399,9 +395,9 @@ complete_line (const char *text, char *line_buffer, int point)
      '-' character used in some commands.  */
 
   rl_completer_word_break_characters =
-    gdb_completer_word_break_characters;
+    current_language->la_word_break_characters();
 
-      /* Decide whether to complete on a list of gdb commands or on symbols. */
+  /* Decide whether to complete on a list of gdb commands or on symbols. */
   tmp_command = (char *) alloca (point + 1);
   p = tmp_command;
 
@@ -467,7 +463,7 @@ complete_line (const char *text, char *line_buffer, int point)
            {
              list = complete_on_cmdlist (cmdlist, p, word);
            }
-         /* Insure that readline does the right thing with respect to
+         /* Ensure that readline does the right thing with respect to
             inserting quotes.  */
          rl_completer_word_break_characters =
            gdb_completer_command_word_break_characters;
@@ -491,8 +487,8 @@ complete_line (const char *text, char *line_buffer, int point)
                     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.  */
+                 /* Ensure that readline does the right thing
+                    with respect to inserting quotes.  */
                  rl_completer_word_break_characters =
                    gdb_completer_command_word_break_characters;
                }
@@ -557,8 +553,8 @@ complete_line (const char *text, char *line_buffer, int point)
 
              list = complete_on_cmdlist (result_list, q, word);
 
-                 /* Insure that readline does the right thing
-                    with respect to inserting quotes.  */
+             /* Ensure that readline does the right thing
+                with respect to inserting quotes.  */
              rl_completer_word_break_characters =
                gdb_completer_command_word_break_characters;
            }
@@ -630,22 +626,23 @@ complete_line (const char *text, char *line_buffer, int point)
    free the string.  */
 
 static char *
-line_completion_function (const char *text, int matches, char *line_buffer, int point)
+line_completion_function (const char *text, int matches, 
+                         char *line_buffer, int point)
 {
-  static char **list = (char **) NULL; /* Cache of completions */
-  static int index;            /* Next cached completion */
+  static char **list = (char **) NULL; /* Cache of completions */
+  static int index;                    /* Next cached completion.  */
   char *output = NULL;
 
   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. */
+         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. */
+            This is because rl_complete_internal () frees the strings.  */
          xfree (list);
        }
       index = 0;
@@ -656,7 +653,7 @@ line_completion_function (const char *text, int matches, char *line_buffer, int
      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. */
+     available.  */
 
   if (list)
     {
@@ -674,7 +671,7 @@ line_completion_function (const char *text, int matches, char *line_buffer, int
     /* 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;
+      current_language->la_word_break_characters();
 #endif
 
   return (output);
@@ -696,16 +693,16 @@ skip_quoted_chars (char *str, char *quotechars, char *breakchars)
     quotechars = gdb_completer_quote_characters;
 
   if (breakchars == NULL)
-    breakchars = gdb_completer_word_break_characters;
+    breakchars = current_language->la_word_break_characters();
 
   for (scan = str; *scan != '\0'; scan++)
     {
       if (quote_char != '\0')
        {
-         /* Ignore everything until the matching close quote char */
+         /* Ignore everything until the matching close quote char */
          if (*scan == quote_char)
            {
-             /* Found matching close quote. */
+             /* Found matching close quote.  */
              scan++;
              break;
            }
@@ -726,7 +723,7 @@ skip_quoted_chars (char *str, char *quotechars, char *breakchars)
 
 /* Skip over the possibly quoted word STR (as defined by the quote
    characters and word break characters used by the completer).
-   Returns pointer to the location after the "word". */
+   Returns pointer to the location after the "word".  */
 
 char *
 skip_quoted (char *str)
This page took 0.028293 seconds and 4 git commands to generate.