Automatic Copyright Year update after running gdb/copyright.py
[deliverable/binutils-gdb.git] / gdb / guile / scm-cmd.c
CommitLineData
e698b8c4
DE
1/* GDB commands implemented in Scheme.
2
88b9d363 3 Copyright (C) 2008-2022 Free Software Foundation, Inc.
e698b8c4
DE
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20/* See README file in this directory for implementation notes, coding
21 conventions, et.al. */
22
23#include "defs.h"
24#include <ctype.h>
e698b8c4
DE
25#include "charset.h"
26#include "gdbcmd.h"
27#include "cli/cli-decode.h"
28#include "completer.h"
29#include "guile-internal.h"
30
31/* The <gdb:command> smob.
32
33 Note: Commands are added to gdb using a two step process:
34 1) Call make-command to create a <gdb:command> object.
35 2) Call register-command! to add the command to gdb.
36 It is done this way so that the constructor, make-command, doesn't have
37 any side-effects. This means that the smob needs to store everything
38 that was passed to make-command. */
39
f99b5177 40struct command_smob
e698b8c4
DE
41{
42 /* This always appears first. */
43 gdb_smob base;
44
45 /* The name of the command, as passed to make-command. */
46 char *name;
47
48 /* The last word of the command.
49 This is needed because add_cmd requires us to allocate space
50 for it. :-( */
51 char *cmd_name;
52
53 /* Non-zero if this is a prefix command. */
54 int is_prefix;
55
56 /* One of the COMMAND_* constants. */
57 enum command_class cmd_class;
58
59 /* The documentation for the command. */
60 char *doc;
61
62 /* The corresponding gdb command object.
63 This is NULL if the command has not been registered yet, or
64 is no longer registered. */
65 struct cmd_list_element *command;
66
67 /* A prefix command requires storage for a list of its sub-commands.
68 A pointer to this is passed to add_prefix_command, and to add_cmd
69 for sub-commands of that prefix.
70 This is NULL if the command has not been registered yet, or
71 is no longer registered. If this command is not a prefix
72 command, then this field is unused. */
73 struct cmd_list_element *sub_list;
74
75 /* The procedure to call to invoke the command.
76 (lambda (self arg from-tty) ...).
77 Its result is unspecified. */
78 SCM invoke;
79
80 /* Either #f, one of the COMPLETE_* constants, or a procedure to call to
81 perform command completion. Called as (lambda (self text word) ...). */
82 SCM complete;
83
84 /* The <gdb:command> object we are contained in, needed to protect/unprotect
85 the object since a reference to it comes from non-gc-managed space
86 (the command context pointer). */
87 SCM containing_scm;
f99b5177 88};
e698b8c4
DE
89
90static const char command_smob_name[] = "gdb:command";
91
92/* The tag Guile knows the objfile smob by. */
93static scm_t_bits command_smob_tag;
94
95/* Keywords used by make-command. */
96static SCM invoke_keyword;
97static SCM command_class_keyword;
98static SCM completer_class_keyword;
99static SCM prefix_p_keyword;
100static SCM doc_keyword;
101
102/* Struct representing built-in completion types. */
103struct cmdscm_completer
104{
105 /* Scheme symbol name. */
106 const char *name;
107 /* Completion function. */
108 completer_ftype *completer;
109};
110
111static const struct cmdscm_completer cmdscm_completers[] =
112{
113 { "COMPLETE_NONE", noop_completer },
114 { "COMPLETE_FILENAME", filename_completer },
115 { "COMPLETE_LOCATION", location_completer },
116 { "COMPLETE_COMMAND", command_completer },
78b13106 117 { "COMPLETE_SYMBOL", symbol_completer },
e698b8c4
DE
118 { "COMPLETE_EXPRESSION", expression_completer },
119};
120
121#define N_COMPLETERS (sizeof (cmdscm_completers) \
122 / sizeof (cmdscm_completers[0]))
123
124static int cmdscm_is_valid (command_smob *);
125\f
126/* Administrivia for command smobs. */
127
128/* The smob "print" function for <gdb:command>. */
129
130static int
131cmdscm_print_command_smob (SCM self, SCM port, scm_print_state *pstate)
132{
133 command_smob *c_smob = (command_smob *) SCM_SMOB_DATA (self);
134
135 gdbscm_printf (port, "#<%s", command_smob_name);
136
137 gdbscm_printf (port, " %s",
138 c_smob->name != NULL ? c_smob->name : "{unnamed}");
139
140 if (! cmdscm_is_valid (c_smob))
141 scm_puts (" {invalid}", port);
142
143 scm_puts (">", port);
144
145 scm_remember_upto_here_1 (self);
146
147 /* Non-zero means success. */
148 return 1;
149}
150
151/* Low level routine to create a <gdb:command> object.
152 It's empty in the sense that a command still needs to be associated
153 with it. */
154
155static SCM
156cmdscm_make_command_smob (void)
157{
158 command_smob *c_smob = (command_smob *)
159 scm_gc_malloc (sizeof (command_smob), command_smob_name);
160 SCM c_scm;
161
162 memset (c_smob, 0, sizeof (*c_smob));
163 c_smob->cmd_class = no_class;
164 c_smob->invoke = SCM_BOOL_F;
165 c_smob->complete = SCM_BOOL_F;
166 c_scm = scm_new_smob (command_smob_tag, (scm_t_bits) c_smob);
167 c_smob->containing_scm = c_scm;
168 gdbscm_init_gsmob (&c_smob->base);
169
170 return c_scm;
171}
172
173/* Clear the COMMAND pointer in C_SMOB and unprotect the object from GC. */
174
175static void
176cmdscm_release_command (command_smob *c_smob)
177{
178 c_smob->command = NULL;
179 scm_gc_unprotect_object (c_smob->containing_scm);
180}
181
182/* Return non-zero if SCM is a command smob. */
183
184static int
185cmdscm_is_command (SCM scm)
186{
187 return SCM_SMOB_PREDICATE (command_smob_tag, scm);
188}
189
190/* (command? scm) -> boolean */
191
192static SCM
193gdbscm_command_p (SCM scm)
194{
195 return scm_from_bool (cmdscm_is_command (scm));
196}
197
198/* Returns the <gdb:command> object in SELF.
199 Throws an exception if SELF is not a <gdb:command> object. */
200
201static SCM
202cmdscm_get_command_arg_unsafe (SCM self, int arg_pos, const char *func_name)
203{
204 SCM_ASSERT_TYPE (cmdscm_is_command (self), self, arg_pos, func_name,
205 command_smob_name);
206
207 return self;
208}
209
210/* Returns a pointer to the command smob of SELF.
211 Throws an exception if SELF is not a <gdb:command> object. */
212
213static command_smob *
214cmdscm_get_command_smob_arg_unsafe (SCM self, int arg_pos,
215 const char *func_name)
216{
217 SCM c_scm = cmdscm_get_command_arg_unsafe (self, arg_pos, func_name);
218 command_smob *c_smob = (command_smob *) SCM_SMOB_DATA (c_scm);
219
220 return c_smob;
221}
222
223/* Return non-zero if command C_SMOB is valid. */
224
225static int
226cmdscm_is_valid (command_smob *c_smob)
227{
228 return c_smob->command != NULL;
229}
230
231/* Returns a pointer to the command smob of SELF.
232 Throws an exception if SELF is not a valid <gdb:command> object. */
233
234static command_smob *
235cmdscm_get_valid_command_smob_arg_unsafe (SCM self, int arg_pos,
236 const char *func_name)
237{
238 command_smob *c_smob
239 = cmdscm_get_command_smob_arg_unsafe (self, arg_pos, func_name);
240
241 if (!cmdscm_is_valid (c_smob))
242 {
243 gdbscm_invalid_object_error (func_name, arg_pos, self,
244 _("<gdb:command>"));
245 }
246
247 return c_smob;
248}
249\f
250/* Scheme functions for GDB commands. */
251
252/* (command-valid? <gdb:command>) -> boolean
253 Returns #t if SELF is still valid. */
254
255static SCM
256gdbscm_command_valid_p (SCM self)
257{
258 command_smob *c_smob
259 = cmdscm_get_command_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
260
261 return scm_from_bool (cmdscm_is_valid (c_smob));
262}
263
264/* (dont-repeat cmd) -> unspecified
265 Scheme function which wraps dont_repeat. */
266
267static SCM
268gdbscm_dont_repeat (SCM self)
269{
d5e9a511
TT
270 /* We currently don't need anything from SELF, but still verify it.
271 Call for side effects. */
272 cmdscm_get_valid_command_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
e698b8c4
DE
273
274 dont_repeat ();
275
276 return SCM_UNSPECIFIED;
277}
278\f
279/* The make-command function. */
280
281/* Called if the gdb cmd_list_element is destroyed. */
282
283static void
284cmdscm_destroyer (struct cmd_list_element *self, void *context)
285{
286 command_smob *c_smob = (command_smob *) context;
287
288 cmdscm_release_command (c_smob);
e698b8c4
DE
289}
290
291/* Called by gdb to invoke the command. */
292
293static void
a121b7c1 294cmdscm_function (struct cmd_list_element *command,
95a6b0a1 295 const char *args, int from_tty)
e698b8c4 296{
0f8e2034 297 command_smob *c_smob/*obj*/ = (command_smob *) command->context ();
e698b8c4
DE
298 SCM arg_scm, tty_scm, result;
299
300 gdb_assert (c_smob != NULL);
301
302 if (args == NULL)
303 args = "";
304 arg_scm = gdbscm_scm_from_string (args, strlen (args), host_charset (), 1);
305 if (gdbscm_is_exception (arg_scm))
306 error (_("Could not convert arguments to Scheme string."));
307
308 tty_scm = scm_from_bool (from_tty);
309
310 result = gdbscm_safe_call_3 (c_smob->invoke, c_smob->containing_scm,
311 arg_scm, tty_scm, gdbscm_user_error_p);
312
313 if (gdbscm_is_exception (result))
314 {
315 /* Don't print the stack if this was an error signalled by the command
316 itself. */
317 if (gdbscm_user_error_p (gdbscm_exception_key (result)))
318 {
15bf3002
TT
319 gdb::unique_xmalloc_ptr<char> msg
320 = gdbscm_exception_message_to_string (result);
e698b8c4 321
15bf3002 322 error ("%s", msg.get ());
e698b8c4
DE
323 }
324 else
325 {
326 gdbscm_print_gdb_exception (SCM_BOOL_F, result);
327 error (_("Error occurred in Scheme-implemented GDB command."));
328 }
329 }
330}
331
332/* Subroutine of cmdscm_completer to simplify it.
333 Print an error message indicating that COMPLETION is a bad completion
334 result. */
335
336static void
337cmdscm_bad_completion_result (const char *msg, SCM completion)
338{
339 SCM port = scm_current_error_port ();
340
341 scm_puts (msg, port);
342 scm_display (completion, port);
343 scm_newline (port);
344}
345
346/* Subroutine of cmdscm_completer to simplify it.
347 Validate COMPLETION and add to RESULT.
348 If an error occurs print an error message.
349 The result is a boolean indicating success. */
350
351static int
eb3ff9a5 352cmdscm_add_completion (SCM completion, completion_tracker &tracker)
e698b8c4 353{
e698b8c4
DE
354 SCM except_scm;
355
356 if (!scm_is_string (completion))
357 {
358 /* Inform the user, but otherwise ignore the entire result. */
359 cmdscm_bad_completion_result (_("Bad text from completer: "),
360 completion);
361 return 0;
362 }
363
eb3ff9a5 364 gdb::unique_xmalloc_ptr<char> item
c6c6149a
TT
365 = gdbscm_scm_to_string (completion, NULL, host_charset (), 1,
366 &except_scm);
e698b8c4
DE
367 if (item == NULL)
368 {
369 /* Inform the user, but otherwise ignore the entire result. */
370 gdbscm_print_gdb_exception (SCM_BOOL_F, except_scm);
371 return 0;
372 }
373
eb3ff9a5 374 tracker.add_completion (std::move (item));
e698b8c4
DE
375
376 return 1;
377}
378
379/* Called by gdb for command completion. */
380
eb3ff9a5 381static void
e698b8c4 382cmdscm_completer (struct cmd_list_element *command,
eb3ff9a5 383 completion_tracker &tracker,
e698b8c4
DE
384 const char *text, const char *word)
385{
0f8e2034 386 command_smob *c_smob/*obj*/ = (command_smob *) command->context ();
e698b8c4 387 SCM completer_result_scm;
798a7429 388 SCM text_scm, word_scm;
e698b8c4
DE
389
390 gdb_assert (c_smob != NULL);
391 gdb_assert (gdbscm_is_procedure (c_smob->complete));
392
393 text_scm = gdbscm_scm_from_string (text, strlen (text), host_charset (),
394 1);
395 if (gdbscm_is_exception (text_scm))
396 error (_("Could not convert \"text\" argument to Scheme string."));
397 word_scm = gdbscm_scm_from_string (word, strlen (word), host_charset (),
398 1);
399 if (gdbscm_is_exception (word_scm))
400 error (_("Could not convert \"word\" argument to Scheme string."));
401
402 completer_result_scm
403 = gdbscm_safe_call_3 (c_smob->complete, c_smob->containing_scm,
404 text_scm, word_scm, NULL);
405
406 if (gdbscm_is_exception (completer_result_scm))
407 {
408 /* Inform the user, but otherwise ignore. */
409 gdbscm_print_gdb_exception (SCM_BOOL_F, completer_result_scm);
eb3ff9a5 410 return;
e698b8c4
DE
411 }
412
413 if (gdbscm_is_true (scm_list_p (completer_result_scm)))
414 {
415 SCM list = completer_result_scm;
416
417 while (!scm_is_eq (list, SCM_EOL))
418 {
419 SCM next = scm_car (list);
420
eb3ff9a5
PA
421 if (!cmdscm_add_completion (next, tracker))
422 break;
e698b8c4
DE
423
424 list = scm_cdr (list);
425 }
426 }
427 else if (itscm_is_iterator (completer_result_scm))
428 {
429 SCM iter = completer_result_scm;
430 SCM next = itscm_safe_call_next_x (iter, NULL);
431
432 while (gdbscm_is_true (next))
433 {
434 if (gdbscm_is_exception (next))
435 {
eb3ff9a5 436 /* Inform the user. */
e698b8c4 437 gdbscm_print_gdb_exception (SCM_BOOL_F, completer_result_scm);
eb3ff9a5 438 break;
e698b8c4
DE
439 }
440
eb3ff9a5
PA
441 if (cmdscm_add_completion (next, tracker))
442 break;
e698b8c4
DE
443
444 next = itscm_safe_call_next_x (iter, NULL);
445 }
446 }
447 else
448 {
449 /* Inform the user, but otherwise ignore. */
450 cmdscm_bad_completion_result (_("Bad completer result: "),
451 completer_result_scm);
452 }
e698b8c4
DE
453}
454
455/* Helper for gdbscm_make_command which locates the command list to use and
456 pulls out the command name.
457
458 NAME is the command name list. The final word in the list is the
459 name of the new command. All earlier words must be existing prefix
460 commands.
461
462 *BASE_LIST is set to the final prefix command's list of
463 *sub-commands.
464
465 START_LIST is the list in which the search starts.
466
467 This function returns the xmalloc()d name of the new command.
468 On error a Scheme exception is thrown. */
469
470char *
471gdbscm_parse_command_name (const char *name,
472 const char *func_name, int arg_pos,
473 struct cmd_list_element ***base_list,
474 struct cmd_list_element **start_list)
475{
476 struct cmd_list_element *elt;
477 int len = strlen (name);
478 int i, lastchar;
479 char *prefix_text;
480 const char *prefix_text2;
481 char *result, *msg;
482
483 /* Skip trailing whitespace. */
484 for (i = len - 1; i >= 0 && (name[i] == ' ' || name[i] == '\t'); --i)
485 ;
486 if (i < 0)
487 {
488 gdbscm_out_of_range_error (func_name, arg_pos,
489 gdbscm_scm_from_c_string (name),
490 _("no command name found"));
491 }
492 lastchar = i;
493
494 /* Find first character of the final word. */
be09caf1 495 for (; i > 0 && valid_cmd_char_p (name[i - 1]); --i)
e698b8c4 496 ;
224c3ddb 497 result = (char *) xmalloc (lastchar - i + 2);
e698b8c4
DE
498 memcpy (result, &name[i], lastchar - i + 1);
499 result[lastchar - i + 1] = '\0';
500
501 /* Skip whitespace again. */
502 for (--i; i >= 0 && (name[i] == ' ' || name[i] == '\t'); --i)
503 ;
504 if (i < 0)
505 {
506 *base_list = start_list;
507 return result;
508 }
509
224c3ddb 510 prefix_text = (char *) xmalloc (i + 2);
e698b8c4
DE
511 memcpy (prefix_text, name, i + 1);
512 prefix_text[i + 1] = '\0';
513
514 prefix_text2 = prefix_text;
cf00cd6f 515 elt = lookup_cmd_1 (&prefix_text2, *start_list, NULL, NULL, 1);
d81412aa 516 if (elt == NULL || elt == CMD_LIST_AMBIGUOUS)
e698b8c4
DE
517 {
518 msg = xstrprintf (_("could not find command prefix '%s'"), prefix_text);
519 xfree (prefix_text);
520 xfree (result);
c6486df5 521 scm_dynwind_begin ((scm_t_dynwind_flags) 0);
e698b8c4
DE
522 gdbscm_dynwind_xfree (msg);
523 gdbscm_out_of_range_error (func_name, arg_pos,
524 gdbscm_scm_from_c_string (name), msg);
525 }
526
3d0b3564 527 if (elt->is_prefix ())
e698b8c4
DE
528 {
529 xfree (prefix_text);
14b42fc4 530 *base_list = elt->subcommands;
e698b8c4
DE
531 return result;
532 }
533
534 msg = xstrprintf (_("'%s' is not a prefix command"), prefix_text);
535 xfree (prefix_text);
536 xfree (result);
c6486df5 537 scm_dynwind_begin ((scm_t_dynwind_flags) 0);
e698b8c4
DE
538 gdbscm_dynwind_xfree (msg);
539 gdbscm_out_of_range_error (func_name, arg_pos,
540 gdbscm_scm_from_c_string (name), msg);
541 /* NOTREACHED */
542}
543
544static const scheme_integer_constant command_classes[] =
545{
546 /* Note: alias and user are special; pseudo appears to be unused,
4f45d445 547 and there is no reason to expose tui, I think. */
e698b8c4
DE
548 { "COMMAND_NONE", no_class },
549 { "COMMAND_RUNNING", class_run },
550 { "COMMAND_DATA", class_vars },
551 { "COMMAND_STACK", class_stack },
552 { "COMMAND_FILES", class_files },
553 { "COMMAND_SUPPORT", class_support },
554 { "COMMAND_STATUS", class_info },
555 { "COMMAND_BREAKPOINTS", class_breakpoint },
556 { "COMMAND_TRACEPOINTS", class_trace },
557 { "COMMAND_OBSCURE", class_obscure },
558 { "COMMAND_MAINTENANCE", class_maintenance },
559 { "COMMAND_USER", class_user },
560
561 END_INTEGER_CONSTANTS
562};
563
564/* Return non-zero if command_class is a valid command class. */
565
566int
567gdbscm_valid_command_class_p (int command_class)
568{
569 int i;
570
571 for (i = 0; command_classes[i].name != NULL; ++i)
572 {
573 if (command_classes[i].value == command_class)
574 return 1;
575 }
576
577 return 0;
578}
579
580/* Return a normalized form of command NAME.
581 That is tabs are replaced with spaces and multiple spaces are replaced
582 with a single space.
583 If WANT_TRAILING_SPACE is non-zero, add one space at the end. This is for
584 prefix commands.
585 but that is the caller's responsibility.
586 Space for the result is allocated on the GC heap. */
587
06eb1586
DE
588char *
589gdbscm_canonicalize_command_name (const char *name, int want_trailing_space)
e698b8c4
DE
590{
591 int i, out, seen_word;
224c3ddb
SM
592 char *result
593 = (char *) scm_gc_malloc_pointerless (strlen (name) + 2, FUNC_NAME);
e698b8c4
DE
594
595 i = out = seen_word = 0;
596 while (name[i])
597 {
598 /* Skip whitespace. */
599 while (name[i] == ' ' || name[i] == '\t')
600 ++i;
601 /* Copy non-whitespace characters. */
602 if (name[i])
603 {
604 if (seen_word)
605 result[out++] = ' ';
606 while (name[i] && name[i] != ' ' && name[i] != '\t')
607 result[out++] = name[i++];
608 seen_word = 1;
609 }
610 }
611 if (want_trailing_space)
612 result[out++] = ' ';
613 result[out] = '\0';
614
615 return result;
616}
617
618/* (make-command name [#:invoke lambda]
619 [#:command-class class] [#:completer-class completer]
620 [#:prefix? <bool>] [#:doc <string>]) -> <gdb:command>
621
622 NAME is the name of the command. It may consist of multiple words,
623 in which case the final word is the name of the new command, and
624 earlier words must be prefix commands.
625
626 INVOKE is a procedure of three arguments that performs the command when
627 invoked: (lambda (self arg from-tty) ...).
628 Its result is unspecified.
629
630 CLASS is the kind of command. It must be one of the COMMAND_*
631 constants defined in the gdb module. If not specified, "no_class" is used.
632
633 COMPLETER is the kind of completer. It must be either:
634 #f - completion is not supported for this command.
635 One of the COMPLETE_* constants defined in the gdb module.
636 A procedure of three arguments: (lambda (self text word) ...).
637 Its result is one of:
dda83cd7
SM
638 A list of strings.
639 A <gdb:iterator> object that returns the set of possible completions,
640 ending with #f.
e698b8c4
DE
641 TODO(dje): Once PR 16699 is fixed, add support for returning
642 a COMPLETE_* constant.
643 If not specified, then completion is not supported for this command.
644
645 If PREFIX is #t, then this command is a prefix command.
646
647 DOC is the doc string for the command.
648
649 The result is the <gdb:command> Scheme object.
650 The command is not available to be used yet, however.
651 It must still be added to gdb with register-command!. */
652
653static SCM
654gdbscm_make_command (SCM name_scm, SCM rest)
655{
656 const SCM keywords[] = {
657 invoke_keyword, command_class_keyword, completer_class_keyword,
658 prefix_p_keyword, doc_keyword, SCM_BOOL_F
659 };
660 int invoke_arg_pos = -1, command_class_arg_pos = 1;
661 int completer_class_arg_pos = -1, is_prefix_arg_pos = -1;
662 int doc_arg_pos = -1;
663 char *s;
664 char *name;
f486487f 665 enum command_class command_class = no_class;
e698b8c4
DE
666 SCM completer_class = SCM_BOOL_F;
667 int is_prefix = 0;
668 char *doc = NULL;
669 SCM invoke = SCM_BOOL_F;
670 SCM c_scm;
671 command_smob *c_smob;
672
673 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#OiOts",
674 name_scm, &name, rest,
675 &invoke_arg_pos, &invoke,
676 &command_class_arg_pos, &command_class,
677 &completer_class_arg_pos, &completer_class,
678 &is_prefix_arg_pos, &is_prefix,
679 &doc_arg_pos, &doc);
680
681 if (doc == NULL)
682 doc = xstrdup (_("This command is not documented."));
683
684 s = name;
06eb1586 685 name = gdbscm_canonicalize_command_name (s, is_prefix);
e698b8c4
DE
686 xfree (s);
687 s = doc;
688 doc = gdbscm_gc_xstrdup (s);
689 xfree (s);
690
691 if (is_prefix
692 ? name[0] == ' '
693 : name[0] == '\0')
694 {
695 gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, name_scm,
696 _("no command name found"));
697 }
698
699 if (gdbscm_is_true (invoke))
700 {
701 SCM_ASSERT_TYPE (gdbscm_is_procedure (invoke), invoke,
702 invoke_arg_pos, FUNC_NAME, _("procedure"));
703 }
704
705 if (!gdbscm_valid_command_class_p (command_class))
706 {
707 gdbscm_out_of_range_error (FUNC_NAME, command_class_arg_pos,
708 scm_from_int (command_class),
709 _("invalid command class argument"));
710 }
711
712 SCM_ASSERT_TYPE (gdbscm_is_false (completer_class)
713 || scm_is_integer (completer_class)
714 || gdbscm_is_procedure (completer_class),
715 completer_class, completer_class_arg_pos, FUNC_NAME,
716 _("integer or procedure"));
717 if (scm_is_integer (completer_class)
718 && !scm_is_signed_integer (completer_class, 0, N_COMPLETERS - 1))
719 {
720 gdbscm_out_of_range_error (FUNC_NAME, completer_class_arg_pos,
721 completer_class,
722 _("invalid completion type argument"));
723 }
724
725 c_scm = cmdscm_make_command_smob ();
726 c_smob = (command_smob *) SCM_SMOB_DATA (c_scm);
727 c_smob->name = name;
728 c_smob->is_prefix = is_prefix;
729 c_smob->cmd_class = command_class;
730 c_smob->doc = doc;
731 c_smob->invoke = invoke;
732 c_smob->complete = completer_class;
733
734 return c_scm;
735}
736
737/* (register-command! <gdb:command>) -> unspecified
738
739 It is an error to register a command more than once. */
740
741static SCM
742gdbscm_register_command_x (SCM self)
743{
744 command_smob *c_smob
745 = cmdscm_get_command_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
798a7429 746 char *cmd_name;
e698b8c4
DE
747 struct cmd_list_element **cmd_list;
748 struct cmd_list_element *cmd = NULL;
e698b8c4
DE
749
750 if (cmdscm_is_valid (c_smob))
751 scm_misc_error (FUNC_NAME, _("command is already registered"), SCM_EOL);
752
753 cmd_name = gdbscm_parse_command_name (c_smob->name, FUNC_NAME, SCM_ARG1,
754 &cmd_list, &cmdlist);
755 c_smob->cmd_name = gdbscm_gc_xstrdup (cmd_name);
756 xfree (cmd_name);
757
680d7fd5 758 gdbscm_gdb_exception exc {};
a70b8144 759 try
e698b8c4
DE
760 {
761 if (c_smob->is_prefix)
762 {
763 /* If we have our own "invoke" method, then allow unknown
764 sub-commands. */
765 int allow_unknown = gdbscm_is_true (c_smob->invoke);
766
767 cmd = add_prefix_cmd (c_smob->cmd_name, c_smob->cmd_class,
768 NULL, c_smob->doc, &c_smob->sub_list,
2f822da5 769 allow_unknown, cmd_list);
e698b8c4
DE
770 }
771 else
772 {
773 cmd = add_cmd (c_smob->cmd_name, c_smob->cmd_class,
0450cc4c 774 c_smob->doc, cmd_list);
e698b8c4
DE
775 }
776 }
230d2906 777 catch (const gdb_exception &except)
492d29ea 778 {
680d7fd5 779 exc = unpack (except);
492d29ea 780 }
680d7fd5 781 GDBSCM_HANDLE_GDB_EXCEPTION (exc);
e698b8c4
DE
782
783 /* Note: At this point the command exists in gdb.
784 So no more errors after this point. */
785
786 /* There appears to be no API to set this. */
787 cmd->func = cmdscm_function;
788 cmd->destroyer = cmdscm_destroyer;
789
790 c_smob->command = cmd;
0f8e2034 791 cmd->set_context (c_smob);
e698b8c4
DE
792
793 if (gdbscm_is_true (c_smob->complete))
794 {
795 set_cmd_completer (cmd,
796 scm_is_integer (c_smob->complete)
797 ? cmdscm_completers[scm_to_int (c_smob->complete)].completer
798 : cmdscm_completer);
799 }
800
801 /* The owner of this command is not in GC-controlled memory, so we need
802 to protect it from GC until the command is deleted. */
803 scm_gc_protect_object (c_smob->containing_scm);
804
805 return SCM_UNSPECIFIED;
806}
807\f
808/* Initialize the Scheme command support. */
809
810static const scheme_function command_functions[] =
811{
72e02483 812 { "make-command", 1, 0, 1, as_a_scm_t_subr (gdbscm_make_command),
e698b8c4
DE
813 "\
814Make a GDB command object.\n\
815\n\
816 Arguments: name [#:invoke lambda]\n\
817 [#:command-class <class>] [#:completer-class <completer>]\n\
818 [#:prefix? <bool>] [#:doc string]\n\
819 name: The name of the command. It may consist of multiple words,\n\
820 in which case the final word is the name of the new command, and\n\
821 earlier words must be prefix commands.\n\
822 invoke: A procedure of three arguments to perform the command.\n\
823 (lambda (self arg from-tty) ...)\n\
824 Its result is unspecified.\n\
825 class: The class of the command, one of COMMAND_*.\n\
826 The default is COMMAND_NONE.\n\
827 completer: The kind of completer, #f, one of COMPLETE_*, or a procedure\n\
828 to perform the completion: (lambda (self text word) ...).\n\
829 prefix?: If true then the command is a prefix command.\n\
830 doc: The \"doc string\" of the command.\n\
831 Returns: <gdb:command> object" },
832
72e02483 833 { "register-command!", 1, 0, 0, as_a_scm_t_subr (gdbscm_register_command_x),
e698b8c4
DE
834 "\
835Register a <gdb:command> object with GDB." },
836
72e02483 837 { "command?", 1, 0, 0, as_a_scm_t_subr (gdbscm_command_p),
e698b8c4
DE
838 "\
839Return #t if the object is a <gdb:command> object." },
840
72e02483 841 { "command-valid?", 1, 0, 0, as_a_scm_t_subr (gdbscm_command_valid_p),
e698b8c4
DE
842 "\
843Return #t if the <gdb:command> object is valid." },
844
72e02483 845 { "dont-repeat", 1, 0, 0, as_a_scm_t_subr (gdbscm_dont_repeat),
e698b8c4
DE
846 "\
847Prevent command repetition when user enters an empty line.\n\
848\n\
849 Arguments: <gdb:command>\n\
850 Returns: unspecified" },
851
852 END_FUNCTIONS
853};
854
855/* Initialize the 'commands' code. */
856
857void
858gdbscm_initialize_commands (void)
859{
860 int i;
861
862 command_smob_tag
863 = gdbscm_make_smob_type (command_smob_name, sizeof (command_smob));
864 scm_set_smob_print (command_smob_tag, cmdscm_print_command_smob);
865
866 gdbscm_define_integer_constants (command_classes, 1);
867 gdbscm_define_functions (command_functions, 1);
868
869 for (i = 0; i < N_COMPLETERS; ++i)
870 {
871 scm_c_define (cmdscm_completers[i].name, scm_from_int (i));
872 scm_c_export (cmdscm_completers[i].name, NULL);
873 }
874
875 invoke_keyword = scm_from_latin1_keyword ("invoke");
876 command_class_keyword = scm_from_latin1_keyword ("command-class");
877 completer_class_keyword = scm_from_latin1_keyword ("completer-class");
878 prefix_p_keyword = scm_from_latin1_keyword ("prefix?");
879 doc_keyword = scm_from_latin1_keyword ("doc");
880}
This page took 0.787212 seconds and 4 git commands to generate.