use remote-utils facilities for baud_rate
[deliverable/binutils-gdb.git] / gdb / command.c
index 412ff21137c316158682cdbdf225319529f98e69..abc2d84499c0eb0f8b78be31ecb20e1aaa2aa111 100644 (file)
@@ -45,7 +45,9 @@ parse_binary_operation PARAMS ((char *));
 static void
 print_doc_line PARAMS ((FILE *, char *));
 
-/* Add element named NAME to command list *LIST.
+/* Add element named NAME.
+   CLASS is the top level category into which commands are broken down
+   for "help" purposes.
    FUN should be the function to execute the command;
    it will get a character string as argument, with leading
    and trailing blanks already eliminated.
@@ -53,7 +55,9 @@ print_doc_line PARAMS ((FILE *, char *));
    DOC is a documentation string for the command.
    Its first line should be a complete sentence.
    It should start with ? for a command that is an abbreviation
-   or with * for a command that most users don't need to know about.  */
+   or with * for a command that most users don't need to know about.
+
+   Add this command to command list *LIST.  */
 
 struct cmd_list_element *
 add_cmd (name, class, fun, doc, list)
@@ -500,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).
@@ -902,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;
@@ -934,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)
@@ -1054,10 +1081,24 @@ do_setshow_command (arg, from_tty, c)
        case var_uinteger:
          if (arg == NULL)
            error_no_arg ("integer to set it to.");
-         *(int *) c->var = parse_and_eval_address (arg);
-         if (*(int *) c->var == 0)
-           *(int *) c->var = UINT_MAX;
+         *(unsigned int *) c->var = parse_and_eval_address (arg);
+         if (*(unsigned int *) c->var == 0)
+           *(unsigned int *) c->var = UINT_MAX;
          break;
+       case var_integer:
+         {
+           unsigned int val;
+           if (arg == NULL)
+             error_no_arg ("integer to set it to.");
+           val = parse_and_eval_address (arg);
+           if (val == 0)
+             *(int *) c->var = INT_MAX;
+           else if (val >= INT_MAX)
+             error ("integer %u out of range", val);
+           else
+             *(int *) c->var = val;
+           break;
+         }
        case var_zinteger:
          if (arg == NULL)
            error_no_arg ("integer to set it to.");
@@ -1101,8 +1142,17 @@ do_setshow_command (arg, from_tty, c)
        }
        /* else fall through */
       case var_zinteger:
-       fprintf_filtered (stdout, "%d", *(unsigned int *) c->var);
+       fprintf_filtered (stdout, "%u", *(unsigned int *) c->var);
        break;
+      case var_integer:
+       if (*(int *) c->var == INT_MAX)
+         {
+           fputs_filtered ("unlimited", stdout);
+         }
+       else
+         fprintf_filtered (stdout, "%d", *(int *) c->var);
+       break;
+           
       default:
        error ("gdb internal error: bad var_type in do_setshow_command");
       }
@@ -1142,6 +1192,11 @@ shell_escape (arg, from_tty)
      char *arg;
      int from_tty;
 {
+#ifdef CANT_FORK
+  /* FIXME: what about errors (I don't know how GO32 system() handles
+     them)?  */
+  system (arg);
+#else /* Can fork.  */
   int rc, status, pid;
   char *p, *user_shell;
 
@@ -1170,6 +1225,7 @@ shell_escape (arg, from_tty)
       ;
   else
     error ("Fork failed");
+#endif /* Can fork.  */
 }
 
 static void
@@ -1201,10 +1257,13 @@ show_user_1 (c, stream)
   cmdlines = c->user_commands;
   if (!cmdlines)
     return;
-  fprintf_filtered (stream, "User command %s:\n", c->name);
+  fputs_filtered ("User command ", stream);
+  fputs_filtered (c->name, stream);
+  fputs_filtered (":\n", stream);
   while (cmdlines)
     {
-      fprintf_filtered (stream, "%s\n", cmdlines->line); 
+      fputs_filtered (cmdlines->line, stream); 
+      fputs_filtered ("\n", stream); 
       cmdlines = cmdlines->next;
     }
   fputs_filtered ("\n", stream);
@@ -1242,10 +1301,8 @@ _initialize_command ()
   add_com ("shell", class_support, shell_escape,
           "Execute the rest of the line as a shell command.  \n\
 With no arguments, run an inferior shell.");
-
   add_com ("make", class_support, make_command,
           "Run the ``make'' program using the rest of the line as arguments.");
-
   add_cmd ("user", no_class, show_user, 
           "Show definitions of user defined commands.\n\
 Argument is the name of the user defined command.\n\
This page took 0.025444 seconds and 4 git commands to generate.