From 09e98ee95fb453adc0f1783937477cd065611581 Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Wed, 8 Dec 2021 10:05:06 -0500 Subject: In extension rwarray, write and read mpfr values as strings instead of using the new and experimental floating-point interchange format. --- extension/rwarray.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index 9a8d15e9..1356005c 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -313,7 +313,22 @@ write_number(FILE *fp, awk_value_t *val) if (fwrite(& code, 1, sizeof(code), fp) != sizeof(code)) return awk_false; +#ifdef USE_MPFR_FPIF + /* This would be preferable, but it is not available + * on older platforms with mpfr 3.x. It's also marked + * experimental in mpfr 4.1, so perhaps not ready for + * production use yet. */ if (mpfr_fpif_export(fp, val->num_ptr) != 0) +#else +#define MPFR_STR_BASE 62 /* maximize base to minimize string len */ +#define MPFR_STR_ROUND MPFR_RNDN + /* XXX does the choice of MPFR_RNDN matter, given + * that the precision is 0, so we should be rendering + * in full precision? */ + /* We need to write a terminating space, since + * mpfr_inp_str reads until it hits a space or EOF */ + if ((mpfr_out_str(fp, MPFR_STR_BASE, 0, val->num_ptr, MPFR_STR_ROUND) == 0) || (putc(' ', fp) == EOF)) +#endif return awk_false; } else { code = htonl(VT_GMP); @@ -595,7 +610,14 @@ read_number(FILE *fp, awk_value_t *value, uint32_t code) mpfr_t mpfr_val; mpfr_init(mpfr_val); +#ifdef USE_MPFR_FPIF + /* preferable if widely available and stable */ if (mpfr_fpif_import(mpfr_val, fp) != 0) +#else + /* N.B. need to consume the terminating space we wrote + * after mpfr_out_str */ + if ((mpfr_inp_str(mpfr_val, fp, MPFR_STR_BASE, MPFR_STR_ROUND) == 0) || (getc(fp) != ' ')) +#endif return awk_false; value = make_number_mpfr(& mpfr_val, value); -- cgit v1.2.3 From cfa3ac1c6a0fcbe794df853f25c757e4acd5fcc0 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 10 Dec 2021 11:58:18 +0200 Subject: Reformat some comments in extension/rwarray.c. --- extension/rwarray.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index 1356005c..59d6b0f7 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -314,19 +314,23 @@ write_number(FILE *fp, awk_value_t *val) return awk_false; #ifdef USE_MPFR_FPIF - /* This would be preferable, but it is not available + /* + * This would be preferable, but it is not available * on older platforms with mpfr 3.x. It's also marked * experimental in mpfr 4.1, so perhaps not ready for - * production use yet. */ + * production use yet. + */ if (mpfr_fpif_export(fp, val->num_ptr) != 0) #else #define MPFR_STR_BASE 62 /* maximize base to minimize string len */ #define MPFR_STR_ROUND MPFR_RNDN - /* XXX does the choice of MPFR_RNDN matter, given + /* + * XXX does the choice of MPFR_RNDN matter, given * that the precision is 0, so we should be rendering - * in full precision? */ - /* We need to write a terminating space, since - * mpfr_inp_str reads until it hits a space or EOF */ + * in full precision? + */ + // We need to write a terminating space, since + // mpfr_inp_str reads until it hits a space or EOF if ((mpfr_out_str(fp, MPFR_STR_BASE, 0, val->num_ptr, MPFR_STR_ROUND) == 0) || (putc(' ', fp) == EOF)) #endif return awk_false; @@ -614,8 +618,8 @@ read_number(FILE *fp, awk_value_t *value, uint32_t code) /* preferable if widely available and stable */ if (mpfr_fpif_import(mpfr_val, fp) != 0) #else - /* N.B. need to consume the terminating space we wrote - * after mpfr_out_str */ + // N.B. need to consume the terminating space we wrote + // after mpfr_out_str if ((mpfr_inp_str(mpfr_val, fp, MPFR_STR_BASE, MPFR_STR_ROUND) == 0) || (getc(fp) != ' ')) #endif return awk_false; -- cgit v1.2.3