Eliminate PARAMS.
[platform/upstream/binutils.git] / gdb / command.c
1 /* Handle lists of commands, their decoding and documentation, for GDB.
2    Copyright 1986, 1989, 1990, 1991, 1998, 2000 Free Software Foundation, Inc.
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software
16    Foundation, Inc., 59 Temple Place - Suite 330,
17    Boston, MA 02111-1307, USA.  */
18
19 #include "defs.h"
20 #include "gdbcmd.h"
21 #include "symtab.h"
22 #include "value.h"
23 #include <ctype.h>
24 #include "gdb_string.h"
25 #ifdef UI_OUT
26 #include "ui-out.h"
27 #endif
28
29 #include "gdb_wait.h"
30 #include "gnu-regex.h"
31 /* FIXME: this should be auto-configured!  */
32 #ifdef __MSDOS__
33 # define CANT_FORK
34 #endif
35
36 /* Prototypes for local functions */
37
38 static void undef_cmd_error (char *, char *);
39
40 static void show_user (char *, int);
41
42 static void show_user_1 (struct cmd_list_element *, struct ui_file *);
43
44 static void make_command (char *, int);
45
46 static void shell_escape (char *, int);
47
48 static int parse_binary_operation (char *);
49
50 static void print_doc_line (struct ui_file *, char *);
51
52 static struct cmd_list_element *find_cmd (char *command,
53                                           int len,
54                                           struct cmd_list_element *clist,
55                                           int ignore_help_classes,
56                                           int *nfound);
57 static void apropos_cmd_helper (struct ui_file *, struct cmd_list_element *, 
58                                 struct re_pattern_buffer *, char *);
59
60 static void help_all (struct ui_file *stream);
61
62 void apropos_command (char *, int);
63
64 void _initialize_command (void);
65
66 /* Add element named NAME.
67    CLASS is the top level category into which commands are broken down
68    for "help" purposes.
69    FUN should be the function to execute the command;
70    it will get a character string as argument, with leading
71    and trailing blanks already eliminated.
72
73    DOC is a documentation string for the command.
74    Its first line should be a complete sentence.
75    It should start with ? for a command that is an abbreviation
76    or with * for a command that most users don't need to know about.
77
78    Add this command to command list *LIST.  
79
80    Returns a pointer to the added command (not necessarily the head 
81    of *LIST). */
82
83 struct cmd_list_element *
84 add_cmd (name, class, fun, doc, list)
85      char *name;
86      enum command_class class;
87      void (*fun) (char *, int);
88      char *doc;
89      struct cmd_list_element **list;
90 {
91   register struct cmd_list_element *c
92   = (struct cmd_list_element *) xmalloc (sizeof (struct cmd_list_element));
93   struct cmd_list_element *p;
94
95   delete_cmd (name, list);
96
97   if (*list == NULL || STRCMP ((*list)->name, name) >= 0)
98     {
99       c->next = *list;
100       *list = c;
101     }
102   else
103     {
104       p = *list;
105       while (p->next && STRCMP (p->next->name, name) <= 0)
106         {
107           p = p->next;
108         }
109       c->next = p->next;
110       p->next = c;
111     }
112
113   c->name = name;
114   c->class = class;
115   c->function.cfunc = fun;
116   c->doc = doc;
117   c->flags = 0;
118   c->replacement = NULL;
119   c->hook = NULL;
120   c->prefixlist = NULL;
121   c->prefixname = NULL;
122   c->allow_unknown = 0;
123   c->abbrev_flag = 0;
124   c->completer = make_symbol_completion_list;
125   c->type = not_set_cmd;
126   c->var = NULL;
127   c->var_type = var_boolean;
128   c->enums = NULL;
129   c->user_commands = NULL;
130   c->hookee = NULL;
131   c->cmd_pointer = NULL;
132
133   return c;
134 }
135
136
137 /* Deprecates a command CMD.
138    REPLACEMENT is the name of the command which should be used in place
139    of this command, or NULL if no such command exists.
140
141    This function does not check to see if command REPLACEMENT exists
142    since gdb may not have gotten around to adding REPLACEMENT when this
143    function is called.
144
145    Returns a pointer to the deprecated command.  */
146
147 struct cmd_list_element *
148 deprecate_cmd (cmd, replacement)
149      struct cmd_list_element *cmd;
150      char *replacement;
151 {
152   cmd->flags |= (CMD_DEPRECATED | DEPRECATED_WARN_USER);
153
154   if (replacement != NULL)
155     cmd->replacement = replacement;
156   else
157     cmd->replacement = NULL;
158
159   return cmd;
160 }
161
162
163 /* Same as above, except that the abbrev_flag is set. */
164
165 #if 0                           /* Currently unused */
166
167 struct cmd_list_element *
168 add_abbrev_cmd (name, class, fun, doc, list)
169      char *name;
170      enum command_class class;
171      void (*fun) (char *, int);
172      char *doc;
173      struct cmd_list_element **list;
174 {
175   register struct cmd_list_element *c
176   = add_cmd (name, class, fun, doc, list);
177
178   c->abbrev_flag = 1;
179   return c;
180 }
181
182 #endif
183
184 struct cmd_list_element *
185 add_alias_cmd (name, oldname, class, abbrev_flag, list)
186      char *name;
187      char *oldname;
188      enum command_class class;
189      int abbrev_flag;
190      struct cmd_list_element **list;
191 {
192   /* Must do this since lookup_cmd tries to side-effect its first arg */
193   char *copied_name;
194   register struct cmd_list_element *old;
195   register struct cmd_list_element *c;
196   copied_name = (char *) alloca (strlen (oldname) + 1);
197   strcpy (copied_name, oldname);
198   old = lookup_cmd (&copied_name, *list, "", 1, 1);
199
200   if (old == 0)
201     {
202       delete_cmd (name, list);
203       return 0;
204     }
205
206   c = add_cmd (name, class, old->function.cfunc, old->doc, list);
207   c->prefixlist = old->prefixlist;
208   c->prefixname = old->prefixname;
209   c->allow_unknown = old->allow_unknown;
210   c->abbrev_flag = abbrev_flag;
211   c->cmd_pointer = old;
212   return c;
213 }
214
215 /* Like add_cmd but adds an element for a command prefix:
216    a name that should be followed by a subcommand to be looked up
217    in another command list.  PREFIXLIST should be the address
218    of the variable containing that list.  */
219
220 struct cmd_list_element *
221 add_prefix_cmd (name, class, fun, doc, prefixlist, prefixname,
222                 allow_unknown, list)
223      char *name;
224      enum command_class class;
225      void (*fun) (char *, int);
226      char *doc;
227      struct cmd_list_element **prefixlist;
228      char *prefixname;
229      int allow_unknown;
230      struct cmd_list_element **list;
231 {
232   register struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
233   c->prefixlist = prefixlist;
234   c->prefixname = prefixname;
235   c->allow_unknown = allow_unknown;
236   return c;
237 }
238
239 /* Like add_prefix_cmd but sets the abbrev_flag on the new command. */
240
241 struct cmd_list_element *
242 add_abbrev_prefix_cmd (name, class, fun, doc, prefixlist, prefixname,
243                        allow_unknown, list)
244      char *name;
245      enum command_class class;
246      void (*fun) (char *, int);
247      char *doc;
248      struct cmd_list_element **prefixlist;
249      char *prefixname;
250      int allow_unknown;
251      struct cmd_list_element **list;
252 {
253   register struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
254   c->prefixlist = prefixlist;
255   c->prefixname = prefixname;
256   c->allow_unknown = allow_unknown;
257   c->abbrev_flag = 1;
258   return c;
259 }
260
261 /* This is an empty "cfunc".  */
262 void
263 not_just_help_class_command (args, from_tty)
264      char *args;
265      int from_tty;
266 {
267 }
268
269 /* This is an empty "sfunc".  */
270 static void empty_sfunc (char *, int, struct cmd_list_element *);
271
272 static void
273 empty_sfunc (args, from_tty, c)
274      char *args;
275      int from_tty;
276      struct cmd_list_element *c;
277 {
278 }
279
280 /* Add element named NAME to command list LIST (the list for set
281    or some sublist thereof).
282    CLASS is as in add_cmd.
283    VAR_TYPE is the kind of thing we are setting.
284    VAR is address of the variable being controlled by this command.
285    DOC is the documentation string.  */
286
287 struct cmd_list_element *
288 add_set_cmd (char *name,
289              enum command_class class,
290              var_types var_type,
291              void *var,
292              char *doc,
293              struct cmd_list_element **list)
294 {
295   struct cmd_list_element *c
296   = add_cmd (name, class, NO_FUNCTION, doc, list);
297
298   c->type = set_cmd;
299   c->var_type = var_type;
300   c->var = var;
301   /* This needs to be something besides NO_FUNCTION so that this isn't
302      treated as a help class.  */
303   c->function.sfunc = empty_sfunc;
304   return c;
305 }
306
307 /* Add element named NAME to command list LIST (the list for set
308    or some sublist thereof).
309    CLASS is as in add_cmd.
310    ENUMLIST is a list of strings which may follow NAME.
311    VAR is address of the variable which will contain the matching string
312    (from ENUMLIST).
313    DOC is the documentation string.  */
314
315 struct cmd_list_element *
316 add_set_enum_cmd (char *name,
317                   enum command_class class,
318                   const char *enumlist[],
319                   const char **var,
320                   char *doc,
321                   struct cmd_list_element **list)
322 {
323   struct cmd_list_element *c
324   = add_set_cmd (name, class, var_enum, var, doc, list);
325   c->enums = enumlist;
326
327   return c;
328 }
329
330 /* Where SETCMD has already been added, add the corresponding show
331    command to LIST and return a pointer to the added command (not 
332    necessarily the head of LIST).  */
333 struct cmd_list_element *
334 add_show_from_set (setcmd, list)
335      struct cmd_list_element *setcmd;
336      struct cmd_list_element **list;
337 {
338   struct cmd_list_element *showcmd =
339   (struct cmd_list_element *) xmalloc (sizeof (struct cmd_list_element));
340   struct cmd_list_element *p;
341
342   memcpy (showcmd, setcmd, sizeof (struct cmd_list_element));
343   delete_cmd (showcmd->name, list);
344   showcmd->type = show_cmd;
345
346   /* Replace "set " at start of docstring with "show ".  */
347   if (setcmd->doc[0] == 'S' && setcmd->doc[1] == 'e'
348       && setcmd->doc[2] == 't' && setcmd->doc[3] == ' ')
349     showcmd->doc = concat ("Show ", setcmd->doc + 4, NULL);
350   else
351     fprintf_unfiltered (gdb_stderr, "GDB internal error: Bad docstring for set command\n");
352
353   if (*list == NULL || STRCMP ((*list)->name, showcmd->name) >= 0)
354     {
355       showcmd->next = *list;
356       *list = showcmd;
357     }
358   else
359     {
360       p = *list;
361       while (p->next && STRCMP (p->next->name, showcmd->name) <= 0)
362         {
363           p = p->next;
364         }
365       showcmd->next = p->next;
366       p->next = showcmd;
367     }
368
369   return showcmd;
370 }
371
372 /* Remove the command named NAME from the command list.  */
373
374 void
375 delete_cmd (name, list)
376      char *name;
377      struct cmd_list_element **list;
378 {
379   register struct cmd_list_element *c;
380   struct cmd_list_element *p;
381
382   while (*list && STREQ ((*list)->name, name))
383     {
384       if ((*list)->hookee)
385         (*list)->hookee->hook = 0;      /* Hook slips out of its mouth */
386       p = (*list)->next;
387       free ((PTR) * list);
388       *list = p;
389     }
390
391   if (*list)
392     for (c = *list; c->next;)
393       {
394         if (STREQ (c->next->name, name))
395           {
396             if (c->next->hookee)
397               c->next->hookee->hook = 0;        /* hooked cmd gets away.  */
398             p = c->next->next;
399             free ((PTR) c->next);
400             c->next = p;
401           }
402         else
403           c = c->next;
404       }
405 }
406 /* Recursively walk the commandlist structures, and print out the
407    documentation of commands that match our regex in either their
408    name, or their documentation.
409 */
410 static void 
411 apropos_cmd_helper (struct ui_file *stream, struct cmd_list_element *commandlist,
412                          struct re_pattern_buffer *regex, char *prefix)
413 {
414   register struct cmd_list_element *c;
415   int returnvalue=1; /*Needed to avoid double printing*/
416   /* Walk through the commands */
417   for (c=commandlist;c;c=c->next)
418     {
419       if (c->name != NULL)
420         {
421           /* Try to match against the name*/
422           returnvalue=re_search(regex,c->name,strlen(c->name),0,strlen(c->name),NULL);
423           if (returnvalue >= 0)
424             {
425               /* Stolen from help_cmd_list. We don't directly use
426                * help_cmd_list because it doesn't let us print out
427                * single commands
428                */
429               fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
430               print_doc_line (stream, c->doc);
431               fputs_filtered ("\n", stream);
432               returnvalue=0; /*Set this so we don't print it again.*/
433             }
434         }
435       if (c->doc != NULL && returnvalue != 0)
436         {
437           /* Try to match against documentation */
438           if (re_search(regex,c->doc,strlen(c->doc),0,strlen(c->doc),NULL) >=0)
439             {
440               /* Stolen from help_cmd_list. We don't directly use
441                * help_cmd_list because it doesn't let us print out
442                * single commands
443                */
444               fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
445               print_doc_line (stream, c->doc);
446               fputs_filtered ("\n", stream);
447             }
448         }
449       /* Check if this command has subcommands */
450       if (c->prefixlist != NULL)
451         {
452           /* Recursively call ourselves on the subcommand list,
453              passing the right prefix in.
454           */
455           apropos_cmd_helper(stream,*c->prefixlist,regex,c->prefixname);
456         }
457     }
458 }
459 /* Search through names of commands and documentations for a certain
460    regular expression.
461 */
462 void 
463 apropos_command (char *searchstr, int from_tty)
464 {
465   extern struct cmd_list_element *cmdlist; /*This is the main command list*/
466   regex_t pattern;
467   char *pattern_fastmap;
468   char errorbuffer[512];
469   pattern_fastmap=calloc(256,sizeof(char));
470   if (searchstr == NULL)
471       error("REGEXP string is empty");
472
473   if (regcomp(&pattern,searchstr,REG_ICASE) == 0)
474     {
475       pattern.fastmap=pattern_fastmap;
476       re_compile_fastmap(&pattern);
477       apropos_cmd_helper(gdb_stdout,cmdlist,&pattern,"");
478     }
479   else
480     {
481       regerror(regcomp(&pattern,searchstr,REG_ICASE),NULL,errorbuffer,512);
482       error("Error in regular expression:%s",errorbuffer);
483     }
484   free(pattern_fastmap);
485 }
486
487
488 /* This command really has to deal with two things:
489  *     1) I want documentation on *this string* (usually called by
490  * "help commandname").
491  *     2) I want documentation on *this list* (usually called by
492  * giving a command that requires subcommands.  Also called by saying
493  * just "help".)
494  *
495  *   I am going to split this into two seperate comamnds, help_cmd and
496  * help_list. 
497  */
498
499 void
500 help_cmd (command, stream)
501      char *command;
502      struct ui_file *stream;
503 {
504   struct cmd_list_element *c;
505   extern struct cmd_list_element *cmdlist;
506
507   if (!command)
508     {
509       help_list (cmdlist, "", all_classes, stream);
510       return;
511     }
512
513   if (strcmp (command, "all") == 0)
514     {
515       help_all (stream);
516       return;
517     }
518
519   c = lookup_cmd (&command, cmdlist, "", 0, 0);
520
521   if (c == 0)
522     return;
523
524   /* There are three cases here.
525      If c->prefixlist is nonzero, we have a prefix command.
526      Print its documentation, then list its subcommands.
527
528      If c->function is nonzero, we really have a command.
529      Print its documentation and return.
530
531      If c->function is zero, we have a class name.
532      Print its documentation (as if it were a command)
533      and then set class to the number of this class
534      so that the commands in the class will be listed.  */
535
536   fputs_filtered (c->doc, stream);
537   fputs_filtered ("\n", stream);
538
539   if (c->prefixlist == 0 && c->function.cfunc != NULL)
540     return;
541   fprintf_filtered (stream, "\n");
542
543   /* If this is a prefix command, print it's subcommands */
544   if (c->prefixlist)
545     help_list (*c->prefixlist, c->prefixname, all_commands, stream);
546
547   /* If this is a class name, print all of the commands in the class */
548   if (c->function.cfunc == NULL)
549     help_list (cmdlist, "", c->class, stream);
550
551   if (c->hook)
552     fprintf_filtered (stream, "\nThis command has a hook defined: %s\n",
553                       c->hook->name);
554 }
555
556 /*
557  * Get a specific kind of help on a command list.
558  *
559  * LIST is the list.
560  * CMDTYPE is the prefix to use in the title string.
561  * CLASS is the class with which to list the nodes of this list (see
562  * documentation for help_cmd_list below),  As usual, ALL_COMMANDS for
563  * everything, ALL_CLASSES for just classes, and non-negative for only things
564  * in a specific class.
565  * and STREAM is the output stream on which to print things.
566  * If you call this routine with a class >= 0, it recurses.
567  */
568 void
569 help_list (list, cmdtype, class, stream)
570      struct cmd_list_element *list;
571      char *cmdtype;
572      enum command_class class;
573      struct ui_file *stream;
574 {
575   int len;
576   char *cmdtype1, *cmdtype2;
577
578   /* If CMDTYPE is "foo ", CMDTYPE1 gets " foo" and CMDTYPE2 gets "foo sub"  */
579   len = strlen (cmdtype);
580   cmdtype1 = (char *) alloca (len + 1);
581   cmdtype1[0] = 0;
582   cmdtype2 = (char *) alloca (len + 4);
583   cmdtype2[0] = 0;
584   if (len)
585     {
586       cmdtype1[0] = ' ';
587       strncpy (cmdtype1 + 1, cmdtype, len - 1);
588       cmdtype1[len] = 0;
589       strncpy (cmdtype2, cmdtype, len - 1);
590       strcpy (cmdtype2 + len - 1, " sub");
591     }
592
593   if (class == all_classes)
594     fprintf_filtered (stream, "List of classes of %scommands:\n\n", cmdtype2);
595   else
596     fprintf_filtered (stream, "List of %scommands:\n\n", cmdtype2);
597
598   help_cmd_list (list, class, cmdtype, (int) class >= 0, stream);
599
600   if (class == all_classes)
601     fprintf_filtered (stream, "\n\
602 Type \"help%s\" followed by a class name for a list of commands in that class.",
603                       cmdtype1);
604
605   fprintf_filtered (stream, "\n\
606 Type \"help%s\" followed by %scommand name for full documentation.\n\
607 Command name abbreviations are allowed if unambiguous.\n",
608                     cmdtype1, cmdtype2);
609 }
610
611 static void
612 help_all (struct ui_file *stream)
613 {
614   struct cmd_list_element *c;
615   extern struct cmd_list_element *cmdlist;
616
617   for (c = cmdlist; c; c = c->next)
618     {
619       if (c->abbrev_flag)
620         continue;
621       /* If this is a prefix command, print it's subcommands */
622       if (c->prefixlist)
623         help_cmd_list (*c->prefixlist, all_commands, c->prefixname, 0, stream);
624     
625       /* If this is a class name, print all of the commands in the class */
626       else if (c->function.cfunc == NULL)
627         help_cmd_list (cmdlist, c->class, "", 0, stream);
628     }
629 }
630
631 /* Print only the first line of STR on STREAM.  */
632 static void
633 print_doc_line (stream, str)
634      struct ui_file *stream;
635      char *str;
636 {
637   static char *line_buffer = 0;
638   static int line_size;
639   register char *p;
640
641   if (!line_buffer)
642     {
643       line_size = 80;
644       line_buffer = (char *) xmalloc (line_size);
645     }
646
647   p = str;
648   while (*p && *p != '\n' && *p != '.' && *p != ',')
649     p++;
650   if (p - str > line_size - 1)
651     {
652       line_size = p - str + 1;
653       free ((PTR) line_buffer);
654       line_buffer = (char *) xmalloc (line_size);
655     }
656   strncpy (line_buffer, str, p - str);
657   line_buffer[p - str] = '\0';
658   if (islower (line_buffer[0]))
659     line_buffer[0] = toupper (line_buffer[0]);
660 #ifdef UI_OUT
661   ui_out_text (uiout, line_buffer);
662 #else
663   fputs_filtered (line_buffer, stream);
664 #endif
665 }
666
667 /*
668  * Implement a help command on command list LIST.
669  * RECURSE should be non-zero if this should be done recursively on
670  * all sublists of LIST.
671  * PREFIX is the prefix to print before each command name.
672  * STREAM is the stream upon which the output should be written.
673  * CLASS should be:
674  *      A non-negative class number to list only commands in that
675  * class.
676  *      ALL_COMMANDS to list all commands in list.
677  *      ALL_CLASSES  to list all classes in list.
678  *
679  *   Note that RECURSE will be active on *all* sublists, not just the
680  * ones selected by the criteria above (ie. the selection mechanism
681  * is at the low level, not the high-level).
682  */
683 void
684 help_cmd_list (list, class, prefix, recurse, stream)
685      struct cmd_list_element *list;
686      enum command_class class;
687      char *prefix;
688      int recurse;
689      struct ui_file *stream;
690 {
691   register struct cmd_list_element *c;
692
693   for (c = list; c; c = c->next)
694     {
695       if (c->abbrev_flag == 0 &&
696           (class == all_commands
697            || (class == all_classes && c->function.cfunc == NULL)
698            || (class == c->class && c->function.cfunc != NULL)))
699         {
700           fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
701           print_doc_line (stream, c->doc);
702           fputs_filtered ("\n", stream);
703         }
704       if (recurse
705           && c->prefixlist != 0
706           && c->abbrev_flag == 0)
707         help_cmd_list (*c->prefixlist, class, c->prefixname, 1, stream);
708     }
709 }
710 \f
711
712 /* Search the input clist for 'command'.  Return the command if
713    found (or NULL if not), and return the number of commands
714    found in nfound */
715
716 static struct cmd_list_element *
717 find_cmd (command, len, clist, ignore_help_classes, nfound)
718      char *command;
719      int len;
720      struct cmd_list_element *clist;
721      int ignore_help_classes;
722      int *nfound;
723 {
724   struct cmd_list_element *found, *c;
725
726   found = (struct cmd_list_element *) NULL;
727   *nfound = 0;
728   for (c = clist; c; c = c->next)
729     if (!strncmp (command, c->name, len)
730         && (!ignore_help_classes || c->function.cfunc))
731       {
732         found = c;
733         (*nfound)++;
734         if (c->name[len] == '\0')
735           {
736             *nfound = 1;
737             break;
738           }
739       }
740   return found;
741 }
742
743 /* This routine takes a line of TEXT and a CLIST in which to start the
744    lookup.  When it returns it will have incremented the text pointer past
745    the section of text it matched, set *RESULT_LIST to point to the list in
746    which the last word was matched, and will return a pointer to the cmd
747    list element which the text matches.  It will return NULL if no match at
748    all was possible.  It will return -1 (cast appropriately, ick) if ambigous
749    matches are possible; in this case *RESULT_LIST will be set to point to
750    the list in which there are ambiguous choices (and *TEXT will be set to
751    the ambiguous text string).
752
753    If the located command was an abbreviation, this routine returns the base
754    command of the abbreviation.
755
756    It does no error reporting whatsoever; control will always return
757    to the superior routine.
758
759    In the case of an ambiguous return (-1), *RESULT_LIST will be set to point
760    at the prefix_command (ie. the best match) *or* (special case) will be NULL
761    if no prefix command was ever found.  For example, in the case of "info a",
762    "info" matches without ambiguity, but "a" could be "args" or "address", so
763    *RESULT_LIST is set to the cmd_list_element for "info".  So in this case
764    RESULT_LIST should not be interpeted as a pointer to the beginning of a
765    list; it simply points to a specific command.  In the case of an ambiguous
766    return *TEXT is advanced past the last non-ambiguous prefix (e.g.
767    "info t" can be "info types" or "info target"; upon return *TEXT has been
768    advanced past "info ").
769
770    If RESULT_LIST is NULL, don't set *RESULT_LIST (but don't otherwise
771    affect the operation).
772
773    This routine does *not* modify the text pointed to by TEXT.
774
775    If IGNORE_HELP_CLASSES is nonzero, ignore any command list elements which
776    are actually help classes rather than commands (i.e. the function field of
777    the struct cmd_list_element is NULL).  */
778
779 struct cmd_list_element *
780 lookup_cmd_1 (text, clist, result_list, ignore_help_classes)
781      char **text;
782      struct cmd_list_element *clist, **result_list;
783      int ignore_help_classes;
784 {
785   char *p, *command;
786   int len, tmp, nfound;
787   struct cmd_list_element *found, *c;
788   char *line = *text;
789
790   while (**text == ' ' || **text == '\t')
791     (*text)++;
792
793   /* Treating underscores as part of command words is important
794      so that "set args_foo()" doesn't get interpreted as
795      "set args _foo()".  */
796   for (p = *text;
797        *p && (isalnum (*p) || *p == '-' || *p == '_' ||
798               (tui_version &&
799                (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
800               (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
801        p++)
802     ;
803
804   /* If nothing but whitespace, return 0.  */
805   if (p == *text)
806     return 0;
807
808   len = p - *text;
809
810   /* *text and p now bracket the first command word to lookup (and
811      it's length is len).  We copy this into a local temporary */
812
813
814   command = (char *) alloca (len + 1);
815   for (tmp = 0; tmp < len; tmp++)
816     {
817       char x = (*text)[tmp];
818       command[tmp] = x;
819     }
820   command[len] = '\0';
821
822   /* Look it up.  */
823   found = 0;
824   nfound = 0;
825   found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
826
827   /* 
828      ** We didn't find the command in the entered case, so lower case it
829      ** and search again.
830    */
831   if (!found || nfound == 0)
832     {
833       for (tmp = 0; tmp < len; tmp++)
834         {
835           char x = command[tmp];
836           command[tmp] = isupper (x) ? tolower (x) : x;
837         }
838       found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
839     }
840
841   /* If nothing matches, we have a simple failure.  */
842   if (nfound == 0)
843     return 0;
844
845   if (nfound > 1)
846     {
847       if (result_list != NULL)
848         /* Will be modified in calling routine
849            if we know what the prefix command is.  */
850         *result_list = 0;
851       return (struct cmd_list_element *) -1;    /* Ambiguous.  */
852     }
853
854   /* We've matched something on this list.  Move text pointer forward. */
855
856   *text = p;
857
858   if (found->cmd_pointer)
859     {
860       /* We drop the alias (abbreviation) in favor of the command it is
861        pointing to.  If the alias is deprecated, though, we need to
862        warn the user about it before we drop it.  Note that while we
863        are warning about the alias, we may also warn about the command
864        itself and we will adjust the appropriate DEPRECATED_WARN_USER
865        flags */
866       
867       if (found->flags & DEPRECATED_WARN_USER)
868       deprecated_cmd_warning (&line);
869       found = found->cmd_pointer;
870     }
871   /* If we found a prefix command, keep looking.  */
872
873   if (found->prefixlist)
874     {
875       c = lookup_cmd_1 (text, *found->prefixlist, result_list,
876                         ignore_help_classes);
877       if (!c)
878         {
879           /* Didn't find anything; this is as far as we got.  */
880           if (result_list != NULL)
881             *result_list = clist;
882           return found;
883         }
884       else if (c == (struct cmd_list_element *) -1)
885         {
886           /* We've gotten this far properly, but the next step
887              is ambiguous.  We need to set the result list to the best
888              we've found (if an inferior hasn't already set it).  */
889           if (result_list != NULL)
890             if (!*result_list)
891               /* This used to say *result_list = *found->prefixlist
892                  If that was correct, need to modify the documentation
893                  at the top of this function to clarify what is supposed
894                  to be going on.  */
895               *result_list = found;
896           return c;
897         }
898       else
899         {
900           /* We matched!  */
901           return c;
902         }
903     }
904   else
905     {
906       if (result_list != NULL)
907         *result_list = clist;
908       return found;
909     }
910 }
911
912 /* All this hair to move the space to the front of cmdtype */
913
914 static void
915 undef_cmd_error (cmdtype, q)
916      char *cmdtype, *q;
917 {
918   error ("Undefined %scommand: \"%s\".  Try \"help%s%.*s\".",
919          cmdtype,
920          q,
921          *cmdtype ? " " : "",
922          strlen (cmdtype) - 1,
923          cmdtype);
924 }
925
926 /* Look up the contents of *LINE as a command in the command list LIST.
927    LIST is a chain of struct cmd_list_element's.
928    If it is found, return the struct cmd_list_element for that command
929    and update *LINE to point after the command name, at the first argument.
930    If not found, call error if ALLOW_UNKNOWN is zero
931    otherwise (or if error returns) return zero.
932    Call error if specified command is ambiguous,
933    unless ALLOW_UNKNOWN is negative.
934    CMDTYPE precedes the word "command" in the error message.
935
936    If INGNORE_HELP_CLASSES is nonzero, ignore any command list
937    elements which are actually help classes rather than commands (i.e.
938    the function field of the struct cmd_list_element is 0).  */
939
940 struct cmd_list_element *
941 lookup_cmd (line, list, cmdtype, allow_unknown, ignore_help_classes)
942      char **line;
943      struct cmd_list_element *list;
944      char *cmdtype;
945      int allow_unknown;
946      int ignore_help_classes;
947 {
948   struct cmd_list_element *last_list = 0;
949   struct cmd_list_element *c =
950   lookup_cmd_1 (line, list, &last_list, ignore_help_classes);
951 #if 0
952   /* This is wrong for complete_command.  */
953   char *ptr = (*line) + strlen (*line) - 1;
954
955   /* Clear off trailing whitespace.  */
956   while (ptr >= *line && (*ptr == ' ' || *ptr == '\t'))
957     ptr--;
958   *(ptr + 1) = '\0';
959 #endif
960
961   if (!c)
962     {
963       if (!allow_unknown)
964         {
965           if (!*line)
966             error ("Lack of needed %scommand", cmdtype);
967           else
968             {
969               char *p = *line, *q;
970
971               while (isalnum (*p) || *p == '-')
972                 p++;
973
974               q = (char *) alloca (p - *line + 1);
975               strncpy (q, *line, p - *line);
976               q[p - *line] = '\0';
977               undef_cmd_error (cmdtype, q);
978             }
979         }
980       else
981         return 0;
982     }
983   else if (c == (struct cmd_list_element *) -1)
984     {
985       /* Ambigous.  Local values should be off prefixlist or called
986          values.  */
987       int local_allow_unknown = (last_list ? last_list->allow_unknown :
988                                  allow_unknown);
989       char *local_cmdtype = last_list ? last_list->prefixname : cmdtype;
990       struct cmd_list_element *local_list =
991       (last_list ? *(last_list->prefixlist) : list);
992
993       if (local_allow_unknown < 0)
994         {
995           if (last_list)
996             return last_list;   /* Found something.  */
997           else
998             return 0;           /* Found nothing.  */
999         }
1000       else
1001         {
1002           /* Report as error.  */
1003           int amb_len;
1004           char ambbuf[100];
1005
1006           for (amb_len = 0;
1007                ((*line)[amb_len] && (*line)[amb_len] != ' '
1008                 && (*line)[amb_len] != '\t');
1009                amb_len++)
1010             ;
1011
1012           ambbuf[0] = 0;
1013           for (c = local_list; c; c = c->next)
1014             if (!strncmp (*line, c->name, amb_len))
1015               {
1016                 if (strlen (ambbuf) + strlen (c->name) + 6 < (int) sizeof ambbuf)
1017                   {
1018                     if (strlen (ambbuf))
1019                       strcat (ambbuf, ", ");
1020                     strcat (ambbuf, c->name);
1021                   }
1022                 else
1023                   {
1024                     strcat (ambbuf, "..");
1025                     break;
1026                   }
1027               }
1028           error ("Ambiguous %scommand \"%s\": %s.", local_cmdtype,
1029                  *line, ambbuf);
1030           return 0;             /* lint */
1031         }
1032     }
1033   else
1034     {
1035       /* We've got something.  It may still not be what the caller
1036          wants (if this command *needs* a subcommand).  */
1037       while (**line == ' ' || **line == '\t')
1038         (*line)++;
1039
1040       if (c->prefixlist && **line && !c->allow_unknown)
1041         undef_cmd_error (c->prefixname, *line);
1042
1043       /* Seems to be what he wants.  Return it.  */
1044       return c;
1045     }
1046   return 0;
1047 }
1048
1049 /* We are here presumably because an alias or command in *TEXT is 
1050    deprecated and a warning message should be generated.  This function
1051    decodes *TEXT and potentially generates a warning message as outlined
1052    below.
1053    
1054    Example for 'set endian big' which has a fictitious alias 'seb'.
1055    
1056    If alias wasn't used in *TEXT, and the command is deprecated:
1057    "warning: 'set endian big' is deprecated." 
1058    
1059    If alias was used, and only the alias is deprecated:
1060    "warning: 'seb' an alias for the command 'set endian big' is deprecated."
1061    
1062    If alias was used and command is deprecated (regardless of whether the
1063    alias itself is deprecated:
1064    
1065    "warning: 'set endian big' (seb) is deprecated."
1066
1067    After the message has been sent, clear the appropriate flags in the
1068    command and/or the alias so the user is no longer bothered.
1069    
1070 */
1071 void
1072 deprecated_cmd_warning (char **text)
1073 {
1074   struct cmd_list_element *alias = NULL;
1075   struct cmd_list_element *prefix_cmd = NULL;
1076   struct cmd_list_element *cmd = NULL;
1077   struct cmd_list_element *c;
1078   char *type;
1079  
1080   if (!lookup_cmd_composition (*text, &alias, &prefix_cmd, &cmd))
1081     /* return if text doesn't evaluate to a command */
1082     return;
1083
1084   if (!((alias ? (alias->flags & DEPRECATED_WARN_USER) : 0)
1085       || (cmd->flags & DEPRECATED_WARN_USER) ) ) 
1086     /* return if nothing is deprecated */
1087     return;
1088   
1089   printf_filtered ("Warning:");
1090   
1091   if (alias && !(cmd->flags & CMD_DEPRECATED))
1092     printf_filtered (" '%s', an alias for the", alias->name);
1093     
1094   printf_filtered (" command '");
1095   
1096   if (prefix_cmd)
1097     printf_filtered ("%s", prefix_cmd->prefixname);
1098   
1099   printf_filtered ("%s", cmd->name);
1100
1101   if (alias && (cmd->flags & CMD_DEPRECATED))
1102     printf_filtered ("' (%s) is deprecated.\n", alias->name);
1103   else
1104     printf_filtered ("' is deprecated.\n"); 
1105   
1106
1107   /* if it is only the alias that is deprecated, we want to indicate the
1108      new alias, otherwise we'll indicate the new command */
1109
1110   if (alias && !(cmd->flags & CMD_DEPRECATED))
1111     {
1112       if (alias->replacement)
1113       printf_filtered ("Use '%s'.\n\n", alias->replacement);
1114       else
1115       printf_filtered ("No alternative known.\n\n");
1116      }  
1117   else
1118     {
1119       if (cmd->replacement)
1120       printf_filtered ("Use '%s'.\n\n", cmd->replacement);
1121       else
1122       printf_filtered ("No alternative known.\n\n");
1123     }
1124
1125   /* We've warned you, now we'll keep quiet */
1126   if (alias)
1127     alias->flags &= ~DEPRECATED_WARN_USER;
1128   
1129   cmd->flags &= ~DEPRECATED_WARN_USER;
1130 }
1131
1132
1133
1134 /* Look up the contents of LINE as a command in the command list 'cmdlist'. 
1135    Return 1 on success, 0 on failure.
1136    
1137    If LINE refers to an alias, *alias will point to that alias.
1138    
1139    If LINE is a postfix command (i.e. one that is preceeded by a prefix
1140    command) set *prefix_cmd.
1141    
1142    Set *cmd to point to the command LINE indicates.
1143    
1144    If any of *alias, *prefix_cmd, or *cmd cannot be determined or do not 
1145    exist, they are NULL when we return.
1146    
1147 */
1148 int
1149 lookup_cmd_composition (char *text,
1150                       struct cmd_list_element **alias,
1151                       struct cmd_list_element **prefix_cmd, 
1152                       struct cmd_list_element **cmd)
1153 {
1154   char *p, *command;
1155   int len, tmp, nfound;
1156   struct cmd_list_element *cur_list;
1157   struct cmd_list_element *prev_cmd;
1158   *alias = NULL;
1159   *prefix_cmd = NULL;
1160   *cmd = NULL;
1161   
1162   cur_list = cmdlist;
1163   
1164   while (1)
1165     { 
1166       /* Go through as many command lists as we need to 
1167        to find the command TEXT refers to. */
1168       
1169       prev_cmd = *cmd;
1170       
1171       while (*text == ' ' || *text == '\t')
1172       (text)++;
1173       
1174       /* Treating underscores as part of command words is important
1175        so that "set args_foo()" doesn't get interpreted as
1176        "set args _foo()".  */
1177       for (p = text;
1178          *p && (isalnum (*p) || *p == '-' || *p == '_' ||
1179                 (tui_version &&
1180                  (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
1181                 (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
1182          p++)
1183       ;
1184       
1185       /* If nothing but whitespace, return.  */
1186       if (p == text)
1187       return 0;
1188       
1189       len = p - text;
1190       
1191       /* text and p now bracket the first command word to lookup (and
1192        it's length is len).  We copy this into a local temporary */
1193       
1194       command = (char *) alloca (len + 1);
1195       for (tmp = 0; tmp < len; tmp++)
1196       {
1197         char x = text[tmp];
1198         command[tmp] = x;
1199       }
1200       command[len] = '\0';
1201       
1202       /* Look it up.  */
1203       *cmd = 0;
1204       nfound = 0;
1205       *cmd = find_cmd (command, len, cur_list, 1, &nfound);
1206       
1207       /* We didn't find the command in the entered case, so lower case it
1208        and search again.
1209       */
1210       if (!*cmd || nfound == 0)
1211       {
1212         for (tmp = 0; tmp < len; tmp++)
1213           {
1214             char x = command[tmp];
1215             command[tmp] = isupper (x) ? tolower (x) : x;
1216           }
1217         *cmd = find_cmd (command, len, cur_list, 1, &nfound);
1218       }
1219       
1220       if (*cmd == (struct cmd_list_element *) -1)
1221       {
1222         return 0;              /* ambiguous */
1223       }
1224       
1225       if (*cmd == NULL)
1226       return 0;                /* nothing found */
1227       else
1228       {
1229         if ((*cmd)->cmd_pointer)
1230           {
1231             /* cmd was actually an alias, we note that an alias was used 
1232                (by assigning *alais) and we set *cmd. 
1233              */
1234             *alias = *cmd;
1235             *cmd = (*cmd)->cmd_pointer;
1236           }
1237         *prefix_cmd = prev_cmd;
1238       }
1239       if ((*cmd)->prefixlist)
1240       cur_list = *(*cmd)->prefixlist;
1241       else
1242       return 1;
1243       
1244       text = p;
1245     }
1246 }
1247
1248
1249
1250
1251 #if 0
1252 /* Look up the contents of *LINE as a command in the command list LIST.
1253    LIST is a chain of struct cmd_list_element's.
1254    If it is found, return the struct cmd_list_element for that command
1255    and update *LINE to point after the command name, at the first argument.
1256    If not found, call error if ALLOW_UNKNOWN is zero
1257    otherwise (or if error returns) return zero.
1258    Call error if specified command is ambiguous,
1259    unless ALLOW_UNKNOWN is negative.
1260    CMDTYPE precedes the word "command" in the error message.  */
1261
1262 struct cmd_list_element *
1263 lookup_cmd (line, list, cmdtype, allow_unknown)
1264      char **line;
1265      struct cmd_list_element *list;
1266      char *cmdtype;
1267      int allow_unknown;
1268 {
1269   register char *p;
1270   register struct cmd_list_element *c, *found;
1271   int nfound;
1272   char ambbuf[100];
1273   char *processed_cmd;
1274   int i, cmd_len;
1275
1276   /* Skip leading whitespace.  */
1277
1278   while (**line == ' ' || **line == '\t')
1279     (*line)++;
1280
1281   /* Clear out trailing whitespace.  */
1282
1283   p = *line + strlen (*line);
1284   while (p != *line && (p[-1] == ' ' || p[-1] == '\t'))
1285     p--;
1286   *p = 0;
1287
1288   /* Find end of command name.  */
1289
1290   p = *line;
1291   while (*p == '-' || isalnum (*p))
1292     p++;
1293
1294   /* Look up the command name.
1295      If exact match, keep that.
1296      Otherwise, take command abbreviated, if unique.  Note that (in my
1297      opinion) a null string does *not* indicate ambiguity; simply the
1298      end of the argument.  */
1299
1300   if (p == *line)
1301     {
1302       if (!allow_unknown)
1303         error ("Lack of needed %scommand", cmdtype);
1304       return 0;
1305     }
1306
1307   /* Copy over to a local buffer, converting to lowercase on the way.
1308      This is in case the command being parsed is a subcommand which
1309      doesn't match anything, and that's ok.  We want the original
1310      untouched for the routine of the original command.  */
1311
1312   processed_cmd = (char *) alloca (p - *line + 1);
1313   for (cmd_len = 0; cmd_len < p - *line; cmd_len++)
1314     {
1315       char x = (*line)[cmd_len];
1316       if (isupper (x))
1317         processed_cmd[cmd_len] = tolower (x);
1318       else
1319         processed_cmd[cmd_len] = x;
1320     }
1321   processed_cmd[cmd_len] = '\0';
1322
1323   /* Check all possibilities in the current command list.  */
1324   found = 0;
1325   nfound = 0;
1326   for (c = list; c; c = c->next)
1327     {
1328       if (!strncmp (processed_cmd, c->name, cmd_len))
1329         {
1330           found = c;
1331           nfound++;
1332           if (c->name[cmd_len] == 0)
1333             {
1334               nfound = 1;
1335               break;
1336             }
1337         }
1338     }
1339
1340   /* Report error for undefined command name.  */
1341
1342   if (nfound != 1)
1343     {
1344       if (nfound > 1 && allow_unknown >= 0)
1345         {
1346           ambbuf[0] = 0;
1347           for (c = list; c; c = c->next)
1348             if (!strncmp (processed_cmd, c->name, cmd_len))
1349               {
1350                 if (strlen (ambbuf) + strlen (c->name) + 6 < sizeof ambbuf)
1351                   {
1352                     if (strlen (ambbuf))
1353                       strcat (ambbuf, ", ");
1354                     strcat (ambbuf, c->name);
1355                   }
1356                 else
1357                   {
1358                     strcat (ambbuf, "..");
1359                     break;
1360                   }
1361               }
1362           error ("Ambiguous %scommand \"%s\": %s.", cmdtype,
1363                  processed_cmd, ambbuf);
1364         }
1365       else if (!allow_unknown)
1366         error ("Undefined %scommand: \"%s\".", cmdtype, processed_cmd);
1367       return 0;
1368     }
1369
1370   /* Skip whitespace before the argument.  */
1371
1372   while (*p == ' ' || *p == '\t')
1373     p++;
1374   *line = p;
1375
1376   if (found->prefixlist && *p)
1377     {
1378       c = lookup_cmd (line, *found->prefixlist, found->prefixname,
1379                       found->allow_unknown);
1380       if (c)
1381         return c;
1382     }
1383
1384   return found;
1385 }
1386 #endif
1387
1388 /* Helper function for SYMBOL_COMPLETION_FUNCTION.  */
1389
1390 /* Return a vector of char pointers which point to the different
1391    possible completions in LIST of TEXT.  
1392
1393    WORD points in the same buffer as TEXT, and completions should be
1394    returned relative to this position.  For example, suppose TEXT is "foo"
1395    and we want to complete to "foobar".  If WORD is "oo", return
1396    "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
1397
1398 char **
1399 complete_on_cmdlist (list, text, word)
1400      struct cmd_list_element *list;
1401      char *text;
1402      char *word;
1403 {
1404   struct cmd_list_element *ptr;
1405   char **matchlist;
1406   int sizeof_matchlist;
1407   int matches;
1408   int textlen = strlen (text);
1409
1410   sizeof_matchlist = 10;
1411   matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
1412   matches = 0;
1413
1414   for (ptr = list; ptr; ptr = ptr->next)
1415     if (!strncmp (ptr->name, text, textlen)
1416         && !ptr->abbrev_flag
1417         && (ptr->function.cfunc
1418             || ptr->prefixlist))
1419       {
1420         if (matches == sizeof_matchlist)
1421           {
1422             sizeof_matchlist *= 2;
1423             matchlist = (char **) xrealloc ((char *) matchlist,
1424                                             (sizeof_matchlist
1425                                              * sizeof (char *)));
1426           }
1427
1428         matchlist[matches] = (char *)
1429           xmalloc (strlen (word) + strlen (ptr->name) + 1);
1430         if (word == text)
1431           strcpy (matchlist[matches], ptr->name);
1432         else if (word > text)
1433           {
1434             /* Return some portion of ptr->name.  */
1435             strcpy (matchlist[matches], ptr->name + (word - text));
1436           }
1437         else
1438           {
1439             /* Return some of text plus ptr->name.  */
1440             strncpy (matchlist[matches], word, text - word);
1441             matchlist[matches][text - word] = '\0';
1442             strcat (matchlist[matches], ptr->name);
1443           }
1444         ++matches;
1445       }
1446
1447   if (matches == 0)
1448     {
1449       free ((PTR) matchlist);
1450       matchlist = 0;
1451     }
1452   else
1453     {
1454       matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
1455                                                         * sizeof (char *)));
1456       matchlist[matches] = (char *) 0;
1457     }
1458
1459   return matchlist;
1460 }
1461
1462 /* Helper function for SYMBOL_COMPLETION_FUNCTION.  */
1463
1464 /* Return a vector of char pointers which point to the different
1465    possible completions in CMD of TEXT.  
1466
1467    WORD points in the same buffer as TEXT, and completions should be
1468    returned relative to this position.  For example, suppose TEXT is "foo"
1469    and we want to complete to "foobar".  If WORD is "oo", return
1470    "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
1471
1472 char **
1473 complete_on_enum (const char *enumlist[],
1474                   char *text,
1475                   char *word)
1476 {
1477   char **matchlist;
1478   int sizeof_matchlist;
1479   int matches;
1480   int textlen = strlen (text);
1481   int i;
1482   const char *name;
1483
1484   sizeof_matchlist = 10;
1485   matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
1486   matches = 0;
1487
1488   for (i = 0; (name = enumlist[i]) != NULL; i++)
1489     if (strncmp (name, text, textlen) == 0)
1490       {
1491         if (matches == sizeof_matchlist)
1492           {
1493             sizeof_matchlist *= 2;
1494             matchlist = (char **) xrealloc ((char *) matchlist,
1495                                             (sizeof_matchlist
1496                                              * sizeof (char *)));
1497           }
1498
1499         matchlist[matches] = (char *)
1500           xmalloc (strlen (word) + strlen (name) + 1);
1501         if (word == text)
1502           strcpy (matchlist[matches], name);
1503         else if (word > text)
1504           {
1505             /* Return some portion of name.  */
1506             strcpy (matchlist[matches], name + (word - text));
1507           }
1508         else
1509           {
1510             /* Return some of text plus name.  */
1511             strncpy (matchlist[matches], word, text - word);
1512             matchlist[matches][text - word] = '\0';
1513             strcat (matchlist[matches], name);
1514           }
1515         ++matches;
1516       }
1517
1518   if (matches == 0)
1519     {
1520       free ((PTR) matchlist);
1521       matchlist = 0;
1522     }
1523   else
1524     {
1525       matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
1526                                                         * sizeof (char *)));
1527       matchlist[matches] = (char *) 0;
1528     }
1529
1530   return matchlist;
1531 }
1532
1533 static int
1534 parse_binary_operation (arg)
1535      char *arg;
1536 {
1537   int length;
1538
1539   if (!arg || !*arg)
1540     return 1;
1541
1542   length = strlen (arg);
1543
1544   while (arg[length - 1] == ' ' || arg[length - 1] == '\t')
1545     length--;
1546
1547   if (!strncmp (arg, "on", length)
1548       || !strncmp (arg, "1", length)
1549       || !strncmp (arg, "yes", length))
1550     return 1;
1551   else if (!strncmp (arg, "off", length)
1552            || !strncmp (arg, "0", length)
1553            || !strncmp (arg, "no", length))
1554     return 0;
1555   else
1556     {
1557       error ("\"on\" or \"off\" expected.");
1558       return 0;
1559     }
1560 }
1561
1562 /* Do a "set" or "show" command.  ARG is NULL if no argument, or the text
1563    of the argument, and FROM_TTY is nonzero if this command is being entered
1564    directly by the user (i.e. these are just like any other
1565    command).  C is the command list element for the command.  */
1566 void
1567 do_setshow_command (arg, from_tty, c)
1568      char *arg;
1569      int from_tty;
1570      struct cmd_list_element *c;
1571 {
1572   if (c->type == set_cmd)
1573     {
1574       switch (c->var_type)
1575         {
1576         case var_string:
1577           {
1578             char *new;
1579             char *p;
1580             char *q;
1581             int ch;
1582
1583             if (arg == NULL)
1584               arg = "";
1585             new = (char *) xmalloc (strlen (arg) + 2);
1586             p = arg;
1587             q = new;
1588             while ((ch = *p++) != '\000')
1589               {
1590                 if (ch == '\\')
1591                   {
1592                     /* \ at end of argument is used after spaces
1593                        so they won't be lost.  */
1594                     /* This is obsolete now that we no longer strip
1595                        trailing whitespace and actually, the backslash
1596                        didn't get here in my test, readline or
1597                        something did something funky with a backslash
1598                        right before a newline.  */
1599                     if (*p == 0)
1600                       break;
1601                     ch = parse_escape (&p);
1602                     if (ch == 0)
1603                       break;    /* C loses */
1604                     else if (ch > 0)
1605                       *q++ = ch;
1606                   }
1607                 else
1608                   *q++ = ch;
1609               }
1610 #if 0
1611             if (*(p - 1) != '\\')
1612               *q++ = ' ';
1613 #endif
1614             *q++ = '\0';
1615             new = (char *) xrealloc (new, q - new);
1616             if (*(char **) c->var != NULL)
1617               free (*(char **) c->var);
1618             *(char **) c->var = new;
1619           }
1620           break;
1621         case var_string_noescape:
1622           if (arg == NULL)
1623             arg = "";
1624           if (*(char **) c->var != NULL)
1625             free (*(char **) c->var);
1626           *(char **) c->var = savestring (arg, strlen (arg));
1627           break;
1628         case var_filename:
1629           if (arg == NULL)
1630             error_no_arg ("filename to set it to.");
1631           if (*(char **) c->var != NULL)
1632             free (*(char **) c->var);
1633           *(char **) c->var = tilde_expand (arg);
1634           break;
1635         case var_boolean:
1636           *(int *) c->var = parse_binary_operation (arg);
1637           break;
1638         case var_uinteger:
1639           if (arg == NULL)
1640             error_no_arg ("integer to set it to.");
1641           *(unsigned int *) c->var = parse_and_eval_address (arg);
1642           if (*(unsigned int *) c->var == 0)
1643             *(unsigned int *) c->var = UINT_MAX;
1644           break;
1645         case var_integer:
1646           {
1647             unsigned int val;
1648             if (arg == NULL)
1649               error_no_arg ("integer to set it to.");
1650             val = parse_and_eval_address (arg);
1651             if (val == 0)
1652               *(int *) c->var = INT_MAX;
1653             else if (val >= INT_MAX)
1654               error ("integer %u out of range", val);
1655             else
1656               *(int *) c->var = val;
1657             break;
1658           }
1659         case var_zinteger:
1660           if (arg == NULL)
1661             error_no_arg ("integer to set it to.");
1662           *(int *) c->var = parse_and_eval_address (arg);
1663           break;
1664         case var_enum:
1665           {
1666             int i;
1667             int len;
1668             int nmatches;
1669             const char *match = NULL;
1670             char *p;
1671
1672             /* if no argument was supplied, print an informative error message */
1673             if (arg == NULL)
1674               {
1675                 char msg[1024];
1676                 strcpy (msg, "Requires an argument. Valid arguments are ");
1677                 for (i = 0; c->enums[i]; i++)
1678                   {
1679                     if (i != 0)
1680                       strcat (msg, ", ");
1681                     strcat (msg, c->enums[i]);
1682                   }
1683                 strcat (msg, ".");
1684                 error (msg);
1685               }
1686
1687             p = strchr (arg, ' ');
1688
1689             if (p)
1690               len = p - arg;
1691             else
1692               len = strlen (arg);
1693
1694             nmatches = 0;
1695             for (i = 0; c->enums[i]; i++)
1696               if (strncmp (arg, c->enums[i], len) == 0)
1697                 {
1698                   if (c->enums[i][len] == '\0')
1699                     {
1700                       match = c->enums[i];
1701                       nmatches = 1;
1702                       break; /* exact match. */
1703                     }
1704                   else
1705                     {
1706                       match = c->enums[i];
1707                       nmatches++;
1708                     }
1709                 }
1710
1711             if (nmatches <= 0)
1712               error ("Undefined item: \"%s\".", arg);
1713
1714             if (nmatches > 1)
1715               error ("Ambiguous item \"%s\".", arg);
1716
1717             *(const char **) c->var = match;
1718           }
1719           break;
1720         default:
1721           error ("gdb internal error: bad var_type in do_setshow_command");
1722         }
1723     }
1724   else if (c->type == show_cmd)
1725     {
1726 #ifdef UI_OUT
1727       struct cleanup *old_chain;
1728       struct ui_stream *stb;
1729       int quote;
1730
1731       stb = ui_out_stream_new (uiout);
1732       old_chain = make_cleanup_ui_out_stream_delete (stb);
1733 #endif /* UI_OUT */
1734
1735       /* Print doc minus "show" at start.  */
1736       print_doc_line (gdb_stdout, c->doc + 5);
1737
1738 #ifdef UI_OUT
1739       ui_out_text (uiout, " is ");
1740       ui_out_wrap_hint (uiout, "    ");
1741       quote = 0;
1742       switch (c->var_type)
1743         {
1744         case var_string:
1745           {
1746             unsigned char *p;
1747
1748             if (*(unsigned char **) c->var)
1749               fputstr_filtered (*(unsigned char **) c->var, '"', stb->stream);
1750             quote = 1;
1751           }
1752           break;
1753         case var_string_noescape:
1754         case var_filename:
1755         case var_enum:
1756           if (*(char **) c->var)
1757             fputs_filtered (*(char **) c->var, stb->stream);
1758           quote = 1;
1759           break;
1760         case var_boolean:
1761           fputs_filtered (*(int *) c->var ? "on" : "off", stb->stream);
1762           break;
1763         case var_uinteger:
1764           if (*(unsigned int *) c->var == UINT_MAX)
1765             {
1766               fputs_filtered ("unlimited", stb->stream);
1767               break;
1768             }
1769           /* else fall through */
1770         case var_zinteger:
1771           fprintf_filtered (stb->stream, "%u", *(unsigned int *) c->var);
1772           break;
1773         case var_integer:
1774           if (*(int *) c->var == INT_MAX)
1775             {
1776               fputs_filtered ("unlimited", stb->stream);
1777             }
1778           else
1779             fprintf_filtered (stb->stream, "%d", *(int *) c->var);
1780           break;
1781
1782         default:
1783           error ("gdb internal error: bad var_type in do_setshow_command");
1784         }
1785       if (quote)
1786         ui_out_text (uiout, "\"");
1787       ui_out_field_stream (uiout, "value", stb);
1788       if (quote)
1789         ui_out_text (uiout, "\"");
1790       ui_out_text (uiout, ".\n");
1791       do_cleanups (old_chain);
1792 #else
1793       fputs_filtered (" is ", gdb_stdout);
1794       wrap_here ("    ");
1795       switch (c->var_type)
1796         {
1797         case var_string:
1798           {
1799             fputs_filtered ("\"", gdb_stdout);
1800             if (*(unsigned char **) c->var)
1801               fputstr_filtered (*(unsigned char **) c->var, '"', gdb_stdout);
1802             fputs_filtered ("\"", gdb_stdout);
1803           }
1804           break;
1805         case var_string_noescape:
1806         case var_filename:
1807         case var_enum:
1808           fputs_filtered ("\"", gdb_stdout);
1809           if (*(char **) c->var)
1810             fputs_filtered (*(char **) c->var, gdb_stdout);
1811           fputs_filtered ("\"", gdb_stdout);
1812           break;
1813         case var_boolean:
1814           fputs_filtered (*(int *) c->var ? "on" : "off", gdb_stdout);
1815           break;
1816         case var_uinteger:
1817           if (*(unsigned int *) c->var == UINT_MAX)
1818             {
1819               fputs_filtered ("unlimited", gdb_stdout);
1820               break;
1821             }
1822           /* else fall through */
1823         case var_zinteger:
1824           fprintf_filtered (gdb_stdout, "%u", *(unsigned int *) c->var);
1825           break;
1826         case var_integer:
1827           if (*(int *) c->var == INT_MAX)
1828             {
1829               fputs_filtered ("unlimited", gdb_stdout);
1830             }
1831           else
1832             fprintf_filtered (gdb_stdout, "%d", *(int *) c->var);
1833           break;
1834
1835         default:
1836           error ("gdb internal error: bad var_type in do_setshow_command");
1837         }
1838       fputs_filtered (".\n", gdb_stdout);
1839 #endif
1840     }
1841   else
1842     error ("gdb internal error: bad cmd_type in do_setshow_command");
1843   (*c->function.sfunc) (NULL, from_tty, c);
1844   if (c->type == set_cmd && set_hook)
1845     set_hook (c);
1846 }
1847
1848 /* Show all the settings in a list of show commands.  */
1849
1850 void
1851 cmd_show_list (list, from_tty, prefix)
1852      struct cmd_list_element *list;
1853      int from_tty;
1854      char *prefix;
1855 {
1856 #ifdef UI_OUT
1857   ui_out_list_begin (uiout, "showlist");
1858 #endif
1859   for (; list != NULL; list = list->next)
1860     {
1861       /* If we find a prefix, run its list, prefixing our output by its
1862          prefix (with "show " skipped).  */
1863 #ifdef UI_OUT
1864       if (list->prefixlist && !list->abbrev_flag)
1865         {
1866           ui_out_list_begin (uiout, "optionlist");
1867           ui_out_field_string (uiout, "prefix", list->prefixname + 5);
1868           cmd_show_list (*list->prefixlist, from_tty, list->prefixname + 5);
1869           ui_out_list_end (uiout);
1870         }
1871       if (list->type == show_cmd)
1872         {
1873           ui_out_list_begin (uiout, "option");
1874           ui_out_text (uiout, prefix);
1875           ui_out_field_string (uiout, "name", list->name);
1876           ui_out_text (uiout, ":  ");
1877           do_setshow_command ((char *) NULL, from_tty, list);
1878           ui_out_list_end (uiout);
1879         }
1880 #else
1881       if (list->prefixlist && !list->abbrev_flag)
1882         cmd_show_list (*list->prefixlist, from_tty, list->prefixname + 5);
1883       if (list->type == show_cmd)
1884         {
1885           fputs_filtered (prefix, gdb_stdout);
1886           fputs_filtered (list->name, gdb_stdout);
1887           fputs_filtered (":  ", gdb_stdout);
1888           do_setshow_command ((char *) NULL, from_tty, list);
1889         }
1890 #endif
1891     }
1892 #ifdef UI_OUT
1893   ui_out_list_end (uiout);
1894 #endif
1895 }
1896
1897 /* ARGSUSED */
1898 static void
1899 shell_escape (arg, from_tty)
1900      char *arg;
1901      int from_tty;
1902 {
1903 #ifdef CANT_FORK
1904   /* If ARG is NULL, they want an inferior shell, but `system' just
1905      reports if the shell is available when passed a NULL arg.  */
1906   int rc = system (arg ? arg : "");
1907
1908   if (!arg)
1909     arg = "inferior shell";
1910
1911   if (rc == -1)
1912     {
1913       fprintf_unfiltered (gdb_stderr, "Cannot execute %s: %s\n", arg,
1914                           safe_strerror (errno));
1915       gdb_flush (gdb_stderr);
1916     }
1917   else if (rc)
1918     {
1919       fprintf_unfiltered (gdb_stderr, "%s exited with status %d\n", arg, rc);
1920       gdb_flush (gdb_stderr);
1921     }
1922 #ifdef __DJGPP__
1923   /* Make sure to return to the directory GDB thinks it is, in case the
1924      shell command we just ran changed it.  */
1925   chdir (current_directory);
1926 #endif
1927 #else /* Can fork.  */
1928   int rc, status, pid;
1929   char *p, *user_shell;
1930
1931   if ((user_shell = (char *) getenv ("SHELL")) == NULL)
1932     user_shell = "/bin/sh";
1933
1934   /* Get the name of the shell for arg0 */
1935   if ((p = strrchr (user_shell, '/')) == NULL)
1936     p = user_shell;
1937   else
1938     p++;                        /* Get past '/' */
1939
1940   if ((pid = fork ()) == 0)
1941     {
1942       if (!arg)
1943         execl (user_shell, p, 0);
1944       else
1945         execl (user_shell, p, "-c", arg, 0);
1946
1947       fprintf_unfiltered (gdb_stderr, "Cannot execute %s: %s\n", user_shell,
1948                           safe_strerror (errno));
1949       gdb_flush (gdb_stderr);
1950       _exit (0177);
1951     }
1952
1953   if (pid != -1)
1954     while ((rc = wait (&status)) != pid && rc != -1)
1955       ;
1956   else
1957     error ("Fork failed");
1958 #endif /* Can fork.  */
1959 }
1960
1961 static void
1962 make_command (arg, from_tty)
1963      char *arg;
1964      int from_tty;
1965 {
1966   char *p;
1967
1968   if (arg == 0)
1969     p = "make";
1970   else
1971     {
1972       p = xmalloc (sizeof ("make ") + strlen (arg));
1973       strcpy (p, "make ");
1974       strcpy (p + sizeof ("make ") - 1, arg);
1975     }
1976
1977   shell_escape (p, from_tty);
1978 }
1979
1980 static void
1981 show_user_1 (c, stream)
1982      struct cmd_list_element *c;
1983      struct ui_file *stream;
1984 {
1985   register struct command_line *cmdlines;
1986
1987   cmdlines = c->user_commands;
1988   if (!cmdlines)
1989     return;
1990   fputs_filtered ("User command ", stream);
1991   fputs_filtered (c->name, stream);
1992   fputs_filtered (":\n", stream);
1993
1994 #ifdef UI_OUT
1995   print_command_lines (uiout, cmdlines, 1);
1996   fputs_filtered ("\n", stream);
1997 #else
1998   while (cmdlines)
1999     {
2000       print_command_line (cmdlines, 4, stream);
2001       cmdlines = cmdlines->next;
2002     }
2003   fputs_filtered ("\n", stream);
2004 #endif
2005 }
2006
2007 /* ARGSUSED */
2008 static void
2009 show_user (args, from_tty)
2010      char *args;
2011      int from_tty;
2012 {
2013   struct cmd_list_element *c;
2014   extern struct cmd_list_element *cmdlist;
2015
2016   if (args)
2017     {
2018       c = lookup_cmd (&args, cmdlist, "", 0, 1);
2019       if (c->class != class_user)
2020         error ("Not a user command.");
2021       show_user_1 (c, gdb_stdout);
2022     }
2023   else
2024     {
2025       for (c = cmdlist; c; c = c->next)
2026         {
2027           if (c->class == class_user)
2028             show_user_1 (c, gdb_stdout);
2029         }
2030     }
2031 }
2032
2033 void
2034 _initialize_command ()
2035 {
2036   add_com ("shell", class_support, shell_escape,
2037            "Execute the rest of the line as a shell command.  \n\
2038 With no arguments, run an inferior shell.");
2039
2040   /* NOTE: cagney/2000-03-20: Being able to enter ``(gdb) !ls'' would
2041      be a really useful feature.  Unfortunatly, the below wont do
2042      this.  Instead it adds support for the form ``(gdb) ! ls''
2043      (i.e. the space is required).  If the ``!'' command below is
2044      added the complains about no ``!'' command would be replaced by
2045      complains about how the ``!'' command is broken :-) */
2046   if (xdb_commands)
2047     add_com_alias ("!", "shell", class_support, 0);
2048
2049   add_com ("make", class_support, make_command,
2050        "Run the ``make'' program using the rest of the line as arguments.");
2051   add_cmd ("user", no_class, show_user,
2052            "Show definitions of user defined commands.\n\
2053 Argument is the name of the user defined command.\n\
2054 With no argument, show definitions of all user defined commands.", &showlist);
2055   add_com ("apropos", class_support, apropos_command, "Search for commands matching a REGEXP");
2056 }