gdb: Have setter and getter callbacks for settings
[binutils-gdb.git] / gdb / command.h
1 /* Header file for command creation.
2
3 Copyright (C) 1986-2021 Free Software Foundation, Inc.
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
17
18 #if !defined (COMMAND_H)
19 #define COMMAND_H 1
20
21 #include "gdbsupport/gdb_vecs.h"
22 #include "gdbsupport/scoped_restore.h"
23
24 struct completion_tracker;
25
26 /* This file defines the public interface for any code wanting to
27 create commands. */
28
29 /* Command classes are top-level categories into which commands are
30 broken down for "help" purposes.
31
32 The class_alias is used for the user-defined aliases, defined
33 using the "alias" command.
34
35 Aliases pre-defined by GDB (e.g. the alias "bt" of the "backtrace" command)
36 are not using the class_alias.
37 Different pre-defined aliases of the same command do not necessarily
38 have the same classes. For example, class_stack is used for the
39 "backtrace" and its "bt" alias", while "info stack" (also an alias
40 of "backtrace" uses class_info. */
41
42 enum command_class
43 {
44 /* Classes of commands followed by a comment giving the name
45 to use in "help <classname>".
46 Note that help accepts unambiguous abbreviated class names. */
47
48 /* Special classes to help_list */
49 class_deprecated = -3,
50 all_classes = -2, /* help without <classname> */
51 all_commands = -1, /* all */
52
53 /* Classes of commands */
54 no_class = -1,
55 class_run = 0, /* running */
56 class_vars, /* data */
57 class_stack, /* stack */
58 class_files, /* files */
59 class_support, /* support */
60 class_info, /* status */
61 class_breakpoint, /* breakpoints */
62 class_trace, /* tracepoints */
63 class_alias, /* aliases */
64 class_bookmark,
65 class_obscure, /* obscure */
66 class_maintenance, /* internals */
67 class_tui, /* text-user-interface */
68 class_user, /* user-defined */
69
70 /* Used for "show" commands that have no corresponding "set" command. */
71 no_set_class
72 };
73
74 /* Types of "set" or "show" command. */
75 typedef enum var_types
76 {
77 /* "on" or "off". *VAR is a bool which is true for on,
78 false for off. */
79 var_boolean,
80
81 /* "on" / "true" / "enable" or "off" / "false" / "disable" or
82 "auto. *VAR is an ``enum auto_boolean''. NOTE: In general a
83 custom show command will need to be implemented - one that for
84 "auto" prints both the "auto" and the current auto-selected
85 value. */
86 var_auto_boolean,
87
88 /* Unsigned Integer. *VAR is an unsigned int. The user can type
89 0 to mean "unlimited", which is stored in *VAR as UINT_MAX. */
90 var_uinteger,
91
92 /* Like var_uinteger but signed. *VAR is an int. The user can
93 type 0 to mean "unlimited", which is stored in *VAR as
94 INT_MAX. The only remaining use of it is the Python API.
95 Don't use it elsewhere. */
96 var_integer,
97
98 /* String which the user enters with escapes (e.g. the user types
99 \n and it is a real newline in the stored string).
100 *VAR is a std::string, "" if the string is empty. */
101 var_string,
102 /* String which stores what the user types verbatim.
103 *VAR is std::string, "" if the string is empty. */
104 var_string_noescape,
105 /* String which stores a filename. (*VAR) is a std::string,
106 "" if the string was empty. */
107 var_optional_filename,
108 /* String which stores a filename. (*VAR) is a std::string. */
109 var_filename,
110 /* ZeroableInteger. *VAR is an int. Like var_integer except
111 that zero really means zero. */
112 var_zinteger,
113 /* ZeroableUnsignedInteger. *VAR is an unsigned int. Zero really
114 means zero. */
115 var_zuinteger,
116 /* ZeroableUnsignedInteger with unlimited value. *VAR is an int,
117 but its range is [0, INT_MAX]. -1 stands for unlimited and
118 other negative numbers are not allowed. */
119 var_zuinteger_unlimited,
120 /* Enumerated type. Can only have one of the specified values.
121 *VAR is a char pointer to the name of the element that we
122 find. */
123 var_enum
124 }
125 var_types;
126
127 /* Return true if a setting of type VAR_TYPE is backed with type T.
128
129 This function is left without definition intentionally. This template is
130 specialized for all valid types that are used to back var_types. Therefore
131 if one tries to instantiate this un-specialized template it means the T
132 parameter is not a type used to back a var_type and it is most likely a
133 programming error. */
134 template<typename T>
135 bool var_type_uses (var_types var_type) = delete;
136
137 /* Return true if a setting of type T is backed by a bool variable. */
138 template<>
139 inline bool var_type_uses<bool> (var_types t)
140 {
141 return t == var_boolean;
142 };
143
144 /* Return true if a setting of type T is backed by a auto_boolean variable.
145 */
146 template<>
147 inline bool var_type_uses<enum auto_boolean> (var_types t)
148 {
149 return t == var_auto_boolean;
150 }
151
152 /* Return true if a setting of type T is backed by an unsigned int variable.
153 */
154 template<>
155 inline bool var_type_uses<unsigned int> (var_types t)
156 {
157 return (t == var_uinteger || t == var_zinteger || t == var_zuinteger);
158 }
159
160 /* Return true if a setting of type T is backed by an int variable. */
161 template<>
162 inline bool var_type_uses<int> (var_types t)
163 {
164 return (t == var_integer || t == var_zinteger
165 || t == var_zuinteger_unlimited);
166 }
167
168 /* Return true if a setting of type T is backed by a std::string variable. */
169 template<>
170 inline bool var_type_uses<std::string> (var_types t)
171 {
172 return (t == var_string || t == var_string_noescape
173 || t == var_optional_filename || t == var_filename);
174 }
175
176 /* Return true if a setting of type T is backed by a const char * variable.
177 */
178 template<>
179 inline bool var_type_uses<const char *> (var_types t)
180 {
181 return t == var_enum;
182 }
183
184 /* Function signature for a callback used to get a value from a setting. */
185
186 template<typename T>
187 using setting_getter_ftype = const T &(*) ();
188
189 /* Function signature for a callback used to set a value to a setting. */
190
191 template<typename T>
192 using setting_setter_ftype = void (*) (const T &);
193
194 /* Generic/type-erased function pointer. */
195
196 using erased_func = void (*) ();
197
198 /* Interface for getting and setting a setting's value.
199
200 The underlying data can be of any VAR_TYPES type. */
201 struct setting
202 {
203 /* Create a setting backed by a variable of type T.
204
205 Type T must match the var type VAR_TYPE (see VAR_TYPE_USES). */
206 template<typename T>
207 setting (var_types var_type, T *var)
208 : m_var_type (var_type), m_var (var)
209 {
210 gdb_assert (var != nullptr);
211 gdb_assert (var_type_uses<T> (var_type));
212 }
213
214 /* A setting can also be constructed with a pre-validated
215 type-erased variable. Use the following function to
216 validate & type-erase said variable/function pointers. */
217
218 struct erased_args
219 {
220 void *var;
221 erased_func setter;
222 erased_func getter;
223 };
224
225 template<typename T>
226 static erased_args erase_args (var_types var_type,
227 T *var,
228 setting_setter_ftype<T> set_setting_func,
229 setting_getter_ftype<T> get_setting_func)
230 {
231 gdb_assert (var_type_uses<T> (var_type));
232 /* The getter and the setter must be both provided or both omitted. */
233 gdb_assert
234 ((set_setting_func == nullptr) == (get_setting_func == nullptr));
235
236 /* The caller must provide a pointer to a variable or get/set functions, but
237 not both. */
238 gdb_assert ((set_setting_func == nullptr) != (var == nullptr));
239
240 return {
241 var,
242 reinterpret_cast<erased_func> (set_setting_func),
243 reinterpret_cast<erased_func> (get_setting_func)
244 };
245 }
246
247 /* Create a setting backed by pre-validated type-erased args.
248 ERASED_VAR's fields' real types must match the var type VAR_TYPE
249 (see VAR_TYPE_USES). */
250 setting (var_types var_type, const erased_args &args)
251 : m_var_type (var_type),
252 m_var (args.var),
253 m_getter (args.getter),
254 m_setter (args.setter)
255 {
256 }
257
258 /* Create a setting backed by setter and getter functions.
259
260 Type T must match the var type VAR_TYPE (see VAR_TYPE_USES). */
261 template<typename T>
262 setting (var_types var_type,
263 setting_setter_ftype<T> setter,
264 setting_getter_ftype<T> getter)
265 : m_var_type (var_type)
266 {
267 gdb_assert (var_type_uses<T> (var_type));
268
269 /* Getters and setters are cast to and from the arbitrary `void (*) ()`
270 function pointer type. Make sure that the two types are really of the
271 same size. */
272 gdb_static_assert (sizeof (m_getter) == sizeof (getter));
273 gdb_static_assert (sizeof (m_setter) == sizeof (setter));
274
275 m_getter = reinterpret_cast<erased_func> (getter);
276 m_setter = reinterpret_cast<erased_func> (setter);
277 }
278
279 /* Access the type of the current setting. */
280 var_types type () const
281 { return m_var_type; }
282
283 /* Return the current value.
284
285 The template parameter T is the type of the variable used to store the
286 setting. */
287 template<typename T>
288 const T &get () const
289 {
290 gdb_assert (var_type_uses<T> (m_var_type));
291 gdb_assert (m_var != nullptr);
292
293 if (m_var == nullptr)
294 {
295 gdb_assert (m_getter != nullptr);
296 auto getter = reinterpret_cast<setting_getter_ftype<T>> (m_getter);
297 return getter ();
298 }
299 else
300 return *static_cast<const T *> (m_var);
301 }
302
303 /* Sets the value of the setting to V.
304
305 If we have a user-provided setter, use it to set the setting. Otherwise
306 copy the value V to the internally referenced buffer.
307
308 The template parameter T indicates the type of the variable used to store
309 the setting.
310
311 The var_type of the setting must match T. */
312 template<typename T>
313 void set (const T &v)
314 {
315 /* Check that the current instance is of one of the supported types for
316 this instantiation. */
317 gdb_assert (var_type_uses<T> (m_var_type));
318
319 if (m_var == nullptr)
320 {
321 gdb_assert (m_setter != nullptr);
322 auto setter = reinterpret_cast<setting_setter_ftype<T>> (m_setter);
323 setter (v);
324 }
325 else
326 *static_cast<T *> (m_var) = v;
327 }
328
329 private:
330 /* The type of the variable M_VAR is pointing to, or that M_GETTER / M_SETTER
331 get or set. */
332 var_types m_var_type;
333
334 /* Pointer to the enclosed variable
335
336 Either M_VAR is non-nullptr, or both M_GETTER and M_SETTER are
337 non-nullptr. */
338 void *m_var = nullptr;
339
340 /* Pointer to a user provided getter. */
341 erased_func m_getter = nullptr;
342
343 /* Pointer to a user provided setter. */
344 erased_func m_setter = nullptr;
345 };
346
347 /* This structure records one command'd definition. */
348 struct cmd_list_element;
349
350 /* The "simple" signature of command callbacks, which doesn't include a
351 cmd_list_element parameter. */
352
353 typedef void cmd_simple_func_ftype (const char *args, int from_tty);
354
355 /* This structure specifies notifications to be suppressed by a cli
356 command interpreter. */
357
358 struct cli_suppress_notification
359 {
360 /* Inferior, thread, frame selected notification suppressed? */
361 int user_selected_context;
362 };
363
364 extern struct cli_suppress_notification cli_suppress_notification;
365
366 /* Forward-declarations of the entry-points of cli/cli-decode.c. */
367
368 /* API to the manipulation of command lists. */
369
370 /* Return TRUE if NAME is a valid user-defined command name.
371 This is a stricter subset of all gdb commands,
372 see find_command_name_length. */
373
374 extern bool valid_user_defined_cmd_name_p (const char *name);
375
376 /* Return TRUE if C is a valid command character. */
377
378 extern bool valid_cmd_char_p (int c);
379
380 /* Const-correct variant of the above. */
381
382 extern struct cmd_list_element *add_cmd (const char *, enum command_class,
383 cmd_simple_func_ftype *fun,
384 const char *,
385 struct cmd_list_element **);
386
387 /* Like add_cmd, but no command function is specified. */
388
389 extern struct cmd_list_element *add_cmd (const char *, enum command_class,
390 const char *,
391 struct cmd_list_element **);
392
393 extern struct cmd_list_element *add_cmd_suppress_notification
394 (const char *name, enum command_class theclass,
395 cmd_simple_func_ftype *fun, const char *doc,
396 struct cmd_list_element **list,
397 int *suppress_notification);
398
399 extern struct cmd_list_element *add_alias_cmd (const char *,
400 cmd_list_element *,
401 enum command_class, int,
402 struct cmd_list_element **);
403
404
405 extern struct cmd_list_element *add_prefix_cmd (const char *, enum command_class,
406 cmd_simple_func_ftype *fun,
407 const char *,
408 struct cmd_list_element **,
409 int,
410 struct cmd_list_element **);
411
412 /* Like add_prefix_cmd, but sets the callback to a function that
413 simply calls help_list. */
414
415 extern struct cmd_list_element *add_basic_prefix_cmd
416 (const char *, enum command_class, const char *, struct cmd_list_element **,
417 int, struct cmd_list_element **);
418
419 /* Like add_prefix_cmd, but useful for "show" prefixes. This sets the
420 callback to a function that simply calls cmd_show_list. */
421
422 extern struct cmd_list_element *add_show_prefix_cmd
423 (const char *, enum command_class, const char *, struct cmd_list_element **,
424 int, struct cmd_list_element **);
425
426 extern struct cmd_list_element *add_prefix_cmd_suppress_notification
427 (const char *name, enum command_class theclass,
428 cmd_simple_func_ftype *fun,
429 const char *doc, struct cmd_list_element **subcommands,
430 int allow_unknown,
431 struct cmd_list_element **list,
432 int *suppress_notification);
433
434 extern struct cmd_list_element *add_abbrev_prefix_cmd (const char *,
435 enum command_class,
436 cmd_simple_func_ftype *fun,
437 const char *,
438 struct cmd_list_element
439 **, int,
440 struct cmd_list_element
441 **);
442
443 typedef void cmd_func_ftype (const char *args, int from_tty,
444 cmd_list_element *c);
445
446 /* A completion routine. Add possible completions to tracker.
447
448 TEXT is the text beyond what was matched for the command itself
449 (leading whitespace is skipped). It stops where we are supposed to
450 stop completing (rl_point) and is '\0' terminated. WORD points in
451 the same buffer as TEXT, and completions should be returned
452 relative to this position. For example, suppose TEXT is "foo" and
453 we want to complete to "foobar". If WORD is "oo", return "oobar";
454 if WORD is "baz/foo", return "baz/foobar". */
455 typedef void completer_ftype (struct cmd_list_element *,
456 completion_tracker &tracker,
457 const char *text, const char *word);
458
459 /* Same, but for set_cmd_completer_handle_brkchars. */
460 typedef void completer_handle_brkchars_ftype (struct cmd_list_element *,
461 completion_tracker &tracker,
462 const char *text, const char *word);
463
464 extern void set_cmd_completer (struct cmd_list_element *, completer_ftype *);
465
466 /* Set the completer_handle_brkchars callback. */
467
468 extern void set_cmd_completer_handle_brkchars (struct cmd_list_element *,
469 completer_handle_brkchars_ftype *);
470
471 /* HACK: cagney/2002-02-23: Code, mostly in tracepoints.c, grubs
472 around in cmd objects to test the value of the commands sfunc(). */
473 extern int cmd_simple_func_eq (struct cmd_list_element *cmd,
474 cmd_simple_func_ftype *cfun);
475
476 /* Execute CMD's pre/post hook. Throw an error if the command fails.
477 If already executing this pre/post hook, or there is no pre/post
478 hook, the call is silently ignored. */
479 extern void execute_cmd_pre_hook (struct cmd_list_element *cmd);
480 extern void execute_cmd_post_hook (struct cmd_list_element *cmd);
481
482 /* Flag for an ambiguous cmd_list result. */
483 #define CMD_LIST_AMBIGUOUS ((struct cmd_list_element *) -1)
484
485 extern struct cmd_list_element *lookup_cmd (const char **,
486 struct cmd_list_element *,
487 const char *,
488 std::string *,
489 int, int);
490
491 /* This routine takes a line of TEXT and a CLIST in which to start the
492 lookup. When it returns it will have incremented the text pointer past
493 the section of text it matched, set *RESULT_LIST to point to the list in
494 which the last word was matched, and will return a pointer to the cmd
495 list element which the text matches. It will return NULL if no match at
496 all was possible. It will return -1 (cast appropriately, ick) if ambigous
497 matches are possible; in this case *RESULT_LIST will be set to point to
498 the list in which there are ambiguous choices (and *TEXT will be set to
499 the ambiguous text string).
500
501 if DEFAULT_ARGS is not null, *DEFAULT_ARGS is set to the found command
502 default args (possibly empty).
503
504 If the located command was an abbreviation, this routine returns the base
505 command of the abbreviation. Note that *DEFAULT_ARGS will contain the
506 default args defined for the alias.
507
508 It does no error reporting whatsoever; control will always return
509 to the superior routine.
510
511 In the case of an ambiguous return (-1), *RESULT_LIST will be set to point
512 at the prefix_command (ie. the best match) *or* (special case) will be NULL
513 if no prefix command was ever found. For example, in the case of "info a",
514 "info" matches without ambiguity, but "a" could be "args" or "address", so
515 *RESULT_LIST is set to the cmd_list_element for "info". So in this case
516 RESULT_LIST should not be interpreted as a pointer to the beginning of a
517 list; it simply points to a specific command. In the case of an ambiguous
518 return *TEXT is advanced past the last non-ambiguous prefix (e.g.
519 "info t" can be "info types" or "info target"; upon return *TEXT has been
520 advanced past "info ").
521
522 If RESULT_LIST is NULL, don't set *RESULT_LIST (but don't otherwise
523 affect the operation).
524
525 This routine does *not* modify the text pointed to by TEXT.
526
527 If IGNORE_HELP_CLASSES is nonzero, ignore any command list elements which
528 are actually help classes rather than commands (i.e. the function field of
529 the struct cmd_list_element is NULL).
530
531 When LOOKUP_FOR_COMPLETION_P is true the completion is being requested
532 for the completion engine, no warnings should be printed. */
533
534 extern struct cmd_list_element *lookup_cmd_1
535 (const char **text, struct cmd_list_element *clist,
536 struct cmd_list_element **result_list, std::string *default_args,
537 int ignore_help_classes, bool lookup_for_completion_p = false);
538
539 /* Look up the command called NAME in the command list LIST.
540
541 Unlike LOOKUP_CMD, partial matches are ignored and only exact matches
542 on NAME are considered.
543
544 LIST is a chain of struct cmd_list_element's.
545
546 If IGNORE_HELP_CLASSES is true (the default), ignore any command list
547 elements which are actually help classes rather than commands (i.e.
548 the function field of the struct cmd_list_element is null).
549
550 If found, return the struct cmd_list_element for that command,
551 otherwise return NULLPTR. */
552
553 extern struct cmd_list_element *lookup_cmd_exact
554 (const char *name,
555 struct cmd_list_element *list,
556 bool ignore_help_classes = true);
557
558 extern struct cmd_list_element *deprecate_cmd (struct cmd_list_element *,
559 const char * );
560
561 extern void deprecated_cmd_warning (const char *, struct cmd_list_element *);
562
563 extern int lookup_cmd_composition (const char *text,
564 struct cmd_list_element **alias,
565 struct cmd_list_element **prefix_cmd,
566 struct cmd_list_element **cmd);
567
568 extern struct cmd_list_element *add_com (const char *, enum command_class,
569 cmd_simple_func_ftype *fun,
570 const char *);
571
572 extern cmd_list_element *add_com_alias (const char *name,
573 cmd_list_element *target,
574 command_class theclass,
575 int abbrev_flag);
576
577 extern struct cmd_list_element *add_com_suppress_notification
578 (const char *name, enum command_class theclass,
579 cmd_simple_func_ftype *fun, const char *doc,
580 int *supress_notification);
581
582 extern struct cmd_list_element *add_info (const char *,
583 cmd_simple_func_ftype *fun,
584 const char *);
585
586 extern cmd_list_element *add_info_alias (const char *name,
587 cmd_list_element *target,
588 int abbrev_flag);
589
590 extern void complete_on_cmdlist (struct cmd_list_element *,
591 completion_tracker &tracker,
592 const char *, const char *, int);
593
594 extern void complete_on_enum (completion_tracker &tracker,
595 const char *const *enumlist,
596 const char *, const char *);
597
598 /* Functions that implement commands about CLI commands. */
599
600 extern void help_list (struct cmd_list_element *, const char *,
601 enum command_class, struct ui_file *);
602
603 /* Method for show a set/show variable's VALUE on FILE. If this
604 method isn't supplied deprecated_show_value_hack() is called (which
605 is not good). */
606 typedef void (show_value_ftype) (struct ui_file *file,
607 int from_tty,
608 struct cmd_list_element *cmd,
609 const char *value);
610 /* NOTE: i18n: This function is not i18n friendly. Callers should
611 instead print the value out directly. */
612 extern show_value_ftype deprecated_show_value_hack;
613
614 /* Return value type for the add_setshow_* functions. */
615
616 struct set_show_commands
617 {
618 cmd_list_element *set, *show;
619 };
620
621 extern set_show_commands add_setshow_enum_cmd
622 (const char *name, command_class theclass, const char *const *enumlist,
623 const char **var, const char *set_doc, const char *show_doc,
624 const char *help_doc, cmd_func_ftype *set_func,
625 show_value_ftype *show_func, cmd_list_element **set_list,
626 cmd_list_element **show_list);
627
628 extern set_show_commands add_setshow_enum_cmd
629 (const char *name, command_class theclass, const char *const *enumlist,
630 const char *set_doc, const char *show_doc,
631 const char *help_doc, setting_setter_ftype<const char *> set_func,
632 setting_getter_ftype<const char *> get_func, show_value_ftype *show_func,
633 cmd_list_element **set_list, cmd_list_element **show_list);
634
635 extern set_show_commands add_setshow_auto_boolean_cmd
636 (const char *name, command_class theclass, auto_boolean *var,
637 const char *set_doc, const char *show_doc, const char *help_doc,
638 cmd_func_ftype *set_func, show_value_ftype *show_func,
639 cmd_list_element **set_list, cmd_list_element **show_list);
640
641 extern set_show_commands add_setshow_auto_boolean_cmd
642 (const char *name, command_class theclass, const char *set_doc,
643 const char *show_doc, const char *help_doc,
644 setting_setter_ftype<enum auto_boolean> set_func,
645 setting_getter_ftype<enum auto_boolean> get_func,
646 show_value_ftype *show_func, cmd_list_element **set_list,
647 cmd_list_element **show_list);
648
649 extern set_show_commands add_setshow_boolean_cmd
650 (const char *name, command_class theclass, bool *var, const char *set_doc,
651 const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
652 show_value_ftype *show_func, cmd_list_element **set_list,
653 cmd_list_element **show_list);
654
655 extern set_show_commands add_setshow_boolean_cmd
656 (const char *name, command_class theclass, const char *set_doc,
657 const char *show_doc, const char *help_doc,
658 setting_setter_ftype<bool> set_func,
659 setting_getter_ftype<bool> get_func, show_value_ftype *show_func,
660 cmd_list_element **set_list, cmd_list_element **show_list);
661
662 extern set_show_commands add_setshow_filename_cmd
663 (const char *name, command_class theclass, std::string *var, const char *set_doc,
664 const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
665 show_value_ftype *show_func, cmd_list_element **set_list,
666 cmd_list_element **show_list);
667
668 extern set_show_commands add_setshow_filename_cmd
669 (const char *name, command_class theclass, const char *set_doc,
670 const char *show_doc, const char *help_doc,
671 setting_setter_ftype<std::string> set_func,
672 setting_getter_ftype<std::string> get_func, show_value_ftype *show_func,
673 cmd_list_element **set_list, cmd_list_element **show_list);
674
675 extern set_show_commands add_setshow_string_cmd
676 (const char *name, command_class theclass, std::string *var, const char *set_doc,
677 const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
678 show_value_ftype *show_func, cmd_list_element **set_list,
679 cmd_list_element **show_list);
680
681 extern set_show_commands add_setshow_string_cmd
682 (const char *name, command_class theclass, const char *set_doc,
683 const char *show_doc, const char *help_doc,
684 setting_setter_ftype<std::string> set_func,
685 setting_getter_ftype<std::string> get_func,
686 show_value_ftype *show_func, cmd_list_element **set_list,
687 cmd_list_element **show_list);
688
689 extern set_show_commands add_setshow_string_noescape_cmd
690 (const char *name, command_class theclass, std::string *var, const char *set_doc,
691 const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
692 show_value_ftype *show_func, cmd_list_element **set_list,
693 cmd_list_element **show_list);
694
695 extern set_show_commands add_setshow_string_noescape_cmd
696 (const char *name, command_class theclass, const char *set_doc,
697 const char *show_doc, const char *help_doc,
698 setting_setter_ftype<std::string> set_func,
699 setting_getter_ftype<std::string> get_func, show_value_ftype *show_func,
700 cmd_list_element **set_list, cmd_list_element **show_list);
701
702 extern set_show_commands add_setshow_optional_filename_cmd
703 (const char *name, command_class theclass, std::string *var, const char *set_doc,
704 const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
705 show_value_ftype *show_func, cmd_list_element **set_list,
706 cmd_list_element **show_list);
707
708 extern set_show_commands add_setshow_optional_filename_cmd
709 (const char *name, command_class theclass, const char *set_doc,
710 const char *show_doc, const char *help_doc,
711 setting_setter_ftype<std::string> set_func,
712 setting_getter_ftype<std::string> get_func,
713 show_value_ftype *show_func, cmd_list_element **set_list,
714 cmd_list_element **show_list);
715
716 extern set_show_commands add_setshow_integer_cmd
717 (const char *name, command_class theclass, int *var, const char *set_doc,
718 const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
719 show_value_ftype *show_func, cmd_list_element **set_list,
720 cmd_list_element **show_list);
721
722 extern set_show_commands add_setshow_integer_cmd
723 (const char *name, command_class theclass, const char *set_doc,
724 const char *show_doc, const char *help_doc,
725 setting_setter_ftype<int> set_func,
726 setting_getter_ftype<int> get_func, show_value_ftype *show_func,
727 cmd_list_element **set_list, cmd_list_element **show_list);
728
729 extern set_show_commands add_setshow_uinteger_cmd
730 (const char *name, command_class theclass, unsigned int *var,
731 const char *set_doc, const char *show_doc, const char *help_doc,
732 cmd_func_ftype *set_func, show_value_ftype *show_func,
733 cmd_list_element **set_list, cmd_list_element **show_list);
734
735 extern set_show_commands add_setshow_uinteger_cmd
736 (const char *name, command_class theclass, const char *set_doc,
737 const char *show_doc, const char *help_doc,
738 setting_setter_ftype<unsigned int> set_func,
739 setting_getter_ftype<unsigned int> get_func, show_value_ftype *show_func,
740 cmd_list_element **set_list, cmd_list_element **show_list);
741
742 extern set_show_commands add_setshow_zinteger_cmd
743 (const char *name, command_class theclass, int *var, const char *set_doc,
744 const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
745 show_value_ftype *show_func, cmd_list_element **set_list,
746 cmd_list_element **show_list);
747
748 extern set_show_commands add_setshow_zinteger_cmd
749 (const char *name, command_class theclass, const char *set_doc,
750 const char *show_doc, const char *help_doc,
751 setting_setter_ftype<int> set_func,
752 setting_getter_ftype<int> get_func, show_value_ftype *show_func,
753 cmd_list_element **set_list, cmd_list_element **show_list);
754
755 extern set_show_commands add_setshow_zuinteger_cmd
756 (const char *name, command_class theclass, unsigned int *var,
757 const char *set_doc, const char *show_doc, const char *help_doc,
758 cmd_func_ftype *set_func, show_value_ftype *show_func,
759 cmd_list_element **set_list, cmd_list_element **show_list);
760
761 extern set_show_commands add_setshow_zuinteger_cmd
762 (const char *name, command_class theclass, const char *set_doc,
763 const char *show_doc, const char *help_doc,
764 setting_setter_ftype<unsigned int> set_func,
765 setting_getter_ftype<unsigned int> get_func, show_value_ftype *show_func,
766 cmd_list_element **set_list, cmd_list_element **show_list);
767
768 extern set_show_commands add_setshow_zuinteger_unlimited_cmd
769 (const char *name, command_class theclass, int *var, const char *set_doc,
770 const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
771 show_value_ftype *show_func, cmd_list_element **set_list,
772 cmd_list_element **show_list);
773
774 extern set_show_commands add_setshow_zuinteger_unlimited_cmd
775 (const char *name, command_class theclass, const char *set_doc,
776 const char *show_doc, const char *help_doc,
777 setting_setter_ftype<int> set_func, setting_getter_ftype<int> get_func,
778 show_value_ftype *show_func, cmd_list_element **set_list,
779 cmd_list_element **show_list);
780
781 /* Do a "show" command for each thing on a command list. */
782
783 extern void cmd_show_list (struct cmd_list_element *, int);
784
785 /* Used everywhere whenever at least one parameter is required and
786 none is specified. */
787
788 extern void error_no_arg (const char *) ATTRIBUTE_NORETURN;
789
790
791 /* Command line saving and repetition.
792 Each input line executed is saved to possibly be repeated either
793 when the user types an empty line, or be repeated by a command
794 that wants to repeat the previously executed command. The below
795 functions control command repetition. */
796
797 /* Commands call dont_repeat if they do not want to be repeated by null
798 lines or by repeat_previous (). */
799
800 extern void dont_repeat ();
801
802 /* Commands call repeat_previous if they want to repeat the previous
803 command. Such commands that repeat the previous command must
804 indicate to not repeat themselves, to avoid recursive repeat.
805 repeat_previous marks the current command as not repeating, and
806 ensures get_saved_command_line returns the previous command, so
807 that the currently executing command can repeat it. If there's no
808 previous command, throws an error. Otherwise, returns the result
809 of get_saved_command_line, which now points at the command to
810 repeat. */
811
812 extern const char *repeat_previous ();
813
814 /* Prevent dont_repeat from working, and return a cleanup that
815 restores the previous state. */
816
817 extern scoped_restore_tmpl<int> prevent_dont_repeat (void);
818
819 /* Set the arguments that will be passed if the current command is
820 repeated. Note that the passed-in string must be a constant. */
821
822 extern void set_repeat_arguments (const char *args);
823
824 /* Returns the saved command line to repeat.
825 When a command is being executed, this is the currently executing
826 command line, unless the currently executing command has called
827 repeat_previous (): in this case, get_saved_command_line returns
828 the previously saved command line. */
829
830 extern char *get_saved_command_line ();
831
832 /* Takes a copy of CMD, for possible repetition. */
833
834 extern void save_command_line (const char *cmd);
835
836 /* Used to mark commands that don't do anything. If we just leave the
837 function field NULL, the command is interpreted as a help topic, or
838 as a class of commands. */
839
840 extern void not_just_help_class_command (const char *, int);
841
842 /* Call the command function. */
843 extern void cmd_func (struct cmd_list_element *cmd,
844 const char *args, int from_tty);
845
846 #endif /* !defined (COMMAND_H) */