2016-06-07 10:39:46 -04:00
|
|
|
#include <guid.hpp>
|
2017-08-06 17:12:16 +02:00
|
|
|
#include <kvp-frame.hpp>
|
2015-06-22 15:00:10 -07:00
|
|
|
#include <libguile.h>
|
|
|
|
|
|
|
|
|
|
extern "C"
|
|
|
|
|
{
|
2017-10-26 11:14:21 +02:00
|
|
|
#include <config.h>
|
2006-04-10 21:49:44 +00:00
|
|
|
|
2015-06-14 14:52:25 -07:00
|
|
|
#include <qof.h>
|
2019-04-27 13:23:54 -07:00
|
|
|
#include "swig-runtime.h"
|
2003-02-22 08:15:53 +00:00
|
|
|
#include "guile-mappings.h"
|
2019-10-05 16:48:37 +02:00
|
|
|
#include "gnc-engine-guile.h"
|
2012-12-22 18:20:29 +00:00
|
|
|
#include "gnc-guile-utils.h"
|
2019-10-05 17:27:48 +02:00
|
|
|
#include "gnc-kvp-guile.h"
|
2015-06-22 15:00:10 -07:00
|
|
|
}
|
|
|
|
|
|
2001-11-06 00:49:46 +00:00
|
|
|
/* NOTE: There are some problems with this approach. Currently,
|
|
|
|
|
* guids are stored simply as strings in scheme, so some
|
|
|
|
|
* strings could be mistaken for guids, although that is
|
|
|
|
|
* unlikely. The general problem is distinguishing kvp
|
2003-06-27 23:33:00 +00:00
|
|
|
* types based only on the scheme type.
|
|
|
|
|
*/
|
2011-11-18 21:04:01 +00:00
|
|
|
|
2003-06-27 23:33:00 +00:00
|
|
|
KvpValue *
|
2001-08-17 16:55:35 +00:00
|
|
|
gnc_scm_to_kvp_value_ptr(SCM val)
|
|
|
|
|
{
|
2017-12-21 15:30:49 -08:00
|
|
|
if (scm_is_rational(val))
|
2001-08-17 16:55:35 +00:00
|
|
|
{
|
2017-12-22 11:07:29 -08:00
|
|
|
if (scm_is_exact(val) &&
|
|
|
|
|
(scm_is_signed_integer(val, INT64_MIN, INT64_MAX) ||
|
|
|
|
|
scm_is_unsigned_integer(val, INT64_MIN, INT64_MAX)))
|
2006-12-23 21:10:47 +00:00
|
|
|
{
|
2015-06-22 15:00:10 -07:00
|
|
|
return new KvpValue{scm_to_int64(val)};
|
2006-12-23 21:10:47 +00:00
|
|
|
}
|
2017-12-21 15:30:49 -08:00
|
|
|
else if (scm_is_exact(val) &&
|
2017-12-22 11:07:29 -08:00
|
|
|
(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))))
|
2017-12-21 15:30:49 -08:00
|
|
|
{
|
|
|
|
|
return new KvpValue{gnc_scm_to_numeric(val)};
|
|
|
|
|
}
|
2010-03-02 21:40:28 +00:00
|
|
|
else
|
2006-12-23 21:10:47 +00:00
|
|
|
{
|
2015-06-22 15:00:10 -07:00
|
|
|
return new KvpValue{scm_to_double(val)};
|
2006-12-23 21:10:47 +00:00
|
|
|
}
|
2001-08-17 16:55:35 +00:00
|
|
|
}
|
2010-03-02 21:40:28 +00:00
|
|
|
else if (gnc_guid_p(val))
|
2001-08-17 16:55:35 +00:00
|
|
|
{
|
2015-06-22 15:00:10 -07:00
|
|
|
auto guid = gnc_scm2guid(val);
|
|
|
|
|
auto tmpguid = guid_copy(&guid);
|
|
|
|
|
return new KvpValue{tmpguid};
|
2001-08-17 16:55:35 +00:00
|
|
|
}
|
2010-03-02 21:40:28 +00:00
|
|
|
else if (scm_is_string(val))
|
2001-08-17 16:55:35 +00:00
|
|
|
{
|
2015-06-22 15:00:10 -07:00
|
|
|
return new KvpValue{gnc_scm_to_utf8_string(val)};
|
2001-08-17 16:55:35 +00:00
|
|
|
}
|
2010-03-02 21:40:28 +00:00
|
|
|
else if (SWIG_IsPointerOfType(val, SWIG_TypeQuery("_p_KvpFrame")))
|
2002-07-06 22:44:13 +00:00
|
|
|
{
|
2010-03-02 21:40:28 +00:00
|
|
|
#define FUNC_NAME G_STRFUNC
|
2015-06-22 15:00:10 -07:00
|
|
|
auto vp_frame = SWIG_MustGetPtr(val,
|
|
|
|
|
SWIG_TypeQuery("_p_KvpFrame"), 1, 0);
|
|
|
|
|
KvpFrame *frame = static_cast<KvpFrame*>(vp_frame);
|
2010-03-02 21:40:28 +00:00
|
|
|
#undef FUNC_NAME
|
2015-06-22 15:00:10 -07:00
|
|
|
return new KvpValue{frame};
|
2002-07-06 22:44:13 +00:00
|
|
|
}
|
2001-11-06 00:49:46 +00:00
|
|
|
/* FIXME: add list handler here */
|
2001-08-17 16:55:35 +00:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SCM
|
2003-06-27 23:33:00 +00:00
|
|
|
gnc_kvp_value_ptr_to_scm(KvpValue* val)
|
2001-08-17 16:55:35 +00:00
|
|
|
{
|
2015-06-27 15:39:54 -07:00
|
|
|
if (val == nullptr) return SCM_BOOL_F;
|
|
|
|
|
|
|
|
|
|
switch (val->get_type())
|
2001-08-17 16:55:35 +00:00
|
|
|
{
|
2015-06-27 15:39:54 -07:00
|
|
|
case KvpValue::Type::INT64:
|
2015-06-22 15:00:10 -07:00
|
|
|
return scm_from_int64(val->get<int64_t>());
|
2001-08-17 16:55:35 +00:00
|
|
|
break;
|
2015-06-27 15:39:54 -07:00
|
|
|
case KvpValue::Type::DOUBLE:
|
2015-06-22 15:00:10 -07:00
|
|
|
return scm_from_double (val->get<double>());
|
2001-08-17 16:55:35 +00:00
|
|
|
break;
|
2015-06-27 15:39:54 -07:00
|
|
|
case KvpValue::Type::NUMERIC:
|
2015-06-22 15:00:10 -07:00
|
|
|
return gnc_numeric_to_scm(val->get<gnc_numeric>());
|
2001-08-17 16:55:35 +00:00
|
|
|
break;
|
2015-06-27 15:39:54 -07:00
|
|
|
case KvpValue::Type::STRING:
|
2015-06-22 15:00:10 -07:00
|
|
|
{
|
|
|
|
|
auto string = val->get<const char*>();
|
2013-12-13 20:21:41 +00:00
|
|
|
return string ? scm_from_utf8_string(string) : SCM_BOOL_F;
|
2001-08-17 16:55:35 +00:00
|
|
|
break;
|
2015-06-22 15:00:10 -07:00
|
|
|
}
|
2015-06-27 15:39:54 -07:00
|
|
|
case KvpValue::Type::GUID:
|
2001-08-17 16:55:35 +00:00
|
|
|
{
|
2015-06-27 15:39:54 -07:00
|
|
|
auto tempguid = val->get<GncGUID*>();
|
2001-08-17 16:55:35 +00:00
|
|
|
return gnc_guid2scm(*tempguid);
|
|
|
|
|
}
|
2010-03-02 21:40:28 +00:00
|
|
|
break;
|
2015-06-27 15:39:54 -07:00
|
|
|
case KvpValue::Type::FRAME:
|
2002-07-06 22:44:13 +00:00
|
|
|
{
|
2015-06-22 15:00:10 -07:00
|
|
|
auto frame = val->get<KvpFrame*>();
|
|
|
|
|
if (frame != nullptr)
|
2006-10-15 19:02:05 +00:00
|
|
|
return SWIG_NewPointerObj(frame, SWIG_TypeQuery("_p_KvpFrame"), 0);
|
2002-07-06 22:44:13 +00:00
|
|
|
}
|
2010-03-02 21:40:28 +00:00
|
|
|
break;
|
2015-06-27 15:39:54 -07:00
|
|
|
case KvpValue::Type::GLIST:
|
2014-04-25 13:41:11 -07:00
|
|
|
default:
|
|
|
|
|
break;
|
2001-08-17 16:55:35 +00:00
|
|
|
}
|
|
|
|
|
return SCM_BOOL_F;
|
|
|
|
|
}
|