KvpValue * gnc_scm_to_kvp_value_ptr(SCM val) { if (scm_is_rational(val)) { if (scm_is_exact(val) && (scm_is_signed_integer(val, INT64_MIN, INT64_MAX) || scm_is_unsigned_integer(val, INT64_MIN, INT64_MAX))) { return new KvpValue{scm_to_int64(val)}; } else if (scm_is_exact(val) && (scm_is_signed_integer(scm_numerator(val), INT64_MIN, INT64_MAX) || scm_is_unsigned_integer(scm_numerator(val), INT64_MIN, INT64_MAX)) && (scm_is_signed_integer(scm_denominator(val), INT64_MIN, INT64_MAX) || (scm_is_unsigned_integer(scm_denominator(val), INT64_MIN, INT64_MAX)))) { return new KvpValue{gnc_scm_to_numeric(val)}; } else { return new KvpValue{scm_to_double(val)}; } } else if (gnc_guid_p(val)) { auto guid = gnc_scm2guid(val); auto tmpguid = guid_copy(&guid); return new KvpValue{tmpguid}; } else if (gnc_timepair_p(val)) { Timespec ts = gnc_timepair2timespec(val); return new KvpValue{ts}; } else if (scm_is_string(val)) { return new KvpValue{gnc_scm_to_utf8_string(val)}; } else if (SWIG_IsPointerOfType(val, SWIG_TypeQuery("_p_KvpFrame"))) { #define FUNC_NAME G_STRFUNC auto vp_frame = SWIG_MustGetPtr(val, SWIG_TypeQuery("_p_KvpFrame"), 1, 0); KvpFrame *frame = static_cast<KvpFrame*>(vp_frame); #undef FUNC_NAME return new KvpValue{frame}; } /* FIXME: add list handler here */ return NULL; }
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; }