* serial.h (SERIAL_SET_TTY_STATE): Comment return value.
[deliverable/binutils-gdb.git] / gdb / command.c
index dc5a92f571280d6141007a6a438e12bc150b86f0..de8bd2a0b9c29967c0e3b51063b44dd2951d9fd1 100644 (file)
@@ -31,7 +31,7 @@ static void
 show_user PARAMS ((char *, int));
 
 static void
-show_user_1 PARAMS ((struct cmd_list_element *, FILE *));
+show_user_1 PARAMS ((struct cmd_list_element *, GDB_FILE *));
 
 static void
 make_command PARAMS ((char *, int));
@@ -43,7 +43,7 @@ static int
 parse_binary_operation PARAMS ((char *));
 
 static void
-print_doc_line PARAMS ((FILE *, char *));
+print_doc_line PARAMS ((GDB_FILE *, char *));
 
 /* Add element named NAME.
    CLASS is the top level category into which commands are broken down
@@ -247,7 +247,7 @@ add_show_from_set (setcmd, list)
       && setcmd->doc[2] == 't' && setcmd->doc[3] == ' ')
     showcmd->doc = concat ("Show ", setcmd->doc + 4, NULL);
   else
-    fprintf (stderr, "GDB internal error: Bad docstring for set command\n");
+    fprintf_unfiltered (gdb_stderr, "GDB internal error: Bad docstring for set command\n");
   
   showcmd->next = *list;
   *list = showcmd;
@@ -303,7 +303,7 @@ delete_cmd (name, list)
 void
 help_cmd (command, stream)
      char *command;
-     FILE *stream;
+     GDB_FILE *stream;
 {
   struct cmd_list_element *c;
   extern struct cmd_list_element *cmdlist;
@@ -368,7 +368,7 @@ help_list (list, cmdtype, class, stream)
      struct cmd_list_element *list;
      char *cmdtype;
      enum command_class class;
-     FILE *stream;
+     GDB_FILE *stream;
 {
   int len;
   char *cmdtype1, *cmdtype2;
@@ -409,7 +409,7 @@ Command name abbreviations are allowed if unambiguous.\n",
 /* Print only the first line of STR on STREAM.  */
 static void
 print_doc_line (stream, str)
-     FILE *stream;
+     GDB_FILE *stream;
      char *str;
 {
   static char *line_buffer = 0;
@@ -460,7 +460,7 @@ help_cmd_list (list, class, prefix, recurse, stream)
      enum command_class class;
      char *prefix;
      int recurse;
-     FILE *stream;
+     GDB_FILE *stream;
 {
   register struct cmd_list_element *c;
 
@@ -504,7 +504,10 @@ help_cmd_list (list, class, prefix, recurse, stream)
    "info" matches without ambiguity, but "a" could be "args" or "address", so
    *RESULT_LIST is set to the cmd_list_element for "info".  So in this case
    RESULT_LIST should not be interpeted as a pointer to the beginning of a
-   list; it simply points to a specific command.
+   list; it simply points to a specific command.  In the case of an ambiguous
+   return *TEXT is advanced past the last non-ambiguous prefix (e.g.
+   "info t" can be "info types" or "info target"; upon return *TEXT has been
+   advanced past "info ").
 
    If RESULT_LIST is NULL, don't set *RESULT_LIST (but don't otherwise
    affect the operation).
@@ -906,12 +909,18 @@ lookup_cmd (line, list, cmdtype, allow_unknown)
 /* Helper function for SYMBOL_COMPLETION_FUNCTION.  */
 
 /* Return a vector of char pointers which point to the different
-   possible completions in LIST of TEXT.  */
+   possible completions in LIST of TEXT.  
+
+   WORD points in the same buffer as TEXT, and completions should be
+   returned relative to this position.  For example, suppose TEXT is "foo"
+   and we want to complete to "foobar".  If WORD is "oo", return
+   "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
 
 char **
-complete_on_cmdlist (list, text)
+complete_on_cmdlist (list, text, word)
      struct cmd_list_element *list;
      char *text;
+     char *word;
 {
   struct cmd_list_element *ptr;
   char **matchlist;
@@ -938,8 +947,22 @@ complete_on_cmdlist (list, text)
          }
 
        matchlist[matches] = (char *) 
-         xmalloc (strlen (ptr->name) + 1);
-       strcpy (matchlist[matches++], ptr->name);
+         xmalloc (strlen (word) + strlen (ptr->name) + 1);
+       if (word == text)
+         strcpy (matchlist[matches], ptr->name);
+       else if (word > text)
+         {
+           /* Return some portion of ptr->name.  */
+           strcpy (matchlist[matches], ptr->name + (word - text));
+         }
+       else
+         {
+           /* Return some of text plus ptr->name.  */
+           strncpy (matchlist[matches], word, text - word);
+           matchlist[matches][text - word] = '\0';
+           strcat (matchlist[matches], ptr->name);
+         }
+       ++matches;
       }
 
   if (matches == 0)
@@ -1088,52 +1111,52 @@ do_setshow_command (arg, from_tty, c)
   else if (c->type == show_cmd)
     {
       /* Print doc minus "show" at start.  */
-      print_doc_line (stdout, c->doc + 5);
+      print_doc_line (gdb_stdout, c->doc + 5);
       
-      fputs_filtered (" is ", stdout);
+      fputs_filtered (" is ", gdb_stdout);
       wrap_here ("    ");
       switch (c->var_type)
        {
       case var_string:
        {
          unsigned char *p;
-         fputs_filtered ("\"", stdout);
+         fputs_filtered ("\"", gdb_stdout);
          for (p = *(unsigned char **) c->var; *p != '\0'; p++)
-           gdb_printchar (*p, stdout, '"');
-         fputs_filtered ("\"", stdout);
+           gdb_printchar (*p, gdb_stdout, '"');
+         fputs_filtered ("\"", gdb_stdout);
        }
        break;
       case var_string_noescape:
       case var_filename:
-       fputs_filtered ("\"", stdout);
-       fputs_filtered (*(char **) c->var, stdout);
-       fputs_filtered ("\"", stdout);
+       fputs_filtered ("\"", gdb_stdout);
+       fputs_filtered (*(char **) c->var, gdb_stdout);
+       fputs_filtered ("\"", gdb_stdout);
        break;
       case var_boolean:
-       fputs_filtered (*(int *) c->var ? "on" : "off", stdout);
+       fputs_filtered (*(int *) c->var ? "on" : "off", gdb_stdout);
        break;
       case var_uinteger:
        if (*(unsigned int *) c->var == UINT_MAX) {
-         fputs_filtered ("unlimited", stdout);
+         fputs_filtered ("unlimited", gdb_stdout);
          break;
        }
        /* else fall through */
       case var_zinteger:
-       fprintf_filtered (stdout, "%u", *(unsigned int *) c->var);
+       fprintf_filtered (gdb_stdout, "%u", *(unsigned int *) c->var);
        break;
       case var_integer:
        if (*(int *) c->var == INT_MAX)
          {
-           fputs_filtered ("unlimited", stdout);
+           fputs_filtered ("unlimited", gdb_stdout);
          }
        else
-         fprintf_filtered (stdout, "%d", *(int *) c->var);
+         fprintf_filtered (gdb_stdout, "%d", *(int *) c->var);
        break;
            
       default:
        error ("gdb internal error: bad var_type in do_setshow_command");
       }
-      fputs_filtered (".\n", stdout);
+      fputs_filtered (".\n", gdb_stdout);
     }
   else
     error ("gdb internal error: bad cmd_type in do_setshow_command");
@@ -1155,9 +1178,9 @@ cmd_show_list (list, from_tty, prefix)
       cmd_show_list (*list->prefixlist, from_tty, list->prefixname + 5);
     if (list->type == show_cmd)
       {
-       fputs_filtered (prefix, stdout);
-       fputs_filtered (list->name, stdout);
-       fputs_filtered (":  ", stdout);
+       fputs_filtered (prefix, gdb_stdout);
+       fputs_filtered (list->name, gdb_stdout);
+       fputs_filtered (":  ", gdb_stdout);
        do_setshow_command ((char *)NULL, from_tty, list);
       }
   }
@@ -1193,7 +1216,7 @@ shell_escape (arg, from_tty)
       else
        execl (user_shell, p, "-c", arg, 0);
 
-      fprintf (stderr, "Exec of shell failed\n");
+      fprintf_unfiltered (gdb_stderr, "Exec of shell failed\n");
       exit (0);
     }
 
@@ -1227,7 +1250,7 @@ make_command (arg, from_tty)
 static void
 show_user_1 (c, stream)
      struct cmd_list_element *c;
-     FILE *stream;
+     GDB_FILE *stream;
 {
   register struct command_line *cmdlines;
 
@@ -1260,14 +1283,14 @@ show_user (args, from_tty)
       c = lookup_cmd (&args, cmdlist, "", 0, 1);
       if (c->class != class_user)
        error ("Not a user command.");
-      show_user_1 (c, stdout);
+      show_user_1 (c, gdb_stdout);
     }
   else
     {
       for (c = cmdlist; c; c = c->next)
        {
          if (c->class == class_user)
-           show_user_1 (c, stdout);
+           show_user_1 (c, gdb_stdout);
        }
     }
 }
This page took 0.026262 seconds and 4 git commands to generate.