Rename gdb exception types
[deliverable/binutils-gdb.git] / gdb / guile / scm-param.c
1 /* GDB parameters implemented in Guile.
2
3 Copyright (C) 2008-2019 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 #include "defs.h"
21 #include "value.h"
22 #include "charset.h"
23 #include "gdbcmd.h"
24 #include "cli/cli-decode.h"
25 #include "completer.h"
26 #include "language.h"
27 #include "arch-utils.h"
28 #include "guile-internal.h"
29
30 /* A union that can hold anything described by enum var_types. */
31
32 union pascm_variable
33 {
34 /* Hold an integer value, for boolean and integer types. */
35 int intval;
36
37 /* Hold an auto_boolean. */
38 enum auto_boolean autoboolval;
39
40 /* Hold an unsigned integer value, for uinteger. */
41 unsigned int uintval;
42
43 /* Hold a string, for the various string types. */
44 char *stringval;
45
46 /* Hold a string, for enums. */
47 const char *cstringval;
48 };
49
50 /* A GDB parameter.
51
52 Note: Parameters are added to gdb using a two step process:
53 1) Call make-parameter to create a <gdb:parameter> object.
54 2) Call register-parameter! to add the parameter to gdb.
55 It is done this way so that the constructor, make-parameter, doesn't have
56 any side-effects. This means that the smob needs to store everything
57 that was passed to make-parameter.
58
59 N.B. There is no free function for this smob.
60 All objects pointed to by this smob must live in GC space. */
61
62 typedef struct _param_smob
63 {
64 /* This always appears first. */
65 gdb_smob base;
66
67 /* The parameter name. */
68 char *name;
69
70 /* The last word of the command.
71 This is needed because add_cmd requires us to allocate space
72 for it. :-( */
73 char *cmd_name;
74
75 /* One of the COMMAND_* constants. */
76 enum command_class cmd_class;
77
78 /* The type of the parameter. */
79 enum var_types type;
80
81 /* The docs for the parameter. */
82 char *set_doc;
83 char *show_doc;
84 char *doc;
85
86 /* The corresponding gdb command objects.
87 These are NULL if the parameter has not been registered yet, or
88 is no longer registered. */
89 struct cmd_list_element *set_command;
90 struct cmd_list_element *show_command;
91
92 /* The value of the parameter. */
93 union pascm_variable value;
94
95 /* For an enum parameter, the possible values. The vector lives in GC
96 space, it will be freed with the smob. */
97 const char * const *enumeration;
98
99 /* The set_func funcion or #f if not specified.
100 This function is called *after* the parameter is set.
101 It returns a string that will be displayed to the user. */
102 SCM set_func;
103
104 /* The show_func function or #f if not specified.
105 This function returns the string that is printed. */
106 SCM show_func;
107
108 /* The <gdb:parameter> object we are contained in, needed to
109 protect/unprotect the object since a reference to it comes from
110 non-gc-managed space (the command context pointer). */
111 SCM containing_scm;
112 } param_smob;
113
114 static const char param_smob_name[] = "gdb:parameter";
115
116 /* The tag Guile knows the param smob by. */
117 static scm_t_bits parameter_smob_tag;
118
119 /* Keywords used by make-parameter!. */
120 static SCM command_class_keyword;
121 static SCM parameter_type_keyword;
122 static SCM enum_list_keyword;
123 static SCM set_func_keyword;
124 static SCM show_func_keyword;
125 static SCM doc_keyword;
126 static SCM set_doc_keyword;
127 static SCM show_doc_keyword;
128 static SCM initial_value_keyword;
129 static SCM auto_keyword;
130 static SCM unlimited_keyword;
131
132 static int pascm_is_valid (param_smob *);
133 static const char *pascm_param_type_name (enum var_types type);
134 static SCM pascm_param_value (enum var_types type, void *var,
135 int arg_pos, const char *func_name);
136 \f
137 /* Administrivia for parameter smobs. */
138
139 static int
140 pascm_print_param_smob (SCM self, SCM port, scm_print_state *pstate)
141 {
142 param_smob *p_smob = (param_smob *) SCM_SMOB_DATA (self);
143 SCM value;
144
145 gdbscm_printf (port, "#<%s", param_smob_name);
146
147 gdbscm_printf (port, " %s", p_smob->name);
148
149 if (! pascm_is_valid (p_smob))
150 scm_puts (" {invalid}", port);
151
152 gdbscm_printf (port, " %s ", pascm_param_type_name (p_smob->type));
153
154 value = pascm_param_value (p_smob->type, &p_smob->value,
155 GDBSCM_ARG_NONE, NULL);
156 scm_display (value, port);
157
158 scm_puts (">", port);
159
160 scm_remember_upto_here_1 (self);
161
162 /* Non-zero means success. */
163 return 1;
164 }
165
166 /* Create an empty (uninitialized) parameter. */
167
168 static SCM
169 pascm_make_param_smob (void)
170 {
171 param_smob *p_smob = (param_smob *)
172 scm_gc_malloc (sizeof (param_smob), param_smob_name);
173 SCM p_scm;
174
175 memset (p_smob, 0, sizeof (*p_smob));
176 p_smob->cmd_class = no_class;
177 p_smob->type = var_boolean; /* ARI: var_boolean */
178 p_smob->set_func = SCM_BOOL_F;
179 p_smob->show_func = SCM_BOOL_F;
180 p_scm = scm_new_smob (parameter_smob_tag, (scm_t_bits) p_smob);
181 p_smob->containing_scm = p_scm;
182 gdbscm_init_gsmob (&p_smob->base);
183
184 return p_scm;
185 }
186
187 /* Returns non-zero if SCM is a <gdb:parameter> object. */
188
189 static int
190 pascm_is_parameter (SCM scm)
191 {
192 return SCM_SMOB_PREDICATE (parameter_smob_tag, scm);
193 }
194
195 /* (gdb:parameter? scm) -> boolean */
196
197 static SCM
198 gdbscm_parameter_p (SCM scm)
199 {
200 return scm_from_bool (pascm_is_parameter (scm));
201 }
202
203 /* Returns the <gdb:parameter> object in SELF.
204 Throws an exception if SELF is not a <gdb:parameter> object. */
205
206 static SCM
207 pascm_get_param_arg_unsafe (SCM self, int arg_pos, const char *func_name)
208 {
209 SCM_ASSERT_TYPE (pascm_is_parameter (self), self, arg_pos, func_name,
210 param_smob_name);
211
212 return self;
213 }
214
215 /* Returns a pointer to the parameter smob of SELF.
216 Throws an exception if SELF is not a <gdb:parameter> object. */
217
218 static param_smob *
219 pascm_get_param_smob_arg_unsafe (SCM self, int arg_pos, const char *func_name)
220 {
221 SCM p_scm = pascm_get_param_arg_unsafe (self, arg_pos, func_name);
222 param_smob *p_smob = (param_smob *) SCM_SMOB_DATA (p_scm);
223
224 return p_smob;
225 }
226
227 /* Return non-zero if parameter P_SMOB is valid. */
228
229 static int
230 pascm_is_valid (param_smob *p_smob)
231 {
232 return p_smob->set_command != NULL;
233 }
234 \f
235 /* A helper function which return the default documentation string for
236 a parameter (which is to say that it's undocumented). */
237
238 static char *
239 get_doc_string (void)
240 {
241 return xstrdup (_("This command is not documented."));
242 }
243
244 /* Subroutine of pascm_set_func, pascm_show_func to simplify them.
245 Signal the error returned from calling set_func/show_func. */
246
247 static void
248 pascm_signal_setshow_error (SCM exception, const char *msg)
249 {
250 /* Don't print the stack if this was an error signalled by the command
251 itself. */
252 if (gdbscm_user_error_p (gdbscm_exception_key (exception)))
253 {
254 gdb::unique_xmalloc_ptr<char> excp_text
255 = gdbscm_exception_message_to_string (exception);
256
257 error ("%s", excp_text.get ());
258 }
259 else
260 {
261 gdbscm_print_gdb_exception (SCM_BOOL_F, exception);
262 error ("%s", msg);
263 }
264 }
265
266 /* A callback function that is registered against the respective
267 add_setshow_* set_func prototype. This function will call
268 the Scheme function "set_func" which must exist.
269 Note: ARGS is always passed as NULL. */
270
271 static void
272 pascm_set_func (const char *args, int from_tty, struct cmd_list_element *c)
273 {
274 param_smob *p_smob = (param_smob *) get_cmd_context (c);
275 SCM self, result, exception;
276
277 gdb_assert (gdbscm_is_procedure (p_smob->set_func));
278
279 self = p_smob->containing_scm;
280
281 result = gdbscm_safe_call_1 (p_smob->set_func, self, gdbscm_user_error_p);
282
283 if (gdbscm_is_exception (result))
284 {
285 pascm_signal_setshow_error (result,
286 _("Error occurred setting parameter."));
287 }
288
289 if (!scm_is_string (result))
290 error (_("Result of %s set-func is not a string."), p_smob->name);
291
292 gdb::unique_xmalloc_ptr<char> msg = gdbscm_scm_to_host_string (result, NULL,
293 &exception);
294 if (msg == NULL)
295 {
296 gdbscm_print_gdb_exception (SCM_BOOL_F, exception);
297 error (_("Error converting show text to host string."));
298 }
299
300 /* GDB is usually silent when a parameter is set. */
301 if (*msg.get () != '\0')
302 fprintf_filtered (gdb_stdout, "%s\n", msg.get ());
303 }
304
305 /* A callback function that is registered against the respective
306 add_setshow_* show_func prototype. This function will call
307 the Scheme function "show_func" which must exist and must return a
308 string that is then printed to FILE. */
309
310 static void
311 pascm_show_func (struct ui_file *file, int from_tty,
312 struct cmd_list_element *c, const char *value)
313 {
314 param_smob *p_smob = (param_smob *) get_cmd_context (c);
315 SCM value_scm, self, result, exception;
316
317 gdb_assert (gdbscm_is_procedure (p_smob->show_func));
318
319 value_scm = gdbscm_scm_from_host_string (value, strlen (value));
320 if (gdbscm_is_exception (value_scm))
321 {
322 error (_("Error converting parameter value \"%s\" to Scheme string."),
323 value);
324 }
325 self = p_smob->containing_scm;
326
327 result = gdbscm_safe_call_2 (p_smob->show_func, self, value_scm,
328 gdbscm_user_error_p);
329
330 if (gdbscm_is_exception (result))
331 {
332 pascm_signal_setshow_error (result,
333 _("Error occurred showing parameter."));
334 }
335
336 gdb::unique_xmalloc_ptr<char> msg = gdbscm_scm_to_host_string (result, NULL,
337 &exception);
338 if (msg == NULL)
339 {
340 gdbscm_print_gdb_exception (SCM_BOOL_F, exception);
341 error (_("Error converting show text to host string."));
342 }
343
344 fprintf_filtered (file, "%s\n", msg.get ());
345 }
346
347 /* A helper function that dispatches to the appropriate add_setshow
348 function. */
349
350 static void
351 add_setshow_generic (enum var_types param_type, enum command_class cmd_class,
352 char *cmd_name, param_smob *self,
353 char *set_doc, char *show_doc, char *help_doc,
354 cmd_const_sfunc_ftype *set_func,
355 show_value_ftype *show_func,
356 struct cmd_list_element **set_list,
357 struct cmd_list_element **show_list,
358 struct cmd_list_element **set_cmd,
359 struct cmd_list_element **show_cmd)
360 {
361 struct cmd_list_element *param = NULL;
362 const char *tmp_name = NULL;
363
364 switch (param_type)
365 {
366 case var_boolean:
367 add_setshow_boolean_cmd (cmd_name, cmd_class,
368 &self->value.intval,
369 set_doc, show_doc, help_doc,
370 set_func, show_func,
371 set_list, show_list);
372
373 break;
374
375 case var_auto_boolean:
376 add_setshow_auto_boolean_cmd (cmd_name, cmd_class,
377 &self->value.autoboolval,
378 set_doc, show_doc, help_doc,
379 set_func, show_func,
380 set_list, show_list);
381 break;
382
383 case var_uinteger:
384 add_setshow_uinteger_cmd (cmd_name, cmd_class,
385 &self->value.uintval,
386 set_doc, show_doc, help_doc,
387 set_func, show_func,
388 set_list, show_list);
389 break;
390
391 case var_zinteger:
392 add_setshow_zinteger_cmd (cmd_name, cmd_class,
393 &self->value.intval,
394 set_doc, show_doc, help_doc,
395 set_func, show_func,
396 set_list, show_list);
397 break;
398
399 case var_zuinteger:
400 add_setshow_zuinteger_cmd (cmd_name, cmd_class,
401 &self->value.uintval,
402 set_doc, show_doc, help_doc,
403 set_func, show_func,
404 set_list, show_list);
405 break;
406
407 case var_zuinteger_unlimited:
408 add_setshow_zuinteger_unlimited_cmd (cmd_name, cmd_class,
409 &self->value.intval,
410 set_doc, show_doc, help_doc,
411 set_func, show_func,
412 set_list, show_list);
413 break;
414
415 case var_string:
416 add_setshow_string_cmd (cmd_name, cmd_class,
417 &self->value.stringval,
418 set_doc, show_doc, help_doc,
419 set_func, show_func,
420 set_list, show_list);
421 break;
422
423 case var_string_noescape:
424 add_setshow_string_noescape_cmd (cmd_name, cmd_class,
425 &self->value.stringval,
426 set_doc, show_doc, help_doc,
427 set_func, show_func,
428 set_list, show_list);
429
430 break;
431
432 case var_optional_filename:
433 add_setshow_optional_filename_cmd (cmd_name, cmd_class,
434 &self->value.stringval,
435 set_doc, show_doc, help_doc,
436 set_func, show_func,
437 set_list, show_list);
438 break;
439
440 case var_filename:
441 add_setshow_filename_cmd (cmd_name, cmd_class,
442 &self->value.stringval,
443 set_doc, show_doc, help_doc,
444 set_func, show_func,
445 set_list, show_list);
446 break;
447
448 case var_enum:
449 add_setshow_enum_cmd (cmd_name, cmd_class,
450 self->enumeration,
451 &self->value.cstringval,
452 set_doc, show_doc, help_doc,
453 set_func, show_func,
454 set_list, show_list);
455 /* Initialize the value, just in case. */
456 self->value.cstringval = self->enumeration[0];
457 break;
458
459 default:
460 gdb_assert_not_reached ("bad param_type value");
461 }
462
463 /* Lookup created parameter, and register Scheme object against the
464 parameter context. Perform this task against both lists. */
465 tmp_name = cmd_name;
466 param = lookup_cmd (&tmp_name, *show_list, "", 0, 1);
467 gdb_assert (param != NULL);
468 set_cmd_context (param, self);
469 *set_cmd = param;
470
471 tmp_name = cmd_name;
472 param = lookup_cmd (&tmp_name, *set_list, "", 0, 1);
473 gdb_assert (param != NULL);
474 set_cmd_context (param, self);
475 *show_cmd = param;
476 }
477
478 /* Return an array of strings corresponding to the enum values for
479 ENUM_VALUES_SCM.
480 Throws an exception if there's a problem with the values.
481 Space for the result is allocated from the GC heap. */
482
483 static const char * const *
484 compute_enum_list (SCM enum_values_scm, int arg_pos, const char *func_name)
485 {
486 long i, size;
487 char **enum_values;
488 const char * const *result;
489
490 SCM_ASSERT_TYPE (gdbscm_is_true (scm_list_p (enum_values_scm)),
491 enum_values_scm, arg_pos, func_name, _("list"));
492
493 size = scm_ilength (enum_values_scm);
494 if (size == 0)
495 {
496 gdbscm_out_of_range_error (FUNC_NAME, arg_pos, enum_values_scm,
497 _("enumeration list is empty"));
498 }
499
500 enum_values = XCNEWVEC (char *, size + 1);
501
502 i = 0;
503 while (!scm_is_eq (enum_values_scm, SCM_EOL))
504 {
505 SCM value = scm_car (enum_values_scm);
506 SCM exception;
507
508 if (!scm_is_string (value))
509 {
510 freeargv (enum_values);
511 SCM_ASSERT_TYPE (0, value, arg_pos, func_name, _("string"));
512 }
513 enum_values[i] = gdbscm_scm_to_host_string (value, NULL,
514 &exception).release ();
515 if (enum_values[i] == NULL)
516 {
517 freeargv (enum_values);
518 gdbscm_throw (exception);
519 }
520 ++i;
521 enum_values_scm = scm_cdr (enum_values_scm);
522 }
523 gdb_assert (i == size);
524
525 result = gdbscm_gc_dup_argv (enum_values);
526 freeargv (enum_values);
527 return result;
528 }
529
530 static const scheme_integer_constant parameter_types[] =
531 {
532 /* Note: var_integer is deprecated, and intentionally does not
533 appear here. */
534 { "PARAM_BOOLEAN", var_boolean }, /* ARI: var_boolean */
535 { "PARAM_AUTO_BOOLEAN", var_auto_boolean },
536 { "PARAM_ZINTEGER", var_zinteger },
537 { "PARAM_UINTEGER", var_uinteger },
538 { "PARAM_ZUINTEGER", var_zuinteger },
539 { "PARAM_ZUINTEGER_UNLIMITED", var_zuinteger_unlimited },
540 { "PARAM_STRING", var_string },
541 { "PARAM_STRING_NOESCAPE", var_string_noescape },
542 { "PARAM_OPTIONAL_FILENAME", var_optional_filename },
543 { "PARAM_FILENAME", var_filename },
544 { "PARAM_ENUM", var_enum },
545
546 END_INTEGER_CONSTANTS
547 };
548
549 /* Return non-zero if PARAM_TYPE is a valid parameter type. */
550
551 static int
552 pascm_valid_parameter_type_p (int param_type)
553 {
554 int i;
555
556 for (i = 0; parameter_types[i].name != NULL; ++i)
557 {
558 if (parameter_types[i].value == param_type)
559 return 1;
560 }
561
562 return 0;
563 }
564
565 /* Return PARAM_TYPE as a string. */
566
567 static const char *
568 pascm_param_type_name (enum var_types param_type)
569 {
570 int i;
571
572 for (i = 0; parameter_types[i].name != NULL; ++i)
573 {
574 if (parameter_types[i].value == param_type)
575 return parameter_types[i].name;
576 }
577
578 gdb_assert_not_reached ("bad parameter type");
579 }
580
581 /* Return the value of a gdb parameter as a Scheme value.
582 If TYPE is not supported, then a <gdb:exception> object is returned. */
583
584 static SCM
585 pascm_param_value (enum var_types type, void *var,
586 int arg_pos, const char *func_name)
587 {
588 /* Note: We *could* support var_integer here in case someone is trying to get
589 the value of a Python-created parameter (which is the only place that
590 still supports var_integer). To further discourage its use we do not. */
591
592 switch (type)
593 {
594 case var_string:
595 case var_string_noescape:
596 case var_optional_filename:
597 case var_filename:
598 case var_enum:
599 {
600 const char *str = *(char **) var;
601
602 if (str == NULL)
603 str = "";
604 return gdbscm_scm_from_host_string (str, strlen (str));
605 }
606
607 case var_boolean:
608 {
609 if (* (int *) var)
610 return SCM_BOOL_T;
611 else
612 return SCM_BOOL_F;
613 }
614
615 case var_auto_boolean:
616 {
617 enum auto_boolean ab = * (enum auto_boolean *) var;
618
619 if (ab == AUTO_BOOLEAN_TRUE)
620 return SCM_BOOL_T;
621 else if (ab == AUTO_BOOLEAN_FALSE)
622 return SCM_BOOL_F;
623 else
624 return auto_keyword;
625 }
626
627 case var_zuinteger_unlimited:
628 if (* (int *) var == -1)
629 return unlimited_keyword;
630 gdb_assert (* (int *) var >= 0);
631 /* Fall through. */
632 case var_zinteger:
633 return scm_from_int (* (int *) var);
634
635 case var_uinteger:
636 if (* (unsigned int *) var == UINT_MAX)
637 return unlimited_keyword;
638 /* Fall through. */
639 case var_zuinteger:
640 return scm_from_uint (* (unsigned int *) var);
641
642 default:
643 break;
644 }
645
646 return gdbscm_make_out_of_range_error (func_name, arg_pos,
647 scm_from_int (type),
648 _("program error: unhandled type"));
649 }
650
651 /* Set the value of a parameter of type TYPE in VAR from VALUE.
652 ENUMERATION is the list of enum values for enum parameters, otherwise NULL.
653 Throws a Scheme exception if VALUE_SCM is invalid for TYPE. */
654
655 static void
656 pascm_set_param_value_x (enum var_types type, union pascm_variable *var,
657 const char * const *enumeration,
658 SCM value, int arg_pos, const char *func_name)
659 {
660 switch (type)
661 {
662 case var_string:
663 case var_string_noescape:
664 case var_optional_filename:
665 case var_filename:
666 SCM_ASSERT_TYPE (scm_is_string (value)
667 || (type != var_filename
668 && gdbscm_is_false (value)),
669 value, arg_pos, func_name,
670 _("string or #f for non-PARAM_FILENAME parameters"));
671 if (gdbscm_is_false (value))
672 {
673 xfree (var->stringval);
674 if (type == var_optional_filename)
675 var->stringval = xstrdup ("");
676 else
677 var->stringval = NULL;
678 }
679 else
680 {
681 SCM exception;
682
683 gdb::unique_xmalloc_ptr<char> string
684 = gdbscm_scm_to_host_string (value, NULL, &exception);
685 if (string == NULL)
686 gdbscm_throw (exception);
687 xfree (var->stringval);
688 var->stringval = string.release ();
689 }
690 break;
691
692 case var_enum:
693 {
694 int i;
695 SCM exception;
696
697 SCM_ASSERT_TYPE (scm_is_string (value), value, arg_pos, func_name,
698 _("string"));
699 gdb::unique_xmalloc_ptr<char> str
700 = gdbscm_scm_to_host_string (value, NULL, &exception);
701 if (str == NULL)
702 gdbscm_throw (exception);
703 for (i = 0; enumeration[i]; ++i)
704 {
705 if (strcmp (enumeration[i], str.get ()) == 0)
706 break;
707 }
708 if (enumeration[i] == NULL)
709 {
710 gdbscm_out_of_range_error (func_name, arg_pos, value,
711 _("not member of enumeration"));
712 }
713 var->cstringval = enumeration[i];
714 break;
715 }
716
717 case var_boolean:
718 SCM_ASSERT_TYPE (gdbscm_is_bool (value), value, arg_pos, func_name,
719 _("boolean"));
720 var->intval = gdbscm_is_true (value);
721 break;
722
723 case var_auto_boolean:
724 SCM_ASSERT_TYPE (gdbscm_is_bool (value)
725 || scm_is_eq (value, auto_keyword),
726 value, arg_pos, func_name,
727 _("boolean or #:auto"));
728 if (scm_is_eq (value, auto_keyword))
729 var->autoboolval = AUTO_BOOLEAN_AUTO;
730 else if (gdbscm_is_true (value))
731 var->autoboolval = AUTO_BOOLEAN_TRUE;
732 else
733 var->autoboolval = AUTO_BOOLEAN_FALSE;
734 break;
735
736 case var_zinteger:
737 case var_uinteger:
738 case var_zuinteger:
739 case var_zuinteger_unlimited:
740 if (type == var_uinteger
741 || type == var_zuinteger_unlimited)
742 {
743 SCM_ASSERT_TYPE (gdbscm_is_bool (value)
744 || scm_is_eq (value, unlimited_keyword),
745 value, arg_pos, func_name,
746 _("integer or #:unlimited"));
747 if (scm_is_eq (value, unlimited_keyword))
748 {
749 if (type == var_uinteger)
750 var->intval = UINT_MAX;
751 else
752 var->intval = -1;
753 break;
754 }
755 }
756 else
757 {
758 SCM_ASSERT_TYPE (scm_is_integer (value), value, arg_pos, func_name,
759 _("integer"));
760 }
761
762 if (type == var_uinteger
763 || type == var_zuinteger)
764 {
765 unsigned int u = scm_to_uint (value);
766
767 if (type == var_uinteger && u == 0)
768 u = UINT_MAX;
769 var->uintval = u;
770 }
771 else
772 {
773 int i = scm_to_int (value);
774
775 if (type == var_zuinteger_unlimited && i < -1)
776 {
777 gdbscm_out_of_range_error (func_name, arg_pos, value,
778 _("must be >= -1"));
779 }
780 var->intval = i;
781 }
782 break;
783
784 default:
785 gdb_assert_not_reached ("bad parameter type");
786 }
787 }
788 \f
789 /* Parameter Scheme functions. */
790
791 /* (make-parameter name
792 [#:command-class cmd-class] [#:parameter-type param-type]
793 [#:enum-list enum-list] [#:set-func function] [#:show-func function]
794 [#:doc <string>] [#:set-doc <string>] [#:show-doc <string>]
795 [#:initial-value initial-value]) -> <gdb:parameter>
796
797 NAME is the name of the parameter. It may consist of multiple
798 words, in which case the final word is the name of the new parameter,
799 and earlier words must be prefix commands.
800
801 CMD-CLASS is the kind of command. It should be one of the COMMAND_*
802 constants defined in the gdb module.
803
804 PARAM_TYPE is the type of the parameter. It should be one of the
805 PARAM_* constants defined in the gdb module.
806
807 If PARAM-TYPE is PARAM_ENUM, then ENUM-LIST is a list of strings that
808 are the valid values for this parameter. The first value is the default.
809
810 SET-FUNC, if provided, is called after the parameter is set.
811 It is a function of one parameter: the <gdb:parameter> object.
812 It must return a string to be displayed to the user.
813 Setting a parameter is typically a silent operation, so typically ""
814 should be returned.
815
816 SHOW-FUNC, if provided, returns the string that is printed.
817 It is a function of two parameters: the <gdb:parameter> object
818 and the current value of the parameter as a string.
819
820 DOC, SET-DOC, SHOW-DOC are the doc strings for the parameter.
821
822 INITIAL-VALUE is the initial value of the parameter.
823
824 The result is the <gdb:parameter> Scheme object.
825 The parameter is not available to be used yet, however.
826 It must still be added to gdb with register-parameter!. */
827
828 static SCM
829 gdbscm_make_parameter (SCM name_scm, SCM rest)
830 {
831 const SCM keywords[] = {
832 command_class_keyword, parameter_type_keyword, enum_list_keyword,
833 set_func_keyword, show_func_keyword,
834 doc_keyword, set_doc_keyword, show_doc_keyword,
835 initial_value_keyword, SCM_BOOL_F
836 };
837 int cmd_class_arg_pos = -1, param_type_arg_pos = -1;
838 int enum_list_arg_pos = -1, set_func_arg_pos = -1, show_func_arg_pos = -1;
839 int doc_arg_pos = -1, set_doc_arg_pos = -1, show_doc_arg_pos = -1;
840 int initial_value_arg_pos = -1;
841 char *s;
842 char *name;
843 int cmd_class = no_class;
844 int param_type = var_boolean; /* ARI: var_boolean */
845 SCM enum_list_scm = SCM_BOOL_F;
846 SCM set_func = SCM_BOOL_F, show_func = SCM_BOOL_F;
847 char *doc = NULL, *set_doc = NULL, *show_doc = NULL;
848 SCM initial_value_scm = SCM_BOOL_F;
849 const char * const *enum_list = NULL;
850 SCM p_scm;
851 param_smob *p_smob;
852
853 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#iiOOOsssO",
854 name_scm, &name, rest,
855 &cmd_class_arg_pos, &cmd_class,
856 &param_type_arg_pos, &param_type,
857 &enum_list_arg_pos, &enum_list_scm,
858 &set_func_arg_pos, &set_func,
859 &show_func_arg_pos, &show_func,
860 &doc_arg_pos, &doc,
861 &set_doc_arg_pos, &set_doc,
862 &show_doc_arg_pos, &show_doc,
863 &initial_value_arg_pos, &initial_value_scm);
864
865 /* If doc is NULL, leave it NULL. See add_setshow_cmd_full. */
866 if (set_doc == NULL)
867 set_doc = get_doc_string ();
868 if (show_doc == NULL)
869 show_doc = get_doc_string ();
870
871 s = name;
872 name = gdbscm_canonicalize_command_name (s, 0);
873 xfree (s);
874 if (doc != NULL)
875 {
876 s = doc;
877 doc = gdbscm_gc_xstrdup (s);
878 xfree (s);
879 }
880 s = set_doc;
881 set_doc = gdbscm_gc_xstrdup (s);
882 xfree (s);
883 s = show_doc;
884 show_doc = gdbscm_gc_xstrdup (s);
885 xfree (s);
886
887 if (!gdbscm_valid_command_class_p (cmd_class))
888 {
889 gdbscm_out_of_range_error (FUNC_NAME, cmd_class_arg_pos,
890 scm_from_int (cmd_class),
891 _("invalid command class argument"));
892 }
893 if (!pascm_valid_parameter_type_p (param_type))
894 {
895 gdbscm_out_of_range_error (FUNC_NAME, param_type_arg_pos,
896 scm_from_int (param_type),
897 _("invalid parameter type argument"));
898 }
899 if (enum_list_arg_pos > 0 && param_type != var_enum)
900 {
901 gdbscm_misc_error (FUNC_NAME, enum_list_arg_pos, enum_list_scm,
902 _("#:enum-values can only be provided with PARAM_ENUM"));
903 }
904 if (enum_list_arg_pos < 0 && param_type == var_enum)
905 {
906 gdbscm_misc_error (FUNC_NAME, GDBSCM_ARG_NONE, SCM_BOOL_F,
907 _("PARAM_ENUM requires an enum-values argument"));
908 }
909 if (set_func_arg_pos > 0)
910 {
911 SCM_ASSERT_TYPE (gdbscm_is_procedure (set_func), set_func,
912 set_func_arg_pos, FUNC_NAME, _("procedure"));
913 }
914 if (show_func_arg_pos > 0)
915 {
916 SCM_ASSERT_TYPE (gdbscm_is_procedure (show_func), show_func,
917 show_func_arg_pos, FUNC_NAME, _("procedure"));
918 }
919 if (param_type == var_enum)
920 {
921 /* Note: enum_list lives in GC space, so we don't have to worry about
922 freeing it if we later throw an exception. */
923 enum_list = compute_enum_list (enum_list_scm, enum_list_arg_pos,
924 FUNC_NAME);
925 }
926
927 /* If initial-value is a function, we need the parameter object constructed
928 to pass it to the function. A typical thing the function may want to do
929 is add an object-property to it to record the last known good value. */
930 p_scm = pascm_make_param_smob ();
931 p_smob = (param_smob *) SCM_SMOB_DATA (p_scm);
932 /* These are all stored in GC space so that we don't have to worry about
933 freeing them if we throw an exception. */
934 p_smob->name = name;
935 p_smob->cmd_class = (enum command_class) cmd_class;
936 p_smob->type = (enum var_types) param_type;
937 p_smob->doc = doc;
938 p_smob->set_doc = set_doc;
939 p_smob->show_doc = show_doc;
940 p_smob->enumeration = enum_list;
941 p_smob->set_func = set_func;
942 p_smob->show_func = show_func;
943
944 if (initial_value_arg_pos > 0)
945 {
946 if (gdbscm_is_procedure (initial_value_scm))
947 {
948 initial_value_scm = gdbscm_safe_call_1 (initial_value_scm,
949 p_smob->containing_scm, NULL);
950 if (gdbscm_is_exception (initial_value_scm))
951 gdbscm_throw (initial_value_scm);
952 }
953 pascm_set_param_value_x (p_smob->type, &p_smob->value, enum_list,
954 initial_value_scm,
955 initial_value_arg_pos, FUNC_NAME);
956 }
957
958 return p_scm;
959 }
960
961 /* Subroutine of gdbscm_register_parameter_x to simplify it.
962 Return non-zero if parameter NAME is already defined in LIST. */
963
964 static int
965 pascm_parameter_defined_p (const char *name, struct cmd_list_element *list)
966 {
967 struct cmd_list_element *c;
968
969 c = lookup_cmd_1 (&name, list, NULL, 1);
970
971 /* If the name is ambiguous that's ok, it's a new parameter still. */
972 return c != NULL && c != CMD_LIST_AMBIGUOUS;
973 }
974
975 /* (register-parameter! <gdb:parameter>) -> unspecified
976
977 It is an error to register a pre-existing parameter. */
978
979 static SCM
980 gdbscm_register_parameter_x (SCM self)
981 {
982 param_smob *p_smob
983 = pascm_get_param_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
984 char *cmd_name;
985 struct cmd_list_element **set_list, **show_list;
986
987 if (pascm_is_valid (p_smob))
988 scm_misc_error (FUNC_NAME, _("parameter is already registered"), SCM_EOL);
989
990 cmd_name = gdbscm_parse_command_name (p_smob->name, FUNC_NAME, SCM_ARG1,
991 &set_list, &setlist);
992 xfree (cmd_name);
993 cmd_name = gdbscm_parse_command_name (p_smob->name, FUNC_NAME, SCM_ARG1,
994 &show_list, &showlist);
995 p_smob->cmd_name = gdbscm_gc_xstrdup (cmd_name);
996 xfree (cmd_name);
997
998 if (pascm_parameter_defined_p (p_smob->cmd_name, *set_list))
999 {
1000 gdbscm_misc_error (FUNC_NAME, SCM_ARG1, self,
1001 _("parameter exists, \"set\" command is already defined"));
1002 }
1003 if (pascm_parameter_defined_p (p_smob->cmd_name, *show_list))
1004 {
1005 gdbscm_misc_error (FUNC_NAME, SCM_ARG1, self,
1006 _("parameter exists, \"show\" command is already defined"));
1007 }
1008
1009 try
1010 {
1011 add_setshow_generic (p_smob->type, p_smob->cmd_class,
1012 p_smob->cmd_name, p_smob,
1013 p_smob->set_doc, p_smob->show_doc, p_smob->doc,
1014 (gdbscm_is_procedure (p_smob->set_func)
1015 ? pascm_set_func : NULL),
1016 (gdbscm_is_procedure (p_smob->show_func)
1017 ? pascm_show_func : NULL),
1018 set_list, show_list,
1019 &p_smob->set_command, &p_smob->show_command);
1020 }
1021 catch (const gdb_exception &except)
1022 {
1023 GDBSCM_HANDLE_GDB_EXCEPTION (except);
1024 }
1025
1026 /* Note: At this point the parameter exists in gdb.
1027 So no more errors after this point. */
1028
1029 /* The owner of this parameter is not in GC-controlled memory, so we need
1030 to protect it from GC until the parameter is deleted. */
1031 scm_gc_protect_object (p_smob->containing_scm);
1032
1033 return SCM_UNSPECIFIED;
1034 }
1035
1036 /* (parameter-value <gdb:parameter>) -> value
1037 (parameter-value <string>) -> value */
1038
1039 static SCM
1040 gdbscm_parameter_value (SCM self)
1041 {
1042 SCM_ASSERT_TYPE (pascm_is_parameter (self) || scm_is_string (self),
1043 self, SCM_ARG1, FUNC_NAME, _("<gdb:parameter> or string"));
1044
1045 if (pascm_is_parameter (self))
1046 {
1047 param_smob *p_smob = pascm_get_param_smob_arg_unsafe (self, SCM_ARG1,
1048 FUNC_NAME);
1049
1050 return pascm_param_value (p_smob->type, &p_smob->value,
1051 SCM_ARG1, FUNC_NAME);
1052 }
1053 else
1054 {
1055 SCM except_scm;
1056 struct cmd_list_element *alias, *prefix, *cmd;
1057 char *newarg;
1058 int found = -1;
1059 struct gdb_exception except = exception_none;
1060
1061 gdb::unique_xmalloc_ptr<char> name
1062 = gdbscm_scm_to_host_string (self, NULL, &except_scm);
1063 if (name == NULL)
1064 gdbscm_throw (except_scm);
1065 newarg = concat ("show ", name.get (), (char *) NULL);
1066 try
1067 {
1068 found = lookup_cmd_composition (newarg, &alias, &prefix, &cmd);
1069 }
1070 catch (const gdb_exception &ex)
1071 {
1072 except = ex;
1073 }
1074
1075 xfree (newarg);
1076 GDBSCM_HANDLE_GDB_EXCEPTION (except);
1077 if (!found)
1078 {
1079 gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self,
1080 _("parameter not found"));
1081 }
1082 if (cmd->var == NULL)
1083 {
1084 gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self,
1085 _("not a parameter"));
1086 }
1087
1088 return pascm_param_value (cmd->var_type, cmd->var, SCM_ARG1, FUNC_NAME);
1089 }
1090 }
1091
1092 /* (set-parameter-value! <gdb:parameter> value) -> unspecified */
1093
1094 static SCM
1095 gdbscm_set_parameter_value_x (SCM self, SCM value)
1096 {
1097 param_smob *p_smob = pascm_get_param_smob_arg_unsafe (self, SCM_ARG1,
1098 FUNC_NAME);
1099
1100 pascm_set_param_value_x (p_smob->type, &p_smob->value, p_smob->enumeration,
1101 value, SCM_ARG2, FUNC_NAME);
1102
1103 return SCM_UNSPECIFIED;
1104 }
1105 \f
1106 /* Initialize the Scheme parameter support. */
1107
1108 static const scheme_function parameter_functions[] =
1109 {
1110 { "make-parameter", 1, 0, 1, as_a_scm_t_subr (gdbscm_make_parameter),
1111 "\
1112 Make a GDB parameter object.\n\
1113 \n\
1114 Arguments: name\n\
1115 [#:command-class <cmd-class>] [#:parameter-type <parameter-type>]\n\
1116 [#:enum-list <enum-list>]\n\
1117 [#:set-func function] [#:show-func function]\n\
1118 [#:doc string] [#:set-doc string] [#:show-doc string]\n\
1119 [#:initial-value initial-value]\n\
1120 name: The name of the command. It may consist of multiple words,\n\
1121 in which case the final word is the name of the new parameter, and\n\
1122 earlier words must be prefix commands.\n\
1123 cmd-class: The class of the command, one of COMMAND_*.\n\
1124 The default is COMMAND_NONE.\n\
1125 parameter-type: The kind of parameter, one of PARAM_*\n\
1126 The default is PARAM_BOOLEAN.\n\
1127 enum-list: If parameter-type is PARAM_ENUM, then this specifies the set\n\
1128 of values of the enum.\n\
1129 set-func: A function of one parameter: the <gdb:parameter> object.\n\
1130 Called *after* the parameter has been set. Returns either \"\" or a\n\
1131 non-empty string to be displayed to the user.\n\
1132 If non-empty, GDB will add a trailing newline.\n\
1133 show-func: A function of two parameters: the <gdb:parameter> object\n\
1134 and the string representation of the current value.\n\
1135 The result is a string to be displayed to the user.\n\
1136 GDB will add a trailing newline.\n\
1137 doc: The \"doc string\" of the parameter.\n\
1138 set-doc: The \"doc string\" when setting the parameter.\n\
1139 show-doc: The \"doc string\" when showing the parameter.\n\
1140 initial-value: The initial value of the parameter." },
1141
1142 { "register-parameter!", 1, 0, 0,
1143 as_a_scm_t_subr (gdbscm_register_parameter_x),
1144 "\
1145 Register a <gdb:parameter> object with GDB." },
1146
1147 { "parameter?", 1, 0, 0, as_a_scm_t_subr (gdbscm_parameter_p),
1148 "\
1149 Return #t if the object is a <gdb:parameter> object." },
1150
1151 { "parameter-value", 1, 0, 0, as_a_scm_t_subr (gdbscm_parameter_value),
1152 "\
1153 Return the value of a <gdb:parameter> object\n\
1154 or any gdb parameter if param is a string naming the parameter." },
1155
1156 { "set-parameter-value!", 2, 0, 0,
1157 as_a_scm_t_subr (gdbscm_set_parameter_value_x),
1158 "\
1159 Set the value of a <gdb:parameter> object.\n\
1160 \n\
1161 Arguments: <gdb:parameter> value" },
1162
1163 END_FUNCTIONS
1164 };
1165
1166 void
1167 gdbscm_initialize_parameters (void)
1168 {
1169 parameter_smob_tag
1170 = gdbscm_make_smob_type (param_smob_name, sizeof (param_smob));
1171 scm_set_smob_print (parameter_smob_tag, pascm_print_param_smob);
1172
1173 gdbscm_define_integer_constants (parameter_types, 1);
1174 gdbscm_define_functions (parameter_functions, 1);
1175
1176 command_class_keyword = scm_from_latin1_keyword ("command-class");
1177 parameter_type_keyword = scm_from_latin1_keyword ("parameter-type");
1178 enum_list_keyword = scm_from_latin1_keyword ("enum-list");
1179 set_func_keyword = scm_from_latin1_keyword ("set-func");
1180 show_func_keyword = scm_from_latin1_keyword ("show-func");
1181 doc_keyword = scm_from_latin1_keyword ("doc");
1182 set_doc_keyword = scm_from_latin1_keyword ("set-doc");
1183 show_doc_keyword = scm_from_latin1_keyword ("show-doc");
1184 initial_value_keyword = scm_from_latin1_keyword ("initial-value");
1185 auto_keyword = scm_from_latin1_keyword ("auto");
1186 unlimited_keyword = scm_from_latin1_keyword ("unlimited");
1187 }
This page took 0.059596 seconds and 4 git commands to generate.