From ab4b9ca4f7cab45b6a2a13d0ef125dcf9c276a06 Mon Sep 17 00:00:00 2001 From: Alasdair Armstrong Date: Tue, 11 Dec 2018 19:54:14 +0000 Subject: Fix all tests with type checking changes --- lib/sail.c | 23 +++++++++++++++++++++++ lib/sail.h | 3 +++ 2 files changed, 26 insertions(+) (limited to 'lib') diff --git a/lib/sail.c b/lib/sail.c index 24ff1fd2..f897fc11 100644 --- a/lib/sail.c +++ b/lib/sail.c @@ -232,6 +232,12 @@ void CREATE_OF(sail_int, sail_string)(sail_int *rop, sail_string str) mpz_init_set_str(*rop, str, 10); } +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) { @@ -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); -- cgit v1.2.3