Introduce compiled_regex, eliminate make_regfree_cleanup
[deliverable/binutils-gdb.git] / gdb / cli / cli-decode.c
CommitLineData
c906108c 1/* Handle lists of commands, their decoding and documentation, for GDB.
8926118c 2
61baf725 3 Copyright (C) 1986-2017 Free Software Foundation, Inc.
c906108c 4
c5aa993b
JM
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
a9762ec7 7 the Free Software Foundation; either version 3 of the License, or
c5aa993b 8 (at your option) any later version.
c906108c 9
c5aa993b
JM
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
c906108c 14
c5aa993b 15 You should have received a copy of the GNU General Public License
a9762ec7 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
17
18#include "defs.h"
c906108c 19#include "symtab.h"
c906108c 20#include <ctype.h>
f77b92bf 21#include "gdb_regex.h"
f397e303 22#include "completer.h"
8b93c638 23#include "ui-out.h"
d318976c
FN
24#include "cli/cli-cmds.h"
25#include "cli/cli-decode.h"
156d9eab 26#include "common/gdb_optional.h"
b2875cc0 27
ebcd3b23 28/* Prototypes for local functions. */
c906108c 29
6f937416 30static void undef_cmd_error (const char *, const char *);
c906108c 31
6f937416 32static struct cmd_list_element *delete_cmd (const char *name,
fad6eecd
TT
33 struct cmd_list_element **list,
34 struct cmd_list_element **prehook,
35 struct cmd_list_element **prehookee,
36 struct cmd_list_element **posthook,
37 struct cmd_list_element **posthookee);
b05dcbb7 38
6f937416 39static struct cmd_list_element *find_cmd (const char *command,
a14ed312
KB
40 int len,
41 struct cmd_list_element *clist,
42 int ignore_help_classes,
43 int *nfound);
6837a0a2 44
c85871a3 45static void help_all (struct ui_file *stream);
6e381ba0 46
5b9afe8a
YQ
47/* Look up a command whose 'prefixlist' is KEY. Return the command if found,
48 otherwise return NULL. */
49
50static struct cmd_list_element *
51lookup_cmd_for_prefixlist (struct cmd_list_element **key,
52 struct cmd_list_element *list)
53{
54 struct cmd_list_element *p = NULL;
55
56 for (p = list; p != NULL; p = p->next)
57 {
58 struct cmd_list_element *q;
59
60 if (p->prefixlist == NULL)
61 continue;
62 else if (p->prefixlist == key)
63 return p;
64
65 q = lookup_cmd_for_prefixlist (key, *(p->prefixlist));
66 if (q != NULL)
67 return q;
68 }
69
70 return NULL;
71}
72
73static void
74set_cmd_prefix (struct cmd_list_element *c, struct cmd_list_element **list)
75{
76 struct cmd_list_element *p;
77
78 /* Check to see if *LIST contains any element other than C. */
79 for (p = *list; p != NULL; p = p->next)
80 if (p != c)
81 break;
82
83 if (p == NULL)
84 {
85 /* *SET_LIST only contains SET. */
86 p = lookup_cmd_for_prefixlist (list, setlist);
87
88 c->prefix = p ? (p->cmd_pointer ? p->cmd_pointer : p) : p;
89 }
90 else
91 c->prefix = p->prefix;
92}
93
6e381ba0 94static void
64e61d29
TT
95print_help_for_command (struct cmd_list_element *c, const char *prefix,
96 int recurse, struct ui_file *stream);
6e381ba0 97
d318976c 98\f
9f60d481
AC
99/* Set the callback function for the specified command. For each both
100 the commands callback and func() are set. The latter set to a
101 bounce function (unless cfunc / sfunc is NULL that is). */
102
103static void
104do_cfunc (struct cmd_list_element *c, char *args, int from_tty)
105{
106 c->function.cfunc (args, from_tty); /* Ok. */
107}
108
109void
9773a94b 110set_cmd_cfunc (struct cmd_list_element *cmd, cmd_cfunc_ftype *cfunc)
9f60d481
AC
111{
112 if (cfunc == NULL)
113 cmd->func = NULL;
114 else
115 cmd->func = do_cfunc;
116 cmd->function.cfunc = cfunc; /* Ok. */
117}
118
119static void
120do_sfunc (struct cmd_list_element *c, char *args, int from_tty)
121{
122 c->function.sfunc (args, from_tty, c); /* Ok. */
123}
124
125void
9773a94b 126set_cmd_sfunc (struct cmd_list_element *cmd, cmd_sfunc_ftype *sfunc)
9f60d481
AC
127{
128 if (sfunc == NULL)
129 cmd->func = NULL;
130 else
131 cmd->func = do_sfunc;
132 cmd->function.sfunc = sfunc; /* Ok. */
133}
134
bbaca940 135int
82ae6c8d 136cmd_cfunc_eq (struct cmd_list_element *cmd, cmd_cfunc_ftype *cfunc)
bbaca940
AC
137{
138 return cmd->func == do_cfunc && cmd->function.cfunc == cfunc;
139}
140
7d0766f3
AC
141void
142set_cmd_context (struct cmd_list_element *cmd, void *context)
143{
144 cmd->context = context;
145}
146
147void *
148get_cmd_context (struct cmd_list_element *cmd)
149{
150 return cmd->context;
151}
152
1868c04e
AC
153enum cmd_types
154cmd_type (struct cmd_list_element *cmd)
155{
156 return cmd->type;
157}
158
5ba2abeb 159void
625e8578 160set_cmd_completer (struct cmd_list_element *cmd, completer_ftype *completer)
5ba2abeb
AC
161{
162 cmd->completer = completer; /* Ok. */
163}
164
7d793aa9
SDJ
165/* See definition in commands.h. */
166
167void
168set_cmd_completer_handle_brkchars (struct cmd_list_element *cmd,
169 completer_ftype_void *completer_handle_brkchars)
170{
171 cmd->completer_handle_brkchars = completer_handle_brkchars;
172}
173
c906108c 174/* Add element named NAME.
bc587a6b 175 Space for NAME and DOC must be allocated by the caller.
c906108c
SS
176 CLASS is the top level category into which commands are broken down
177 for "help" purposes.
178 FUN should be the function to execute the command;
179 it will get a character string as argument, with leading
180 and trailing blanks already eliminated.
181
182 DOC is a documentation string for the command.
183 Its first line should be a complete sentence.
184 It should start with ? for a command that is an abbreviation
185 or with * for a command that most users don't need to know about.
186
ebcd3b23 187 Add this command to command list *LIST.
c906108c
SS
188
189 Returns a pointer to the added command (not necessarily the head
ebcd3b23 190 of *LIST). */
c906108c
SS
191
192struct cmd_list_element *
fe978cb0 193add_cmd (const char *name, enum command_class theclass, cmd_cfunc_ftype *fun,
1947513d 194 const char *doc, struct cmd_list_element **list)
c906108c 195{
8d749320 196 struct cmd_list_element *c = XNEW (struct cmd_list_element);
b05dcbb7 197 struct cmd_list_element *p, *iter;
c906108c 198
b05dcbb7
TT
199 /* Turn each alias of the old command into an alias of the new
200 command. */
fad6eecd
TT
201 c->aliases = delete_cmd (name, list, &c->hook_pre, &c->hookee_pre,
202 &c->hook_post, &c->hookee_post);
b05dcbb7
TT
203 for (iter = c->aliases; iter; iter = iter->alias_chain)
204 iter->cmd_pointer = c;
fad6eecd
TT
205 if (c->hook_pre)
206 c->hook_pre->hookee_pre = c;
207 if (c->hookee_pre)
208 c->hookee_pre->hook_pre = c;
209 if (c->hook_post)
210 c->hook_post->hookee_post = c;
211 if (c->hookee_post)
212 c->hookee_post->hook_post = c;
c906108c 213
494b7ec9 214 if (*list == NULL || strcmp ((*list)->name, name) >= 0)
c906108c
SS
215 {
216 c->next = *list;
217 *list = c;
218 }
219 else
220 {
221 p = *list;
494b7ec9 222 while (p->next && strcmp (p->next->name, name) <= 0)
c5aa993b
JM
223 {
224 p = p->next;
225 }
c906108c
SS
226 c->next = p->next;
227 p->next = c;
228 }
229
230 c->name = name;
fe978cb0 231 c->theclass = theclass;
9f60d481 232 set_cmd_cfunc (c, fun);
7d0766f3 233 set_cmd_context (c, NULL);
c906108c 234 c->doc = doc;
1f2bdf09
TT
235 c->cmd_deprecated = 0;
236 c->deprecated_warn_user = 0;
237 c->malloced_replacement = 0;
238 c->doc_allocated = 0;
56382845 239 c->replacement = NULL;
47724592 240 c->pre_show_hook = NULL;
73bc900d 241 c->hook_in = 0;
c906108c
SS
242 c->prefixlist = NULL;
243 c->prefixname = NULL;
244 c->allow_unknown = 0;
5b9afe8a 245 c->prefix = NULL;
c906108c 246 c->abbrev_flag = 0;
d8906c6f 247 set_cmd_completer (c, make_symbol_completion_list_fn);
7d793aa9 248 c->completer_handle_brkchars = NULL;
d8906c6f 249 c->destroyer = NULL;
c906108c
SS
250 c->type = not_set_cmd;
251 c->var = NULL;
252 c->var_type = var_boolean;
253 c->enums = NULL;
254 c->user_commands = NULL;
c906108c 255 c->cmd_pointer = NULL;
b05dcbb7 256 c->alias_chain = NULL;
4034d0ff 257 c->suppress_notification = NULL;
c906108c
SS
258
259 return c;
260}
261
56382845 262/* Deprecates a command CMD.
ebcd3b23
MS
263 REPLACEMENT is the name of the command which should be used in
264 place of this command, or NULL if no such command exists.
56382845
FN
265
266 This function does not check to see if command REPLACEMENT exists
ebcd3b23
MS
267 since gdb may not have gotten around to adding REPLACEMENT when
268 this function is called.
56382845
FN
269
270 Returns a pointer to the deprecated command. */
271
272struct cmd_list_element *
429e55ea 273deprecate_cmd (struct cmd_list_element *cmd, const char *replacement)
56382845 274{
1f2bdf09
TT
275 cmd->cmd_deprecated = 1;
276 cmd->deprecated_warn_user = 1;
56382845
FN
277
278 if (replacement != NULL)
279 cmd->replacement = replacement;
280 else
281 cmd->replacement = NULL;
282
283 return cmd;
284}
285
c906108c 286struct cmd_list_element *
21873064
YQ
287add_alias_cmd (const char *name, cmd_list_element *old,
288 enum command_class theclass, int abbrev_flag,
289 struct cmd_list_element **list)
c906108c 290{
c906108c
SS
291 if (old == 0)
292 {
fad6eecd
TT
293 struct cmd_list_element *prehook, *prehookee, *posthook, *posthookee;
294 struct cmd_list_element *aliases = delete_cmd (name, list,
295 &prehook, &prehookee,
296 &posthook, &posthookee);
cdb27c12 297
b05dcbb7 298 /* If this happens, it means a programmer error somewhere. */
300d0284 299 gdb_assert (!aliases && !prehook && !prehookee
fad6eecd 300 && !posthook && ! posthookee);
c906108c
SS
301 return 0;
302 }
303
21873064 304 struct cmd_list_element *c = add_cmd (name, theclass, NULL, old->doc, list);
5bc81a00
PM
305
306 /* If OLD->DOC can be freed, we should make another copy. */
1f2bdf09 307 if (old->doc_allocated)
5bc81a00
PM
308 {
309 c->doc = xstrdup (old->doc);
1f2bdf09 310 c->doc_allocated = 1;
5bc81a00 311 }
9f60d481
AC
312 /* NOTE: Both FUNC and all the FUNCTIONs need to be copied. */
313 c->func = old->func;
314 c->function = old->function;
c906108c
SS
315 c->prefixlist = old->prefixlist;
316 c->prefixname = old->prefixname;
317 c->allow_unknown = old->allow_unknown;
318 c->abbrev_flag = abbrev_flag;
319 c->cmd_pointer = old;
b05dcbb7
TT
320 c->alias_chain = old->aliases;
321 old->aliases = c;
5b9afe8a
YQ
322
323 set_cmd_prefix (c, list);
c906108c
SS
324 return c;
325}
326
21873064
YQ
327struct cmd_list_element *
328add_alias_cmd (const char *name, const char *oldname,
329 enum command_class theclass, int abbrev_flag,
330 struct cmd_list_element **list)
331{
332 const char *tmp;
333 struct cmd_list_element *old;
334
335 tmp = oldname;
336 old = lookup_cmd (&tmp, *list, "", 1, 1);
337
338 return add_alias_cmd (name, old, theclass, abbrev_flag, list);
339}
340
341
ebcd3b23
MS
342/* Like add_cmd but adds an element for a command prefix: a name that
343 should be followed by a subcommand to be looked up in another
344 command list. PREFIXLIST should be the address of the variable
345 containing that list. */
c906108c
SS
346
347struct cmd_list_element *
fe978cb0 348add_prefix_cmd (const char *name, enum command_class theclass,
82ae6c8d 349 cmd_cfunc_ftype *fun,
1947513d 350 const char *doc, struct cmd_list_element **prefixlist,
64e61d29 351 const char *prefixname, int allow_unknown,
af1c1752 352 struct cmd_list_element **list)
c906108c 353{
fe978cb0 354 struct cmd_list_element *c = add_cmd (name, theclass, fun, doc, list);
5b9afe8a 355 struct cmd_list_element *p;
cdb27c12 356
c906108c
SS
357 c->prefixlist = prefixlist;
358 c->prefixname = prefixname;
359 c->allow_unknown = allow_unknown;
5b9afe8a
YQ
360
361 if (list == &cmdlist)
362 c->prefix = NULL;
363 else
364 set_cmd_prefix (c, list);
365
366 /* Update the field 'prefix' of each cmd_list_element in *PREFIXLIST. */
367 for (p = *prefixlist; p != NULL; p = p->next)
368 p->prefix = c;
369
c906108c
SS
370 return c;
371}
372
ebcd3b23 373/* Like add_prefix_cmd but sets the abbrev_flag on the new command. */
c5aa993b 374
c906108c 375struct cmd_list_element *
fe978cb0 376add_abbrev_prefix_cmd (const char *name, enum command_class theclass,
1947513d 377 cmd_cfunc_ftype *fun, const char *doc,
64e61d29
TT
378 struct cmd_list_element **prefixlist,
379 const char *prefixname,
af1c1752 380 int allow_unknown, struct cmd_list_element **list)
c906108c 381{
fe978cb0 382 struct cmd_list_element *c = add_cmd (name, theclass, fun, doc, list);
cdb27c12 383
c906108c
SS
384 c->prefixlist = prefixlist;
385 c->prefixname = prefixname;
386 c->allow_unknown = allow_unknown;
387 c->abbrev_flag = 1;
388 return c;
389}
390
391/* This is an empty "cfunc". */
392void
fba45db2 393not_just_help_class_command (char *args, int from_tty)
c906108c
SS
394{
395}
396
397/* This is an empty "sfunc". */
a14ed312 398static void empty_sfunc (char *, int, struct cmd_list_element *);
c906108c
SS
399
400static void
fba45db2 401empty_sfunc (char *args, int from_tty, struct cmd_list_element *c)
c906108c
SS
402{
403}
404
b2875cc0 405/* Add element named NAME to command list LIST (the list for set/show
c906108c 406 or some sublist thereof).
b2875cc0 407 TYPE is set_cmd or show_cmd.
c906108c
SS
408 CLASS is as in add_cmd.
409 VAR_TYPE is the kind of thing we are setting.
410 VAR is address of the variable being controlled by this command.
411 DOC is the documentation string. */
412
b2875cc0 413static struct cmd_list_element *
6f937416 414add_set_or_show_cmd (const char *name,
b2875cc0 415 enum cmd_types type,
fe978cb0 416 enum command_class theclass,
b2875cc0
AC
417 var_types var_type,
418 void *var,
1947513d 419 const char *doc,
b2875cc0 420 struct cmd_list_element **list)
c906108c 421{
fe978cb0 422 struct cmd_list_element *c = add_cmd (name, theclass, NULL, doc, list);
cdb27c12 423
b2875cc0
AC
424 gdb_assert (type == set_cmd || type == show_cmd);
425 c->type = type;
c906108c
SS
426 c->var_type = var_type;
427 c->var = var;
e00d1dc8 428 /* This needs to be something besides NULL so that this isn't
c906108c 429 treated as a help class. */
9f60d481 430 set_cmd_sfunc (c, empty_sfunc);
c906108c
SS
431 return c;
432}
433
e707bbc2
AC
434/* Add element named NAME to both the command SET_LIST and SHOW_LIST.
435 CLASS is as in add_cmd. VAR_TYPE is the kind of thing we are
436 setting. VAR is address of the variable being controlled by this
437 command. SET_FUNC and SHOW_FUNC are the callback functions (if
3b64bf98
AC
438 non-NULL). SET_DOC, SHOW_DOC and HELP_DOC are the documentation
439 strings. PRINT the format string to print the value. SET_RESULT
440 and SHOW_RESULT, if not NULL, are set to the resulting command
441 structures. */
e707bbc2 442
b3f42336 443static void
6f937416 444add_setshow_cmd_full (const char *name,
fe978cb0 445 enum command_class theclass,
9f064c95 446 var_types var_type, void *var,
3b64bf98 447 const char *set_doc, const char *show_doc,
335cca0d 448 const char *help_doc,
3b64bf98 449 cmd_sfunc_ftype *set_func,
08546159 450 show_value_ftype *show_func,
9f064c95
TT
451 struct cmd_list_element **set_list,
452 struct cmd_list_element **show_list,
453 struct cmd_list_element **set_result,
454 struct cmd_list_element **show_result)
e707bbc2
AC
455{
456 struct cmd_list_element *set;
457 struct cmd_list_element *show;
be7d7357
AC
458 char *full_set_doc;
459 char *full_show_doc;
460
461 if (help_doc != NULL)
462 {
463 full_set_doc = xstrprintf ("%s\n%s", set_doc, help_doc);
464 full_show_doc = xstrprintf ("%s\n%s", show_doc, help_doc);
465 }
466 else
467 {
468 full_set_doc = xstrdup (set_doc);
469 full_show_doc = xstrdup (show_doc);
470 }
fe978cb0 471 set = add_set_or_show_cmd (name, set_cmd, theclass, var_type, var,
3b64bf98 472 full_set_doc, set_list);
1f2bdf09 473 set->doc_allocated = 1;
5bc81a00 474
e707bbc2
AC
475 if (set_func != NULL)
476 set_cmd_sfunc (set, set_func);
5b9afe8a
YQ
477
478 set_cmd_prefix (set, set_list);
479
fe978cb0 480 show = add_set_or_show_cmd (name, show_cmd, theclass, var_type, var,
3b64bf98 481 full_show_doc, show_list);
1f2bdf09 482 show->doc_allocated = 1;
08546159 483 show->show_value_func = show_func;
9f064c95
TT
484
485 if (set_result != NULL)
486 *set_result = set;
487 if (show_result != NULL)
488 *show_result = show;
489}
490
1b295c3d
AC
491/* Add element named NAME to command list LIST (the list for set or
492 some sublist thereof). CLASS is as in add_cmd. ENUMLIST is a list
493 of strings which may follow NAME. VAR is address of the variable
494 which will contain the matching string (from ENUMLIST). */
495
496void
6f937416 497add_setshow_enum_cmd (const char *name,
fe978cb0 498 enum command_class theclass,
40478521 499 const char *const *enumlist,
1b295c3d
AC
500 const char **var,
501 const char *set_doc,
502 const char *show_doc,
503 const char *help_doc,
1b295c3d 504 cmd_sfunc_ftype *set_func,
08546159 505 show_value_ftype *show_func,
1b295c3d 506 struct cmd_list_element **set_list,
7376b4c2 507 struct cmd_list_element **show_list)
1b295c3d
AC
508{
509 struct cmd_list_element *c;
cdb27c12 510
fe978cb0 511 add_setshow_cmd_full (name, theclass, var_enum, var,
335cca0d 512 set_doc, show_doc, help_doc,
1b295c3d
AC
513 set_func, show_func,
514 set_list, show_list,
7376b4c2 515 &c, NULL);
1b295c3d
AC
516 c->enums = enumlist;
517}
518
5b9afe8a
YQ
519const char * const auto_boolean_enums[] = { "on", "off", "auto", NULL };
520
e9e68a56
AC
521/* Add an auto-boolean command named NAME to both the set and show
522 command list lists. CLASS is as in add_cmd. VAR is address of the
523 variable which will contain the value. DOC is the documentation
524 string. FUNC is the corresponding callback. */
525void
6f937416 526add_setshow_auto_boolean_cmd (const char *name,
fe978cb0 527 enum command_class theclass,
e9e68a56 528 enum auto_boolean *var,
3b64bf98 529 const char *set_doc, const char *show_doc,
335cca0d 530 const char *help_doc,
e9e68a56 531 cmd_sfunc_ftype *set_func,
08546159 532 show_value_ftype *show_func,
e9e68a56
AC
533 struct cmd_list_element **set_list,
534 struct cmd_list_element **show_list)
97c3646f 535{
97c3646f 536 struct cmd_list_element *c;
cdb27c12 537
fe978cb0 538 add_setshow_cmd_full (name, theclass, var_auto_boolean, var,
2c5b56ce 539 set_doc, show_doc, help_doc,
3b64bf98 540 set_func, show_func,
9f064c95
TT
541 set_list, show_list,
542 &c, NULL);
97c3646f 543 c->enums = auto_boolean_enums;
97c3646f
AC
544}
545
e707bbc2
AC
546/* Add element named NAME to both the set and show command LISTs (the
547 list for set/show or some sublist thereof). CLASS is as in
548 add_cmd. VAR is address of the variable which will contain the
ba3e8e46 549 value. SET_DOC and SHOW_DOC are the documentation strings. */
e707bbc2 550void
fe978cb0 551add_setshow_boolean_cmd (const char *name, enum command_class theclass, int *var,
3b64bf98 552 const char *set_doc, const char *show_doc,
335cca0d 553 const char *help_doc,
e707bbc2 554 cmd_sfunc_ftype *set_func,
08546159 555 show_value_ftype *show_func,
e707bbc2
AC
556 struct cmd_list_element **set_list,
557 struct cmd_list_element **show_list)
f3796e26
AC
558{
559 static const char *boolean_enums[] = { "on", "off", NULL };
560 struct cmd_list_element *c;
cdb27c12 561
fe978cb0 562 add_setshow_cmd_full (name, theclass, var_boolean, var,
2c5b56ce 563 set_doc, show_doc, help_doc,
9f064c95
TT
564 set_func, show_func,
565 set_list, show_list,
566 &c, NULL);
f3796e26 567 c->enums = boolean_enums;
f3796e26
AC
568}
569
b3f42336
AC
570/* Add element named NAME to both the set and show command LISTs (the
571 list for set/show or some sublist thereof). */
572void
fe978cb0 573add_setshow_filename_cmd (const char *name, enum command_class theclass,
b3f42336
AC
574 char **var,
575 const char *set_doc, const char *show_doc,
335cca0d 576 const char *help_doc,
b3f42336 577 cmd_sfunc_ftype *set_func,
08546159 578 show_value_ftype *show_func,
b3f42336
AC
579 struct cmd_list_element **set_list,
580 struct cmd_list_element **show_list)
581{
f397e303 582 struct cmd_list_element *set_result;
cdb27c12 583
fe978cb0 584 add_setshow_cmd_full (name, theclass, var_filename, var,
2c5b56ce 585 set_doc, show_doc, help_doc,
b3f42336
AC
586 set_func, show_func,
587 set_list, show_list,
f397e303
AC
588 &set_result, NULL);
589 set_cmd_completer (set_result, filename_completer);
b3f42336
AC
590}
591
592/* Add element named NAME to both the set and show command LISTs (the
5efd5804
PA
593 list for set/show or some sublist thereof). */
594void
fe978cb0 595add_setshow_string_cmd (const char *name, enum command_class theclass,
6df3bc68
MS
596 char **var,
597 const char *set_doc, const char *show_doc,
598 const char *help_doc,
599 cmd_sfunc_ftype *set_func,
600 show_value_ftype *show_func,
601 struct cmd_list_element **set_list,
602 struct cmd_list_element **show_list)
b3f42336 603{
fe978cb0 604 add_setshow_cmd_full (name, theclass, var_string, var,
2c5b56ce 605 set_doc, show_doc, help_doc,
b3f42336
AC
606 set_func, show_func,
607 set_list, show_list,
5efd5804 608 NULL, NULL);
b3f42336
AC
609}
610
26c41df3 611/* Add element named NAME to both the set and show command LISTs (the
5efd5804 612 list for set/show or some sublist thereof). */
44478ab3 613struct cmd_list_element *
fe978cb0 614add_setshow_string_noescape_cmd (const char *name, enum command_class theclass,
26c41df3
AC
615 char **var,
616 const char *set_doc, const char *show_doc,
617 const char *help_doc,
618 cmd_sfunc_ftype *set_func,
619 show_value_ftype *show_func,
620 struct cmd_list_element **set_list,
621 struct cmd_list_element **show_list)
622{
44478ab3
TT
623 struct cmd_list_element *set_cmd;
624
fe978cb0 625 add_setshow_cmd_full (name, theclass, var_string_noescape, var,
26c41df3
AC
626 set_doc, show_doc, help_doc,
627 set_func, show_func,
628 set_list, show_list,
44478ab3
TT
629 &set_cmd, NULL);
630 return set_cmd;
26c41df3
AC
631}
632
b4b4ac0b
AC
633/* Add element named NAME to both the set and show command LISTs (the
634 list for set/show or some sublist thereof). */
635void
fe978cb0 636add_setshow_optional_filename_cmd (const char *name, enum command_class theclass,
b4b4ac0b
AC
637 char **var,
638 const char *set_doc, const char *show_doc,
639 const char *help_doc,
640 cmd_sfunc_ftype *set_func,
641 show_value_ftype *show_func,
642 struct cmd_list_element **set_list,
643 struct cmd_list_element **show_list)
644{
7f6a6314
PM
645 struct cmd_list_element *set_result;
646
fe978cb0 647 add_setshow_cmd_full (name, theclass, var_optional_filename, var,
b4b4ac0b
AC
648 set_doc, show_doc, help_doc,
649 set_func, show_func,
650 set_list, show_list,
7f6a6314
PM
651 &set_result, NULL);
652
653 set_cmd_completer (set_result, filename_completer);
654
b4b4ac0b
AC
655}
656
f81d1120
PA
657/* Completes on literal "unlimited". Used by integer commands that
658 support a special "unlimited" value. */
659
660static VEC (char_ptr) *
661integer_unlimited_completer (struct cmd_list_element *ignore,
662 const char *text, const char *word)
663{
664 static const char * const keywords[] =
665 {
666 "unlimited",
667 NULL,
668 };
669
670 return complete_on_enum (keywords, text, word);
671}
672
c0d88b1b
AC
673/* Add element named NAME to both the set and show command LISTs (the
674 list for set/show or some sublist thereof). CLASS is as in
675 add_cmd. VAR is address of the variable which will contain the
6fc1c773
YQ
676 value. SET_DOC and SHOW_DOC are the documentation strings. This
677 function is only used in Python API. Please don't use it elsewhere. */
5efd5804 678void
fe978cb0 679add_setshow_integer_cmd (const char *name, enum command_class theclass,
47b667de 680 int *var,
6df3bc68
MS
681 const char *set_doc, const char *show_doc,
682 const char *help_doc,
683 cmd_sfunc_ftype *set_func,
684 show_value_ftype *show_func,
685 struct cmd_list_element **set_list,
686 struct cmd_list_element **show_list)
c0d88b1b 687{
f81d1120
PA
688 struct cmd_list_element *set;
689
fe978cb0 690 add_setshow_cmd_full (name, theclass, var_integer, var,
c0d88b1b
AC
691 set_doc, show_doc, help_doc,
692 set_func, show_func,
693 set_list, show_list,
f81d1120
PA
694 &set, NULL);
695
696 set_cmd_completer (set, integer_unlimited_completer);
c0d88b1b
AC
697}
698
25d29d70
AC
699/* Add element named NAME to both the set and show command LISTs (the
700 list for set/show or some sublist thereof). CLASS is as in
701 add_cmd. VAR is address of the variable which will contain the
5efd5804
PA
702 value. SET_DOC and SHOW_DOC are the documentation strings. */
703void
fe978cb0 704add_setshow_uinteger_cmd (const char *name, enum command_class theclass,
3b64bf98
AC
705 unsigned int *var,
706 const char *set_doc, const char *show_doc,
335cca0d 707 const char *help_doc,
25d29d70 708 cmd_sfunc_ftype *set_func,
08546159 709 show_value_ftype *show_func,
25d29d70
AC
710 struct cmd_list_element **set_list,
711 struct cmd_list_element **show_list)
712{
f81d1120
PA
713 struct cmd_list_element *set;
714
fe978cb0 715 add_setshow_cmd_full (name, theclass, var_uinteger, var,
2c5b56ce 716 set_doc, show_doc, help_doc,
25d29d70
AC
717 set_func, show_func,
718 set_list, show_list,
f81d1120
PA
719 &set, NULL);
720
721 set_cmd_completer (set, integer_unlimited_completer);
25d29d70
AC
722}
723
15170568
AC
724/* Add element named NAME to both the set and show command LISTs (the
725 list for set/show or some sublist thereof). CLASS is as in
726 add_cmd. VAR is address of the variable which will contain the
5efd5804
PA
727 value. SET_DOC and SHOW_DOC are the documentation strings. */
728void
fe978cb0 729add_setshow_zinteger_cmd (const char *name, enum command_class theclass,
3b64bf98
AC
730 int *var,
731 const char *set_doc, const char *show_doc,
335cca0d 732 const char *help_doc,
15170568 733 cmd_sfunc_ftype *set_func,
08546159 734 show_value_ftype *show_func,
15170568
AC
735 struct cmd_list_element **set_list,
736 struct cmd_list_element **show_list)
737{
fe978cb0 738 add_setshow_cmd_full (name, theclass, var_zinteger, var,
2c5b56ce 739 set_doc, show_doc, help_doc,
15170568
AC
740 set_func, show_func,
741 set_list, show_list,
5efd5804 742 NULL, NULL);
15170568
AC
743}
744
6fc1c773 745void
6f937416 746add_setshow_zuinteger_unlimited_cmd (const char *name,
fe978cb0 747 enum command_class theclass,
b69b1fb1 748 int *var,
6fc1c773
YQ
749 const char *set_doc,
750 const char *show_doc,
751 const char *help_doc,
752 cmd_sfunc_ftype *set_func,
753 show_value_ftype *show_func,
754 struct cmd_list_element **set_list,
755 struct cmd_list_element **show_list)
756{
f81d1120
PA
757 struct cmd_list_element *set;
758
fe978cb0 759 add_setshow_cmd_full (name, theclass, var_zuinteger_unlimited, var,
6fc1c773
YQ
760 set_doc, show_doc, help_doc,
761 set_func, show_func,
762 set_list, show_list,
f81d1120
PA
763 &set, NULL);
764
765 set_cmd_completer (set, integer_unlimited_completer);
6fc1c773
YQ
766}
767
1e8fb976
PA
768/* Add element named NAME to both the set and show command LISTs (the
769 list for set/show or some sublist thereof). CLASS is as in
770 add_cmd. VAR is address of the variable which will contain the
5efd5804
PA
771 value. SET_DOC and SHOW_DOC are the documentation strings. */
772void
fe978cb0 773add_setshow_zuinteger_cmd (const char *name, enum command_class theclass,
1e8fb976
PA
774 unsigned int *var,
775 const char *set_doc, const char *show_doc,
776 const char *help_doc,
777 cmd_sfunc_ftype *set_func,
778 show_value_ftype *show_func,
779 struct cmd_list_element **set_list,
780 struct cmd_list_element **show_list)
781{
fe978cb0 782 add_setshow_cmd_full (name, theclass, var_zuinteger, var,
1e8fb976
PA
783 set_doc, show_doc, help_doc,
784 set_func, show_func,
785 set_list, show_list,
5efd5804 786 NULL, NULL);
1e8fb976
PA
787}
788
b05dcbb7
TT
789/* Remove the command named NAME from the command list. Return the
790 list commands which were aliased to the deleted command. If the
fad6eecd
TT
791 command had no aliases, return NULL. The various *HOOKs are set to
792 the pre- and post-hook commands for the deleted command. If the
793 command does not have a hook, the corresponding out parameter is
794 set to NULL. */
c906108c 795
b05dcbb7 796static struct cmd_list_element *
6f937416 797delete_cmd (const char *name, struct cmd_list_element **list,
fad6eecd
TT
798 struct cmd_list_element **prehook,
799 struct cmd_list_element **prehookee,
800 struct cmd_list_element **posthook,
801 struct cmd_list_element **posthookee)
c906108c 802{
b05dcbb7
TT
803 struct cmd_list_element *iter;
804 struct cmd_list_element **previous_chain_ptr;
805 struct cmd_list_element *aliases = NULL;
c906108c 806
fad6eecd
TT
807 *prehook = NULL;
808 *prehookee = NULL;
809 *posthook = NULL;
810 *posthookee = NULL;
b05dcbb7
TT
811 previous_chain_ptr = list;
812
813 for (iter = *previous_chain_ptr; iter; iter = *previous_chain_ptr)
c906108c 814 {
b05dcbb7
TT
815 if (strcmp (iter->name, name) == 0)
816 {
d8906c6f
TJB
817 if (iter->destroyer)
818 iter->destroyer (iter, iter->context);
b05dcbb7
TT
819 if (iter->hookee_pre)
820 iter->hookee_pre->hook_pre = 0;
fad6eecd
TT
821 *prehook = iter->hook_pre;
822 *prehookee = iter->hookee_pre;
b05dcbb7
TT
823 if (iter->hookee_post)
824 iter->hookee_post->hook_post = 0;
1f2bdf09 825 if (iter->doc && iter->doc_allocated)
1947513d 826 xfree ((char *) iter->doc);
fad6eecd
TT
827 *posthook = iter->hook_post;
828 *posthookee = iter->hookee_post;
b05dcbb7
TT
829
830 /* Update the link. */
831 *previous_chain_ptr = iter->next;
832
833 aliases = iter->aliases;
834
835 /* If this command was an alias, remove it from the list of
836 aliases. */
837 if (iter->cmd_pointer)
838 {
839 struct cmd_list_element **prevp = &iter->cmd_pointer->aliases;
840 struct cmd_list_element *a = *prevp;
841
842 while (a != iter)
843 {
844 prevp = &a->alias_chain;
845 a = *prevp;
846 }
847 *prevp = iter->alias_chain;
848 }
849
850 xfree (iter);
851
852 /* We won't see another command with the same name. */
853 break;
854 }
855 else
856 previous_chain_ptr = &iter->next;
c906108c
SS
857 }
858
b05dcbb7 859 return aliases;
c906108c 860}
d318976c 861\f
ebcd3b23 862/* Shorthands to the commands above. */
d318976c
FN
863
864/* Add an element to the list of info subcommands. */
865
866struct cmd_list_element *
1947513d 867add_info (const char *name, cmd_cfunc_ftype *fun, const char *doc)
d318976c 868{
f3575e08 869 return add_cmd (name, class_info, fun, doc, &infolist);
d318976c
FN
870}
871
872/* Add an alias to the list of info subcommands. */
873
874struct cmd_list_element *
1947513d 875add_info_alias (const char *name, const char *oldname, int abbrev_flag)
d318976c 876{
f486487f 877 return add_alias_cmd (name, oldname, class_run, abbrev_flag, &infolist);
d318976c
FN
878}
879
880/* Add an element to the list of commands. */
881
882struct cmd_list_element *
fe978cb0 883add_com (const char *name, enum command_class theclass, cmd_cfunc_ftype *fun,
1947513d 884 const char *doc)
d318976c 885{
fe978cb0 886 return add_cmd (name, theclass, fun, doc, &cmdlist);
d318976c
FN
887}
888
889/* Add an alias or abbreviation command to the list of commands. */
890
891struct cmd_list_element *
fe978cb0 892add_com_alias (const char *name, const char *oldname, enum command_class theclass,
d318976c
FN
893 int abbrev_flag)
894{
fe978cb0 895 return add_alias_cmd (name, oldname, theclass, abbrev_flag, &cmdlist);
d318976c 896}
4034d0ff
AT
897
898/* Add an element with a suppress notification to the list of commands. */
899
900struct cmd_list_element *
901add_com_suppress_notification (const char *name, enum command_class theclass,
902 cmd_cfunc_ftype *fun, const char *doc,
903 int *suppress_notification)
904{
905 struct cmd_list_element *element;
906
907 element = add_cmd (name, theclass, fun, doc, &cmdlist);
908 element->suppress_notification = suppress_notification;
909
910 return element;
911}
912
6837a0a2
DB
913/* Recursively walk the commandlist structures, and print out the
914 documentation of commands that match our regex in either their
915 name, or their documentation.
916*/
d318976c 917void
ebcd3b23
MS
918apropos_cmd (struct ui_file *stream,
919 struct cmd_list_element *commandlist,
2d7cc5c7 920 compiled_regex &regex, const char *prefix)
6837a0a2 921{
d5b5ac79 922 struct cmd_list_element *c;
4a98be19 923 int returnvalue;
cdb27c12 924
ebcd3b23 925 /* Walk through the commands. */
6837a0a2
DB
926 for (c=commandlist;c;c=c->next)
927 {
ebcd3b23 928 returnvalue = -1; /* Needed to avoid double printing. */
6837a0a2
DB
929 if (c->name != NULL)
930 {
2d7cc5c7
PA
931 size_t name_len = strlen (c->name);
932
ebcd3b23 933 /* Try to match against the name. */
2d7cc5c7 934 returnvalue = regex.search (c->name, name_len, 0, name_len, NULL);
6837a0a2
DB
935 if (returnvalue >= 0)
936 {
6e381ba0
VP
937 print_help_for_command (c, prefix,
938 0 /* don't recurse */, stream);
6837a0a2
DB
939 }
940 }
4a98be19 941 if (c->doc != NULL && returnvalue < 0)
6837a0a2 942 {
2d7cc5c7
PA
943 size_t doc_len = strlen (c->doc);
944
ebcd3b23 945 /* Try to match against documentation. */
2d7cc5c7 946 if (regex.search (c->doc, doc_len, 0, doc_len, NULL) >= 0)
6837a0a2 947 {
6e381ba0
VP
948 print_help_for_command (c, prefix,
949 0 /* don't recurse */, stream);
6837a0a2
DB
950 }
951 }
ebcd3b23
MS
952 /* Check if this command has subcommands and is not an
953 abbreviation. We skip listing subcommands of abbreviations
954 in order to avoid duplicates in the output. */
5d2c29b8 955 if (c->prefixlist != NULL && !c->abbrev_flag)
6837a0a2
DB
956 {
957 /* Recursively call ourselves on the subcommand list,
ebcd3b23 958 passing the right prefix in. */
d318976c 959 apropos_cmd (stream,*c->prefixlist,regex,c->prefixname);
6837a0a2
DB
960 }
961 }
962}
c906108c
SS
963
964/* This command really has to deal with two things:
ebcd3b23
MS
965 1) I want documentation on *this string* (usually called by
966 "help commandname").
967
968 2) I want documentation on *this list* (usually called by giving a
969 command that requires subcommands. Also called by saying just
970 "help".)
971
972 I am going to split this into two seperate comamnds, help_cmd and
973 help_list. */
c906108c
SS
974
975void
64669f3b 976help_cmd (const char *command, struct ui_file *stream)
c906108c
SS
977{
978 struct cmd_list_element *c;
c906108c
SS
979
980 if (!command)
981 {
982 help_list (cmdlist, "", all_classes, stream);
983 return;
984 }
985
49a5a3a3
GM
986 if (strcmp (command, "all") == 0)
987 {
988 help_all (stream);
989 return;
990 }
991
c906108c
SS
992 c = lookup_cmd (&command, cmdlist, "", 0, 0);
993
994 if (c == 0)
995 return;
996
997 /* There are three cases here.
998 If c->prefixlist is nonzero, we have a prefix command.
999 Print its documentation, then list its subcommands.
c5aa993b 1000
9f60d481
AC
1001 If c->func is non NULL, we really have a command. Print its
1002 documentation and return.
c5aa993b 1003
9f60d481
AC
1004 If c->func is NULL, we have a class name. Print its
1005 documentation (as if it were a command) and then set class to the
1006 number of this class so that the commands in the class will be
1007 listed. */
c906108c
SS
1008
1009 fputs_filtered (c->doc, stream);
1010 fputs_filtered ("\n", stream);
1011
9f60d481 1012 if (c->prefixlist == 0 && c->func != NULL)
c906108c
SS
1013 return;
1014 fprintf_filtered (stream, "\n");
1015
ebcd3b23 1016 /* If this is a prefix command, print it's subcommands. */
c906108c
SS
1017 if (c->prefixlist)
1018 help_list (*c->prefixlist, c->prefixname, all_commands, stream);
1019
ebcd3b23 1020 /* If this is a class name, print all of the commands in the class. */
9f60d481 1021 if (c->func == NULL)
fe978cb0 1022 help_list (cmdlist, "", c->theclass, stream);
c906108c 1023
73bc900d
FN
1024 if (c->hook_pre || c->hook_post)
1025 fprintf_filtered (stream,
1026 "\nThis command has a hook (or hooks) defined:\n");
1027
1028 if (c->hook_pre)
327529e9 1029 fprintf_filtered (stream,
72fe0832 1030 "\tThis command is run after : %s (pre hook)\n",
73bc900d
FN
1031 c->hook_pre->name);
1032 if (c->hook_post)
327529e9 1033 fprintf_filtered (stream,
72fe0832 1034 "\tThis command is run before : %s (post hook)\n",
73bc900d 1035 c->hook_post->name);
c906108c
SS
1036}
1037
1038/*
1039 * Get a specific kind of help on a command list.
1040 *
1041 * LIST is the list.
1042 * CMDTYPE is the prefix to use in the title string.
1043 * CLASS is the class with which to list the nodes of this list (see
1044 * documentation for help_cmd_list below), As usual, ALL_COMMANDS for
1045 * everything, ALL_CLASSES for just classes, and non-negative for only things
1046 * in a specific class.
1047 * and STREAM is the output stream on which to print things.
1048 * If you call this routine with a class >= 0, it recurses.
1049 */
1050void
64e61d29 1051help_list (struct cmd_list_element *list, const char *cmdtype,
fe978cb0 1052 enum command_class theclass, struct ui_file *stream)
c906108c
SS
1053{
1054 int len;
1055 char *cmdtype1, *cmdtype2;
c5aa993b 1056
ebcd3b23
MS
1057 /* If CMDTYPE is "foo ", CMDTYPE1 gets " foo" and CMDTYPE2 gets "foo sub".
1058 */
c906108c
SS
1059 len = strlen (cmdtype);
1060 cmdtype1 = (char *) alloca (len + 1);
1061 cmdtype1[0] = 0;
1062 cmdtype2 = (char *) alloca (len + 4);
1063 cmdtype2[0] = 0;
1064 if (len)
1065 {
1066 cmdtype1[0] = ' ';
1067 strncpy (cmdtype1 + 1, cmdtype, len - 1);
1068 cmdtype1[len] = 0;
1069 strncpy (cmdtype2, cmdtype, len - 1);
1070 strcpy (cmdtype2 + len - 1, " sub");
1071 }
1072
fe978cb0 1073 if (theclass == all_classes)
c906108c
SS
1074 fprintf_filtered (stream, "List of classes of %scommands:\n\n", cmdtype2);
1075 else
1076 fprintf_filtered (stream, "List of %scommands:\n\n", cmdtype2);
1077
fe978cb0 1078 help_cmd_list (list, theclass, cmdtype, (int) theclass >= 0, stream);
c906108c 1079
fe978cb0 1080 if (theclass == all_classes)
de74f71f
MS
1081 {
1082 fprintf_filtered (stream, "\n\
1083Type \"help%s\" followed by a class name for a list of commands in ",
1084 cmdtype1);
1085 wrap_here ("");
1086 fprintf_filtered (stream, "that class.");
6e381ba0
VP
1087
1088 fprintf_filtered (stream, "\n\
1089Type \"help all\" for the list of all commands.");
de74f71f 1090 }
c906108c 1091
de74f71f 1092 fprintf_filtered (stream, "\nType \"help%s\" followed by %scommand name ",
c5aa993b 1093 cmdtype1, cmdtype2);
de74f71f
MS
1094 wrap_here ("");
1095 fputs_filtered ("for ", stream);
1096 wrap_here ("");
1097 fputs_filtered ("full ", stream);
1098 wrap_here ("");
1099 fputs_filtered ("documentation.\n", stream);
6e381ba0 1100 fputs_filtered ("Type \"apropos word\" to search "
ebcd3b23 1101 "for commands related to \"word\".\n", stream);
de74f71f
MS
1102 fputs_filtered ("Command name abbreviations are allowed if unambiguous.\n",
1103 stream);
c906108c 1104}
c5aa993b 1105
49a5a3a3 1106static void
c85871a3 1107help_all (struct ui_file *stream)
49a5a3a3
GM
1108{
1109 struct cmd_list_element *c;
6e381ba0 1110 int seen_unclassified = 0;
49a5a3a3
GM
1111
1112 for (c = cmdlist; c; c = c->next)
1113 {
1114 if (c->abbrev_flag)
1115 continue;
ebcd3b23
MS
1116 /* If this is a class name, print all of the commands in the
1117 class. */
6e381ba0
VP
1118
1119 if (c->func == NULL)
1120 {
1121 fprintf_filtered (stream, "\nCommand class: %s\n\n", c->name);
fe978cb0 1122 help_cmd_list (cmdlist, c->theclass, "", 1, stream);
6e381ba0 1123 }
49a5a3a3 1124 }
6e381ba0
VP
1125
1126 /* While it's expected that all commands are in some class,
1127 as a safety measure, we'll print commands outside of any
1128 class at the end. */
1129
1130 for (c = cmdlist; c; c = c->next)
1131 {
1132 if (c->abbrev_flag)
1133 continue;
1134
fe978cb0 1135 if (c->theclass == no_class)
6e381ba0
VP
1136 {
1137 if (!seen_unclassified)
1138 {
1139 fprintf_filtered (stream, "\nUnclassified commands\n\n");
1140 seen_unclassified = 1;
1141 }
1142 print_help_for_command (c, "", 1, stream);
1143 }
1144 }
1145
49a5a3a3
GM
1146}
1147
c906108c 1148/* Print only the first line of STR on STREAM. */
d318976c 1149void
1947513d 1150print_doc_line (struct ui_file *stream, const char *str)
c906108c
SS
1151{
1152 static char *line_buffer = 0;
1153 static int line_size;
1947513d 1154 const char *p;
c906108c
SS
1155
1156 if (!line_buffer)
1157 {
1158 line_size = 80;
1159 line_buffer = (char *) xmalloc (line_size);
1160 }
1161
7afa1642
JK
1162 /* Keep printing '.' or ',' not followed by a whitespace for embedded strings
1163 like '.gdbinit'. */
c906108c 1164 p = str;
7afa1642
JK
1165 while (*p && *p != '\n'
1166 && ((*p != '.' && *p != ',') || (p[1] && !isspace (p[1]))))
c906108c
SS
1167 p++;
1168 if (p - str > line_size - 1)
1169 {
1170 line_size = p - str + 1;
b8c9b27d 1171 xfree (line_buffer);
c906108c
SS
1172 line_buffer = (char *) xmalloc (line_size);
1173 }
1174 strncpy (line_buffer, str, p - str);
1175 line_buffer[p - str] = '\0';
1176 if (islower (line_buffer[0]))
1177 line_buffer[0] = toupper (line_buffer[0]);
b6201d44 1178 fputs_filtered (line_buffer, stream);
c906108c
SS
1179}
1180
6e381ba0
VP
1181/* Print one-line help for command C.
1182 If RECURSE is non-zero, also print one-line descriptions
ebcd3b23 1183 of all prefixed subcommands. */
6e381ba0 1184static void
64e61d29
TT
1185print_help_for_command (struct cmd_list_element *c, const char *prefix,
1186 int recurse, struct ui_file *stream)
6e381ba0
VP
1187{
1188 fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
1189 print_doc_line (stream, c->doc);
1190 fputs_filtered ("\n", stream);
1191
1192 if (recurse
1193 && c->prefixlist != 0
1194 && c->abbrev_flag == 0)
1195 /* Subcommands of a prefix command typically have 'all_commands'
1196 as class. If we pass CLASS to recursive invocation,
ebcd3b23 1197 most often we won't see anything. */
6e381ba0
VP
1198 help_cmd_list (*c->prefixlist, all_commands, c->prefixname, 1, stream);
1199}
1200
c906108c
SS
1201/*
1202 * Implement a help command on command list LIST.
1203 * RECURSE should be non-zero if this should be done recursively on
1204 * all sublists of LIST.
1205 * PREFIX is the prefix to print before each command name.
1206 * STREAM is the stream upon which the output should be written.
2aa08bd1 1207 * THECLASS should be:
c5aa993b 1208 * A non-negative class number to list only commands in that
c906108c 1209 * class.
c5aa993b
JM
1210 * ALL_COMMANDS to list all commands in list.
1211 * ALL_CLASSES to list all classes in list.
c906108c
SS
1212 *
1213 * Note that RECURSE will be active on *all* sublists, not just the
1214 * ones selected by the criteria above (ie. the selection mechanism
1215 * is at the low level, not the high-level).
1216 */
1217void
fe978cb0 1218help_cmd_list (struct cmd_list_element *list, enum command_class theclass,
64e61d29 1219 const char *prefix, int recurse, struct ui_file *stream)
c906108c 1220{
d5b5ac79 1221 struct cmd_list_element *c;
c906108c
SS
1222
1223 for (c = list; c; c = c->next)
2aa08bd1 1224 {
5aafa1cc 1225 if (c->abbrev_flag == 0
0400cf2f 1226 && !c->cmd_deprecated
fe978cb0
PA
1227 && (theclass == all_commands
1228 || (theclass == all_classes && c->func == NULL)
1229 || (theclass == c->theclass && c->func != NULL)))
c906108c 1230 {
6e381ba0 1231 print_help_for_command (c, prefix, recurse, stream);
c906108c 1232 }
0400cf2f
SM
1233 else if (c->abbrev_flag == 0
1234 && recurse
1235 && !c->cmd_deprecated
fe978cb0 1236 && theclass == class_user && c->prefixlist != NULL)
adb483fe 1237 /* User-defined commands may be subcommands. */
fe978cb0 1238 help_cmd_list (*c->prefixlist, theclass, c->prefixname,
ebcd3b23 1239 recurse, stream);
c906108c
SS
1240 }
1241}
c906108c 1242\f
c5aa993b 1243
c906108c
SS
1244/* Search the input clist for 'command'. Return the command if
1245 found (or NULL if not), and return the number of commands
ebcd3b23 1246 found in nfound. */
c906108c
SS
1247
1248static struct cmd_list_element *
6f937416 1249find_cmd (const char *command, int len, struct cmd_list_element *clist,
fba45db2 1250 int ignore_help_classes, int *nfound)
c906108c
SS
1251{
1252 struct cmd_list_element *found, *c;
1253
b03e6ad9 1254 found = NULL;
c906108c
SS
1255 *nfound = 0;
1256 for (c = clist; c; c = c->next)
1257 if (!strncmp (command, c->name, len)
9f60d481 1258 && (!ignore_help_classes || c->func))
c906108c 1259 {
c5aa993b
JM
1260 found = c;
1261 (*nfound)++;
1262 if (c->name[len] == '\0')
1263 {
1264 *nfound = 1;
1265 break;
1266 }
c906108c
SS
1267 }
1268 return found;
1269}
1270
604c4576
JG
1271/* Return the length of command name in TEXT. */
1272
1273int
3386243e
AS
1274find_command_name_length (const char *text)
1275{
1276 const char *p = text;
1277
1278 /* Treating underscores as part of command words is important
1279 so that "set args_foo()" doesn't get interpreted as
1280 "set args _foo()". */
ebcd3b23
MS
1281 /* Some characters are only used for TUI specific commands.
1282 However, they are always allowed for the sake of consistency.
1283
ebcd3b23
MS
1284 Note that this is larger than the character set allowed when
1285 creating user-defined commands. */
1286
ed59ded5
DE
1287 /* Recognize '!' as a single character command so that, e.g., "!ls"
1288 works as expected. */
1289 if (*p == '!')
1290 return 1;
1291
5aafa1cc 1292 while (isalnum (*p) || *p == '-' || *p == '_'
3386243e 1293 /* Characters used by TUI specific commands. */
4f45d445 1294 || *p == '+' || *p == '<' || *p == '>' || *p == '$')
3386243e
AS
1295 p++;
1296
1297 return p - text;
1298}
1299
5a56e9c5
DE
1300/* Return TRUE if NAME is a valid user-defined command name.
1301 This is a stricter subset of all gdb commands,
1302 see find_command_name_length. */
1303
1304int
1305valid_user_defined_cmd_name_p (const char *name)
1306{
1307 const char *p;
1308
1309 if (*name == '\0')
1310 return FALSE;
1311
1312 /* Alas "42" is a legitimate user-defined command.
1313 In the interests of not breaking anything we preserve that. */
1314
1315 for (p = name; *p != '\0'; ++p)
1316 {
1317 if (isalnum (*p)
1318 || *p == '-'
1319 || *p == '_')
1320 ; /* Ok. */
1321 else
1322 return FALSE;
1323 }
1324
1325 return TRUE;
1326}
1327
c906108c
SS
1328/* This routine takes a line of TEXT and a CLIST in which to start the
1329 lookup. When it returns it will have incremented the text pointer past
1330 the section of text it matched, set *RESULT_LIST to point to the list in
1331 which the last word was matched, and will return a pointer to the cmd
1332 list element which the text matches. It will return NULL if no match at
1333 all was possible. It will return -1 (cast appropriately, ick) if ambigous
1334 matches are possible; in this case *RESULT_LIST will be set to point to
1335 the list in which there are ambiguous choices (and *TEXT will be set to
1336 the ambiguous text string).
1337
1338 If the located command was an abbreviation, this routine returns the base
1339 command of the abbreviation.
1340
1341 It does no error reporting whatsoever; control will always return
1342 to the superior routine.
1343
1344 In the case of an ambiguous return (-1), *RESULT_LIST will be set to point
1345 at the prefix_command (ie. the best match) *or* (special case) will be NULL
1346 if no prefix command was ever found. For example, in the case of "info a",
1347 "info" matches without ambiguity, but "a" could be "args" or "address", so
1348 *RESULT_LIST is set to the cmd_list_element for "info". So in this case
4ad2da73 1349 RESULT_LIST should not be interpreted as a pointer to the beginning of a
c906108c
SS
1350 list; it simply points to a specific command. In the case of an ambiguous
1351 return *TEXT is advanced past the last non-ambiguous prefix (e.g.
1352 "info t" can be "info types" or "info target"; upon return *TEXT has been
1353 advanced past "info ").
1354
1355 If RESULT_LIST is NULL, don't set *RESULT_LIST (but don't otherwise
1356 affect the operation).
1357
1358 This routine does *not* modify the text pointed to by TEXT.
c5aa993b 1359
c906108c
SS
1360 If IGNORE_HELP_CLASSES is nonzero, ignore any command list elements which
1361 are actually help classes rather than commands (i.e. the function field of
1362 the struct cmd_list_element is NULL). */
1363
1364struct cmd_list_element *
6f937416 1365lookup_cmd_1 (const char **text, struct cmd_list_element *clist,
fba45db2 1366 struct cmd_list_element **result_list, int ignore_help_classes)
c906108c 1367{
3386243e 1368 char *command;
c906108c
SS
1369 int len, tmp, nfound;
1370 struct cmd_list_element *found, *c;
6f937416 1371 const char *line = *text;
c906108c
SS
1372
1373 while (**text == ' ' || **text == '\t')
1374 (*text)++;
1375
3386243e
AS
1376 /* Identify the name of the command. */
1377 len = find_command_name_length (*text);
c906108c
SS
1378
1379 /* If nothing but whitespace, return 0. */
3386243e 1380 if (len == 0)
c906108c 1381 return 0;
c5aa993b 1382
c906108c 1383 /* *text and p now bracket the first command word to lookup (and
ebcd3b23 1384 it's length is len). We copy this into a local temporary. */
c906108c
SS
1385
1386
1387 command = (char *) alloca (len + 1);
22ad7fee 1388 memcpy (command, *text, len);
c906108c
SS
1389 command[len] = '\0';
1390
1391 /* Look it up. */
1392 found = 0;
1393 nfound = 0;
c5aa993b 1394 found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
c906108c 1395
c906108c
SS
1396 /* If nothing matches, we have a simple failure. */
1397 if (nfound == 0)
1398 return 0;
1399
1400 if (nfound > 1)
1401 {
1402 if (result_list != NULL)
1403 /* Will be modified in calling routine
1404 if we know what the prefix command is. */
c5aa993b 1405 *result_list = 0;
1427fe5e 1406 return CMD_LIST_AMBIGUOUS; /* Ambiguous. */
c906108c
SS
1407 }
1408
ebcd3b23 1409 /* We've matched something on this list. Move text pointer forward. */
c906108c 1410
3386243e 1411 *text += len;
c906108c 1412
c906108c 1413 if (found->cmd_pointer)
56382845 1414 {
ebcd3b23
MS
1415 /* We drop the alias (abbreviation) in favor of the command it
1416 is pointing to. If the alias is deprecated, though, we need to
56382845
FN
1417 warn the user about it before we drop it. Note that while we
1418 are warning about the alias, we may also warn about the command
1419 itself and we will adjust the appropriate DEPRECATED_WARN_USER
ebcd3b23 1420 flags. */
56382845 1421
1f2bdf09 1422 if (found->deprecated_warn_user)
6f937416 1423 deprecated_cmd_warning (line);
56382845
FN
1424 found = found->cmd_pointer;
1425 }
c906108c
SS
1426 /* If we found a prefix command, keep looking. */
1427
1428 if (found->prefixlist)
1429 {
1430 c = lookup_cmd_1 (text, *found->prefixlist, result_list,
1431 ignore_help_classes);
1432 if (!c)
1433 {
1434 /* Didn't find anything; this is as far as we got. */
1435 if (result_list != NULL)
1436 *result_list = clist;
1437 return found;
1438 }
1427fe5e 1439 else if (c == CMD_LIST_AMBIGUOUS)
c906108c 1440 {
ebcd3b23
MS
1441 /* We've gotten this far properly, but the next step is
1442 ambiguous. We need to set the result list to the best
c906108c
SS
1443 we've found (if an inferior hasn't already set it). */
1444 if (result_list != NULL)
1445 if (!*result_list)
ebcd3b23 1446 /* This used to say *result_list = *found->prefixlist.
c5aa993b 1447 If that was correct, need to modify the documentation
ebcd3b23
MS
1448 at the top of this function to clarify what is
1449 supposed to be going on. */
c906108c
SS
1450 *result_list = found;
1451 return c;
1452 }
1453 else
1454 {
1455 /* We matched! */
1456 return c;
1457 }
1458 }
1459 else
1460 {
1461 if (result_list != NULL)
1462 *result_list = clist;
1463 return found;
1464 }
1465}
1466
1467/* All this hair to move the space to the front of cmdtype */
1468
1469static void
6f937416 1470undef_cmd_error (const char *cmdtype, const char *q)
c906108c 1471{
8a3fe4f8 1472 error (_("Undefined %scommand: \"%s\". Try \"help%s%.*s\"."),
c5aa993b
JM
1473 cmdtype,
1474 q,
1475 *cmdtype ? " " : "",
823ca731 1476 (int) strlen (cmdtype) - 1,
c5aa993b 1477 cmdtype);
c906108c
SS
1478}
1479
1480/* Look up the contents of *LINE as a command in the command list LIST.
1481 LIST is a chain of struct cmd_list_element's.
1482 If it is found, return the struct cmd_list_element for that command
1483 and update *LINE to point after the command name, at the first argument.
1484 If not found, call error if ALLOW_UNKNOWN is zero
1485 otherwise (or if error returns) return zero.
1486 Call error if specified command is ambiguous,
1487 unless ALLOW_UNKNOWN is negative.
1488 CMDTYPE precedes the word "command" in the error message.
1489
1490 If INGNORE_HELP_CLASSES is nonzero, ignore any command list
1491 elements which are actually help classes rather than commands (i.e.
1492 the function field of the struct cmd_list_element is 0). */
1493
1494struct cmd_list_element *
a121b7c1
PA
1495lookup_cmd (const char **line, struct cmd_list_element *list,
1496 const char *cmdtype,
fba45db2 1497 int allow_unknown, int ignore_help_classes)
c906108c
SS
1498{
1499 struct cmd_list_element *last_list = 0;
3cebf8d8 1500 struct cmd_list_element *c;
c64601c7
FN
1501
1502 /* Note: Do not remove trailing whitespace here because this
1503 would be wrong for complete_command. Jim Kingdon */
c5aa993b 1504
3cebf8d8
MS
1505 if (!*line)
1506 error (_("Lack of needed %scommand"), cmdtype);
1507
1508 c = lookup_cmd_1 (line, list, &last_list, ignore_help_classes);
1509
c906108c
SS
1510 if (!c)
1511 {
1512 if (!allow_unknown)
1513 {
3cebf8d8
MS
1514 char *q;
1515 int len = find_command_name_length (*line);
c906108c 1516
3cebf8d8
MS
1517 q = (char *) alloca (len + 1);
1518 strncpy (q, *line, len);
1519 q[len] = '\0';
1520 undef_cmd_error (cmdtype, q);
c906108c
SS
1521 }
1522 else
1523 return 0;
1524 }
1427fe5e 1525 else if (c == CMD_LIST_AMBIGUOUS)
c906108c
SS
1526 {
1527 /* Ambigous. Local values should be off prefixlist or called
c5aa993b 1528 values. */
c906108c
SS
1529 int local_allow_unknown = (last_list ? last_list->allow_unknown :
1530 allow_unknown);
64e61d29 1531 const char *local_cmdtype = last_list ? last_list->prefixname : cmdtype;
c906108c 1532 struct cmd_list_element *local_list =
cdb27c12 1533 (last_list ? *(last_list->prefixlist) : list);
c5aa993b 1534
c906108c
SS
1535 if (local_allow_unknown < 0)
1536 {
1537 if (last_list)
1538 return last_list; /* Found something. */
1539 else
1540 return 0; /* Found nothing. */
1541 }
1542 else
1543 {
1544 /* Report as error. */
1545 int amb_len;
1546 char ambbuf[100];
1547
1548 for (amb_len = 0;
1549 ((*line)[amb_len] && (*line)[amb_len] != ' '
1550 && (*line)[amb_len] != '\t');
1551 amb_len++)
1552 ;
c5aa993b 1553
c906108c
SS
1554 ambbuf[0] = 0;
1555 for (c = local_list; c; c = c->next)
1556 if (!strncmp (*line, c->name, amb_len))
1557 {
9a2b4c1b
MS
1558 if (strlen (ambbuf) + strlen (c->name) + 6
1559 < (int) sizeof ambbuf)
c906108c
SS
1560 {
1561 if (strlen (ambbuf))
1562 strcat (ambbuf, ", ");
1563 strcat (ambbuf, c->name);
1564 }
1565 else
1566 {
1567 strcat (ambbuf, "..");
1568 break;
1569 }
1570 }
8a3fe4f8 1571 error (_("Ambiguous %scommand \"%s\": %s."), local_cmdtype,
c906108c
SS
1572 *line, ambbuf);
1573 return 0; /* lint */
1574 }
1575 }
1576 else
1577 {
bf9e4d0c
MB
1578 if (c->type == set_cmd && **line != '\0' && !isspace (**line))
1579 error (_("Argument must be preceded by space."));
1580
c906108c
SS
1581 /* We've got something. It may still not be what the caller
1582 wants (if this command *needs* a subcommand). */
1583 while (**line == ' ' || **line == '\t')
1584 (*line)++;
1585
1586 if (c->prefixlist && **line && !c->allow_unknown)
1587 undef_cmd_error (c->prefixname, *line);
1588
1589 /* Seems to be what he wants. Return it. */
1590 return c;
1591 }
1592 return 0;
1593}
c5aa993b 1594
6f937416 1595/* We are here presumably because an alias or command in TEXT is
ebcd3b23 1596 deprecated and a warning message should be generated. This
6f937416 1597 function decodes TEXT and potentially generates a warning message
ebcd3b23 1598 as outlined below.
56382845
FN
1599
1600 Example for 'set endian big' which has a fictitious alias 'seb'.
1601
6f937416 1602 If alias wasn't used in TEXT, and the command is deprecated:
56382845
FN
1603 "warning: 'set endian big' is deprecated."
1604
1605 If alias was used, and only the alias is deprecated:
1606 "warning: 'seb' an alias for the command 'set endian big' is deprecated."
1607
ebcd3b23
MS
1608 If alias was used and command is deprecated (regardless of whether
1609 the alias itself is deprecated:
56382845
FN
1610
1611 "warning: 'set endian big' (seb) is deprecated."
1612
1613 After the message has been sent, clear the appropriate flags in the
1614 command and/or the alias so the user is no longer bothered.
1615
1616*/
1617void
6f937416 1618deprecated_cmd_warning (const char *text)
56382845
FN
1619{
1620 struct cmd_list_element *alias = NULL;
1621 struct cmd_list_element *prefix_cmd = NULL;
1622 struct cmd_list_element *cmd = NULL;
edefbb7c 1623
6f937416 1624 if (!lookup_cmd_composition (text, &alias, &prefix_cmd, &cmd))
ebcd3b23 1625 /* Return if text doesn't evaluate to a command. */
56382845
FN
1626 return;
1627
1f2bdf09
TT
1628 if (!((alias ? alias->deprecated_warn_user : 0)
1629 || cmd->deprecated_warn_user) )
ebcd3b23 1630 /* Return if nothing is deprecated. */
56382845
FN
1631 return;
1632
1633 printf_filtered ("Warning:");
1634
1f2bdf09 1635 if (alias && !cmd->cmd_deprecated)
56382845
FN
1636 printf_filtered (" '%s', an alias for the", alias->name);
1637
1638 printf_filtered (" command '");
1639
1640 if (prefix_cmd)
1641 printf_filtered ("%s", prefix_cmd->prefixname);
1642
1643 printf_filtered ("%s", cmd->name);
1644
1f2bdf09 1645 if (alias && cmd->cmd_deprecated)
56382845
FN
1646 printf_filtered ("' (%s) is deprecated.\n", alias->name);
1647 else
1648 printf_filtered ("' is deprecated.\n");
1649
1650
ebcd3b23
MS
1651 /* If it is only the alias that is deprecated, we want to indicate
1652 the new alias, otherwise we'll indicate the new command. */
56382845 1653
1f2bdf09 1654 if (alias && !cmd->cmd_deprecated)
56382845
FN
1655 {
1656 if (alias->replacement)
cdb27c12 1657 printf_filtered ("Use '%s'.\n\n", alias->replacement);
56382845 1658 else
cdb27c12 1659 printf_filtered ("No alternative known.\n\n");
56382845
FN
1660 }
1661 else
1662 {
1663 if (cmd->replacement)
cdb27c12 1664 printf_filtered ("Use '%s'.\n\n", cmd->replacement);
56382845 1665 else
cdb27c12 1666 printf_filtered ("No alternative known.\n\n");
56382845
FN
1667 }
1668
ebcd3b23 1669 /* We've warned you, now we'll keep quiet. */
56382845 1670 if (alias)
1f2bdf09 1671 alias->deprecated_warn_user = 0;
56382845 1672
1f2bdf09 1673 cmd->deprecated_warn_user = 0;
56382845
FN
1674}
1675
1676
ebcd3b23 1677/* Look up the contents of LINE as a command in the command list 'cmdlist'.
56382845
FN
1678 Return 1 on success, 0 on failure.
1679
1680 If LINE refers to an alias, *alias will point to that alias.
1681
177b42fe 1682 If LINE is a postfix command (i.e. one that is preceded by a prefix
56382845
FN
1683 command) set *prefix_cmd.
1684
1685 Set *cmd to point to the command LINE indicates.
1686
1687 If any of *alias, *prefix_cmd, or *cmd cannot be determined or do not
1688 exist, they are NULL when we return.
1689
1690*/
1691int
6f937416 1692lookup_cmd_composition (const char *text,
56382845
FN
1693 struct cmd_list_element **alias,
1694 struct cmd_list_element **prefix_cmd,
1695 struct cmd_list_element **cmd)
1696{
3386243e 1697 char *command;
56382845
FN
1698 int len, tmp, nfound;
1699 struct cmd_list_element *cur_list;
1700 struct cmd_list_element *prev_cmd;
cdb27c12 1701
56382845
FN
1702 *alias = NULL;
1703 *prefix_cmd = NULL;
1704 *cmd = NULL;
1705
1706 cur_list = cmdlist;
1707
1708 while (1)
1709 {
7a9dd1b2 1710 /* Go through as many command lists as we need to,
ebcd3b23 1711 to find the command TEXT refers to. */
56382845
FN
1712
1713 prev_cmd = *cmd;
1714
1715 while (*text == ' ' || *text == '\t')
cdb27c12 1716 (text)++;
56382845 1717
3386243e
AS
1718 /* Identify the name of the command. */
1719 len = find_command_name_length (text);
56382845
FN
1720
1721 /* If nothing but whitespace, return. */
3386243e
AS
1722 if (len == 0)
1723 return 0;
56382845 1724
cdb27c12
MS
1725 /* Text is the start of the first command word to lookup (and
1726 it's length is len). We copy this into a local temporary. */
56382845
FN
1727
1728 command = (char *) alloca (len + 1);
22ad7fee 1729 memcpy (command, text, len);
56382845
FN
1730 command[len] = '\0';
1731
1732 /* Look it up. */
1733 *cmd = 0;
1734 nfound = 0;
1735 *cmd = find_cmd (command, len, cur_list, 1, &nfound);
1736
1427fe5e 1737 if (*cmd == CMD_LIST_AMBIGUOUS)
cdb27c12
MS
1738 {
1739 return 0; /* ambiguous */
1740 }
56382845
FN
1741
1742 if (*cmd == NULL)
cdb27c12 1743 return 0; /* nothing found */
56382845 1744 else
cdb27c12
MS
1745 {
1746 if ((*cmd)->cmd_pointer)
1747 {
ebcd3b23
MS
1748 /* cmd was actually an alias, we note that an alias was
1749 used (by assigning *alais) and we set *cmd. */
cdb27c12
MS
1750 *alias = *cmd;
1751 *cmd = (*cmd)->cmd_pointer;
1752 }
1753 *prefix_cmd = prev_cmd;
1754 }
56382845 1755 if ((*cmd)->prefixlist)
cdb27c12 1756 cur_list = *(*cmd)->prefixlist;
56382845 1757 else
cdb27c12 1758 return 1;
56382845 1759
3386243e 1760 text += len;
56382845
FN
1761 }
1762}
1763
c906108c
SS
1764/* Helper function for SYMBOL_COMPLETION_FUNCTION. */
1765
1766/* Return a vector of char pointers which point to the different
ebcd3b23 1767 possible completions in LIST of TEXT.
c906108c
SS
1768
1769 WORD points in the same buffer as TEXT, and completions should be
ebcd3b23
MS
1770 returned relative to this position. For example, suppose TEXT is
1771 "foo" and we want to complete to "foobar". If WORD is "oo", return
c906108c
SS
1772 "oobar"; if WORD is "baz/foo", return "baz/foobar". */
1773
49c4e619 1774VEC (char_ptr) *
6f937416
PA
1775complete_on_cmdlist (struct cmd_list_element *list,
1776 const char *text, const char *word,
ace21957 1777 int ignore_help_classes)
c906108c
SS
1778{
1779 struct cmd_list_element *ptr;
49c4e619 1780 VEC (char_ptr) *matchlist = NULL;
c906108c 1781 int textlen = strlen (text);
3f172e24
TT
1782 int pass;
1783 int saw_deprecated_match = 0;
c906108c 1784
3f172e24
TT
1785 /* We do one or two passes. In the first pass, we skip deprecated
1786 commands. If we see no matching commands in the first pass, and
1787 if we did happen to see a matching deprecated command, we do
1788 another loop to collect those. */
49c4e619 1789 for (pass = 0; matchlist == 0 && pass < 2; ++pass)
3f172e24
TT
1790 {
1791 for (ptr = list; ptr; ptr = ptr->next)
1792 if (!strncmp (ptr->name, text, textlen)
1793 && !ptr->abbrev_flag
ace21957 1794 && (!ignore_help_classes || ptr->func
3f172e24 1795 || ptr->prefixlist))
c906108c 1796 {
49c4e619
TT
1797 char *match;
1798
3f172e24
TT
1799 if (pass == 0)
1800 {
1f2bdf09 1801 if (ptr->cmd_deprecated)
3f172e24
TT
1802 {
1803 saw_deprecated_match = 1;
1804 continue;
1805 }
1806 }
c906108c 1807
49c4e619 1808 match = (char *) xmalloc (strlen (word) + strlen (ptr->name) + 1);
3f172e24 1809 if (word == text)
49c4e619 1810 strcpy (match, ptr->name);
3f172e24
TT
1811 else if (word > text)
1812 {
1813 /* Return some portion of ptr->name. */
49c4e619 1814 strcpy (match, ptr->name + (word - text));
3f172e24
TT
1815 }
1816 else
1817 {
1818 /* Return some of text plus ptr->name. */
49c4e619
TT
1819 strncpy (match, word, text - word);
1820 match[text - word] = '\0';
1821 strcat (match, ptr->name);
3f172e24 1822 }
49c4e619 1823 VEC_safe_push (char_ptr, matchlist, match);
c906108c 1824 }
3f172e24
TT
1825 /* If we saw no matching deprecated commands in the first pass,
1826 just bail out. */
1827 if (!saw_deprecated_match)
1828 break;
1829 }
c906108c 1830
c906108c
SS
1831 return matchlist;
1832}
1833
1834/* Helper function for SYMBOL_COMPLETION_FUNCTION. */
1835
1836/* Return a vector of char pointers which point to the different
ebcd3b23 1837 possible completions in CMD of TEXT.
c906108c
SS
1838
1839 WORD points in the same buffer as TEXT, and completions should be
1840 returned relative to this position. For example, suppose TEXT is "foo"
1841 and we want to complete to "foobar". If WORD is "oo", return
1842 "oobar"; if WORD is "baz/foo", return "baz/foobar". */
1843
49c4e619 1844VEC (char_ptr) *
40478521 1845complete_on_enum (const char *const *enumlist,
6f937416 1846 const char *text, const char *word)
c906108c 1847{
49c4e619 1848 VEC (char_ptr) *matchlist = NULL;
c906108c
SS
1849 int textlen = strlen (text);
1850 int i;
53904c9e 1851 const char *name;
c906108c 1852
c906108c
SS
1853 for (i = 0; (name = enumlist[i]) != NULL; i++)
1854 if (strncmp (name, text, textlen) == 0)
1855 {
49c4e619 1856 char *match;
c906108c 1857
49c4e619 1858 match = (char *) xmalloc (strlen (word) + strlen (name) + 1);
c906108c 1859 if (word == text)
49c4e619 1860 strcpy (match, name);
c906108c
SS
1861 else if (word > text)
1862 {
1863 /* Return some portion of name. */
49c4e619 1864 strcpy (match, name + (word - text));
c906108c
SS
1865 }
1866 else
1867 {
1868 /* Return some of text plus name. */
49c4e619
TT
1869 strncpy (match, word, text - word);
1870 match[text - word] = '\0';
1871 strcat (match, name);
c906108c 1872 }
49c4e619 1873 VEC_safe_push (char_ptr, matchlist, match);
c906108c
SS
1874 }
1875
c906108c
SS
1876 return matchlist;
1877}
1878
f436dd25 1879
ebcd3b23 1880/* Check function pointer. */
f436dd25
MH
1881int
1882cmd_func_p (struct cmd_list_element *cmd)
1883{
1884 return (cmd->func != NULL);
1885}
1886
1887
ebcd3b23 1888/* Call the command function. */
f436dd25
MH
1889void
1890cmd_func (struct cmd_list_element *cmd, char *args, int from_tty)
1891{
1892 if (cmd_func_p (cmd))
4034d0ff 1893 {
156d9eab 1894 gdb::optional<scoped_restore_tmpl<int>> restore_suppress;
4034d0ff
AT
1895
1896 if (cmd->suppress_notification != NULL)
156d9eab 1897 restore_suppress.emplace (cmd->suppress_notification, 1);
4034d0ff
AT
1898
1899 (*cmd->func) (cmd, args, from_tty);
4034d0ff 1900 }
f436dd25 1901 else
8a3fe4f8 1902 error (_("Invalid command"));
f436dd25 1903}
a9f116cb
GKB
1904
1905int
1906cli_user_command_p (struct cmd_list_element *cmd)
1907{
fe978cb0 1908 return (cmd->theclass == class_user
a9f116cb
GKB
1909 && (cmd->func == do_cfunc || cmd->func == do_sfunc));
1910}
This page took 1.355013 seconds and 4 git commands to generate.