static SCM extract_arg (char format_char, SCM arg, void *argp, const char *func_name, int position) { switch (format_char) { case 's': { char **arg_ptr = (char **) argp; CHECK_TYPE (gdbscm_is_true (scm_string_p (arg)), arg, position, func_name, _("string")); *arg_ptr = gdbscm_scm_to_c_string (arg); break; } case 't': { int *arg_ptr = (int *) argp; /* While in Scheme, anything non-#f is "true", we're strict. */ CHECK_TYPE (gdbscm_is_bool (arg), arg, position, func_name, _("boolean")); *arg_ptr = gdbscm_is_true (arg); break; } case 'i': { int *arg_ptr = (int *) argp; CHECK_TYPE (scm_is_signed_integer (arg, INT_MIN, INT_MAX), arg, position, func_name, _("int")); *arg_ptr = scm_to_int (arg); break; } case 'u': { int *arg_ptr = (int *) argp; CHECK_TYPE (scm_is_unsigned_integer (arg, 0, UINT_MAX), arg, position, func_name, _("unsigned int")); *arg_ptr = scm_to_uint (arg); break; } case 'l': { long *arg_ptr = (long *) argp; CHECK_TYPE (scm_is_signed_integer (arg, LONG_MIN, LONG_MAX), arg, position, func_name, _("long")); *arg_ptr = scm_to_long (arg); break; } case 'n': { unsigned long *arg_ptr = (unsigned long *) argp; CHECK_TYPE (scm_is_unsigned_integer (arg, 0, ULONG_MAX), arg, position, func_name, _("unsigned long")); *arg_ptr = scm_to_ulong (arg); break; } case 'L': { LONGEST *arg_ptr = (LONGEST *) argp; CHECK_TYPE (scm_is_signed_integer (arg, INT64_MIN, INT64_MAX), arg, position, func_name, _("LONGEST")); *arg_ptr = gdbscm_scm_to_longest (arg); break; } case 'U': { ULONGEST *arg_ptr = (ULONGEST *) argp; CHECK_TYPE (scm_is_unsigned_integer (arg, 0, UINT64_MAX), arg, position, func_name, _("ULONGEST")); *arg_ptr = gdbscm_scm_to_ulongest (arg); break; } case 'O': { SCM *arg_ptr = (SCM *) argp; *arg_ptr = arg; break; } default: gdb_assert_not_reached ("invalid argument format character"); } return SCM_BOOL_F; }
static void pascm_set_param_value_x (enum var_types type, union pascm_variable *var, const char * const *enumeration, SCM value, int arg_pos, const char *func_name) { switch (type) { case var_string: case var_string_noescape: case var_optional_filename: case var_filename: SCM_ASSERT_TYPE (scm_is_string (value) || (type != var_filename && gdbscm_is_false (value)), value, arg_pos, func_name, _("string or #f for non-PARAM_FILENAME parameters")); if (gdbscm_is_false (value)) { xfree (var->stringval); if (type == var_optional_filename) var->stringval = xstrdup (""); else var->stringval = NULL; } else { char *string; SCM exception; string = gdbscm_scm_to_host_string (value, NULL, &exception); if (string == NULL) gdbscm_throw (exception); xfree (var->stringval); var->stringval = string; } break; case var_enum: { int i; char *str; SCM exception; SCM_ASSERT_TYPE (scm_is_string (value), value, arg_pos, func_name, _("string")); str = gdbscm_scm_to_host_string (value, NULL, &exception); if (str == NULL) gdbscm_throw (exception); for (i = 0; enumeration[i]; ++i) { if (strcmp (enumeration[i], str) == 0) break; } xfree (str); if (enumeration[i] == NULL) { gdbscm_out_of_range_error (func_name, arg_pos, value, _("not member of enumeration")); } var->cstringval = enumeration[i]; break; } case var_boolean: SCM_ASSERT_TYPE (gdbscm_is_bool (value), value, arg_pos, func_name, _("boolean")); var->intval = gdbscm_is_true (value); break; case var_auto_boolean: SCM_ASSERT_TYPE (gdbscm_is_bool (value) || scm_is_eq (value, auto_keyword), value, arg_pos, func_name, _("boolean or #:auto")); if (scm_is_eq (value, auto_keyword)) var->autoboolval = AUTO_BOOLEAN_AUTO; else if (gdbscm_is_true (value)) var->autoboolval = AUTO_BOOLEAN_TRUE; else var->autoboolval = AUTO_BOOLEAN_FALSE; break; case var_zinteger: case var_uinteger: case var_zuinteger: case var_zuinteger_unlimited: if (type == var_uinteger || type == var_zuinteger_unlimited) { SCM_ASSERT_TYPE (gdbscm_is_bool (value) || scm_is_eq (value, unlimited_keyword), value, arg_pos, func_name, _("integer or #:unlimited")); if (scm_is_eq (value, unlimited_keyword)) { if (type == var_uinteger) var->intval = UINT_MAX; else var->intval = -1; break; } } else { SCM_ASSERT_TYPE (scm_is_integer (value), value, arg_pos, func_name, _("integer")); } if (type == var_uinteger || type == var_zuinteger) { unsigned int u = scm_to_uint (value); if (type == var_uinteger && u == 0) u = UINT_MAX; var->uintval = u; } else { int i = scm_to_int (value); if (type == var_zuinteger_unlimited && i < -1) { gdbscm_out_of_range_error (func_name, arg_pos, value, _("must be >= -1")); } var->intval = i; } break; default: gdb_assert_not_reached ("bad parameter type"); } }