gdb: change functions returning value contents to use gdb::array_view
[binutils-gdb.git] / gdb / guile / scm-cmd.c
1 /* GDB commands implemented in Scheme.
2
3 Copyright (C) 2008-2021 Free Software Foundation, Inc.
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>
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
40 struct command_smob
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;
88 };
89
90 static const char command_smob_name[] = "gdb:command";
91
92 /* The tag Guile knows the objfile smob by. */
93 static scm_t_bits command_smob_tag;
94
95 /* Keywords used by make-command. */
96 static SCM invoke_keyword;
97 static SCM command_class_keyword;
98 static SCM completer_class_keyword;
99 static SCM prefix_p_keyword;
100 static SCM doc_keyword;
101
102 /* Struct representing built-in completion types. */
103 struct cmdscm_completer
104 {
105 /* Scheme symbol name. */
106 const char *name;
107 /* Completion function. */
108 completer_ftype *completer;
109 };
110
111 static 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 },
117 { "COMPLETE_SYMBOL", symbol_completer },
118 { "COMPLETE_EXPRESSION", expression_completer },
119 };
120
121 #define N_COMPLETERS (sizeof (cmdscm_completers) \
122 / sizeof (cmdscm_completers[0]))
123
124 static int cmdscm_is_valid (command_smob *);
125 \f
126 /* Administrivia for command smobs. */
127
128 /* The smob "print" function for <gdb:command>. */
129
130 static int
131 cmdscm_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
155 static SCM
156 cmdscm_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
175 static void
176 cmdscm_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
184 static int
185 cmdscm_is_command (SCM scm)
186 {
187 return SCM_SMOB_PREDICATE (command_smob_tag, scm);
188 }
189
190 /* (command? scm) -> boolean */
191
192 static SCM
193 gdbscm_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
201 static SCM
202 cmdscm_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
213 static command_smob *
214 cmdscm_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
225 static int
226 cmdscm_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
234 static command_smob *
235 cmdscm_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
255 static SCM
256 gdbscm_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
267 static SCM
268 gdbscm_dont_repeat (SCM self)
269 {
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);
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
283 static void
284 cmdscm_destroyer (struct cmd_list_element *self, void *context)
285 {
286 command_smob *c_smob = (command_smob *) context;
287
288 cmdscm_release_command (c_smob);
289 }
290
291 /* Called by gdb to invoke the command. */
292
293 static void
294 cmdscm_function (const char *args, int from_tty, cmd_list_element *command)
295 {
296 command_smob *c_smob/*obj*/ = (command_smob *) command->context ();
297 SCM arg_scm, tty_scm, result;
298
299 gdb_assert (c_smob != NULL);
300
301 if (args == NULL)
302 args = "";
303 arg_scm = gdbscm_scm_from_string (args, strlen (args), host_charset (), 1);
304 if (gdbscm_is_exception (arg_scm))
305 error (_("Could not convert arguments to Scheme string."));
306
307 tty_scm = scm_from_bool (from_tty);
308
309 result = gdbscm_safe_call_3 (c_smob->invoke, c_smob->containing_scm,
310 arg_scm, tty_scm, gdbscm_user_error_p);
311
312 if (gdbscm_is_exception (result))
313 {
314 /* Don't print the stack if this was an error signalled by the command
315 itself. */
316 if (gdbscm_user_error_p (gdbscm_exception_key (result)))
317 {
318 gdb::unique_xmalloc_ptr<char> msg
319 = gdbscm_exception_message_to_string (result);
320
321 error ("%s", msg.get ());
322 }
323 else
324 {
325 gdbscm_print_gdb_exception (SCM_BOOL_F, result);
326 error (_("Error occurred in Scheme-implemented GDB command."));
327 }
328 }
329 }
330
331 /* Subroutine of cmdscm_completer to simplify it.
332 Print an error message indicating that COMPLETION is a bad completion
333 result. */
334
335 static void
336 cmdscm_bad_completion_result (const char *msg, SCM completion)
337 {
338 SCM port = scm_current_error_port ();
339
340 scm_puts (msg, port);
341 scm_display (completion, port);
342 scm_newline (port);
343 }
344
345 /* Subroutine of cmdscm_completer to simplify it.
346 Validate COMPLETION and add to RESULT.
347 If an error occurs print an error message.
348 The result is a boolean indicating success. */
349
350 static int
351 cmdscm_add_completion (SCM completion, completion_tracker &tracker)
352 {
353 SCM except_scm;
354
355 if (!scm_is_string (completion))
356 {
357 /* Inform the user, but otherwise ignore the entire result. */
358 cmdscm_bad_completion_result (_("Bad text from completer: "),
359 completion);
360 return 0;
361 }
362
363 gdb::unique_xmalloc_ptr<char> item
364 = gdbscm_scm_to_string (completion, NULL, host_charset (), 1,
365 &except_scm);
366 if (item == NULL)
367 {
368 /* Inform the user, but otherwise ignore the entire result. */
369 gdbscm_print_gdb_exception (SCM_BOOL_F, except_scm);
370 return 0;
371 }
372
373 tracker.add_completion (std::move (item));
374
375 return 1;
376 }
377
378 /* Called by gdb for command completion. */
379
380 static void
381 cmdscm_completer (struct cmd_list_element *command,
382 completion_tracker &tracker,
383 const char *text, const char *word)
384 {
385 command_smob *c_smob/*obj*/ = (command_smob *) command->context ();
386 SCM completer_result_scm;
387 SCM text_scm, word_scm;
388
389 gdb_assert (c_smob != NULL);
390 gdb_assert (gdbscm_is_procedure (c_smob->complete));
391
392 text_scm = gdbscm_scm_from_string (text, strlen (text), host_charset (),
393 1);
394 if (gdbscm_is_exception (text_scm))
395 error (_("Could not convert \"text\" argument to Scheme string."));
396 word_scm = gdbscm_scm_from_string (word, strlen (word), host_charset (),
397 1);
398 if (gdbscm_is_exception (word_scm))
399 error (_("Could not convert \"word\" argument to Scheme string."));
400
401 completer_result_scm
402 = gdbscm_safe_call_3 (c_smob->complete, c_smob->containing_scm,
403 text_scm, word_scm, NULL);
404
405 if (gdbscm_is_exception (completer_result_scm))
406 {
407 /* Inform the user, but otherwise ignore. */
408 gdbscm_print_gdb_exception (SCM_BOOL_F, completer_result_scm);
409 return;
410 }
411
412 if (gdbscm_is_true (scm_list_p (completer_result_scm)))
413 {
414 SCM list = completer_result_scm;
415
416 while (!scm_is_eq (list, SCM_EOL))
417 {
418 SCM next = scm_car (list);
419
420 if (!cmdscm_add_completion (next, tracker))
421 break;
422
423 list = scm_cdr (list);
424 }
425 }
426 else if (itscm_is_iterator (completer_result_scm))
427 {
428 SCM iter = completer_result_scm;
429 SCM next = itscm_safe_call_next_x (iter, NULL);
430
431 while (gdbscm_is_true (next))
432 {
433 if (gdbscm_is_exception (next))
434 {
435 /* Inform the user. */
436 gdbscm_print_gdb_exception (SCM_BOOL_F, completer_result_scm);
437 break;
438 }
439
440 if (cmdscm_add_completion (next, tracker))
441 break;
442
443 next = itscm_safe_call_next_x (iter, NULL);
444 }
445 }
446 else
447 {
448 /* Inform the user, but otherwise ignore. */
449 cmdscm_bad_completion_result (_("Bad completer result: "),
450 completer_result_scm);
451 }
452 }
453
454 /* Helper for gdbscm_make_command which locates the command list to use and
455 pulls out the command name.
456
457 NAME is the command name list. The final word in the list is the
458 name of the new command. All earlier words must be existing prefix
459 commands.
460
461 *BASE_LIST is set to the final prefix command's list of
462 *sub-commands.
463
464 START_LIST is the list in which the search starts.
465
466 This function returns the xmalloc()d name of the new command.
467 On error a Scheme exception is thrown. */
468
469 char *
470 gdbscm_parse_command_name (const char *name,
471 const char *func_name, int arg_pos,
472 struct cmd_list_element ***base_list,
473 struct cmd_list_element **start_list)
474 {
475 struct cmd_list_element *elt;
476 int len = strlen (name);
477 int i, lastchar;
478 char *prefix_text;
479 const char *prefix_text2;
480 char *result, *msg;
481
482 /* Skip trailing whitespace. */
483 for (i = len - 1; i >= 0 && (name[i] == ' ' || name[i] == '\t'); --i)
484 ;
485 if (i < 0)
486 {
487 gdbscm_out_of_range_error (func_name, arg_pos,
488 gdbscm_scm_from_c_string (name),
489 _("no command name found"));
490 }
491 lastchar = i;
492
493 /* Find first character of the final word. */
494 for (; i > 0 && valid_cmd_char_p (name[i - 1]); --i)
495 ;
496 result = (char *) xmalloc (lastchar - i + 2);
497 memcpy (result, &name[i], lastchar - i + 1);
498 result[lastchar - i + 1] = '\0';
499
500 /* Skip whitespace again. */
501 for (--i; i >= 0 && (name[i] == ' ' || name[i] == '\t'); --i)
502 ;
503 if (i < 0)
504 {
505 *base_list = start_list;
506 return result;
507 }
508
509 prefix_text = (char *) xmalloc (i + 2);
510 memcpy (prefix_text, name, i + 1);
511 prefix_text[i + 1] = '\0';
512
513 prefix_text2 = prefix_text;
514 elt = lookup_cmd_1 (&prefix_text2, *start_list, NULL, NULL, 1);
515 if (elt == NULL || elt == CMD_LIST_AMBIGUOUS)
516 {
517 msg = xstrprintf (_("could not find command prefix '%s'"), prefix_text);
518 xfree (prefix_text);
519 xfree (result);
520 scm_dynwind_begin ((scm_t_dynwind_flags) 0);
521 gdbscm_dynwind_xfree (msg);
522 gdbscm_out_of_range_error (func_name, arg_pos,
523 gdbscm_scm_from_c_string (name), msg);
524 }
525
526 if (elt->is_prefix ())
527 {
528 xfree (prefix_text);
529 *base_list = elt->subcommands;
530 return result;
531 }
532
533 msg = xstrprintf (_("'%s' is not a prefix command"), prefix_text);
534 xfree (prefix_text);
535 xfree (result);
536 scm_dynwind_begin ((scm_t_dynwind_flags) 0);
537 gdbscm_dynwind_xfree (msg);
538 gdbscm_out_of_range_error (func_name, arg_pos,
539 gdbscm_scm_from_c_string (name), msg);
540 /* NOTREACHED */
541 }
542
543 static const scheme_integer_constant command_classes[] =
544 {
545 /* Note: alias and user are special; pseudo appears to be unused,
546 and there is no reason to expose tui, I think. */
547 { "COMMAND_NONE", no_class },
548 { "COMMAND_RUNNING", class_run },
549 { "COMMAND_DATA", class_vars },
550 { "COMMAND_STACK", class_stack },
551 { "COMMAND_FILES", class_files },
552 { "COMMAND_SUPPORT", class_support },
553 { "COMMAND_STATUS", class_info },
554 { "COMMAND_BREAKPOINTS", class_breakpoint },
555 { "COMMAND_TRACEPOINTS", class_trace },
556 { "COMMAND_OBSCURE", class_obscure },
557 { "COMMAND_MAINTENANCE", class_maintenance },
558 { "COMMAND_USER", class_user },
559
560 END_INTEGER_CONSTANTS
561 };
562
563 /* Return non-zero if command_class is a valid command class. */
564
565 int
566 gdbscm_valid_command_class_p (int command_class)
567 {
568 int i;
569
570 for (i = 0; command_classes[i].name != NULL; ++i)
571 {
572 if (command_classes[i].value == command_class)
573 return 1;
574 }
575
576 return 0;
577 }
578
579 /* Return a normalized form of command NAME.
580 That is tabs are replaced with spaces and multiple spaces are replaced
581 with a single space.
582 If WANT_TRAILING_SPACE is non-zero, add one space at the end. This is for
583 prefix commands.
584 but that is the caller's responsibility.
585 Space for the result is allocated on the GC heap. */
586
587 char *
588 gdbscm_canonicalize_command_name (const char *name, int want_trailing_space)
589 {
590 int i, out, seen_word;
591 char *result
592 = (char *) scm_gc_malloc_pointerless (strlen (name) + 2, FUNC_NAME);
593
594 i = out = seen_word = 0;
595 while (name[i])
596 {
597 /* Skip whitespace. */
598 while (name[i] == ' ' || name[i] == '\t')
599 ++i;
600 /* Copy non-whitespace characters. */
601 if (name[i])
602 {
603 if (seen_word)
604 result[out++] = ' ';
605 while (name[i] && name[i] != ' ' && name[i] != '\t')
606 result[out++] = name[i++];
607 seen_word = 1;
608 }
609 }
610 if (want_trailing_space)
611 result[out++] = ' ';
612 result[out] = '\0';
613
614 return result;
615 }
616
617 /* (make-command name [#:invoke lambda]
618 [#:command-class class] [#:completer-class completer]
619 [#:prefix? <bool>] [#:doc <string>]) -> <gdb:command>
620
621 NAME is the name of the command. It may consist of multiple words,
622 in which case the final word is the name of the new command, and
623 earlier words must be prefix commands.
624
625 INVOKE is a procedure of three arguments that performs the command when
626 invoked: (lambda (self arg from-tty) ...).
627 Its result is unspecified.
628
629 CLASS is the kind of command. It must be one of the COMMAND_*
630 constants defined in the gdb module. If not specified, "no_class" is used.
631
632 COMPLETER is the kind of completer. It must be either:
633 #f - completion is not supported for this command.
634 One of the COMPLETE_* constants defined in the gdb module.
635 A procedure of three arguments: (lambda (self text word) ...).
636 Its result is one of:
637 A list of strings.
638 A <gdb:iterator> object that returns the set of possible completions,
639 ending with #f.
640 TODO(dje): Once PR 16699 is fixed, add support for returning
641 a COMPLETE_* constant.
642 If not specified, then completion is not supported for this command.
643
644 If PREFIX is #t, then this command is a prefix command.
645
646 DOC is the doc string for the command.
647
648 The result is the <gdb:command> Scheme object.
649 The command is not available to be used yet, however.
650 It must still be added to gdb with register-command!. */
651
652 static SCM
653 gdbscm_make_command (SCM name_scm, SCM rest)
654 {
655 const SCM keywords[] = {
656 invoke_keyword, command_class_keyword, completer_class_keyword,
657 prefix_p_keyword, doc_keyword, SCM_BOOL_F
658 };
659 int invoke_arg_pos = -1, command_class_arg_pos = 1;
660 int completer_class_arg_pos = -1, is_prefix_arg_pos = -1;
661 int doc_arg_pos = -1;
662 char *s;
663 char *name;
664 enum command_class command_class = no_class;
665 SCM completer_class = SCM_BOOL_F;
666 int is_prefix = 0;
667 char *doc = NULL;
668 SCM invoke = SCM_BOOL_F;
669 SCM c_scm;
670 command_smob *c_smob;
671
672 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#OiOts",
673 name_scm, &name, rest,
674 &invoke_arg_pos, &invoke,
675 &command_class_arg_pos, &command_class,
676 &completer_class_arg_pos, &completer_class,
677 &is_prefix_arg_pos, &is_prefix,
678 &doc_arg_pos, &doc);
679
680 if (doc == NULL)
681 doc = xstrdup (_("This command is not documented."));
682
683 s = name;
684 name = gdbscm_canonicalize_command_name (s, is_prefix);
685 xfree (s);
686 s = doc;
687 doc = gdbscm_gc_xstrdup (s);
688 xfree (s);
689
690 if (is_prefix
691 ? name[0] == ' '
692 : name[0] == '\0')
693 {
694 gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, name_scm,
695 _("no command name found"));
696 }
697
698 if (gdbscm_is_true (invoke))
699 {
700 SCM_ASSERT_TYPE (gdbscm_is_procedure (invoke), invoke,
701 invoke_arg_pos, FUNC_NAME, _("procedure"));
702 }
703
704 if (!gdbscm_valid_command_class_p (command_class))
705 {
706 gdbscm_out_of_range_error (FUNC_NAME, command_class_arg_pos,
707 scm_from_int (command_class),
708 _("invalid command class argument"));
709 }
710
711 SCM_ASSERT_TYPE (gdbscm_is_false (completer_class)
712 || scm_is_integer (completer_class)
713 || gdbscm_is_procedure (completer_class),
714 completer_class, completer_class_arg_pos, FUNC_NAME,
715 _("integer or procedure"));
716 if (scm_is_integer (completer_class)
717 && !scm_is_signed_integer (completer_class, 0, N_COMPLETERS - 1))
718 {
719 gdbscm_out_of_range_error (FUNC_NAME, completer_class_arg_pos,
720 completer_class,
721 _("invalid completion type argument"));
722 }
723
724 c_scm = cmdscm_make_command_smob ();
725 c_smob = (command_smob *) SCM_SMOB_DATA (c_scm);
726 c_smob->name = name;
727 c_smob->is_prefix = is_prefix;
728 c_smob->cmd_class = command_class;
729 c_smob->doc = doc;
730 c_smob->invoke = invoke;
731 c_smob->complete = completer_class;
732
733 return c_scm;
734 }
735
736 /* (register-command! <gdb:command>) -> unspecified
737
738 It is an error to register a command more than once. */
739
740 static SCM
741 gdbscm_register_command_x (SCM self)
742 {
743 command_smob *c_smob
744 = cmdscm_get_command_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
745 char *cmd_name;
746 struct cmd_list_element **cmd_list;
747 struct cmd_list_element *cmd = NULL;
748
749 if (cmdscm_is_valid (c_smob))
750 scm_misc_error (FUNC_NAME, _("command is already registered"), SCM_EOL);
751
752 cmd_name = gdbscm_parse_command_name (c_smob->name, FUNC_NAME, SCM_ARG1,
753 &cmd_list, &cmdlist);
754 c_smob->cmd_name = gdbscm_gc_xstrdup (cmd_name);
755 xfree (cmd_name);
756
757 gdbscm_gdb_exception exc {};
758 try
759 {
760 if (c_smob->is_prefix)
761 {
762 /* If we have our own "invoke" method, then allow unknown
763 sub-commands. */
764 int allow_unknown = gdbscm_is_true (c_smob->invoke);
765
766 cmd = add_prefix_cmd (c_smob->cmd_name, c_smob->cmd_class,
767 NULL, c_smob->doc, &c_smob->sub_list,
768 allow_unknown, cmd_list);
769 }
770 else
771 {
772 cmd = add_cmd (c_smob->cmd_name, c_smob->cmd_class,
773 c_smob->doc, cmd_list);
774 }
775 }
776 catch (const gdb_exception &except)
777 {
778 exc = unpack (except);
779 }
780 GDBSCM_HANDLE_GDB_EXCEPTION (exc);
781
782 /* Note: At this point the command exists in gdb.
783 So no more errors after this point. */
784
785 /* There appears to be no API to set this. */
786 cmd->func = cmdscm_function;
787 cmd->destroyer = cmdscm_destroyer;
788
789 c_smob->command = cmd;
790 cmd->set_context (c_smob);
791
792 if (gdbscm_is_true (c_smob->complete))
793 {
794 set_cmd_completer (cmd,
795 scm_is_integer (c_smob->complete)
796 ? cmdscm_completers[scm_to_int (c_smob->complete)].completer
797 : cmdscm_completer);
798 }
799
800 /* The owner of this command is not in GC-controlled memory, so we need
801 to protect it from GC until the command is deleted. */
802 scm_gc_protect_object (c_smob->containing_scm);
803
804 return SCM_UNSPECIFIED;
805 }
806 \f
807 /* Initialize the Scheme command support. */
808
809 static const scheme_function command_functions[] =
810 {
811 { "make-command", 1, 0, 1, as_a_scm_t_subr (gdbscm_make_command),
812 "\
813 Make a GDB command object.\n\
814 \n\
815 Arguments: name [#:invoke lambda]\n\
816 [#:command-class <class>] [#:completer-class <completer>]\n\
817 [#:prefix? <bool>] [#:doc string]\n\
818 name: The name of the command. It may consist of multiple words,\n\
819 in which case the final word is the name of the new command, and\n\
820 earlier words must be prefix commands.\n\
821 invoke: A procedure of three arguments to perform the command.\n\
822 (lambda (self arg from-tty) ...)\n\
823 Its result is unspecified.\n\
824 class: The class of the command, one of COMMAND_*.\n\
825 The default is COMMAND_NONE.\n\
826 completer: The kind of completer, #f, one of COMPLETE_*, or a procedure\n\
827 to perform the completion: (lambda (self text word) ...).\n\
828 prefix?: If true then the command is a prefix command.\n\
829 doc: The \"doc string\" of the command.\n\
830 Returns: <gdb:command> object" },
831
832 { "register-command!", 1, 0, 0, as_a_scm_t_subr (gdbscm_register_command_x),
833 "\
834 Register a <gdb:command> object with GDB." },
835
836 { "command?", 1, 0, 0, as_a_scm_t_subr (gdbscm_command_p),
837 "\
838 Return #t if the object is a <gdb:command> object." },
839
840 { "command-valid?", 1, 0, 0, as_a_scm_t_subr (gdbscm_command_valid_p),
841 "\
842 Return #t if the <gdb:command> object is valid." },
843
844 { "dont-repeat", 1, 0, 0, as_a_scm_t_subr (gdbscm_dont_repeat),
845 "\
846 Prevent command repetition when user enters an empty line.\n\
847 \n\
848 Arguments: <gdb:command>\n\
849 Returns: unspecified" },
850
851 END_FUNCTIONS
852 };
853
854 /* Initialize the 'commands' code. */
855
856 void
857 gdbscm_initialize_commands (void)
858 {
859 int i;
860
861 command_smob_tag
862 = gdbscm_make_smob_type (command_smob_name, sizeof (command_smob));
863 scm_set_smob_print (command_smob_tag, cmdscm_print_command_smob);
864
865 gdbscm_define_integer_constants (command_classes, 1);
866 gdbscm_define_functions (command_functions, 1);
867
868 for (i = 0; i < N_COMPLETERS; ++i)
869 {
870 scm_c_define (cmdscm_completers[i].name, scm_from_int (i));
871 scm_c_export (cmdscm_completers[i].name, NULL);
872 }
873
874 invoke_keyword = scm_from_latin1_keyword ("invoke");
875 command_class_keyword = scm_from_latin1_keyword ("command-class");
876 completer_class_keyword = scm_from_latin1_keyword ("completer-class");
877 prefix_p_keyword = scm_from_latin1_keyword ("prefix?");
878 doc_keyword = scm_from_latin1_keyword ("doc");
879 }