static SCM ppscm_search_pp_list (SCM list, SCM value) { SCM orig_list = list; if (scm_is_null (list)) return SCM_BOOL_F; if (gdbscm_is_false (scm_list_p (list))) /* scm_is_pair? */ { return ppscm_make_pp_type_error_exception (_("pretty-printer list is not a list"), list); } for ( ; scm_is_pair (list); list = scm_cdr (list)) { SCM matcher = scm_car (list); SCM worker; pretty_printer_smob *pp_smob; if (!ppscm_is_pretty_printer (matcher)) { return ppscm_make_pp_type_error_exception (_("pretty-printer list contains non-pretty-printer object"), matcher); } pp_smob = (pretty_printer_smob *) SCM_SMOB_DATA (matcher); /* Skip if disabled. */ if (gdbscm_is_false (pp_smob->enabled)) continue; if (!gdbscm_is_procedure (pp_smob->lookup)) { return ppscm_make_pp_type_error_exception (_("invalid lookup object in pretty-printer matcher"), pp_smob->lookup); } worker = gdbscm_safe_call_2 (pp_smob->lookup, matcher, value, gdbscm_memory_error_p); if (!gdbscm_is_false (worker)) { if (gdbscm_is_exception (worker)) return worker; if (ppscm_is_pretty_printer_worker (worker)) return worker; return ppscm_make_pp_type_error_exception (_("invalid result from pretty-printer lookup"), worker); } } if (!scm_is_null (list)) { return ppscm_make_pp_type_error_exception (_("pretty-printer list is not a list"), orig_list); } return SCM_BOOL_F; }
static void pascm_show_func (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { param_smob *p_smob = (param_smob *) get_cmd_context (c); SCM value_scm, self, result, exception; char *msg; struct cleanup *cleanups; gdb_assert (gdbscm_is_procedure (p_smob->show_func)); value_scm = gdbscm_scm_from_host_string (value, strlen (value)); if (gdbscm_is_exception (value_scm)) { error (_("Error converting parameter value \"%s\" to Scheme string."), value); } self = p_smob->containing_scm; result = gdbscm_safe_call_2 (p_smob->show_func, self, value_scm, gdbscm_user_error_p); if (gdbscm_is_exception (result)) { pascm_signal_setshow_error (result, _("Error occurred showing parameter.")); } msg = gdbscm_scm_to_host_string (result, NULL, &exception); if (msg == NULL) { gdbscm_print_gdb_exception (SCM_BOOL_F, exception); error (_("Error converting show text to host string.")); } cleanups = make_cleanup (xfree, msg); fprintf_filtered (file, "%s\n", msg); do_cleanups (cleanups); }