diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sail.c | 23 | ||||
| -rw-r--r-- | lib/sail.h | 3 |
2 files changed, 26 insertions, 0 deletions
@@ -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); @@ -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); |
