summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/sail.c23
-rw-r--r--lib/sail.h3
2 files changed, 26 insertions, 0 deletions
diff --git a/lib/sail.c b/lib/sail.c
index 24ff1fd2..f897fc11 100644
--- a/lib/sail.c
+++ b/lib/sail.c
@@ -233,6 +233,12 @@ void CREATE_OF(sail_int, sail_string)(sail_int *rop, sail_string str)
}
inline
+void CONVERT_OF(sail_int, sail_string)(sail_int *rop, sail_string str)
+{
+ mpz_set_str(*rop, str, 10);
+}
+
+inline
void RECREATE_OF(sail_int, sail_string)(mpz_t *rop, sail_string str)
{
mpz_set_str(*rop, str, 10);
@@ -1246,6 +1252,23 @@ void CREATE_OF(real, sail_string)(real *rop, const sail_string op)
mpq_add(*rop, *rop, sail_lib_tmp_real);
}
+void CONVERT_OF(real, sail_string)(real *rop, const sail_string op)
+{
+ int decimal;
+ int total;
+
+ gmp_sscanf(op, "%Zd.%n%Zd%n", sail_lib_tmp1, &decimal, sail_lib_tmp2, &total);
+
+ int len = total - decimal;
+ mpz_ui_pow_ui(sail_lib_tmp3, 10, len);
+ mpz_set(mpq_numref(*rop), sail_lib_tmp2);
+ mpz_set(mpq_denref(*rop), sail_lib_tmp3);
+ mpq_canonicalize(*rop);
+ mpz_set(mpq_numref(sail_lib_tmp_real), sail_lib_tmp1);
+ mpz_set_ui(mpq_denref(sail_lib_tmp_real), 1);
+ mpq_add(*rop, *rop, sail_lib_tmp_real);
+}
+
unit print_real(const sail_string str, const real op)
{
gmp_printf("%s%Qd\n", str, op);
diff --git a/lib/sail.h b/lib/sail.h
index 49a5cf72..1310dd72 100644
--- a/lib/sail.h
+++ b/lib/sail.h
@@ -96,6 +96,8 @@ mach_int CREATE_OF(mach_int, sail_int)(const sail_int);
void CREATE_OF(sail_int, sail_string)(sail_int *, const sail_string);
void RECREATE_OF(sail_int, sail_string)(mpz_t *, const sail_string);
+void CONVERT_OF(sail_int, sail_string)(sail_int *, const sail_string);
+
mach_int CONVERT_OF(mach_int, sail_int)(const sail_int);
void CONVERT_OF(sail_int, mach_int)(sail_int *, const mach_int);
@@ -317,6 +319,7 @@ typedef mpq_t real;
SAIL_BUILTIN_TYPE(real);
void CREATE_OF(real, sail_string)(real *rop, const sail_string op);
+void CONVERT_OF(real, sail_string)(real *rop, const sail_string op);
void UNDEFINED(real)(real *rop, unit u);