2 #include <kvp-frame.hpp> 10 #include "swig-runtime.h" 11 #include "guile-mappings.h" 12 #include "gnc-engine-guile.h" 13 #include "gnc-guile-utils.h" 14 #include "gnc-kvp-guile.h" 23 static bool scm_is_list_of_string_pairs (SCM val)
25 for (; !scm_is_null (val); val = scm_cdr (val))
27 if (!(scm_is_pair (val) && scm_is_pair (scm_car (val)) &&
28 scm_is_string (scm_caar (val))))
35 gnc_scm_to_kvp_value_ptr(SCM val)
37 if (scm_is_rational(val))
39 if (scm_is_exact(val) &&
40 (scm_is_signed_integer(val, INT64_MIN, INT64_MAX) ||
41 scm_is_unsigned_integer(val, INT64_MIN, INT64_MAX)))
43 return new KvpValue{scm_to_int64(val)};
45 else if (scm_is_exact(val) &&
46 (scm_is_signed_integer(scm_numerator(val),
47 INT64_MIN, INT64_MAX) ||
48 scm_is_unsigned_integer(scm_numerator(val),
49 INT64_MIN, INT64_MAX)) &&
50 (scm_is_signed_integer(scm_denominator(val),
51 INT64_MIN, INT64_MAX) ||
52 (scm_is_unsigned_integer(scm_denominator(val),
53 INT64_MIN, INT64_MAX))))
55 return new KvpValue{gnc_scm_to_numeric(val)};
59 return new KvpValue{scm_to_double(val)};
62 else if (gnc_guid_p(val))
64 auto guid = gnc_scm2guid(val);
66 return new KvpValue{tmpguid};
68 else if (scm_is_string(val))
70 return new KvpValue{gnc_scm_to_utf8_string(val)};
72 else if (!scm_is_null (val) && scm_is_list_of_string_pairs (val))
74 auto frame =
new KvpFrame;
75 for (; !scm_is_null (val); val = scm_cdr (val))
77 auto key_str = scm_to_utf8_stringn (scm_caar (val),
nullptr);
78 auto val_scm = scm_cdar (val);
79 auto prev = frame->set ({key_str}, gnc_scm_to_kvp_value_ptr (val_scm));
85 return new KvpValue (frame);
87 else if (!scm_is_null (val) && scm_is_list (val))
89 GList *kvplist =
nullptr;
90 for (; !scm_is_null (val); val = scm_cdr (val))
92 auto elt = gnc_scm_to_kvp_value_ptr (scm_car (val));
93 kvplist = g_list_prepend (kvplist, elt);
95 return new KvpValue (g_list_reverse (kvplist));
101 gnc_kvp_value_ptr_to_scm(KvpValue* val)
103 if (val ==
nullptr)
return SCM_BOOL_F;
105 switch (val->get_type())
107 case KvpValue::Type::INT64:
108 return scm_from_int64(val->get<int64_t>());
110 case KvpValue::Type::DOUBLE:
111 return scm_from_double (val->get<
double>());
113 case KvpValue::Type::NUMERIC:
114 return gnc_numeric_to_scm(val->get<gnc_numeric>());
116 case KvpValue::Type::STRING:
118 auto string = val->get<
const char*>();
119 return string ? scm_from_utf8_string(
string) : SCM_BOOL_F;
122 case KvpValue::Type::GUID:
124 auto tempguid = val->get<
GncGUID*>();
125 return tempguid ? gnc_guid2scm(*tempguid) : SCM_BOOL_F;
128 case KvpValue::Type::FRAME:
130 auto frame { val->get<KvpFrame*>() };
131 auto acc = [](
const auto& rv,
const auto& iter)
133 auto key_scm { scm_from_utf8_string (iter.first) };
134 auto val_scm { gnc_kvp_value_ptr_to_scm (iter.second) };
135 return scm_acons (key_scm, val_scm, rv);
137 return frame ? scm_reverse (std::accumulate (frame->begin(), frame->end(), SCM_EOL, acc)) : SCM_BOOL_F;
140 case KvpValue::Type::GLIST:
143 for (GList *n = val->get<GList*>(); n; n = n->next)
145 auto elt = gnc_kvp_value_ptr_to_scm (static_cast<KvpValue*>(n->data));
146 lst = scm_cons (elt, lst);
148 return scm_reverse (lst);
GncGUID * guid_copy(const GncGUID *guid)
Returns a newly allocated GncGUID that matches the passed-in GUID.
The type used to store guids in C.