cli-decode.c revision 1.11 1 1.1 christos /* Handle lists of commands, their decoding and documentation, for GDB.
2 1.1 christos
3 1.11 christos Copyright (C) 1986-2024 Free Software Foundation, Inc.
4 1.1 christos
5 1.1 christos This program is free software; you can redistribute it and/or modify
6 1.1 christos it under the terms of the GNU General Public License as published by
7 1.1 christos the Free Software Foundation; either version 3 of the License, or
8 1.1 christos (at your option) any later version.
9 1.1 christos
10 1.1 christos This program is distributed in the hope that it will be useful,
11 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
12 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 1.1 christos GNU General Public License for more details.
14 1.1 christos
15 1.1 christos You should have received a copy of the GNU General Public License
16 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
17 1.1 christos
18 1.1 christos #include "symtab.h"
19 1.1 christos #include <ctype.h>
20 1.10 christos #include "gdbsupport/gdb_regex.h"
21 1.1 christos #include "completer.h"
22 1.1 christos #include "ui-out.h"
23 1.1 christos #include "cli/cli-cmds.h"
24 1.1 christos #include "cli/cli-decode.h"
25 1.9 christos #include "cli/cli-style.h"
26 1.11 christos #include <optional>
27 1.1 christos
28 1.1 christos /* Prototypes for local functions. */
29 1.1 christos
30 1.1 christos static void undef_cmd_error (const char *, const char *);
31 1.1 christos
32 1.10 christos static cmd_list_element::aliases_list_type delete_cmd
33 1.10 christos (const char *name, cmd_list_element **list, cmd_list_element **prehook,
34 1.10 christos cmd_list_element **prehookee, cmd_list_element **posthook,
35 1.10 christos cmd_list_element **posthookee);
36 1.1 christos
37 1.1 christos static struct cmd_list_element *find_cmd (const char *command,
38 1.1 christos int len,
39 1.1 christos struct cmd_list_element *clist,
40 1.1 christos int ignore_help_classes,
41 1.1 christos int *nfound);
42 1.1 christos
43 1.9 christos static void help_cmd_list (struct cmd_list_element *list,
44 1.9 christos enum command_class theclass,
45 1.9 christos bool recurse,
46 1.9 christos struct ui_file *stream);
47 1.9 christos
48 1.1 christos static void help_all (struct ui_file *stream);
49 1.1 christos
50 1.10 christos static int lookup_cmd_composition_1 (const char *text,
51 1.10 christos struct cmd_list_element **alias,
52 1.10 christos struct cmd_list_element **prefix_cmd,
53 1.10 christos struct cmd_list_element **cmd,
54 1.10 christos struct cmd_list_element *cur_list);
55 1.10 christos
56 1.10 christos /* Look up a command whose 'subcommands' field is SUBCOMMANDS. Return the
57 1.10 christos command if found, otherwise return NULL. */
58 1.1 christos
59 1.1 christos static struct cmd_list_element *
60 1.10 christos lookup_cmd_with_subcommands (cmd_list_element **subcommands,
61 1.10 christos cmd_list_element *list)
62 1.1 christos {
63 1.1 christos struct cmd_list_element *p = NULL;
64 1.1 christos
65 1.1 christos for (p = list; p != NULL; p = p->next)
66 1.1 christos {
67 1.1 christos struct cmd_list_element *q;
68 1.1 christos
69 1.10 christos if (!p->is_prefix ())
70 1.1 christos continue;
71 1.10 christos
72 1.10 christos else if (p->subcommands == subcommands)
73 1.9 christos {
74 1.9 christos /* If we found an alias, we must return the aliased
75 1.9 christos command. */
76 1.10 christos return p->is_alias () ? p->alias_target : p;
77 1.9 christos }
78 1.1 christos
79 1.10 christos q = lookup_cmd_with_subcommands (subcommands, *(p->subcommands));
80 1.1 christos if (q != NULL)
81 1.1 christos return q;
82 1.1 christos }
83 1.1 christos
84 1.1 christos return NULL;
85 1.1 christos }
86 1.1 christos
87 1.1 christos static void
88 1.10 christos print_help_for_command (const cmd_list_element &c,
89 1.9 christos bool recurse, struct ui_file *stream);
90 1.1 christos
91 1.1 christos static void
92 1.10 christos do_simple_func (const char *args, int from_tty, cmd_list_element *c)
93 1.1 christos {
94 1.10 christos c->function.simple_func (args, from_tty);
95 1.1 christos }
96 1.1 christos
97 1.8 christos static void
98 1.10 christos set_cmd_simple_func (struct cmd_list_element *cmd, cmd_simple_func_ftype *simple_func)
99 1.1 christos {
100 1.10 christos if (simple_func == NULL)
101 1.1 christos cmd->func = NULL;
102 1.1 christos else
103 1.10 christos cmd->func = do_simple_func;
104 1.10 christos
105 1.10 christos cmd->function.simple_func = simple_func;
106 1.1 christos }
107 1.1 christos
108 1.10 christos int
109 1.10 christos cmd_simple_func_eq (struct cmd_list_element *cmd, cmd_simple_func_ftype *simple_func)
110 1.1 christos {
111 1.10 christos return (cmd->func == do_simple_func
112 1.10 christos && cmd->function.simple_func == simple_func);
113 1.1 christos }
114 1.1 christos
115 1.1 christos void
116 1.10 christos set_cmd_completer (struct cmd_list_element *cmd, completer_ftype *completer)
117 1.1 christos {
118 1.10 christos cmd->completer = completer; /* Ok. */
119 1.1 christos }
120 1.1 christos
121 1.10 christos /* See definition in commands.h. */
122 1.1 christos
123 1.1 christos void
124 1.10 christos set_cmd_completer_handle_brkchars (struct cmd_list_element *cmd,
125 1.10 christos completer_handle_brkchars_ftype *func)
126 1.1 christos {
127 1.10 christos cmd->completer_handle_brkchars = func;
128 1.1 christos }
129 1.1 christos
130 1.10 christos std::string
131 1.10 christos cmd_list_element::prefixname () const
132 1.1 christos {
133 1.10 christos if (!this->is_prefix ())
134 1.10 christos /* Not a prefix command. */
135 1.10 christos return "";
136 1.10 christos
137 1.10 christos std::string prefixname;
138 1.10 christos if (this->prefix != nullptr)
139 1.10 christos prefixname = this->prefix->prefixname ();
140 1.10 christos
141 1.10 christos prefixname += this->name;
142 1.10 christos prefixname += " ";
143 1.10 christos
144 1.10 christos return prefixname;
145 1.1 christos }
146 1.1 christos
147 1.10 christos /* See cli/cli-decode.h. */
148 1.10 christos
149 1.10 christos std::vector<std::string>
150 1.10 christos cmd_list_element::command_components () const
151 1.1 christos {
152 1.10 christos std::vector<std::string> result;
153 1.1 christos
154 1.10 christos if (this->prefix != nullptr)
155 1.10 christos result = this->prefix->command_components ();
156 1.3 christos
157 1.11 christos result.emplace_back (this->name);
158 1.10 christos return result;
159 1.3 christos }
160 1.3 christos
161 1.1 christos /* Add element named NAME.
162 1.1 christos Space for NAME and DOC must be allocated by the caller.
163 1.11 christos THECLASS is the top level category into which commands are broken down
164 1.1 christos for "help" purposes.
165 1.1 christos FUN should be the function to execute the command;
166 1.1 christos it will get a character string as argument, with leading
167 1.1 christos and trailing blanks already eliminated.
168 1.1 christos
169 1.1 christos DOC is a documentation string for the command.
170 1.1 christos Its first line should be a complete sentence.
171 1.1 christos It should start with ? for a command that is an abbreviation
172 1.1 christos or with * for a command that most users don't need to know about.
173 1.1 christos
174 1.1 christos Add this command to command list *LIST.
175 1.1 christos
176 1.1 christos Returns a pointer to the added command (not necessarily the head
177 1.1 christos of *LIST). */
178 1.1 christos
179 1.8 christos static struct cmd_list_element *
180 1.8 christos do_add_cmd (const char *name, enum command_class theclass,
181 1.8 christos const char *doc, struct cmd_list_element **list)
182 1.1 christos {
183 1.8 christos struct cmd_list_element *c = new struct cmd_list_element (name, theclass,
184 1.8 christos doc);
185 1.1 christos
186 1.1 christos /* Turn each alias of the old command into an alias of the new
187 1.1 christos command. */
188 1.1 christos c->aliases = delete_cmd (name, list, &c->hook_pre, &c->hookee_pre,
189 1.1 christos &c->hook_post, &c->hookee_post);
190 1.10 christos
191 1.10 christos for (cmd_list_element &alias : c->aliases)
192 1.10 christos alias.alias_target = c;
193 1.10 christos
194 1.1 christos if (c->hook_pre)
195 1.1 christos c->hook_pre->hookee_pre = c;
196 1.10 christos
197 1.1 christos if (c->hookee_pre)
198 1.1 christos c->hookee_pre->hook_pre = c;
199 1.10 christos
200 1.1 christos if (c->hook_post)
201 1.1 christos c->hook_post->hookee_post = c;
202 1.10 christos
203 1.1 christos if (c->hookee_post)
204 1.1 christos c->hookee_post->hook_post = c;
205 1.1 christos
206 1.1 christos if (*list == NULL || strcmp ((*list)->name, name) >= 0)
207 1.1 christos {
208 1.1 christos c->next = *list;
209 1.1 christos *list = c;
210 1.1 christos }
211 1.1 christos else
212 1.1 christos {
213 1.10 christos cmd_list_element *p = *list;
214 1.1 christos while (p->next && strcmp (p->next->name, name) <= 0)
215 1.1 christos {
216 1.1 christos p = p->next;
217 1.1 christos }
218 1.1 christos c->next = p->next;
219 1.1 christos p->next = c;
220 1.1 christos }
221 1.1 christos
222 1.9 christos /* Search the prefix cmd of C, and assigns it to C->prefix.
223 1.9 christos See also add_prefix_cmd and update_prefix_field_of_prefixed_commands. */
224 1.10 christos cmd_list_element *prefixcmd = lookup_cmd_with_subcommands (list, cmdlist);
225 1.9 christos c->prefix = prefixcmd;
226 1.9 christos
227 1.9 christos
228 1.8 christos return c;
229 1.8 christos }
230 1.8 christos
231 1.8 christos struct cmd_list_element *
232 1.8 christos add_cmd (const char *name, enum command_class theclass,
233 1.8 christos const char *doc, struct cmd_list_element **list)
234 1.8 christos {
235 1.8 christos cmd_list_element *result = do_add_cmd (name, theclass, doc, list);
236 1.8 christos result->func = NULL;
237 1.10 christos result->function.simple_func = NULL;
238 1.8 christos return result;
239 1.8 christos }
240 1.8 christos
241 1.8 christos struct cmd_list_element *
242 1.8 christos add_cmd (const char *name, enum command_class theclass,
243 1.10 christos cmd_simple_func_ftype *fun,
244 1.8 christos const char *doc, struct cmd_list_element **list)
245 1.8 christos {
246 1.8 christos cmd_list_element *result = do_add_cmd (name, theclass, doc, list);
247 1.10 christos set_cmd_simple_func (result, fun);
248 1.8 christos return result;
249 1.8 christos }
250 1.8 christos
251 1.8 christos /* Add an element with a suppress notification to the LIST of commands. */
252 1.1 christos
253 1.8 christos struct cmd_list_element *
254 1.8 christos add_cmd_suppress_notification (const char *name, enum command_class theclass,
255 1.10 christos cmd_simple_func_ftype *fun, const char *doc,
256 1.8 christos struct cmd_list_element **list,
257 1.10 christos bool *suppress_notification)
258 1.8 christos {
259 1.8 christos struct cmd_list_element *element;
260 1.8 christos
261 1.8 christos element = add_cmd (name, theclass, fun, doc, list);
262 1.8 christos element->suppress_notification = suppress_notification;
263 1.8 christos
264 1.8 christos return element;
265 1.1 christos }
266 1.1 christos
267 1.8 christos
268 1.1 christos /* Deprecates a command CMD.
269 1.1 christos REPLACEMENT is the name of the command which should be used in
270 1.1 christos place of this command, or NULL if no such command exists.
271 1.1 christos
272 1.1 christos This function does not check to see if command REPLACEMENT exists
273 1.1 christos since gdb may not have gotten around to adding REPLACEMENT when
274 1.1 christos this function is called.
275 1.1 christos
276 1.1 christos Returns a pointer to the deprecated command. */
277 1.1 christos
278 1.1 christos struct cmd_list_element *
279 1.3 christos deprecate_cmd (struct cmd_list_element *cmd, const char *replacement)
280 1.1 christos {
281 1.3 christos cmd->cmd_deprecated = 1;
282 1.3 christos cmd->deprecated_warn_user = 1;
283 1.1 christos
284 1.1 christos if (replacement != NULL)
285 1.1 christos cmd->replacement = replacement;
286 1.1 christos else
287 1.1 christos cmd->replacement = NULL;
288 1.1 christos
289 1.1 christos return cmd;
290 1.1 christos }
291 1.1 christos
292 1.1 christos struct cmd_list_element *
293 1.10 christos add_alias_cmd (const char *name, cmd_list_element *target,
294 1.7 christos enum command_class theclass, int abbrev_flag,
295 1.7 christos struct cmd_list_element **list)
296 1.1 christos {
297 1.10 christos gdb_assert (target != nullptr);
298 1.1 christos
299 1.10 christos struct cmd_list_element *c = add_cmd (name, theclass, target->doc, list);
300 1.1 christos
301 1.10 christos /* If TARGET->DOC can be freed, we should make another copy. */
302 1.10 christos if (target->doc_allocated)
303 1.1 christos {
304 1.10 christos c->doc = xstrdup (target->doc);
305 1.3 christos c->doc_allocated = 1;
306 1.1 christos }
307 1.1 christos /* NOTE: Both FUNC and all the FUNCTIONs need to be copied. */
308 1.10 christos c->func = target->func;
309 1.10 christos c->function = target->function;
310 1.10 christos c->subcommands = target->subcommands;
311 1.10 christos c->allow_unknown = target->allow_unknown;
312 1.1 christos c->abbrev_flag = abbrev_flag;
313 1.10 christos c->alias_target = target;
314 1.10 christos target->aliases.push_front (*c);
315 1.1 christos
316 1.1 christos return c;
317 1.1 christos }
318 1.1 christos
319 1.9 christos /* Update the prefix field of all sub-commands of the prefix command C.
320 1.9 christos We must do this when a prefix command is defined as the GDB init sequence
321 1.9 christos does not guarantee that a prefix command is created before its sub-commands.
322 1.9 christos For example, break-catch-sig.c initialization runs before breakpoint.c
323 1.9 christos initialization, but it is breakpoint.c that creates the "catch" command used
324 1.9 christos by the "catch signal" command created by break-catch-sig.c. */
325 1.9 christos
326 1.9 christos static void
327 1.9 christos update_prefix_field_of_prefixed_commands (struct cmd_list_element *c)
328 1.9 christos {
329 1.10 christos for (cmd_list_element *p = *c->subcommands; p != NULL; p = p->next)
330 1.9 christos {
331 1.9 christos p->prefix = c;
332 1.9 christos
333 1.9 christos /* We must recursively update the prefix field to cover
334 1.9 christos e.g. 'info auto-load libthread-db' where the creation
335 1.9 christos order was:
336 1.10 christos libthread-db
337 1.10 christos auto-load
338 1.10 christos info
339 1.9 christos In such a case, when 'auto-load' was created by do_add_cmd,
340 1.10 christos the 'libthread-db' prefix field could not be updated, as the
341 1.9 christos 'auto-load' command was not yet reachable by
342 1.10 christos lookup_cmd_for_subcommands (list, cmdlist)
343 1.9 christos that searches from the top level 'cmdlist'. */
344 1.10 christos if (p->is_prefix ())
345 1.9 christos update_prefix_field_of_prefixed_commands (p);
346 1.9 christos }
347 1.9 christos }
348 1.9 christos
349 1.9 christos
350 1.1 christos /* Like add_cmd but adds an element for a command prefix: a name that
351 1.1 christos should be followed by a subcommand to be looked up in another
352 1.10 christos command list. SUBCOMMANDS should be the address of the variable
353 1.1 christos containing that list. */
354 1.1 christos
355 1.1 christos struct cmd_list_element *
356 1.5 christos add_prefix_cmd (const char *name, enum command_class theclass,
357 1.10 christos cmd_simple_func_ftype *fun,
358 1.10 christos const char *doc, struct cmd_list_element **subcommands,
359 1.10 christos int allow_unknown, struct cmd_list_element **list)
360 1.1 christos {
361 1.5 christos struct cmd_list_element *c = add_cmd (name, theclass, fun, doc, list);
362 1.1 christos
363 1.10 christos c->subcommands = subcommands;
364 1.1 christos c->allow_unknown = allow_unknown;
365 1.1 christos
366 1.9 christos /* Now that prefix command C is defined, we need to set the prefix field
367 1.9 christos of all prefixed commands that were defined before C itself was defined. */
368 1.9 christos update_prefix_field_of_prefixed_commands (c);
369 1.9 christos
370 1.9 christos return c;
371 1.9 christos }
372 1.9 christos
373 1.9 christos /* A helper function for add_basic_prefix_cmd. This is a command
374 1.9 christos function that just forwards to help_list. */
375 1.9 christos
376 1.9 christos static void
377 1.9 christos do_prefix_cmd (const char *args, int from_tty, struct cmd_list_element *c)
378 1.9 christos {
379 1.9 christos /* Look past all aliases. */
380 1.10 christos while (c->is_alias ())
381 1.10 christos c = c->alias_target;
382 1.9 christos
383 1.10 christos help_list (*c->subcommands, c->prefixname ().c_str (),
384 1.10 christos all_commands, gdb_stdout);
385 1.9 christos }
386 1.9 christos
387 1.9 christos /* See command.h. */
388 1.9 christos
389 1.9 christos struct cmd_list_element *
390 1.9 christos add_basic_prefix_cmd (const char *name, enum command_class theclass,
391 1.10 christos const char *doc, struct cmd_list_element **subcommands,
392 1.10 christos int allow_unknown, struct cmd_list_element **list)
393 1.9 christos {
394 1.9 christos struct cmd_list_element *cmd = add_prefix_cmd (name, theclass, nullptr,
395 1.10 christos doc, subcommands,
396 1.9 christos allow_unknown, list);
397 1.10 christos cmd->func = do_prefix_cmd;
398 1.9 christos return cmd;
399 1.9 christos }
400 1.9 christos
401 1.9 christos /* A helper function for add_show_prefix_cmd. This is a command
402 1.9 christos function that just forwards to cmd_show_list. */
403 1.9 christos
404 1.9 christos static void
405 1.9 christos do_show_prefix_cmd (const char *args, int from_tty, struct cmd_list_element *c)
406 1.9 christos {
407 1.10 christos cmd_show_list (*c->subcommands, from_tty);
408 1.9 christos }
409 1.1 christos
410 1.9 christos /* See command.h. */
411 1.1 christos
412 1.9 christos struct cmd_list_element *
413 1.9 christos add_show_prefix_cmd (const char *name, enum command_class theclass,
414 1.10 christos const char *doc, struct cmd_list_element **subcommands,
415 1.10 christos int allow_unknown, struct cmd_list_element **list)
416 1.9 christos {
417 1.9 christos struct cmd_list_element *cmd = add_prefix_cmd (name, theclass, nullptr,
418 1.10 christos doc, subcommands,
419 1.9 christos allow_unknown, list);
420 1.10 christos cmd->func = do_show_prefix_cmd;
421 1.9 christos return cmd;
422 1.1 christos }
423 1.1 christos
424 1.10 christos /* See command.h. */
425 1.10 christos
426 1.10 christos set_show_commands
427 1.10 christos add_setshow_prefix_cmd (const char *name, command_class theclass,
428 1.10 christos const char *set_doc, const char *show_doc,
429 1.10 christos cmd_list_element **set_subcommands_list,
430 1.10 christos cmd_list_element **show_subcommands_list,
431 1.10 christos cmd_list_element **set_list,
432 1.10 christos cmd_list_element **show_list)
433 1.10 christos {
434 1.10 christos set_show_commands cmds;
435 1.10 christos
436 1.10 christos cmds.set = add_basic_prefix_cmd (name, theclass, set_doc,
437 1.10 christos set_subcommands_list, 0,
438 1.10 christos set_list);
439 1.10 christos cmds.show = add_show_prefix_cmd (name, theclass, show_doc,
440 1.10 christos show_subcommands_list, 0,
441 1.10 christos show_list);
442 1.10 christos
443 1.10 christos return cmds;
444 1.10 christos }
445 1.10 christos
446 1.8 christos /* Like ADD_PREFIX_CMD but sets the suppress_notification pointer on the
447 1.8 christos new command list element. */
448 1.8 christos
449 1.8 christos struct cmd_list_element *
450 1.8 christos add_prefix_cmd_suppress_notification
451 1.10 christos (const char *name, enum command_class theclass,
452 1.10 christos cmd_simple_func_ftype *fun,
453 1.10 christos const char *doc, struct cmd_list_element **subcommands,
454 1.10 christos int allow_unknown, struct cmd_list_element **list,
455 1.10 christos bool *suppress_notification)
456 1.8 christos {
457 1.8 christos struct cmd_list_element *element
458 1.10 christos = add_prefix_cmd (name, theclass, fun, doc, subcommands,
459 1.10 christos allow_unknown, list);
460 1.8 christos element->suppress_notification = suppress_notification;
461 1.8 christos return element;
462 1.8 christos }
463 1.8 christos
464 1.1 christos /* Like add_prefix_cmd but sets the abbrev_flag on the new command. */
465 1.1 christos
466 1.1 christos struct cmd_list_element *
467 1.5 christos add_abbrev_prefix_cmd (const char *name, enum command_class theclass,
468 1.10 christos cmd_simple_func_ftype *fun, const char *doc,
469 1.10 christos struct cmd_list_element **subcommands,
470 1.1 christos int allow_unknown, struct cmd_list_element **list)
471 1.1 christos {
472 1.5 christos struct cmd_list_element *c = add_cmd (name, theclass, fun, doc, list);
473 1.1 christos
474 1.10 christos c->subcommands = subcommands;
475 1.1 christos c->allow_unknown = allow_unknown;
476 1.1 christos c->abbrev_flag = 1;
477 1.1 christos return c;
478 1.1 christos }
479 1.1 christos
480 1.10 christos /* This is an empty "simple func". */
481 1.1 christos void
482 1.8 christos not_just_help_class_command (const char *args, int from_tty)
483 1.1 christos {
484 1.1 christos }
485 1.1 christos
486 1.10 christos /* This is an empty cmd func. */
487 1.1 christos
488 1.1 christos static void
489 1.10 christos empty_func (const char *args, int from_tty, cmd_list_element *c)
490 1.1 christos {
491 1.1 christos }
492 1.1 christos
493 1.1 christos /* Add element named NAME to command list LIST (the list for set/show
494 1.1 christos or some sublist thereof).
495 1.1 christos TYPE is set_cmd or show_cmd.
496 1.11 christos THECLASS is as in add_cmd.
497 1.1 christos VAR_TYPE is the kind of thing we are setting.
498 1.11 christos EXTRA_LITERALS if non-NULL define extra literals to be accepted in lieu of
499 1.11 christos a number for integer variables.
500 1.11 christos ARGS is a pre-validated type-erased reference to the variable being
501 1.11 christos controlled by this command.
502 1.1 christos DOC is the documentation string. */
503 1.1 christos
504 1.1 christos static struct cmd_list_element *
505 1.1 christos add_set_or_show_cmd (const char *name,
506 1.1 christos enum cmd_types type,
507 1.5 christos enum command_class theclass,
508 1.1 christos var_types var_type,
509 1.11 christos const literal_def *extra_literals,
510 1.10 christos const setting::erased_args &arg,
511 1.3 christos const char *doc,
512 1.1 christos struct cmd_list_element **list)
513 1.1 christos {
514 1.8 christos struct cmd_list_element *c = add_cmd (name, theclass, doc, list);
515 1.1 christos
516 1.1 christos gdb_assert (type == set_cmd || type == show_cmd);
517 1.1 christos c->type = type;
518 1.11 christos c->var.emplace (var_type, extra_literals, arg);
519 1.10 christos
520 1.1 christos /* This needs to be something besides NULL so that this isn't
521 1.1 christos treated as a help class. */
522 1.10 christos c->func = empty_func;
523 1.1 christos return c;
524 1.1 christos }
525 1.1 christos
526 1.11 christos /* Add element named NAME to both command lists SET_LIST and SHOW_LIST.
527 1.11 christos THECLASS is as in add_cmd. VAR_TYPE is the kind of thing we are
528 1.11 christos setting. EXTRA_LITERALS if non-NULL define extra literals to be
529 1.11 christos accepted in lieu of a number for integer variables. ARGS is a
530 1.11 christos pre-validated type-erased reference to the variable being controlled
531 1.11 christos by this command. SET_FUNC and SHOW_FUNC are the callback functions
532 1.11 christos (if non-NULL). SET_DOC, SHOW_DOC and HELP_DOC are the documentation
533 1.11 christos strings.
534 1.10 christos
535 1.10 christos Return the newly created set and show commands. */
536 1.10 christos
537 1.10 christos static set_show_commands
538 1.10 christos add_setshow_cmd_full_erased (const char *name,
539 1.10 christos enum command_class theclass,
540 1.10 christos var_types var_type,
541 1.11 christos const literal_def *extra_literals,
542 1.10 christos const setting::erased_args &args,
543 1.10 christos const char *set_doc, const char *show_doc,
544 1.10 christos const char *help_doc,
545 1.10 christos cmd_func_ftype *set_func,
546 1.10 christos show_value_ftype *show_func,
547 1.10 christos struct cmd_list_element **set_list,
548 1.10 christos struct cmd_list_element **show_list)
549 1.1 christos {
550 1.1 christos struct cmd_list_element *set;
551 1.1 christos struct cmd_list_element *show;
552 1.10 christos gdb::unique_xmalloc_ptr<char> full_set_doc;
553 1.10 christos gdb::unique_xmalloc_ptr<char> full_show_doc;
554 1.1 christos
555 1.1 christos if (help_doc != NULL)
556 1.1 christos {
557 1.1 christos full_set_doc = xstrprintf ("%s\n%s", set_doc, help_doc);
558 1.1 christos full_show_doc = xstrprintf ("%s\n%s", show_doc, help_doc);
559 1.1 christos }
560 1.1 christos else
561 1.1 christos {
562 1.10 christos full_set_doc = make_unique_xstrdup (set_doc);
563 1.10 christos full_show_doc = make_unique_xstrdup (show_doc);
564 1.1 christos }
565 1.11 christos set = add_set_or_show_cmd (name, set_cmd, theclass, var_type,
566 1.11 christos extra_literals, args,
567 1.10 christos full_set_doc.release (), set_list);
568 1.3 christos set->doc_allocated = 1;
569 1.1 christos
570 1.1 christos if (set_func != NULL)
571 1.10 christos set->func = set_func;
572 1.1 christos
573 1.11 christos show = add_set_or_show_cmd (name, show_cmd, theclass, var_type,
574 1.11 christos extra_literals, args,
575 1.10 christos full_show_doc.release (), show_list);
576 1.3 christos show->doc_allocated = 1;
577 1.1 christos show->show_value_func = show_func;
578 1.9 christos /* Disable the default symbol completer. Doesn't make much sense
579 1.9 christos for the "show" command to complete on anything. */
580 1.9 christos set_cmd_completer (show, nullptr);
581 1.1 christos
582 1.10 christos return {set, show};
583 1.10 christos }
584 1.10 christos
585 1.11 christos /* Completes on integer commands that support extra literals. */
586 1.11 christos
587 1.11 christos static void
588 1.11 christos integer_literals_completer (struct cmd_list_element *c,
589 1.11 christos completion_tracker &tracker,
590 1.11 christos const char *text, const char *word)
591 1.11 christos {
592 1.11 christos const literal_def *extra_literals = c->var->extra_literals ();
593 1.11 christos
594 1.11 christos if (*text == '\0')
595 1.11 christos {
596 1.11 christos tracker.add_completion (make_unique_xstrdup ("NUMBER"));
597 1.11 christos for (const literal_def *l = extra_literals;
598 1.11 christos l->literal != nullptr;
599 1.11 christos l++)
600 1.11 christos tracker.add_completion (make_unique_xstrdup (l->literal));
601 1.11 christos }
602 1.11 christos else
603 1.11 christos for (const literal_def *l = extra_literals;
604 1.11 christos l->literal != nullptr;
605 1.11 christos l++)
606 1.11 christos if (startswith (l->literal, text))
607 1.11 christos tracker.add_completion (make_unique_xstrdup (l->literal));
608 1.11 christos }
609 1.11 christos
610 1.11 christos /* Add element named NAME to both command lists SET_LIST and SHOW_LIST.
611 1.11 christos THECLASS is as in add_cmd. VAR_TYPE is the kind of thing we are
612 1.11 christos setting. VAR is address of the variable being controlled by this
613 1.11 christos command. EXTRA_LITERALS if non-NULL define extra literals to be
614 1.11 christos accepted in lieu of a number for integer variables. If nullptr is
615 1.11 christos given as VAR, then both SET_SETTING_FUNC and GET_SETTING_FUNC must
616 1.11 christos be provided. SET_SETTING_FUNC and GET_SETTING_FUNC are callbacks
617 1.11 christos used to access and modify the underlying property, whatever its
618 1.11 christos storage is. SET_FUNC and SHOW_FUNC are the callback functions
619 1.11 christos (if non-NULL). SET_DOC, SHOW_DOC and HELP_DOC are the
620 1.11 christos documentation strings.
621 1.11 christos
622 1.11 christos Return the newly created set and show commands. */
623 1.11 christos
624 1.10 christos template<typename T>
625 1.10 christos static set_show_commands
626 1.10 christos add_setshow_cmd_full (const char *name,
627 1.10 christos enum command_class theclass,
628 1.10 christos var_types var_type, T *var,
629 1.11 christos const literal_def *extra_literals,
630 1.10 christos const char *set_doc, const char *show_doc,
631 1.10 christos const char *help_doc,
632 1.10 christos typename setting_func_types<T>::set set_setting_func,
633 1.10 christos typename setting_func_types<T>::get get_setting_func,
634 1.10 christos cmd_func_ftype *set_func,
635 1.10 christos show_value_ftype *show_func,
636 1.10 christos struct cmd_list_element **set_list,
637 1.10 christos struct cmd_list_element **show_list)
638 1.10 christos {
639 1.10 christos auto erased_args
640 1.10 christos = setting::erase_args (var_type, var,
641 1.10 christos set_setting_func, get_setting_func);
642 1.11 christos auto cmds = add_setshow_cmd_full_erased (name,
643 1.11 christos theclass,
644 1.11 christos var_type, extra_literals,
645 1.11 christos erased_args,
646 1.11 christos set_doc, show_doc,
647 1.11 christos help_doc,
648 1.11 christos set_func,
649 1.11 christos show_func,
650 1.11 christos set_list,
651 1.11 christos show_list);
652 1.11 christos
653 1.11 christos if (extra_literals != nullptr)
654 1.11 christos set_cmd_completer (cmds.set, integer_literals_completer);
655 1.10 christos
656 1.11 christos return cmds;
657 1.11 christos }
658 1.11 christos
659 1.11 christos /* Same as above but omitting EXTRA_LITERALS. */
660 1.11 christos
661 1.11 christos template<typename T>
662 1.11 christos static set_show_commands
663 1.11 christos add_setshow_cmd_full (const char *name,
664 1.11 christos enum command_class theclass,
665 1.11 christos var_types var_type, T *var,
666 1.11 christos const char *set_doc, const char *show_doc,
667 1.11 christos const char *help_doc,
668 1.11 christos typename setting_func_types<T>::set set_setting_func,
669 1.11 christos typename setting_func_types<T>::get get_setting_func,
670 1.11 christos cmd_func_ftype *set_func,
671 1.11 christos show_value_ftype *show_func,
672 1.11 christos struct cmd_list_element **set_list,
673 1.11 christos struct cmd_list_element **show_list)
674 1.11 christos {
675 1.11 christos return add_setshow_cmd_full (name, theclass, var_type, var, nullptr,
676 1.11 christos set_doc, show_doc, help_doc,
677 1.11 christos set_setting_func, get_setting_func,
678 1.11 christos set_func, show_func, set_list, show_list);
679 1.1 christos }
680 1.1 christos
681 1.1 christos /* Add element named NAME to command list LIST (the list for set or
682 1.11 christos some sublist thereof). THECLASS is as in add_cmd. ENUMLIST is a list
683 1.1 christos of strings which may follow NAME. VAR is address of the variable
684 1.1 christos which will contain the matching string (from ENUMLIST). */
685 1.1 christos
686 1.10 christos set_show_commands
687 1.1 christos add_setshow_enum_cmd (const char *name,
688 1.5 christos enum command_class theclass,
689 1.1 christos const char *const *enumlist,
690 1.1 christos const char **var,
691 1.1 christos const char *set_doc,
692 1.1 christos const char *show_doc,
693 1.1 christos const char *help_doc,
694 1.10 christos cmd_func_ftype *set_func,
695 1.1 christos show_value_ftype *show_func,
696 1.1 christos struct cmd_list_element **set_list,
697 1.10 christos struct cmd_list_element **show_list)
698 1.10 christos {
699 1.10 christos /* We require *VAR to be initialized before this call, and
700 1.10 christos furthermore it must be == to one of the values in ENUMLIST. */
701 1.10 christos gdb_assert (var != nullptr && *var != nullptr);
702 1.10 christos for (int i = 0; ; ++i)
703 1.10 christos {
704 1.10 christos gdb_assert (enumlist[i] != nullptr);
705 1.10 christos if (*var == enumlist[i])
706 1.10 christos break;
707 1.10 christos }
708 1.10 christos
709 1.10 christos set_show_commands commands
710 1.10 christos = add_setshow_cmd_full<const char *> (name, theclass, var_enum, var,
711 1.10 christos set_doc, show_doc, help_doc,
712 1.10 christos nullptr, nullptr, set_func,
713 1.10 christos show_func, set_list, show_list);
714 1.10 christos commands.set->enums = enumlist;
715 1.10 christos return commands;
716 1.10 christos }
717 1.10 christos
718 1.10 christos /* Same as above but using a getter and a setter function instead of a pointer
719 1.10 christos to a global storage buffer. */
720 1.10 christos
721 1.10 christos set_show_commands
722 1.10 christos add_setshow_enum_cmd (const char *name, command_class theclass,
723 1.10 christos const char *const *enumlist, const char *set_doc,
724 1.10 christos const char *show_doc, const char *help_doc,
725 1.10 christos setting_func_types<const char *>::set set_func,
726 1.10 christos setting_func_types<const char *>::get get_func,
727 1.10 christos show_value_ftype *show_func,
728 1.10 christos cmd_list_element **set_list,
729 1.10 christos cmd_list_element **show_list)
730 1.1 christos {
731 1.10 christos auto cmds = add_setshow_cmd_full<const char *> (name, theclass, var_enum,
732 1.10 christos nullptr, set_doc, show_doc,
733 1.10 christos help_doc, set_func, get_func,
734 1.10 christos nullptr, show_func, set_list,
735 1.10 christos show_list);
736 1.1 christos
737 1.10 christos cmds.set->enums = enumlist;
738 1.8 christos
739 1.10 christos return cmds;
740 1.1 christos }
741 1.1 christos
742 1.9 christos /* See cli-decode.h. */
743 1.1 christos const char * const auto_boolean_enums[] = { "on", "off", "auto", NULL };
744 1.1 christos
745 1.1 christos /* Add an auto-boolean command named NAME to both the set and show
746 1.11 christos command list lists. THECLASS is as in add_cmd. VAR is address of the
747 1.1 christos variable which will contain the value. DOC is the documentation
748 1.1 christos string. FUNC is the corresponding callback. */
749 1.10 christos
750 1.10 christos set_show_commands
751 1.1 christos add_setshow_auto_boolean_cmd (const char *name,
752 1.5 christos enum command_class theclass,
753 1.1 christos enum auto_boolean *var,
754 1.1 christos const char *set_doc, const char *show_doc,
755 1.1 christos const char *help_doc,
756 1.10 christos cmd_func_ftype *set_func,
757 1.1 christos show_value_ftype *show_func,
758 1.1 christos struct cmd_list_element **set_list,
759 1.1 christos struct cmd_list_element **show_list)
760 1.1 christos {
761 1.10 christos set_show_commands commands
762 1.10 christos = add_setshow_cmd_full<enum auto_boolean> (name, theclass, var_auto_boolean,
763 1.10 christos var, set_doc, show_doc, help_doc,
764 1.10 christos nullptr, nullptr, set_func,
765 1.10 christos show_func, set_list, show_list);
766 1.10 christos
767 1.10 christos commands.set->enums = auto_boolean_enums;
768 1.10 christos
769 1.10 christos return commands;
770 1.10 christos }
771 1.10 christos
772 1.10 christos /* Same as above but using a getter and a setter function instead of a pointer
773 1.10 christos to a global storage buffer. */
774 1.10 christos
775 1.10 christos set_show_commands
776 1.10 christos add_setshow_auto_boolean_cmd (const char *name, command_class theclass,
777 1.10 christos const char *set_doc, const char *show_doc,
778 1.10 christos const char *help_doc,
779 1.10 christos setting_func_types<enum auto_boolean>::set set_func,
780 1.10 christos setting_func_types<enum auto_boolean>::get get_func,
781 1.10 christos show_value_ftype *show_func,
782 1.10 christos cmd_list_element **set_list,
783 1.10 christos cmd_list_element **show_list)
784 1.10 christos {
785 1.10 christos auto cmds = add_setshow_cmd_full<enum auto_boolean> (name, theclass,
786 1.10 christos var_auto_boolean,
787 1.10 christos nullptr, set_doc,
788 1.10 christos show_doc, help_doc,
789 1.10 christos set_func, get_func,
790 1.10 christos nullptr, show_func,
791 1.10 christos set_list, show_list);
792 1.10 christos
793 1.10 christos cmds.set->enums = auto_boolean_enums;
794 1.1 christos
795 1.10 christos return cmds;
796 1.1 christos }
797 1.1 christos
798 1.9 christos /* See cli-decode.h. */
799 1.9 christos const char * const boolean_enums[] = { "on", "off", NULL };
800 1.9 christos
801 1.1 christos /* Add element named NAME to both the set and show command LISTs (the
802 1.11 christos list for set/show or some sublist thereof). THECLASS is as in
803 1.1 christos add_cmd. VAR is address of the variable which will contain the
804 1.9 christos value. SET_DOC and SHOW_DOC are the documentation strings.
805 1.9 christos Returns the new command element. */
806 1.9 christos
807 1.10 christos set_show_commands
808 1.9 christos add_setshow_boolean_cmd (const char *name, enum command_class theclass, bool *var,
809 1.1 christos const char *set_doc, const char *show_doc,
810 1.1 christos const char *help_doc,
811 1.10 christos cmd_func_ftype *set_func,
812 1.1 christos show_value_ftype *show_func,
813 1.1 christos struct cmd_list_element **set_list,
814 1.1 christos struct cmd_list_element **show_list)
815 1.1 christos {
816 1.10 christos set_show_commands commands
817 1.10 christos = add_setshow_cmd_full<bool> (name, theclass, var_boolean, var,
818 1.10 christos set_doc, show_doc, help_doc,
819 1.10 christos nullptr, nullptr, set_func, show_func,
820 1.10 christos set_list, show_list);
821 1.10 christos
822 1.10 christos commands.set->enums = boolean_enums;
823 1.10 christos
824 1.10 christos return commands;
825 1.10 christos }
826 1.10 christos
827 1.10 christos /* Same as above but using a getter and a setter function instead of a pointer
828 1.10 christos to a global storage buffer. */
829 1.10 christos
830 1.10 christos set_show_commands
831 1.10 christos add_setshow_boolean_cmd (const char *name, command_class theclass,
832 1.10 christos const char *set_doc, const char *show_doc,
833 1.10 christos const char *help_doc,
834 1.10 christos setting_func_types<bool>::set set_func,
835 1.10 christos setting_func_types<bool>::get get_func,
836 1.10 christos show_value_ftype *show_func,
837 1.10 christos cmd_list_element **set_list,
838 1.10 christos cmd_list_element **show_list)
839 1.10 christos {
840 1.10 christos auto cmds = add_setshow_cmd_full<bool> (name, theclass, var_boolean, nullptr,
841 1.10 christos set_doc, show_doc, help_doc,
842 1.10 christos set_func, get_func, nullptr,
843 1.10 christos show_func, set_list, show_list);
844 1.1 christos
845 1.10 christos cmds.set->enums = boolean_enums;
846 1.9 christos
847 1.10 christos return cmds;
848 1.1 christos }
849 1.1 christos
850 1.1 christos /* Add element named NAME to both the set and show command LISTs (the
851 1.1 christos list for set/show or some sublist thereof). */
852 1.10 christos
853 1.10 christos set_show_commands
854 1.5 christos add_setshow_filename_cmd (const char *name, enum command_class theclass,
855 1.10 christos std::string *var,
856 1.1 christos const char *set_doc, const char *show_doc,
857 1.1 christos const char *help_doc,
858 1.10 christos cmd_func_ftype *set_func,
859 1.1 christos show_value_ftype *show_func,
860 1.1 christos struct cmd_list_element **set_list,
861 1.1 christos struct cmd_list_element **show_list)
862 1.1 christos {
863 1.10 christos set_show_commands commands
864 1.10 christos = add_setshow_cmd_full<std::string> (name, theclass, var_filename, var,
865 1.10 christos set_doc, show_doc, help_doc,
866 1.10 christos nullptr, nullptr, set_func,
867 1.10 christos show_func, set_list, show_list);
868 1.10 christos
869 1.10 christos set_cmd_completer (commands.set, filename_completer);
870 1.10 christos
871 1.10 christos return commands;
872 1.10 christos }
873 1.10 christos
874 1.10 christos /* Same as above but using a getter and a setter function instead of a pointer
875 1.10 christos to a global storage buffer. */
876 1.10 christos
877 1.10 christos set_show_commands
878 1.10 christos add_setshow_filename_cmd (const char *name, command_class theclass,
879 1.10 christos const char *set_doc, const char *show_doc,
880 1.10 christos const char *help_doc,
881 1.10 christos setting_func_types<std::string>::set set_func,
882 1.10 christos setting_func_types<std::string>::get get_func,
883 1.10 christos show_value_ftype *show_func,
884 1.10 christos cmd_list_element **set_list,
885 1.10 christos cmd_list_element **show_list)
886 1.10 christos {
887 1.10 christos auto cmds = add_setshow_cmd_full<std::string> (name, theclass, var_filename,
888 1.10 christos nullptr, set_doc, show_doc,
889 1.10 christos help_doc, set_func, get_func,
890 1.10 christos nullptr, show_func, set_list,
891 1.10 christos show_list);
892 1.1 christos
893 1.10 christos set_cmd_completer (cmds.set, filename_completer);
894 1.10 christos
895 1.10 christos return cmds;
896 1.1 christos }
897 1.1 christos
898 1.1 christos /* Add element named NAME to both the set and show command LISTs (the
899 1.1 christos list for set/show or some sublist thereof). */
900 1.10 christos
901 1.10 christos set_show_commands
902 1.5 christos add_setshow_string_cmd (const char *name, enum command_class theclass,
903 1.10 christos std::string *var,
904 1.1 christos const char *set_doc, const char *show_doc,
905 1.1 christos const char *help_doc,
906 1.10 christos cmd_func_ftype *set_func,
907 1.1 christos show_value_ftype *show_func,
908 1.1 christos struct cmd_list_element **set_list,
909 1.1 christos struct cmd_list_element **show_list)
910 1.1 christos {
911 1.10 christos set_show_commands commands
912 1.10 christos = add_setshow_cmd_full<std::string> (name, theclass, var_string, var,
913 1.10 christos set_doc, show_doc, help_doc,
914 1.10 christos nullptr, nullptr, set_func,
915 1.10 christos show_func, set_list, show_list);
916 1.10 christos
917 1.10 christos /* Disable the default symbol completer. */
918 1.10 christos set_cmd_completer (commands.set, nullptr);
919 1.10 christos
920 1.10 christos return commands;
921 1.10 christos }
922 1.9 christos
923 1.10 christos /* Same as above but using a getter and a setter function instead of a pointer
924 1.10 christos to a global storage buffer. */
925 1.10 christos
926 1.10 christos set_show_commands
927 1.10 christos add_setshow_string_cmd (const char *name, command_class theclass,
928 1.10 christos const char *set_doc, const char *show_doc,
929 1.10 christos const char *help_doc,
930 1.10 christos setting_func_types<std::string>::set set_func,
931 1.10 christos setting_func_types<std::string>::get get_func,
932 1.10 christos show_value_ftype *show_func,
933 1.10 christos cmd_list_element **set_list,
934 1.10 christos cmd_list_element **show_list)
935 1.10 christos {
936 1.10 christos auto cmds = add_setshow_cmd_full<std::string> (name, theclass, var_string,
937 1.10 christos nullptr, set_doc, show_doc,
938 1.10 christos help_doc, set_func, get_func,
939 1.10 christos nullptr, show_func, set_list,
940 1.10 christos show_list);
941 1.9 christos
942 1.9 christos /* Disable the default symbol completer. */
943 1.10 christos set_cmd_completer (cmds.set, nullptr);
944 1.10 christos
945 1.10 christos return cmds;
946 1.1 christos }
947 1.1 christos
948 1.1 christos /* Add element named NAME to both the set and show command LISTs (the
949 1.1 christos list for set/show or some sublist thereof). */
950 1.10 christos
951 1.10 christos set_show_commands
952 1.5 christos add_setshow_string_noescape_cmd (const char *name, enum command_class theclass,
953 1.10 christos std::string *var,
954 1.1 christos const char *set_doc, const char *show_doc,
955 1.1 christos const char *help_doc,
956 1.10 christos cmd_func_ftype *set_func,
957 1.1 christos show_value_ftype *show_func,
958 1.1 christos struct cmd_list_element **set_list,
959 1.1 christos struct cmd_list_element **show_list)
960 1.1 christos {
961 1.10 christos set_show_commands commands
962 1.10 christos = add_setshow_cmd_full<std::string> (name, theclass, var_string_noescape,
963 1.10 christos var, set_doc, show_doc, help_doc,
964 1.10 christos nullptr, nullptr, set_func, show_func,
965 1.10 christos set_list, show_list);
966 1.10 christos
967 1.10 christos /* Disable the default symbol completer. */
968 1.10 christos set_cmd_completer (commands.set, nullptr);
969 1.1 christos
970 1.10 christos return commands;
971 1.10 christos }
972 1.10 christos
973 1.10 christos /* Same as above but using a getter and a setter function instead of a pointer
974 1.10 christos to a global storage buffer. */
975 1.10 christos
976 1.10 christos set_show_commands
977 1.10 christos add_setshow_string_noescape_cmd (const char *name, command_class theclass,
978 1.10 christos const char *set_doc, const char *show_doc,
979 1.10 christos const char *help_doc,
980 1.10 christos setting_func_types<std::string>::set set_func,
981 1.10 christos setting_func_types<std::string>::get get_func,
982 1.10 christos show_value_ftype *show_func,
983 1.10 christos cmd_list_element **set_list,
984 1.10 christos cmd_list_element **show_list)
985 1.10 christos {
986 1.10 christos auto cmds = add_setshow_cmd_full<std::string> (name, theclass,
987 1.10 christos var_string_noescape, nullptr,
988 1.10 christos set_doc, show_doc, help_doc,
989 1.10 christos set_func, get_func,
990 1.10 christos nullptr, show_func, set_list,
991 1.10 christos show_list);
992 1.9 christos
993 1.9 christos /* Disable the default symbol completer. */
994 1.10 christos set_cmd_completer (cmds.set, nullptr);
995 1.9 christos
996 1.10 christos return cmds;
997 1.1 christos }
998 1.1 christos
999 1.1 christos /* Add element named NAME to both the set and show command LISTs (the
1000 1.1 christos list for set/show or some sublist thereof). */
1001 1.10 christos
1002 1.10 christos set_show_commands
1003 1.5 christos add_setshow_optional_filename_cmd (const char *name, enum command_class theclass,
1004 1.10 christos std::string *var,
1005 1.1 christos const char *set_doc, const char *show_doc,
1006 1.1 christos const char *help_doc,
1007 1.10 christos cmd_func_ftype *set_func,
1008 1.1 christos show_value_ftype *show_func,
1009 1.1 christos struct cmd_list_element **set_list,
1010 1.1 christos struct cmd_list_element **show_list)
1011 1.1 christos {
1012 1.10 christos set_show_commands commands
1013 1.10 christos = add_setshow_cmd_full<std::string> (name, theclass, var_optional_filename,
1014 1.10 christos var, set_doc, show_doc, help_doc,
1015 1.10 christos nullptr, nullptr, set_func, show_func,
1016 1.10 christos set_list, show_list);
1017 1.10 christos
1018 1.10 christos set_cmd_completer (commands.set, filename_completer);
1019 1.10 christos
1020 1.10 christos return commands;
1021 1.10 christos }
1022 1.10 christos
1023 1.10 christos /* Same as above but using a getter and a setter function instead of a pointer
1024 1.10 christos to a global storage buffer. */
1025 1.10 christos
1026 1.10 christos set_show_commands
1027 1.10 christos add_setshow_optional_filename_cmd (const char *name, command_class theclass,
1028 1.10 christos const char *set_doc, const char *show_doc,
1029 1.10 christos const char *help_doc,
1030 1.10 christos setting_func_types<std::string>::set set_func,
1031 1.10 christos setting_func_types<std::string>::get get_func,
1032 1.10 christos show_value_ftype *show_func,
1033 1.10 christos cmd_list_element **set_list,
1034 1.10 christos cmd_list_element **show_list)
1035 1.10 christos {
1036 1.10 christos auto cmds =
1037 1.10 christos add_setshow_cmd_full<std::string> (name, theclass, var_optional_filename,
1038 1.10 christos nullptr, set_doc, show_doc, help_doc,
1039 1.10 christos set_func, get_func, nullptr, show_func,
1040 1.10 christos set_list,show_list);
1041 1.1 christos
1042 1.10 christos set_cmd_completer (cmds.set, filename_completer);
1043 1.10 christos
1044 1.10 christos return cmds;
1045 1.1 christos }
1046 1.1 christos
1047 1.11 christos /* Add element named NAME to both the set and show command LISTs (the
1048 1.11 christos list for set/show or some sublist thereof). THECLASS is as in
1049 1.11 christos add_cmd. VAR is address of the variable which will contain the
1050 1.11 christos value. SET_DOC and SHOW_DOC are the documentation strings. This
1051 1.11 christos function is only used in Python API. Please don't use it elsewhere. */
1052 1.1 christos
1053 1.11 christos set_show_commands
1054 1.11 christos add_setshow_integer_cmd (const char *name, enum command_class theclass,
1055 1.11 christos int *var, const literal_def *extra_literals,
1056 1.11 christos const char *set_doc, const char *show_doc,
1057 1.11 christos const char *help_doc,
1058 1.11 christos cmd_func_ftype *set_func,
1059 1.11 christos show_value_ftype *show_func,
1060 1.11 christos struct cmd_list_element **set_list,
1061 1.11 christos struct cmd_list_element **show_list)
1062 1.1 christos {
1063 1.11 christos set_show_commands commands
1064 1.11 christos = add_setshow_cmd_full<int> (name, theclass, var_integer, var,
1065 1.11 christos extra_literals, set_doc, show_doc,
1066 1.11 christos help_doc, nullptr, nullptr, set_func,
1067 1.11 christos show_func, set_list, show_list);
1068 1.11 christos return commands;
1069 1.11 christos }
1070 1.11 christos
1071 1.11 christos /* Same as above but using a getter and a setter function instead of a pointer
1072 1.11 christos to a global storage buffer. */
1073 1.1 christos
1074 1.11 christos set_show_commands
1075 1.11 christos add_setshow_integer_cmd (const char *name, command_class theclass,
1076 1.11 christos const literal_def *extra_literals,
1077 1.11 christos const char *set_doc, const char *show_doc,
1078 1.11 christos const char *help_doc,
1079 1.11 christos setting_func_types<int>::set set_func,
1080 1.11 christos setting_func_types<int>::get get_func,
1081 1.11 christos show_value_ftype *show_func,
1082 1.11 christos cmd_list_element **set_list,
1083 1.11 christos cmd_list_element **show_list)
1084 1.11 christos {
1085 1.11 christos auto cmds = add_setshow_cmd_full<int> (name, theclass, var_integer, nullptr,
1086 1.11 christos extra_literals, set_doc, show_doc,
1087 1.11 christos help_doc, set_func, get_func, nullptr,
1088 1.11 christos show_func, set_list, show_list);
1089 1.11 christos return cmds;
1090 1.1 christos }
1091 1.1 christos
1092 1.11 christos /* Accept `unlimited' or 0, translated internally to INT_MAX. */
1093 1.11 christos const literal_def integer_unlimited_literals[] =
1094 1.11 christos {
1095 1.11 christos { "unlimited", INT_MAX, 0 },
1096 1.11 christos { nullptr }
1097 1.11 christos };
1098 1.11 christos
1099 1.11 christos /* Same as above but using `integer_unlimited_literals', with a pointer
1100 1.11 christos to a global storage buffer. */
1101 1.10 christos
1102 1.10 christos set_show_commands
1103 1.5 christos add_setshow_integer_cmd (const char *name, enum command_class theclass,
1104 1.1 christos int *var,
1105 1.1 christos const char *set_doc, const char *show_doc,
1106 1.1 christos const char *help_doc,
1107 1.10 christos cmd_func_ftype *set_func,
1108 1.1 christos show_value_ftype *show_func,
1109 1.1 christos struct cmd_list_element **set_list,
1110 1.1 christos struct cmd_list_element **show_list)
1111 1.1 christos {
1112 1.10 christos set_show_commands commands
1113 1.10 christos = add_setshow_cmd_full<int> (name, theclass, var_integer, var,
1114 1.11 christos integer_unlimited_literals,
1115 1.10 christos set_doc, show_doc, help_doc,
1116 1.10 christos nullptr, nullptr, set_func,
1117 1.10 christos show_func, set_list, show_list);
1118 1.10 christos return commands;
1119 1.10 christos }
1120 1.10 christos
1121 1.10 christos /* Same as above but using a getter and a setter function instead of a pointer
1122 1.10 christos to a global storage buffer. */
1123 1.10 christos
1124 1.10 christos set_show_commands
1125 1.10 christos add_setshow_integer_cmd (const char *name, command_class theclass,
1126 1.10 christos const char *set_doc, const char *show_doc,
1127 1.10 christos const char *help_doc,
1128 1.10 christos setting_func_types<int>::set set_func,
1129 1.10 christos setting_func_types<int>::get get_func,
1130 1.10 christos show_value_ftype *show_func,
1131 1.10 christos cmd_list_element **set_list,
1132 1.10 christos cmd_list_element **show_list)
1133 1.10 christos {
1134 1.10 christos auto cmds = add_setshow_cmd_full<int> (name, theclass, var_integer, nullptr,
1135 1.11 christos integer_unlimited_literals,
1136 1.10 christos set_doc, show_doc, help_doc, set_func,
1137 1.10 christos get_func, nullptr, show_func, set_list,
1138 1.10 christos show_list);
1139 1.11 christos return cmds;
1140 1.11 christos }
1141 1.1 christos
1142 1.11 christos /* Add element named NAME to both the set and show command LISTs (the
1143 1.11 christos list for set/show or some sublist thereof). CLASS is as in
1144 1.11 christos add_cmd. VAR is address of the variable which will contain the
1145 1.11 christos value. SET_DOC and SHOW_DOC are the documentation strings. */
1146 1.1 christos
1147 1.11 christos set_show_commands
1148 1.11 christos add_setshow_pinteger_cmd (const char *name, enum command_class theclass,
1149 1.11 christos int *var, const literal_def *extra_literals,
1150 1.11 christos const char *set_doc, const char *show_doc,
1151 1.11 christos const char *help_doc,
1152 1.11 christos cmd_func_ftype *set_func,
1153 1.11 christos show_value_ftype *show_func,
1154 1.11 christos struct cmd_list_element **set_list,
1155 1.11 christos struct cmd_list_element **show_list)
1156 1.11 christos {
1157 1.11 christos set_show_commands commands
1158 1.11 christos = add_setshow_cmd_full<int> (name, theclass, var_pinteger, var,
1159 1.11 christos extra_literals, set_doc, show_doc,
1160 1.11 christos help_doc, nullptr, nullptr, set_func,
1161 1.11 christos show_func, set_list, show_list);
1162 1.11 christos return commands;
1163 1.11 christos }
1164 1.11 christos
1165 1.11 christos /* Same as above but using a getter and a setter function instead of a pointer
1166 1.11 christos to a global storage buffer. */
1167 1.11 christos
1168 1.11 christos set_show_commands
1169 1.11 christos add_setshow_pinteger_cmd (const char *name, command_class theclass,
1170 1.11 christos const literal_def *extra_literals,
1171 1.11 christos const char *set_doc, const char *show_doc,
1172 1.11 christos const char *help_doc,
1173 1.11 christos setting_func_types<int>::set set_func,
1174 1.11 christos setting_func_types<int>::get get_func,
1175 1.11 christos show_value_ftype *show_func,
1176 1.11 christos cmd_list_element **set_list,
1177 1.11 christos cmd_list_element **show_list)
1178 1.11 christos {
1179 1.11 christos auto cmds = add_setshow_cmd_full<int> (name, theclass, var_pinteger, nullptr,
1180 1.11 christos extra_literals, set_doc, show_doc,
1181 1.11 christos help_doc, set_func, get_func, nullptr,
1182 1.11 christos show_func, set_list, show_list);
1183 1.10 christos return cmds;
1184 1.1 christos }
1185 1.1 christos
1186 1.1 christos /* Add element named NAME to both the set and show command LISTs (the
1187 1.11 christos list for set/show or some sublist thereof). THECLASS is as in
1188 1.1 christos add_cmd. VAR is address of the variable which will contain the
1189 1.1 christos value. SET_DOC and SHOW_DOC are the documentation strings. */
1190 1.10 christos
1191 1.10 christos set_show_commands
1192 1.5 christos add_setshow_uinteger_cmd (const char *name, enum command_class theclass,
1193 1.11 christos unsigned int *var, const literal_def *extra_literals,
1194 1.1 christos const char *set_doc, const char *show_doc,
1195 1.1 christos const char *help_doc,
1196 1.10 christos cmd_func_ftype *set_func,
1197 1.1 christos show_value_ftype *show_func,
1198 1.1 christos struct cmd_list_element **set_list,
1199 1.1 christos struct cmd_list_element **show_list)
1200 1.1 christos {
1201 1.10 christos set_show_commands commands
1202 1.10 christos = add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger, var,
1203 1.11 christos extra_literals, set_doc, show_doc,
1204 1.11 christos help_doc, nullptr, nullptr, set_func,
1205 1.10 christos show_func, set_list, show_list);
1206 1.11 christos return commands;
1207 1.11 christos }
1208 1.11 christos
1209 1.11 christos /* Same as above but using a getter and a setter function instead of a pointer
1210 1.11 christos to a global storage buffer. */
1211 1.11 christos
1212 1.11 christos set_show_commands
1213 1.11 christos add_setshow_uinteger_cmd (const char *name, command_class theclass,
1214 1.11 christos const literal_def *extra_literals,
1215 1.11 christos const char *set_doc, const char *show_doc,
1216 1.11 christos const char *help_doc,
1217 1.11 christos setting_func_types<unsigned int>::set set_func,
1218 1.11 christos setting_func_types<unsigned int>::get get_func,
1219 1.11 christos show_value_ftype *show_func,
1220 1.11 christos cmd_list_element **set_list,
1221 1.11 christos cmd_list_element **show_list)
1222 1.11 christos {
1223 1.11 christos auto cmds = add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger,
1224 1.11 christos nullptr, extra_literals,
1225 1.11 christos set_doc, show_doc, help_doc,
1226 1.11 christos set_func, get_func, nullptr,
1227 1.11 christos show_func, set_list,
1228 1.11 christos show_list);
1229 1.11 christos return cmds;
1230 1.11 christos }
1231 1.10 christos
1232 1.11 christos /* Accept `unlimited' or 0, translated internally to UINT_MAX. */
1233 1.11 christos const literal_def uinteger_unlimited_literals[] =
1234 1.11 christos {
1235 1.11 christos { "unlimited", UINT_MAX, 0 },
1236 1.11 christos { nullptr }
1237 1.11 christos };
1238 1.10 christos
1239 1.11 christos /* Same as above but using `uinteger_unlimited_literals', with a pointer
1240 1.11 christos to a global storage buffer. */
1241 1.11 christos
1242 1.11 christos set_show_commands
1243 1.11 christos add_setshow_uinteger_cmd (const char *name, enum command_class theclass,
1244 1.11 christos unsigned int *var,
1245 1.11 christos const char *set_doc, const char *show_doc,
1246 1.11 christos const char *help_doc,
1247 1.11 christos cmd_func_ftype *set_func,
1248 1.11 christos show_value_ftype *show_func,
1249 1.11 christos struct cmd_list_element **set_list,
1250 1.11 christos struct cmd_list_element **show_list)
1251 1.11 christos {
1252 1.11 christos set_show_commands commands
1253 1.11 christos = add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger, var,
1254 1.11 christos uinteger_unlimited_literals,
1255 1.11 christos set_doc, show_doc, help_doc, nullptr,
1256 1.11 christos nullptr, set_func, show_func,
1257 1.11 christos set_list, show_list);
1258 1.10 christos return commands;
1259 1.10 christos }
1260 1.10 christos
1261 1.10 christos /* Same as above but using a getter and a setter function instead of a pointer
1262 1.10 christos to a global storage buffer. */
1263 1.10 christos
1264 1.10 christos set_show_commands
1265 1.10 christos add_setshow_uinteger_cmd (const char *name, command_class theclass,
1266 1.10 christos const char *set_doc, const char *show_doc,
1267 1.10 christos const char *help_doc,
1268 1.10 christos setting_func_types<unsigned int>::set set_func,
1269 1.10 christos setting_func_types<unsigned int>::get get_func,
1270 1.10 christos show_value_ftype *show_func,
1271 1.10 christos cmd_list_element **set_list,
1272 1.10 christos cmd_list_element **show_list)
1273 1.10 christos {
1274 1.10 christos auto cmds = add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger,
1275 1.11 christos nullptr,
1276 1.11 christos uinteger_unlimited_literals,
1277 1.11 christos set_doc, show_doc, help_doc,
1278 1.11 christos set_func, get_func, nullptr,
1279 1.11 christos show_func, set_list,
1280 1.10 christos show_list);
1281 1.10 christos return cmds;
1282 1.1 christos }
1283 1.1 christos
1284 1.1 christos /* Add element named NAME to both the set and show command LISTs (the
1285 1.11 christos list for set/show or some sublist thereof). THECLASS is as in
1286 1.1 christos add_cmd. VAR is address of the variable which will contain the
1287 1.1 christos value. SET_DOC and SHOW_DOC are the documentation strings. */
1288 1.10 christos
1289 1.10 christos set_show_commands
1290 1.5 christos add_setshow_zinteger_cmd (const char *name, enum command_class theclass,
1291 1.1 christos int *var,
1292 1.1 christos const char *set_doc, const char *show_doc,
1293 1.1 christos const char *help_doc,
1294 1.10 christos cmd_func_ftype *set_func,
1295 1.1 christos show_value_ftype *show_func,
1296 1.1 christos struct cmd_list_element **set_list,
1297 1.1 christos struct cmd_list_element **show_list)
1298 1.1 christos {
1299 1.11 christos return add_setshow_cmd_full<int> (name, theclass, var_integer, var,
1300 1.10 christos set_doc, show_doc, help_doc,
1301 1.10 christos nullptr, nullptr, set_func,
1302 1.10 christos show_func, set_list, show_list);
1303 1.1 christos }
1304 1.1 christos
1305 1.10 christos /* Same as above but using a getter and a setter function instead of a pointer
1306 1.10 christos to a global storage buffer. */
1307 1.10 christos
1308 1.10 christos set_show_commands
1309 1.10 christos add_setshow_zinteger_cmd (const char *name, command_class theclass,
1310 1.10 christos const char *set_doc, const char *show_doc,
1311 1.10 christos const char *help_doc,
1312 1.10 christos setting_func_types<int>::set set_func,
1313 1.10 christos setting_func_types<int>::get get_func,
1314 1.10 christos show_value_ftype *show_func,
1315 1.10 christos cmd_list_element **set_list,
1316 1.10 christos cmd_list_element **show_list)
1317 1.10 christos {
1318 1.11 christos return add_setshow_cmd_full<int> (name, theclass, var_integer, nullptr,
1319 1.10 christos set_doc, show_doc, help_doc, set_func,
1320 1.10 christos get_func, nullptr, show_func, set_list,
1321 1.10 christos show_list);
1322 1.10 christos }
1323 1.10 christos
1324 1.11 christos /* Accept `unlimited' or -1, using -1 internally. */
1325 1.11 christos const literal_def pinteger_unlimited_literals[] =
1326 1.11 christos {
1327 1.11 christos { "unlimited", -1, -1 },
1328 1.11 christos { nullptr }
1329 1.11 christos };
1330 1.11 christos
1331 1.11 christos /* Same as above but using `pinteger_unlimited_literals', with a pointer
1332 1.11 christos to a global storage buffer. */
1333 1.11 christos
1334 1.10 christos set_show_commands
1335 1.1 christos add_setshow_zuinteger_unlimited_cmd (const char *name,
1336 1.5 christos enum command_class theclass,
1337 1.1 christos int *var,
1338 1.1 christos const char *set_doc,
1339 1.1 christos const char *show_doc,
1340 1.1 christos const char *help_doc,
1341 1.10 christos cmd_func_ftype *set_func,
1342 1.1 christos show_value_ftype *show_func,
1343 1.1 christos struct cmd_list_element **set_list,
1344 1.1 christos struct cmd_list_element **show_list)
1345 1.1 christos {
1346 1.10 christos set_show_commands commands
1347 1.11 christos = add_setshow_cmd_full<int> (name, theclass, var_pinteger, var,
1348 1.11 christos pinteger_unlimited_literals,
1349 1.10 christos set_doc, show_doc, help_doc, nullptr,
1350 1.10 christos nullptr, set_func, show_func, set_list,
1351 1.10 christos show_list);
1352 1.10 christos return commands;
1353 1.10 christos }
1354 1.10 christos
1355 1.10 christos /* Same as above but using a getter and a setter function instead of a pointer
1356 1.10 christos to a global storage buffer. */
1357 1.10 christos
1358 1.10 christos set_show_commands
1359 1.10 christos add_setshow_zuinteger_unlimited_cmd (const char *name, command_class theclass,
1360 1.10 christos const char *set_doc, const char *show_doc,
1361 1.10 christos const char *help_doc,
1362 1.10 christos setting_func_types<int>::set set_func,
1363 1.10 christos setting_func_types<int>::get get_func,
1364 1.10 christos show_value_ftype *show_func,
1365 1.10 christos cmd_list_element **set_list,
1366 1.10 christos cmd_list_element **show_list)
1367 1.10 christos {
1368 1.10 christos auto cmds
1369 1.11 christos = add_setshow_cmd_full<int> (name, theclass, var_pinteger, nullptr,
1370 1.11 christos pinteger_unlimited_literals,
1371 1.11 christos set_doc, show_doc, help_doc, set_func,
1372 1.10 christos get_func, nullptr, show_func, set_list,
1373 1.10 christos show_list);
1374 1.10 christos return cmds;
1375 1.1 christos }
1376 1.1 christos
1377 1.1 christos /* Add element named NAME to both the set and show command LISTs (the
1378 1.11 christos list for set/show or some sublist thereof). THECLASS is as in
1379 1.1 christos add_cmd. VAR is address of the variable which will contain the
1380 1.1 christos value. SET_DOC and SHOW_DOC are the documentation strings. */
1381 1.10 christos
1382 1.10 christos set_show_commands
1383 1.5 christos add_setshow_zuinteger_cmd (const char *name, enum command_class theclass,
1384 1.1 christos unsigned int *var,
1385 1.1 christos const char *set_doc, const char *show_doc,
1386 1.1 christos const char *help_doc,
1387 1.10 christos cmd_func_ftype *set_func,
1388 1.1 christos show_value_ftype *show_func,
1389 1.1 christos struct cmd_list_element **set_list,
1390 1.1 christos struct cmd_list_element **show_list)
1391 1.1 christos {
1392 1.11 christos return add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger,
1393 1.10 christos var, set_doc, show_doc, help_doc,
1394 1.10 christos nullptr, nullptr, set_func,
1395 1.10 christos show_func, set_list, show_list);
1396 1.1 christos }
1397 1.1 christos
1398 1.10 christos /* Same as above but using a getter and a setter function instead of a pointer
1399 1.10 christos to a global storage buffer. */
1400 1.10 christos
1401 1.10 christos set_show_commands
1402 1.10 christos add_setshow_zuinteger_cmd (const char *name, command_class theclass,
1403 1.10 christos const char *set_doc, const char *show_doc,
1404 1.10 christos const char *help_doc,
1405 1.10 christos setting_func_types<unsigned int>::set set_func,
1406 1.10 christos setting_func_types<unsigned int>::get get_func,
1407 1.10 christos show_value_ftype *show_func,
1408 1.10 christos cmd_list_element **set_list,
1409 1.10 christos cmd_list_element **show_list)
1410 1.10 christos {
1411 1.11 christos return add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger,
1412 1.10 christos nullptr, set_doc, show_doc,
1413 1.10 christos help_doc, set_func, get_func,
1414 1.10 christos nullptr, show_func, set_list,
1415 1.10 christos show_list);
1416 1.10 christos }
1417 1.10 christos
1418 1.10 christos /* Remove the command named NAME from the command list. Return the list
1419 1.10 christos commands which were aliased to the deleted command. The various *HOOKs are
1420 1.10 christos set to the pre- and post-hook commands for the deleted command. If the
1421 1.10 christos command does not have a hook, the corresponding out parameter is set to
1422 1.10 christos NULL. */
1423 1.1 christos
1424 1.10 christos static cmd_list_element::aliases_list_type
1425 1.1 christos delete_cmd (const char *name, struct cmd_list_element **list,
1426 1.1 christos struct cmd_list_element **prehook,
1427 1.1 christos struct cmd_list_element **prehookee,
1428 1.1 christos struct cmd_list_element **posthook,
1429 1.1 christos struct cmd_list_element **posthookee)
1430 1.1 christos {
1431 1.1 christos struct cmd_list_element *iter;
1432 1.1 christos struct cmd_list_element **previous_chain_ptr;
1433 1.10 christos cmd_list_element::aliases_list_type aliases;
1434 1.1 christos
1435 1.1 christos *prehook = NULL;
1436 1.1 christos *prehookee = NULL;
1437 1.1 christos *posthook = NULL;
1438 1.1 christos *posthookee = NULL;
1439 1.1 christos previous_chain_ptr = list;
1440 1.1 christos
1441 1.1 christos for (iter = *previous_chain_ptr; iter; iter = *previous_chain_ptr)
1442 1.1 christos {
1443 1.1 christos if (strcmp (iter->name, name) == 0)
1444 1.1 christos {
1445 1.1 christos if (iter->destroyer)
1446 1.10 christos iter->destroyer (iter, iter->context ());
1447 1.10 christos
1448 1.1 christos if (iter->hookee_pre)
1449 1.1 christos iter->hookee_pre->hook_pre = 0;
1450 1.1 christos *prehook = iter->hook_pre;
1451 1.1 christos *prehookee = iter->hookee_pre;
1452 1.1 christos if (iter->hookee_post)
1453 1.1 christos iter->hookee_post->hook_post = 0;
1454 1.1 christos *posthook = iter->hook_post;
1455 1.1 christos *posthookee = iter->hookee_post;
1456 1.1 christos
1457 1.1 christos /* Update the link. */
1458 1.1 christos *previous_chain_ptr = iter->next;
1459 1.1 christos
1460 1.10 christos aliases = std::move (iter->aliases);
1461 1.1 christos
1462 1.1 christos /* If this command was an alias, remove it from the list of
1463 1.1 christos aliases. */
1464 1.10 christos if (iter->is_alias ())
1465 1.1 christos {
1466 1.10 christos auto it = iter->alias_target->aliases.iterator_to (*iter);
1467 1.10 christos iter->alias_target->aliases.erase (it);
1468 1.1 christos }
1469 1.1 christos
1470 1.8 christos delete iter;
1471 1.1 christos
1472 1.1 christos /* We won't see another command with the same name. */
1473 1.1 christos break;
1474 1.1 christos }
1475 1.1 christos else
1476 1.1 christos previous_chain_ptr = &iter->next;
1477 1.1 christos }
1478 1.1 christos
1479 1.1 christos return aliases;
1480 1.1 christos }
1481 1.1 christos
1482 1.1 christos /* Shorthands to the commands above. */
1484 1.1 christos
1485 1.1 christos /* Add an element to the list of info subcommands. */
1486 1.1 christos
1487 1.10 christos struct cmd_list_element *
1488 1.1 christos add_info (const char *name, cmd_simple_func_ftype *fun, const char *doc)
1489 1.6 christos {
1490 1.1 christos return add_cmd (name, class_info, fun, doc, &infolist);
1491 1.1 christos }
1492 1.1 christos
1493 1.1 christos /* Add an alias to the list of info subcommands. */
1494 1.10 christos
1495 1.10 christos cmd_list_element *
1496 1.1 christos add_info_alias (const char *name, cmd_list_element *target, int abbrev_flag)
1497 1.10 christos {
1498 1.1 christos return add_alias_cmd (name, target, class_run, abbrev_flag, &infolist);
1499 1.1 christos }
1500 1.1 christos
1501 1.1 christos /* Add an element to the list of commands. */
1502 1.1 christos
1503 1.8 christos struct cmd_list_element *
1504 1.10 christos add_com (const char *name, enum command_class theclass,
1505 1.3 christos cmd_simple_func_ftype *fun,
1506 1.1 christos const char *doc)
1507 1.5 christos {
1508 1.1 christos return add_cmd (name, theclass, fun, doc, &cmdlist);
1509 1.1 christos }
1510 1.9 christos
1511 1.9 christos /* Add an alias or abbreviation command to the list of commands.
1512 1.9 christos For aliases predefined by GDB (such as bt), THECLASS must be
1513 1.9 christos different of class_alias, as class_alias is used to identify
1514 1.1 christos user defined aliases. */
1515 1.10 christos
1516 1.10 christos cmd_list_element *
1517 1.10 christos add_com_alias (const char *name, cmd_list_element *target,
1518 1.1 christos command_class theclass, int abbrev_flag)
1519 1.10 christos {
1520 1.1 christos return add_alias_cmd (name, target, theclass, abbrev_flag, &cmdlist);
1521 1.6 christos }
1522 1.6 christos
1523 1.6 christos /* Add an element with a suppress notification to the list of commands. */
1524 1.6 christos
1525 1.6 christos struct cmd_list_element *
1526 1.10 christos add_com_suppress_notification (const char *name, enum command_class theclass,
1527 1.10 christos cmd_simple_func_ftype *fun, const char *doc,
1528 1.6 christos bool *suppress_notification)
1529 1.8 christos {
1530 1.8 christos return add_cmd_suppress_notification (name, theclass, fun, doc,
1531 1.6 christos &cmdlist, suppress_notification);
1532 1.6 christos }
1533 1.9 christos
1534 1.9 christos /* Print the prefix of C followed by name of C in title style. */
1535 1.9 christos
1536 1.10 christos static void
1537 1.9 christos fput_command_name_styled (const cmd_list_element &c, struct ui_file *stream)
1538 1.10 christos {
1539 1.10 christos std::string prefixname
1540 1.10 christos = c.prefix == nullptr ? "" : c.prefix->prefixname ();
1541 1.10 christos
1542 1.10 christos fprintf_styled (stream, title_style.style (), "%s%s",
1543 1.10 christos prefixname.c_str (), c.name);
1544 1.9 christos }
1545 1.10 christos
1546 1.10 christos /* True if ALIAS has a user-defined documentation. */
1547 1.10 christos
1548 1.10 christos static bool
1549 1.10 christos user_documented_alias (const cmd_list_element &alias)
1550 1.10 christos {
1551 1.10 christos gdb_assert (alias.is_alias ());
1552 1.10 christos /* Alias is user documented if it has an allocated documentation
1553 1.10 christos that differs from the aliased command. */
1554 1.10 christos return (alias.doc_allocated
1555 1.9 christos && strcmp (alias.doc, alias.alias_target->doc) != 0);
1556 1.9 christos }
1557 1.9 christos
1558 1.9 christos /* Print the definition of alias C using title style for alias
1559 1.9 christos and aliased command. */
1560 1.9 christos
1561 1.10 christos static void
1562 1.9 christos fput_alias_definition_styled (const cmd_list_element &c,
1563 1.9 christos struct ui_file *stream)
1564 1.10 christos {
1565 1.10 christos gdb_assert (c.is_alias ());
1566 1.9 christos gdb_puts (" alias ", stream);
1567 1.10 christos fput_command_name_styled (c, stream);
1568 1.10 christos gdb_printf (stream, " = ");
1569 1.10 christos fput_command_name_styled (*c.alias_target, stream);
1570 1.9 christos gdb_printf (stream, " %s\n", c.default_args.c_str ());
1571 1.9 christos }
1572 1.10 christos
1573 1.10 christos /* Print the definition of CMD aliases not deprecated and having default args
1574 1.9 christos and not specifically documented by the user. */
1575 1.9 christos
1576 1.10 christos static void
1577 1.9 christos fput_aliases_definition_styled (const cmd_list_element &cmd,
1578 1.9 christos struct ui_file *stream)
1579 1.10 christos {
1580 1.10 christos for (const cmd_list_element &alias : cmd.aliases)
1581 1.10 christos if (!alias.cmd_deprecated
1582 1.10 christos && !user_documented_alias (alias)
1583 1.10 christos && !alias.default_args.empty ())
1584 1.9 christos fput_alias_definition_styled (alias, stream);
1585 1.9 christos }
1586 1.10 christos
1587 1.10 christos /* If C has one or more aliases, style print the name of C and the name of its
1588 1.9 christos aliases not documented specifically by the user, separated by commas.
1589 1.9 christos If ALWAYS_FPUT_C_NAME, print the name of C even if it has no aliases.
1590 1.9 christos If one or more names are printed, POSTFIX is printed after the last name.
1591 1.9 christos */
1592 1.9 christos
1593 1.10 christos static void
1594 1.9 christos fput_command_names_styled (const cmd_list_element &c,
1595 1.9 christos bool always_fput_c_name, const char *postfix,
1596 1.9 christos struct ui_file *stream)
1597 1.10 christos {
1598 1.10 christos /* First, check if we are going to print something. That is, either if
1599 1.10 christos ALWAYS_FPUT_C_NAME is true or if there exists at least one non-deprecated
1600 1.10 christos alias not documented specifically by the user. */
1601 1.10 christos
1602 1.10 christos auto print_alias = [] (const cmd_list_element &alias)
1603 1.10 christos {
1604 1.10 christos return !alias.cmd_deprecated && !user_documented_alias (alias);
1605 1.10 christos };
1606 1.10 christos
1607 1.10 christos bool print_something = always_fput_c_name;
1608 1.10 christos if (!print_something)
1609 1.10 christos for (const cmd_list_element &alias : c.aliases)
1610 1.10 christos {
1611 1.10 christos if (!print_alias (alias))
1612 1.10 christos continue;
1613 1.10 christos
1614 1.10 christos print_something = true;
1615 1.10 christos break;
1616 1.10 christos }
1617 1.10 christos
1618 1.9 christos if (print_something)
1619 1.10 christos fput_command_name_styled (c, stream);
1620 1.10 christos
1621 1.9 christos for (const cmd_list_element &alias : c.aliases)
1622 1.10 christos {
1623 1.10 christos if (!print_alias (alias))
1624 1.10 christos continue;
1625 1.10 christos
1626 1.10 christos gdb_puts (", ", stream);
1627 1.10 christos stream->wrap_here (3);
1628 1.9 christos fput_command_name_styled (alias, stream);
1629 1.10 christos }
1630 1.10 christos
1631 1.10 christos if (print_something)
1632 1.9 christos gdb_puts (postfix, stream);
1633 1.9 christos }
1634 1.9 christos
1635 1.9 christos /* If VERBOSE, print the full help for command C and highlight the
1636 1.9 christos documentation parts matching HIGHLIGHT,
1637 1.9 christos otherwise print only one-line help for command C. */
1638 1.9 christos
1639 1.11 christos static void
1640 1.11 christos print_doc_of_command (const cmd_list_element &c, bool verbose,
1641 1.9 christos compiled_regex &highlight, struct ui_file *stream)
1642 1.9 christos {
1643 1.9 christos /* When printing the full documentation, add a line to separate
1644 1.9 christos this documentation from the previous command help, in the likely
1645 1.9 christos case that apropos finds several commands. */
1646 1.10 christos if (verbose)
1647 1.9 christos gdb_puts ("\n", stream);
1648 1.9 christos
1649 1.9 christos fput_command_names_styled (c, true,
1650 1.9 christos verbose ? "" : " -- ", stream);
1651 1.9 christos if (verbose)
1652 1.10 christos {
1653 1.9 christos gdb_puts ("\n", stream);
1654 1.10 christos fput_aliases_definition_styled (c, stream);
1655 1.10 christos fputs_highlighted (c.doc, highlight, stream);
1656 1.9 christos gdb_puts ("\n", stream);
1657 1.9 christos }
1658 1.9 christos else
1659 1.10 christos {
1660 1.10 christos print_doc_line (stream, c.doc, false);
1661 1.9 christos gdb_puts ("\n", stream);
1662 1.9 christos fput_aliases_definition_styled (c, stream);
1663 1.9 christos }
1664 1.9 christos }
1665 1.1 christos
1666 1.1 christos /* Recursively walk the commandlist structures, and print out the
1667 1.1 christos documentation of commands that match our regex in either their
1668 1.9 christos name, or their documentation.
1669 1.9 christos If VERBOSE, prints the complete documentation and highlight the
1670 1.9 christos documentation parts matching REGEX, otherwise prints only
1671 1.1 christos the first line.
1672 1.9 christos */
1673 1.9 christos void
1674 1.1 christos apropos_cmd (struct ui_file *stream,
1675 1.11 christos struct cmd_list_element *commandlist,
1676 1.1 christos bool verbose, compiled_regex ®ex)
1677 1.1 christos {
1678 1.1 christos struct cmd_list_element *c;
1679 1.1 christos int returnvalue;
1680 1.1 christos
1681 1.1 christos /* Walk through the commands. */
1682 1.1 christos for (c=commandlist;c;c=c->next)
1683 1.10 christos {
1684 1.9 christos if (c->is_alias () && !user_documented_alias (*c))
1685 1.10 christos {
1686 1.10 christos /* Command aliases/abbreviations not specifically documented by the
1687 1.10 christos user are skipped to ensure we print the doc of a command only once,
1688 1.9 christos when encountering the aliased command. */
1689 1.9 christos continue;
1690 1.9 christos }
1691 1.1 christos
1692 1.1 christos returnvalue = -1; /* Needed to avoid double printing. */
1693 1.1 christos if (c->name != NULL)
1694 1.8 christos {
1695 1.8 christos size_t name_len = strlen (c->name);
1696 1.1 christos
1697 1.8 christos /* Try to match against the name. */
1698 1.1 christos returnvalue = regex.search (c->name, name_len, 0, name_len, NULL);
1699 1.11 christos if (returnvalue >= 0)
1700 1.9 christos print_doc_of_command (*c, verbose, regex, stream);
1701 1.9 christos
1702 1.10 christos /* Try to match against the name of the aliases. */
1703 1.1 christos for (const cmd_list_element &alias : c->aliases)
1704 1.10 christos {
1705 1.10 christos name_len = strlen (alias.name);
1706 1.9 christos returnvalue = regex.search (alias.name, name_len, 0, name_len, NULL);
1707 1.10 christos if (returnvalue >= 0)
1708 1.11 christos {
1709 1.10 christos print_doc_of_command (*c, verbose, regex, stream);
1710 1.10 christos break;
1711 1.1 christos }
1712 1.1 christos }
1713 1.1 christos }
1714 1.1 christos if (c->doc != NULL && returnvalue < 0)
1715 1.8 christos {
1716 1.8 christos size_t doc_len = strlen (c->doc);
1717 1.1 christos
1718 1.8 christos /* Try to match against documentation. */
1719 1.11 christos if (regex.search (c->doc, doc_len, 0, doc_len, NULL) >= 0)
1720 1.1 christos print_doc_of_command (*c, verbose, regex, stream);
1721 1.9 christos }
1722 1.10 christos /* Check if this command has subcommands. */
1723 1.1 christos if (c->is_prefix ())
1724 1.1 christos {
1725 1.1 christos /* Recursively call ourselves on the subcommand list,
1726 1.11 christos passing the right prefix in. */
1727 1.1 christos apropos_cmd (stream, *c->subcommands, verbose, regex);
1728 1.1 christos }
1729 1.1 christos }
1730 1.1 christos }
1731 1.1 christos
1732 1.1 christos /* This command really has to deal with two things:
1733 1.1 christos 1) I want documentation on *this string* (usually called by
1734 1.1 christos "help commandname").
1735 1.1 christos
1736 1.1 christos 2) I want documentation on *this list* (usually called by giving a
1737 1.1 christos command that requires subcommands. Also called by saying just
1738 1.1 christos "help".)
1739 1.9 christos
1740 1.1 christos I am going to split this into two separate commands, help_cmd and
1741 1.1 christos help_list. */
1742 1.1 christos
1743 1.3 christos void
1744 1.1 christos help_cmd (const char *command, struct ui_file *stream)
1745 1.9 christos {
1746 1.1 christos struct cmd_list_element *c, *alias, *prefix_cmd, *c_cmd;
1747 1.1 christos
1748 1.1 christos if (!command)
1749 1.1 christos {
1750 1.1 christos help_list (cmdlist, "", all_classes, stream);
1751 1.1 christos return;
1752 1.1 christos }
1753 1.1 christos
1754 1.1 christos if (strcmp (command, "all") == 0)
1755 1.1 christos {
1756 1.1 christos help_all (stream);
1757 1.1 christos return;
1758 1.1 christos }
1759 1.9 christos
1760 1.9 christos const char *orig_command = command;
1761 1.1 christos c = lookup_cmd (&command, cmdlist, "", NULL, 0, 0);
1762 1.1 christos
1763 1.1 christos if (c == 0)
1764 1.1 christos return;
1765 1.9 christos
1766 1.9 christos lookup_cmd_composition (orig_command, &alias, &prefix_cmd, &c_cmd);
1767 1.1 christos
1768 1.10 christos /* There are three cases here.
1769 1.1 christos If c->subcommands is nonzero, we have a prefix command.
1770 1.1 christos Print its documentation, then list its subcommands.
1771 1.1 christos
1772 1.1 christos If c->func is non NULL, we really have a command. Print its
1773 1.1 christos documentation and return.
1774 1.1 christos
1775 1.1 christos If c->func is NULL, we have a class name. Print its
1776 1.1 christos documentation (as if it were a command) and then set class to the
1777 1.1 christos number of this class so that the commands in the class will be
1778 1.1 christos listed. */
1779 1.10 christos
1780 1.10 christos if (alias == nullptr || !user_documented_alias (*alias))
1781 1.11 christos {
1782 1.10 christos /* Case of a normal command, or an alias not explicitly
1783 1.10 christos documented by the user. */
1784 1.10 christos /* If the user asked 'help somecommand' and there is no alias,
1785 1.10 christos the false indicates to not output the (single) command name. */
1786 1.10 christos fput_command_names_styled (*c, false, "\n", stream);
1787 1.10 christos fput_aliases_definition_styled (*c, stream);
1788 1.10 christos gdb_puts (c->doc, stream);
1789 1.10 christos }
1790 1.10 christos else
1791 1.11 christos {
1792 1.10 christos /* Case of an alias explicitly documented by the user.
1793 1.10 christos Only output the alias definition and its explicit documentation. */
1794 1.10 christos fput_alias_definition_styled (*alias, stream);
1795 1.10 christos fput_command_names_styled (*alias, false, "\n", stream);
1796 1.10 christos gdb_puts (alias->doc, stream);
1797 1.10 christos }
1798 1.1 christos gdb_puts ("\n", stream);
1799 1.10 christos
1800 1.1 christos if (!c->is_prefix () && !c->is_command_class_help ())
1801 1.10 christos return;
1802 1.10 christos
1803 1.1 christos gdb_printf (stream, "\n");
1804 1.1 christos
1805 1.10 christos /* If this is a prefix command, print it's subcommands. */
1806 1.10 christos if (c->is_prefix ())
1807 1.10 christos help_list (*c->subcommands, c->prefixname ().c_str (),
1808 1.1 christos all_commands, stream);
1809 1.1 christos
1810 1.10 christos /* If this is a class name, print all of the commands in the class. */
1811 1.5 christos if (c->is_command_class_help ())
1812 1.1 christos help_list (cmdlist, "", c->theclass, stream);
1813 1.1 christos
1814 1.10 christos if (c->hook_pre || c->hook_post)
1815 1.10 christos gdb_printf (stream,
1816 1.1 christos "\nThis command has a hook (or hooks) defined:\n");
1817 1.1 christos
1818 1.10 christos if (c->hook_pre)
1819 1.10 christos gdb_printf (stream,
1820 1.10 christos "\tThis command is run after : %s (pre hook)\n",
1821 1.1 christos c->hook_pre->name);
1822 1.10 christos if (c->hook_post)
1823 1.10 christos gdb_printf (stream,
1824 1.10 christos "\tThis command is run before : %s (post hook)\n",
1825 1.1 christos c->hook_post->name);
1826 1.1 christos }
1827 1.1 christos
1828 1.1 christos /*
1829 1.1 christos * Get a specific kind of help on a command list.
1830 1.1 christos *
1831 1.1 christos * LIST is the list.
1832 1.11 christos * CMDTYPE is the prefix to use in the title string.
1833 1.1 christos * THECLASS is the class with which to list the nodes of this list (see
1834 1.1 christos * documentation for help_cmd_list below), As usual, ALL_COMMANDS for
1835 1.1 christos * everything, ALL_CLASSES for just classes, and non-negative for only things
1836 1.1 christos * in a specific class.
1837 1.1 christos * and STREAM is the output stream on which to print things.
1838 1.1 christos * If you call this routine with a class >= 0, it recurses.
1839 1.1 christos */
1840 1.3 christos void
1841 1.5 christos help_list (struct cmd_list_element *list, const char *cmdtype,
1842 1.1 christos enum command_class theclass, struct ui_file *stream)
1843 1.1 christos {
1844 1.1 christos int len;
1845 1.1 christos char *cmdtype1, *cmdtype2;
1846 1.1 christos
1847 1.1 christos /* If CMDTYPE is "foo ", CMDTYPE1 gets " foo" and CMDTYPE2 gets "foo sub".
1848 1.1 christos */
1849 1.1 christos len = strlen (cmdtype);
1850 1.1 christos cmdtype1 = (char *) alloca (len + 1);
1851 1.1 christos cmdtype1[0] = 0;
1852 1.1 christos cmdtype2 = (char *) alloca (len + 4);
1853 1.1 christos cmdtype2[0] = 0;
1854 1.1 christos if (len)
1855 1.1 christos {
1856 1.8 christos cmdtype1[0] = ' ';
1857 1.1 christos memcpy (cmdtype1 + 1, cmdtype, len - 1);
1858 1.8 christos cmdtype1[len] = 0;
1859 1.1 christos memcpy (cmdtype2, cmdtype, len - 1);
1860 1.1 christos strcpy (cmdtype2 + len - 1, " sub");
1861 1.1 christos }
1862 1.5 christos
1863 1.10 christos if (theclass == all_classes)
1864 1.1 christos gdb_printf (stream, "List of classes of %scommands:\n\n", cmdtype2);
1865 1.10 christos else
1866 1.1 christos gdb_printf (stream, "List of %scommands:\n\n", cmdtype2);
1867 1.9 christos
1868 1.1 christos help_cmd_list (list, theclass, theclass >= 0, stream);
1869 1.5 christos
1870 1.1 christos if (theclass == all_classes)
1871 1.10 christos {
1872 1.1 christos gdb_printf (stream, "\n\
1873 1.10 christos Type \"help%s\" followed by a class name for a list of commands in ",
1874 1.10 christos cmdtype1);
1875 1.10 christos stream->wrap_here (0);
1876 1.1 christos gdb_printf (stream, "that class.");
1877 1.10 christos
1878 1.1 christos gdb_printf (stream, "\n\
1879 1.1 christos Type \"help all\" for the list of all commands.");
1880 1.1 christos }
1881 1.10 christos
1882 1.10 christos gdb_printf (stream, "\nType \"help%s\" followed by %scommand name ",
1883 1.10 christos cmdtype1, cmdtype2);
1884 1.10 christos stream->wrap_here (0);
1885 1.10 christos gdb_puts ("for ", stream);
1886 1.10 christos stream->wrap_here (0);
1887 1.10 christos gdb_puts ("full ", stream);
1888 1.10 christos stream->wrap_here (0);
1889 1.10 christos gdb_puts ("documentation.\n", stream);
1890 1.10 christos gdb_puts ("Type \"apropos word\" to search "
1891 1.10 christos "for commands related to \"word\".\n", stream);
1892 1.10 christos gdb_puts ("Type \"apropos -v word\" for full documentation", stream);
1893 1.10 christos stream->wrap_here (0);
1894 1.10 christos gdb_puts (" of commands related to \"word\".\n", stream);
1895 1.10 christos gdb_puts ("Command name abbreviations are allowed if unambiguous.\n",
1896 1.1 christos stream);
1897 1.1 christos }
1898 1.1 christos
1899 1.1 christos static void
1900 1.1 christos help_all (struct ui_file *stream)
1901 1.1 christos {
1902 1.1 christos struct cmd_list_element *c;
1903 1.1 christos int seen_unclassified = 0;
1904 1.1 christos
1905 1.1 christos for (c = cmdlist; c; c = c->next)
1906 1.1 christos {
1907 1.10 christos if (c->abbrev_flag)
1908 1.1 christos continue;
1909 1.1 christos /* If this is a class name, print all of the commands in the
1910 1.1 christos class. */
1911 1.10 christos
1912 1.1 christos if (c->is_command_class_help ())
1913 1.10 christos {
1914 1.9 christos gdb_printf (stream, "\nCommand class: %s\n\n", c->name);
1915 1.1 christos help_cmd_list (cmdlist, c->theclass, true, stream);
1916 1.1 christos }
1917 1.1 christos }
1918 1.1 christos
1919 1.1 christos /* While it's expected that all commands are in some class,
1920 1.1 christos as a safety measure, we'll print commands outside of any
1921 1.1 christos class at the end. */
1922 1.1 christos
1923 1.1 christos for (c = cmdlist; c; c = c->next)
1924 1.1 christos {
1925 1.10 christos if (c->abbrev_flag)
1926 1.1 christos continue;
1927 1.5 christos
1928 1.1 christos if (c->theclass == no_class)
1929 1.1 christos {
1930 1.1 christos if (!seen_unclassified)
1931 1.10 christos {
1932 1.1 christos gdb_printf (stream, "\nUnclassified commands\n\n");
1933 1.1 christos seen_unclassified = 1;
1934 1.10 christos }
1935 1.1 christos print_help_for_command (*c, true, stream);
1936 1.1 christos }
1937 1.1 christos }
1938 1.1 christos
1939 1.1 christos }
1940 1.9 christos
1941 1.9 christos /* See cli-decode.h. */
1942 1.1 christos
1943 1.9 christos void
1944 1.9 christos print_doc_line (struct ui_file *stream, const char *str,
1945 1.1 christos bool for_value_prefix)
1946 1.1 christos {
1947 1.1 christos static char *line_buffer = 0;
1948 1.3 christos static int line_size;
1949 1.1 christos const char *p;
1950 1.1 christos
1951 1.1 christos if (!line_buffer)
1952 1.1 christos {
1953 1.1 christos line_size = 80;
1954 1.1 christos line_buffer = (char *) xmalloc (line_size);
1955 1.1 christos }
1956 1.9 christos
1957 1.1 christos /* Searches for the first end of line or the end of STR. */
1958 1.9 christos p = str;
1959 1.1 christos while (*p && *p != '\n')
1960 1.1 christos p++;
1961 1.1 christos if (p - str > line_size - 1)
1962 1.1 christos {
1963 1.1 christos line_size = p - str + 1;
1964 1.1 christos xfree (line_buffer);
1965 1.1 christos line_buffer = (char *) xmalloc (line_size);
1966 1.1 christos }
1967 1.9 christos strncpy (line_buffer, str, p - str);
1968 1.9 christos if (for_value_prefix)
1969 1.9 christos {
1970 1.9 christos if (islower (line_buffer[0]))
1971 1.9 christos line_buffer[0] = toupper (line_buffer[0]);
1972 1.9 christos gdb_assert (p > str);
1973 1.9 christos if (line_buffer[p - str - 1] == '.')
1974 1.9 christos line_buffer[p - str - 1] = '\0';
1975 1.9 christos else
1976 1.9 christos line_buffer[p - str] = '\0';
1977 1.9 christos }
1978 1.9 christos else
1979 1.10 christos line_buffer[p - str] = '\0';
1980 1.1 christos gdb_puts (line_buffer, stream);
1981 1.1 christos }
1982 1.1 christos
1983 1.1 christos /* Print one-line help for command C.
1984 1.1 christos If RECURSE is non-zero, also print one-line descriptions
1985 1.1 christos of all prefixed subcommands. */
1986 1.10 christos static void
1987 1.9 christos print_help_for_command (const cmd_list_element &c,
1988 1.1 christos bool recurse, struct ui_file *stream)
1989 1.9 christos {
1990 1.10 christos fput_command_names_styled (c, true, " -- ", stream);
1991 1.10 christos print_doc_line (stream, c.doc, false);
1992 1.10 christos gdb_puts ("\n", stream);
1993 1.9 christos if (!c.default_args.empty ())
1994 1.9 christos fput_alias_definition_styled (c, stream);
1995 1.9 christos fput_aliases_definition_styled (c, stream);
1996 1.1 christos
1997 1.10 christos if (recurse
1998 1.10 christos && c.is_prefix ()
1999 1.1 christos && c.abbrev_flag == 0)
2000 1.1 christos /* Subcommands of a prefix command typically have 'all_commands'
2001 1.1 christos as class. If we pass CLASS to recursive invocation,
2002 1.10 christos most often we won't see anything. */
2003 1.1 christos help_cmd_list (*c.subcommands, all_commands, true, stream);
2004 1.1 christos }
2005 1.1 christos
2006 1.1 christos /*
2007 1.1 christos * Implement a help command on command list LIST.
2008 1.1 christos * RECURSE should be non-zero if this should be done recursively on
2009 1.1 christos * all sublists of LIST.
2010 1.6 christos * STREAM is the stream upon which the output should be written.
2011 1.1 christos * THECLASS should be:
2012 1.1 christos * A non-negative class number to list only commands in that
2013 1.1 christos * ALL_COMMANDS to list all commands in list.
2014 1.1 christos * ALL_CLASSES to list all classes in list.
2015 1.9 christos *
2016 1.9 christos * Note that aliases are only shown when THECLASS is class_alias.
2017 1.9 christos * In the other cases, the aliases will be shown together with their
2018 1.9 christos * aliased command.
2019 1.1 christos *
2020 1.1 christos * Note that RECURSE will be active on *all* sublists, not just the
2021 1.1 christos * ones selected by the criteria above (ie. the selection mechanism
2022 1.1 christos * is at the low level, not the high-level).
2023 1.9 christos */
2024 1.9 christos
2025 1.5 christos static void
2026 1.9 christos help_cmd_list (struct cmd_list_element *list, enum command_class theclass,
2027 1.1 christos bool recurse, struct ui_file *stream)
2028 1.1 christos {
2029 1.1 christos struct cmd_list_element *c;
2030 1.1 christos
2031 1.6 christos for (c = list; c; c = c->next)
2032 1.9 christos {
2033 1.9 christos if (c->abbrev_flag == 1 || c->cmd_deprecated)
2034 1.9 christos {
2035 1.9 christos /* Do not show abbreviations or deprecated commands. */
2036 1.9 christos continue;
2037 1.9 christos }
2038 1.10 christos
2039 1.9 christos if (c->is_alias () && theclass != class_alias)
2040 1.9 christos {
2041 1.9 christos /* Do not show an alias, unless specifically showing the
2042 1.9 christos list of aliases: for all other classes, an alias is
2043 1.9 christos shown (if needed) together with its aliased command. */
2044 1.9 christos continue;
2045 1.9 christos }
2046 1.9 christos
2047 1.10 christos if (theclass == all_commands
2048 1.10 christos || (theclass == all_classes && c->is_command_class_help ())
2049 1.9 christos || (theclass == c->theclass && !c->is_command_class_help ()))
2050 1.9 christos {
2051 1.10 christos /* show C when
2052 1.9 christos - showing all commands
2053 1.9 christos - showing all classes and C is a help class
2054 1.9 christos - showing commands of THECLASS and C is not the help class */
2055 1.9 christos
2056 1.9 christos /* If we show the class_alias and C is an alias, do not recurse,
2057 1.9 christos as this would show the (possibly very long) not very useful
2058 1.9 christos list of sub-commands of the aliased command. */
2059 1.10 christos print_help_for_command
2060 1.10 christos (*c,
2061 1.9 christos recurse && (theclass != class_alias || !c->is_alias ()),
2062 1.9 christos stream);
2063 1.9 christos continue;
2064 1.9 christos }
2065 1.9 christos
2066 1.9 christos if (recurse
2067 1.10 christos && (theclass == class_user || theclass == class_alias)
2068 1.9 christos && c->is_prefix ())
2069 1.9 christos {
2070 1.10 christos /* User-defined commands or aliases may be subcommands. */
2071 1.9 christos help_cmd_list (*c->subcommands, theclass, recurse, stream);
2072 1.9 christos continue;
2073 1.9 christos }
2074 1.9 christos
2075 1.9 christos /* Do not show C or recurse on C, e.g. because C does not belong to
2076 1.1 christos THECLASS or because C is a help class. */
2077 1.1 christos }
2078 1.1 christos }
2079 1.1 christos
2080 1.1 christos
2082 1.1 christos /* Search the input clist for 'command'. Return the command if
2083 1.1 christos found (or NULL if not), and return the number of commands
2084 1.1 christos found in nfound. */
2085 1.1 christos
2086 1.1 christos static struct cmd_list_element *
2087 1.1 christos find_cmd (const char *command, int len, struct cmd_list_element *clist,
2088 1.1 christos int ignore_help_classes, int *nfound)
2089 1.1 christos {
2090 1.6 christos struct cmd_list_element *found, *c;
2091 1.1 christos
2092 1.1 christos found = NULL;
2093 1.1 christos *nfound = 0;
2094 1.10 christos for (c = clist; c; c = c->next)
2095 1.1 christos if (!strncmp (command, c->name, len)
2096 1.1 christos && (!ignore_help_classes || !c->is_command_class_help ()))
2097 1.1 christos {
2098 1.1 christos found = c;
2099 1.1 christos (*nfound)++;
2100 1.1 christos if (c->name[len] == '\0')
2101 1.1 christos {
2102 1.1 christos *nfound = 1;
2103 1.1 christos break;
2104 1.1 christos }
2105 1.1 christos }
2106 1.1 christos return found;
2107 1.7 christos }
2108 1.7 christos
2109 1.7 christos /* Return the length of command name in TEXT. */
2110 1.1 christos
2111 1.1 christos int
2112 1.1 christos find_command_name_length (const char *text)
2113 1.1 christos {
2114 1.1 christos const char *p = text;
2115 1.1 christos
2116 1.1 christos /* Treating underscores as part of command words is important
2117 1.1 christos so that "set args_foo()" doesn't get interpreted as
2118 1.1 christos "set args _foo()". */
2119 1.1 christos /* Some characters are only used for TUI specific commands.
2120 1.1 christos However, they are always allowed for the sake of consistency.
2121 1.1 christos
2122 1.1 christos Note that this is larger than the character set allowed when
2123 1.9 christos creating user-defined commands. */
2124 1.1 christos
2125 1.9 christos /* Recognize the single character commands so that, e.g., "!ls"
2126 1.1 christos works as expected. */
2127 1.1 christos if (*p == '!' || *p == '|')
2128 1.9 christos return 1;
2129 1.1 christos
2130 1.5 christos while (valid_cmd_char_p (*p)
2131 1.1 christos /* Characters used by TUI specific commands. */
2132 1.1 christos || *p == '+' || *p == '<' || *p == '>' || *p == '$')
2133 1.1 christos p++;
2134 1.1 christos
2135 1.1 christos return p - text;
2136 1.9 christos }
2137 1.9 christos
2138 1.9 christos /* See command.h. */
2139 1.9 christos
2140 1.9 christos bool
2141 1.9 christos valid_cmd_char_p (int c)
2142 1.9 christos {
2143 1.1 christos /* Alas "42" is a legitimate user-defined command.
2144 1.9 christos In the interests of not breaking anything we preserve that. */
2145 1.9 christos
2146 1.9 christos return isalnum (c) || c == '-' || c == '_' || c == '.';
2147 1.9 christos }
2148 1.9 christos
2149 1.9 christos /* See command.h. */
2150 1.1 christos
2151 1.1 christos bool
2152 1.1 christos valid_user_defined_cmd_name_p (const char *name)
2153 1.1 christos {
2154 1.1 christos const char *p;
2155 1.9 christos
2156 1.1 christos if (*name == '\0')
2157 1.1 christos return false;
2158 1.1 christos
2159 1.9 christos for (p = name; *p != '\0'; ++p)
2160 1.1 christos {
2161 1.1 christos if (valid_cmd_char_p (*p))
2162 1.9 christos ; /* Ok. */
2163 1.1 christos else
2164 1.1 christos return false;
2165 1.9 christos }
2166 1.1 christos
2167 1.1 christos return true;
2168 1.10 christos }
2169 1.1 christos
2170 1.1 christos /* See command.h. */
2171 1.1 christos
2172 1.9 christos struct cmd_list_element *
2173 1.10 christos lookup_cmd_1 (const char **text, struct cmd_list_element *clist,
2174 1.1 christos struct cmd_list_element **result_list, std::string *default_args,
2175 1.1 christos int ignore_help_classes, bool lookup_for_completion_p)
2176 1.8 christos {
2177 1.1 christos char *command;
2178 1.9 christos int len, nfound;
2179 1.1 christos struct cmd_list_element *found, *c;
2180 1.1 christos bool found_alias = false;
2181 1.1 christos const char *line = *text;
2182 1.1 christos
2183 1.1 christos while (**text == ' ' || **text == '\t')
2184 1.1 christos (*text)++;
2185 1.1 christos
2186 1.1 christos /* Identify the name of the command. */
2187 1.1 christos len = find_command_name_length (*text);
2188 1.1 christos
2189 1.1 christos /* If nothing but whitespace, return 0. */
2190 1.1 christos if (len == 0)
2191 1.1 christos return 0;
2192 1.1 christos
2193 1.1 christos /* *text and p now bracket the first command word to lookup (and
2194 1.1 christos it's length is len). We copy this into a local temporary. */
2195 1.1 christos
2196 1.1 christos
2197 1.1 christos command = (char *) alloca (len + 1);
2198 1.1 christos memcpy (command, *text, len);
2199 1.1 christos command[len] = '\0';
2200 1.1 christos
2201 1.1 christos /* Look it up. */
2202 1.1 christos found = 0;
2203 1.1 christos nfound = 0;
2204 1.1 christos found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
2205 1.1 christos
2206 1.1 christos /* If nothing matches, we have a simple failure. */
2207 1.1 christos if (nfound == 0)
2208 1.1 christos return 0;
2209 1.1 christos
2210 1.9 christos if (nfound > 1)
2211 1.1 christos {
2212 1.1 christos if (result_list != nullptr)
2213 1.1 christos /* Will be modified in calling routine
2214 1.9 christos if we know what the prefix command is. */
2215 1.9 christos *result_list = 0;
2216 1.1 christos if (default_args != nullptr)
2217 1.1 christos *default_args = std::string ();
2218 1.1 christos return CMD_LIST_AMBIGUOUS; /* Ambiguous. */
2219 1.1 christos }
2220 1.1 christos
2221 1.1 christos /* We've matched something on this list. Move text pointer forward. */
2222 1.1 christos
2223 1.10 christos *text += len;
2224 1.1 christos
2225 1.1 christos if (found->is_alias ())
2226 1.1 christos {
2227 1.1 christos /* We drop the alias (abbreviation) in favor of the command it
2228 1.1 christos is pointing to. If the alias is deprecated, though, we need to
2229 1.1 christos warn the user about it before we drop it. Note that while we
2230 1.1 christos are warning about the alias, we may also warn about the command
2231 1.9 christos itself and we will adjust the appropriate DEPRECATED_WARN_USER
2232 1.10 christos flags. */
2233 1.10 christos
2234 1.10 christos if (found->deprecated_warn_user && !lookup_for_completion_p)
2235 1.9 christos deprecated_cmd_warning (line, clist);
2236 1.9 christos
2237 1.9 christos
2238 1.9 christos /* Return the default_args of the alias, not the default_args
2239 1.9 christos of the command it is pointing to. */
2240 1.10 christos if (default_args != nullptr)
2241 1.9 christos *default_args = found->default_args;
2242 1.1 christos found = found->alias_target;
2243 1.1 christos found_alias = true;
2244 1.1 christos }
2245 1.10 christos /* If we found a prefix command, keep looking. */
2246 1.1 christos
2247 1.10 christos if (found->is_prefix ())
2248 1.10 christos {
2249 1.1 christos c = lookup_cmd_1 (text, *found->subcommands, result_list, default_args,
2250 1.1 christos ignore_help_classes, lookup_for_completion_p);
2251 1.1 christos if (!c)
2252 1.9 christos {
2253 1.1 christos /* Didn't find anything; this is as far as we got. */
2254 1.9 christos if (result_list != nullptr)
2255 1.9 christos *result_list = clist;
2256 1.1 christos if (!found_alias && default_args != nullptr)
2257 1.1 christos *default_args = found->default_args;
2258 1.1 christos return found;
2259 1.1 christos }
2260 1.1 christos else if (c == CMD_LIST_AMBIGUOUS)
2261 1.1 christos {
2262 1.1 christos /* We've gotten this far properly, but the next step is
2263 1.9 christos ambiguous. We need to set the result list to the best
2264 1.1 christos we've found (if an inferior hasn't already set it). */
2265 1.10 christos if (result_list != nullptr)
2266 1.10 christos if (!*result_list)
2267 1.10 christos /* This used to say *result_list = *found->subcommands.
2268 1.10 christos If that was correct, need to modify the documentation
2269 1.1 christos at the top of this function to clarify what is
2270 1.9 christos supposed to be going on. */
2271 1.9 christos *result_list = found;
2272 1.9 christos /* For ambiguous commands, do not return any default_args args. */
2273 1.1 christos if (default_args != nullptr)
2274 1.1 christos *default_args = std::string ();
2275 1.1 christos return c;
2276 1.1 christos }
2277 1.1 christos else
2278 1.1 christos {
2279 1.1 christos /* We matched! */
2280 1.1 christos return c;
2281 1.1 christos }
2282 1.1 christos }
2283 1.9 christos else
2284 1.1 christos {
2285 1.9 christos if (result_list != nullptr)
2286 1.9 christos *result_list = clist;
2287 1.1 christos if (!found_alias && default_args != nullptr)
2288 1.1 christos *default_args = found->default_args;
2289 1.1 christos return found;
2290 1.1 christos }
2291 1.1 christos }
2292 1.1 christos
2293 1.1 christos /* All this hair to move the space to the front of cmdtype */
2294 1.1 christos
2295 1.1 christos static void
2296 1.1 christos undef_cmd_error (const char *cmdtype, const char *q)
2297 1.1 christos {
2298 1.1 christos error (_("Undefined %scommand: \"%s\". Try \"help%s%.*s\"."),
2299 1.1 christos cmdtype,
2300 1.1 christos q,
2301 1.1 christos *cmdtype ? " " : "",
2302 1.1 christos (int) strlen (cmdtype) - 1,
2303 1.1 christos cmdtype);
2304 1.1 christos }
2305 1.1 christos
2306 1.9 christos /* Look up the contents of *LINE as a command in the command list LIST.
2307 1.9 christos LIST is a chain of struct cmd_list_element's.
2308 1.9 christos If it is found, return the struct cmd_list_element for that command,
2309 1.9 christos update *LINE to point after the command name, at the first argument
2310 1.9 christos and update *DEFAULT_ARGS (if DEFAULT_ARGS is not null) to the default
2311 1.9 christos args to prepend to the user provided args when running the command.
2312 1.9 christos Note that if the found cmd_list_element is found via an alias,
2313 1.1 christos the default args of the alias are returned.
2314 1.1 christos
2315 1.1 christos If not found, call error if ALLOW_UNKNOWN is zero
2316 1.1 christos otherwise (or if error returns) return zero.
2317 1.1 christos Call error if specified command is ambiguous,
2318 1.1 christos unless ALLOW_UNKNOWN is negative.
2319 1.9 christos CMDTYPE precedes the word "command" in the error message.
2320 1.1 christos
2321 1.1 christos If IGNORE_HELP_CLASSES is nonzero, ignore any command list
2322 1.1 christos elements which are actually help classes rather than commands (i.e.
2323 1.1 christos the function field of the struct cmd_list_element is 0). */
2324 1.7 christos
2325 1.7 christos struct cmd_list_element *
2326 1.9 christos lookup_cmd (const char **line, struct cmd_list_element *list,
2327 1.1 christos const char *cmdtype,
2328 1.1 christos std::string *default_args,
2329 1.1 christos int allow_unknown, int ignore_help_classes)
2330 1.1 christos {
2331 1.1 christos struct cmd_list_element *last_list = 0;
2332 1.1 christos struct cmd_list_element *c;
2333 1.1 christos
2334 1.1 christos /* Note: Do not remove trailing whitespace here because this
2335 1.1 christos would be wrong for complete_command. Jim Kingdon */
2336 1.1 christos
2337 1.1 christos if (!*line)
2338 1.9 christos error (_("Lack of needed %scommand"), cmdtype);
2339 1.1 christos
2340 1.1 christos c = lookup_cmd_1 (line, list, &last_list, default_args, ignore_help_classes);
2341 1.1 christos
2342 1.1 christos if (!c)
2343 1.1 christos {
2344 1.1 christos if (!allow_unknown)
2345 1.1 christos {
2346 1.1 christos char *q;
2347 1.1 christos int len = find_command_name_length (*line);
2348 1.1 christos
2349 1.1 christos q = (char *) alloca (len + 1);
2350 1.1 christos strncpy (q, *line, len);
2351 1.1 christos q[len] = '\0';
2352 1.1 christos undef_cmd_error (cmdtype, q);
2353 1.1 christos }
2354 1.1 christos else
2355 1.1 christos return 0;
2356 1.1 christos }
2357 1.10 christos else if (c == CMD_LIST_AMBIGUOUS)
2358 1.10 christos {
2359 1.1 christos /* Ambigous. Local values should be off subcommands or called
2360 1.1 christos values. */
2361 1.10 christos int local_allow_unknown = (last_list ? last_list->allow_unknown :
2362 1.10 christos allow_unknown);
2363 1.1 christos std::string local_cmdtype
2364 1.10 christos = last_list ? last_list->prefixname () : cmdtype;
2365 1.1 christos struct cmd_list_element *local_list =
2366 1.1 christos (last_list ? *(last_list->subcommands) : list);
2367 1.1 christos
2368 1.1 christos if (local_allow_unknown < 0)
2369 1.1 christos {
2370 1.1 christos if (last_list)
2371 1.1 christos return last_list; /* Found something. */
2372 1.1 christos else
2373 1.1 christos return 0; /* Found nothing. */
2374 1.1 christos }
2375 1.1 christos else
2376 1.1 christos {
2377 1.1 christos /* Report as error. */
2378 1.1 christos int amb_len;
2379 1.1 christos char ambbuf[100];
2380 1.1 christos
2381 1.1 christos for (amb_len = 0;
2382 1.1 christos ((*line)[amb_len] && (*line)[amb_len] != ' '
2383 1.1 christos && (*line)[amb_len] != '\t');
2384 1.1 christos amb_len++)
2385 1.1 christos ;
2386 1.1 christos
2387 1.1 christos ambbuf[0] = 0;
2388 1.1 christos for (c = local_list; c; c = c->next)
2389 1.1 christos if (!strncmp (*line, c->name, amb_len))
2390 1.1 christos {
2391 1.1 christos if (strlen (ambbuf) + strlen (c->name) + 6
2392 1.1 christos < (int) sizeof ambbuf)
2393 1.1 christos {
2394 1.1 christos if (strlen (ambbuf))
2395 1.1 christos strcat (ambbuf, ", ");
2396 1.1 christos strcat (ambbuf, c->name);
2397 1.1 christos }
2398 1.1 christos else
2399 1.1 christos {
2400 1.1 christos strcat (ambbuf, "..");
2401 1.1 christos break;
2402 1.10 christos }
2403 1.10 christos }
2404 1.1 christos error (_("Ambiguous %scommand \"%s\": %s."),
2405 1.1 christos local_cmdtype.c_str (), *line, ambbuf);
2406 1.1 christos }
2407 1.1 christos }
2408 1.1 christos else
2409 1.10 christos {
2410 1.1 christos if (c->type == set_cmd && **line != '\0' && !isspace (**line))
2411 1.1 christos error (_("Argument must be preceded by space."));
2412 1.10 christos
2413 1.1 christos /* We've got something. It may still not be what the caller
2414 1.1 christos wants (if this command *needs* a subcommand). */
2415 1.1 christos while (**line == ' ' || **line == '\t')
2416 1.10 christos (*line)++;
2417 1.10 christos
2418 1.1 christos if (c->is_prefix () && **line && !c->allow_unknown)
2419 1.1 christos undef_cmd_error (c->prefixname ().c_str (), *line);
2420 1.1 christos
2421 1.1 christos /* Seems to be what he wants. Return it. */
2422 1.1 christos return c;
2423 1.1 christos }
2424 1.1 christos return 0;
2425 1.10 christos }
2426 1.10 christos
2427 1.10 christos /* See command.h. */
2428 1.10 christos
2429 1.10 christos struct cmd_list_element *
2430 1.10 christos lookup_cmd_exact (const char *name,
2431 1.10 christos struct cmd_list_element *list,
2432 1.10 christos bool ignore_help_classes)
2433 1.10 christos {
2434 1.10 christos const char *tem = name;
2435 1.10 christos struct cmd_list_element *cmd = lookup_cmd (&tem, list, "", NULL, -1,
2436 1.10 christos ignore_help_classes);
2437 1.10 christos if (cmd != nullptr && strcmp (name, cmd->name) != 0)
2438 1.10 christos cmd = nullptr;
2439 1.10 christos return cmd;
2440 1.1 christos }
2441 1.1 christos
2442 1.1 christos /* We are here presumably because an alias or command in TEXT is
2443 1.1 christos deprecated and a warning message should be generated. This
2444 1.1 christos function decodes TEXT and potentially generates a warning message
2445 1.1 christos as outlined below.
2446 1.1 christos
2447 1.1 christos Example for 'set endian big' which has a fictitious alias 'seb'.
2448 1.1 christos
2449 1.1 christos If alias wasn't used in TEXT, and the command is deprecated:
2450 1.1 christos "warning: 'set endian big' is deprecated."
2451 1.1 christos
2452 1.1 christos If alias was used, and only the alias is deprecated:
2453 1.1 christos "warning: 'seb' an alias for the command 'set endian big' is deprecated."
2454 1.1 christos
2455 1.1 christos If alias was used and command is deprecated (regardless of whether
2456 1.1 christos the alias itself is deprecated:
2457 1.1 christos
2458 1.1 christos "warning: 'set endian big' (seb) is deprecated."
2459 1.1 christos
2460 1.1 christos After the message has been sent, clear the appropriate flags in the
2461 1.1 christos command and/or the alias so the user is no longer bothered.
2462 1.1 christos
2463 1.10 christos */
2464 1.1 christos void
2465 1.10 christos deprecated_cmd_warning (const char *text, struct cmd_list_element *list)
2466 1.10 christos {
2467 1.1 christos struct cmd_list_element *alias = nullptr;
2468 1.10 christos struct cmd_list_element *cmd = nullptr;
2469 1.10 christos
2470 1.10 christos /* Return if text doesn't evaluate to a command. We place this lookup
2471 1.10 christos within its own scope so that the PREFIX_CMD local is not visible
2472 1.10 christos later in this function. The value returned in PREFIX_CMD is based on
2473 1.10 christos the prefix found in TEXT, and is our case this prefix can be missing
2474 1.10 christos in some situations (when LIST is not the global CMDLIST).
2475 1.10 christos
2476 1.10 christos It is better for our purposes to use the prefix commands directly from
2477 1.10 christos the ALIAS and CMD results. */
2478 1.10 christos {
2479 1.10 christos struct cmd_list_element *prefix_cmd = nullptr;
2480 1.10 christos if (!lookup_cmd_composition_1 (text, &alias, &prefix_cmd, &cmd, list))
2481 1.1 christos return;
2482 1.10 christos }
2483 1.10 christos
2484 1.10 christos /* Return if nothing is deprecated. */
2485 1.1 christos if (!((alias != nullptr ? alias->deprecated_warn_user : 0)
2486 1.1 christos || cmd->deprecated_warn_user))
2487 1.10 christos return;
2488 1.10 christos
2489 1.10 christos /* Join command prefix (if any) and the command name. */
2490 1.10 christos std::string tmp_cmd_str;
2491 1.10 christos if (cmd->prefix != nullptr)
2492 1.10 christos tmp_cmd_str += cmd->prefix->prefixname ();
2493 1.10 christos tmp_cmd_str += std::string (cmd->name);
2494 1.10 christos
2495 1.10 christos /* Display the appropriate first line, this warns that the thing the user
2496 1.10 christos entered is deprecated. */
2497 1.10 christos if (alias != nullptr)
2498 1.10 christos {
2499 1.10 christos /* Join the alias prefix (if any) and the alias name. */
2500 1.10 christos std::string tmp_alias_str;
2501 1.10 christos if (alias->prefix != nullptr)
2502 1.10 christos tmp_alias_str += alias->prefix->prefixname ();
2503 1.10 christos tmp_alias_str += std::string (alias->name);
2504 1.10 christos
2505 1.10 christos if (cmd->cmd_deprecated)
2506 1.10 christos gdb_printf (_("Warning: command '%ps' (%ps) is deprecated.\n"),
2507 1.10 christos styled_string (title_style.style (),
2508 1.10 christos tmp_cmd_str.c_str ()),
2509 1.10 christos styled_string (title_style.style (),
2510 1.10 christos tmp_alias_str.c_str ()));
2511 1.10 christos else
2512 1.10 christos gdb_printf (_("Warning: '%ps', an alias for the command '%ps', "
2513 1.10 christos "is deprecated.\n"),
2514 1.10 christos styled_string (title_style.style (),
2515 1.10 christos tmp_alias_str.c_str ()),
2516 1.10 christos styled_string (title_style.style (),
2517 1.10 christos tmp_cmd_str.c_str ()));
2518 1.10 christos }
2519 1.10 christos else
2520 1.10 christos gdb_printf (_("Warning: command '%ps' is deprecated.\n"),
2521 1.10 christos styled_string (title_style.style (),
2522 1.10 christos tmp_cmd_str.c_str ()));
2523 1.10 christos
2524 1.10 christos /* Now display a second line indicating what the user should use instead.
2525 1.10 christos If it is only the alias that is deprecated, we want to indicate the
2526 1.10 christos new alias, otherwise we'll indicate the new command. */
2527 1.10 christos const char *replacement;
2528 1.1 christos if (alias != nullptr && !cmd->cmd_deprecated)
2529 1.10 christos replacement = alias->replacement;
2530 1.10 christos else
2531 1.10 christos replacement = cmd->replacement;
2532 1.10 christos if (replacement != nullptr)
2533 1.10 christos gdb_printf (_("Use '%ps'.\n\n"),
2534 1.1 christos styled_string (title_style.style (),
2535 1.10 christos replacement));
2536 1.1 christos else
2537 1.1 christos gdb_printf (_("No alternative known.\n\n"));
2538 1.10 christos
2539 1.3 christos /* We've warned you, now we'll keep quiet. */
2540 1.3 christos if (alias != nullptr)
2541 1.1 christos alias->deprecated_warn_user = 0;
2542 1.1 christos cmd->deprecated_warn_user = 0;
2543 1.10 christos }
2544 1.1 christos
2545 1.9 christos /* Look up the contents of TEXT as a command in the command list CUR_LIST.
2546 1.9 christos Return 1 on success, 0 on failure.
2547 1.9 christos
2548 1.9 christos If TEXT refers to an alias, *ALIAS will point to that alias.
2549 1.9 christos
2550 1.9 christos If TEXT is a subcommand (i.e. one that is preceded by a prefix
2551 1.11 christos command) set *PREFIX_CMD.
2552 1.11 christos
2553 1.9 christos Set *CMD to point to the command TEXT indicates, or to
2554 1.9 christos CMD_LIST_AMBIGUOUS if there are multiple possible matches.
2555 1.1 christos
2556 1.9 christos If any of *ALIAS, *PREFIX_CMD, or *CMD cannot be determined or do not
2557 1.1 christos exist, they are NULL when we return.
2558 1.1 christos
2559 1.10 christos */
2560 1.10 christos
2561 1.10 christos static int
2562 1.10 christos lookup_cmd_composition_1 (const char *text,
2563 1.10 christos struct cmd_list_element **alias,
2564 1.10 christos struct cmd_list_element **prefix_cmd,
2565 1.10 christos struct cmd_list_element **cmd,
2566 1.10 christos struct cmd_list_element *cur_list)
2567 1.10 christos {
2568 1.10 christos *alias = nullptr;
2569 1.9 christos *prefix_cmd = cur_list->prefix;
2570 1.9 christos *cmd = nullptr;
2571 1.9 christos
2572 1.10 christos text = skip_spaces (text);
2573 1.10 christos
2574 1.1 christos /* Go through as many command lists as we need to, to find the command
2575 1.9 christos TEXT refers to. */
2576 1.1 christos while (1)
2577 1.10 christos {
2578 1.9 christos /* Identify the name of the command. */
2579 1.1 christos int len = find_command_name_length (text);
2580 1.1 christos
2581 1.1 christos /* If nothing but whitespace, return. */
2582 1.9 christos if (len == 0)
2583 1.9 christos return 0;
2584 1.9 christos
2585 1.10 christos /* TEXT is the start of the first command word to lookup (and
2586 1.9 christos it's length is LEN). We copy this into a local temporary. */
2587 1.1 christos std::string command (text, len);
2588 1.10 christos
2589 1.10 christos /* Look it up. */
2590 1.9 christos int nfound = 0;
2591 1.10 christos *cmd = find_cmd (command.c_str (), len, cur_list, 1, &nfound);
2592 1.11 christos
2593 1.11 christos /* We only handle the case where a single command was found. */
2594 1.11 christos if (nfound > 1)
2595 1.11 christos {
2596 1.11 christos *cmd = CMD_LIST_AMBIGUOUS;
2597 1.11 christos return 0;
2598 1.10 christos }
2599 1.1 christos else if (*cmd == nullptr)
2600 1.1 christos return 0;
2601 1.10 christos else
2602 1.1 christos {
2603 1.10 christos if ((*cmd)->is_alias ())
2604 1.10 christos {
2605 1.1 christos /* If the command was actually an alias, we note that an
2606 1.10 christos alias was used (by assigning *ALIAS) and we set *CMD. */
2607 1.1 christos *alias = *cmd;
2608 1.1 christos *cmd = (*cmd)->alias_target;
2609 1.9 christos }
2610 1.9 christos }
2611 1.9 christos
2612 1.9 christos text += len;
2613 1.10 christos text = skip_spaces (text);
2614 1.10 christos
2615 1.10 christos if ((*cmd)->is_prefix () && *text != '\0')
2616 1.10 christos {
2617 1.10 christos cur_list = *(*cmd)->subcommands;
2618 1.1 christos *prefix_cmd = *cmd;
2619 1.1 christos }
2620 1.1 christos else
2621 1.1 christos return 1;
2622 1.1 christos }
2623 1.10 christos }
2624 1.10 christos
2625 1.10 christos /* Look up the contents of TEXT as a command in the command list 'cmdlist'.
2626 1.10 christos Return 1 on success, 0 on failure.
2627 1.10 christos
2628 1.10 christos If TEXT refers to an alias, *ALIAS will point to that alias.
2629 1.10 christos
2630 1.10 christos If TEXT is a subcommand (i.e. one that is preceded by a prefix
2631 1.11 christos command) set *PREFIX_CMD.
2632 1.11 christos
2633 1.10 christos Set *CMD to point to the command TEXT indicates, or to
2634 1.10 christos CMD_LIST_AMBIGUOUS if there are multiple possible matches.
2635 1.10 christos
2636 1.10 christos If any of *ALIAS, *PREFIX_CMD, or *CMD cannot be determined or do not
2637 1.10 christos exist, they are NULL when we return.
2638 1.10 christos
2639 1.10 christos */
2640 1.10 christos
2641 1.10 christos int
2642 1.10 christos lookup_cmd_composition (const char *text,
2643 1.10 christos struct cmd_list_element **alias,
2644 1.10 christos struct cmd_list_element **prefix_cmd,
2645 1.10 christos struct cmd_list_element **cmd)
2646 1.10 christos {
2647 1.10 christos return lookup_cmd_composition_1 (text, alias, prefix_cmd, cmd, cmdlist);
2648 1.1 christos }
2649 1.1 christos
2650 1.1 christos /* Helper function for SYMBOL_COMPLETION_FUNCTION. */
2651 1.1 christos
2652 1.1 christos /* Return a vector of char pointers which point to the different
2653 1.1 christos possible completions in LIST of TEXT.
2654 1.1 christos
2655 1.1 christos WORD points in the same buffer as TEXT, and completions should be
2656 1.1 christos returned relative to this position. For example, suppose TEXT is
2657 1.1 christos "foo" and we want to complete to "foobar". If WORD is "oo", return
2658 1.8 christos "oobar"; if WORD is "baz/foo", return "baz/foobar". */
2659 1.1 christos
2660 1.8 christos void
2661 1.1 christos complete_on_cmdlist (struct cmd_list_element *list,
2662 1.1 christos completion_tracker &tracker,
2663 1.1 christos const char *text, const char *word,
2664 1.1 christos int ignore_help_classes)
2665 1.1 christos {
2666 1.1 christos struct cmd_list_element *ptr;
2667 1.1 christos int textlen = strlen (text);
2668 1.1 christos int pass;
2669 1.1 christos int saw_deprecated_match = 0;
2670 1.1 christos
2671 1.1 christos /* We do one or two passes. In the first pass, we skip deprecated
2672 1.1 christos commands. If we see no matching commands in the first pass, and
2673 1.8 christos if we did happen to see a matching deprecated command, we do
2674 1.1 christos another loop to collect those. */
2675 1.8 christos for (pass = 0; pass < 2; ++pass)
2676 1.8 christos {
2677 1.1 christos bool got_matches = false;
2678 1.1 christos
2679 1.1 christos for (ptr = list; ptr; ptr = ptr->next)
2680 1.10 christos if (!strncmp (ptr->name, text, textlen)
2681 1.10 christos && !ptr->abbrev_flag
2682 1.1 christos && (!ignore_help_classes || !ptr->is_command_class_help ()
2683 1.1 christos || ptr->is_prefix ()))
2684 1.1 christos {
2685 1.3 christos if (pass == 0)
2686 1.1 christos {
2687 1.1 christos if (ptr->cmd_deprecated)
2688 1.1 christos {
2689 1.1 christos saw_deprecated_match = 1;
2690 1.1 christos continue;
2691 1.1 christos }
2692 1.8 christos }
2693 1.8 christos
2694 1.8 christos tracker.add_completion
2695 1.1 christos (make_completion_match_str (ptr->name, text, word));
2696 1.8 christos got_matches = true;
2697 1.8 christos }
2698 1.8 christos
2699 1.8 christos if (got_matches)
2700 1.1 christos break;
2701 1.1 christos
2702 1.1 christos /* If we saw no matching deprecated commands in the first pass,
2703 1.1 christos just bail out. */
2704 1.1 christos if (!saw_deprecated_match)
2705 1.1 christos break;
2706 1.1 christos }
2707 1.1 christos }
2708 1.1 christos
2709 1.8 christos /* Helper function for SYMBOL_COMPLETION_FUNCTION. */
2710 1.1 christos
2711 1.1 christos /* Add the different possible completions in ENUMLIST of TEXT.
2712 1.1 christos
2713 1.1 christos WORD points in the same buffer as TEXT, and completions should be
2714 1.1 christos returned relative to this position. For example, suppose TEXT is "foo"
2715 1.1 christos and we want to complete to "foobar". If WORD is "oo", return
2716 1.8 christos "oobar"; if WORD is "baz/foo", return "baz/foobar". */
2717 1.8 christos
2718 1.8 christos void
2719 1.1 christos complete_on_enum (completion_tracker &tracker,
2720 1.1 christos const char *const *enumlist,
2721 1.1 christos const char *text, const char *word)
2722 1.1 christos {
2723 1.1 christos int textlen = strlen (text);
2724 1.1 christos int i;
2725 1.1 christos const char *name;
2726 1.1 christos
2727 1.8 christos for (i = 0; (name = enumlist[i]) != NULL; i++)
2728 1.1 christos if (strncmp (name, text, textlen) == 0)
2729 1.1 christos tracker.add_completion (make_completion_match_str (name, text, word));
2730 1.1 christos }
2731 1.1 christos
2732 1.8 christos /* Call the command function. */
2733 1.1 christos void
2734 1.10 christos cmd_func (struct cmd_list_element *cmd, const char *args, int from_tty)
2735 1.6 christos {
2736 1.11 christos if (!cmd->is_command_class_help ())
2737 1.6 christos {
2738 1.6 christos std::optional<scoped_restore_tmpl<bool>> restore_suppress;
2739 1.10 christos
2740 1.6 christos if (cmd->suppress_notification != NULL)
2741 1.10 christos restore_suppress.emplace (cmd->suppress_notification, true);
2742 1.6 christos
2743 1.1 christos cmd->func (args, from_tty, cmd);
2744 1.1 christos }
2745 1.1 christos else
2746 1.3 christos error (_("Invalid command"));
2747 1.3 christos }
2748 1.3 christos
2749 1.3 christos int
2750 1.10 christos cli_user_command_p (struct cmd_list_element *cmd)
2751 1.3 christos {
2752 return cmd->theclass == class_user && cmd->func == do_simple_func;
2753 }
2754