diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | awk.h | 11 | ||||
-rw-r--r-- | extension/ChangeLog | 6 | ||||
-rw-r--r-- | extension/Makefile.in | 16 | ||||
-rwxr-xr-x | extension/configure | 4 | ||||
-rw-r--r-- | extension/configure.ac | 4 | ||||
-rw-r--r-- | extension/intdiv.c | 15 | ||||
-rw-r--r-- | mpfr.c | 6 |
8 files changed, 46 insertions, 30 deletions
@@ -1,3 +1,8 @@ +2017-04-13 Arnold D. Robbins <arnold@skeeve.com> + + * awk.h (make_number_node): Simplify. + * mpfr.c (mpg_node): Change parameter name to `flags'. + 2017-04-12 Arnold D. Robbins <arnold@skeeve.com> * mpfr.c (mpg_format_val): Set STRCUR flag when we're done. @@ -503,7 +508,7 @@ gmp_minor_version, mpfr_major_version, and mpfr_minor_version. Add functions api_get_mpfr and api_get_mpz to allocate memory for extended-precision numbers to hand to gawk. - (get_mpfr_ptr, get_mpz_ptr): Helper macros to warp api_get_mpfr and + (get_mpfr_ptr, get_mpz_ptr): Helper macros to wrap api_get_mpfr and api_get_mpz. (make_number): Modify to populate awk_number_t correctly. (make_number_mpz, make_number_mpfr): New helper functions to create @@ -512,12 +517,11 @@ in extensions that want to support extended-precision math. * gawkapi.c (getmpfr, freempfr, getmpz, freempz): New macros to allocate and free memory blocks for extended-precision math. - (awk_value_to_node): For AWK_NUMBER values, support 3 different kinds - of internal numbers: double, mpz_t, and mpfr_t. + (awk_value_to_node): For AWK_NUMBER values, support three different + kinds of internal numbers: double, mpz_t, and mpfr_t. (assign_number): New helper function to convert a numeric node to an awk_value_t. - (node_to_awk_value): Use assign_number in a couple of places to - pass numbers properly. + (node_to_awk_value): Use assign_number to pass numbers properly. (api_get_mpfr): Implement new api_get_mpfr hook. (api_get_mpfz): Implement new api_get_mpz hook. (api_impl): Add GMP & MPFR versions, api_get_mpfr, and api_get_mpz. @@ -1976,20 +1976,17 @@ erealloc_real(void *ptr, size_t count, const char *where, const char *var, const return ret; } -/* make_number_node --- make node with the give flags */ +/* make_number_node --- make node with the given flags */ static inline NODE * -make_number_node(unsigned int tp) +make_number_node(unsigned int flags) { NODE *r; getnode(r); + memset(r, 0, sizeof(*r)); r->type = Node_val; r->valref = 1; - r->flags = (tp|MALLOC|NUMBER|NUMCUR); - r->stptr = NULL; - r->stlen = 0; - r->wstptr = NULL; - r->wstlen = 0; + r->flags = (flags|MALLOC|NUMBER|NUMCUR); return r; } diff --git a/extension/ChangeLog b/extension/ChangeLog index 87d4358d..784daf21 100644 --- a/extension/ChangeLog +++ b/extension/ChangeLog @@ -1,3 +1,9 @@ +2017-04-13 Arnold D. Robbins <arnold@skeeve.com> + + * configure.ac: Alphabetize function list in AC_CHECK_FUNCS. + * intdiv.c: Add descriptive comments to some functions. + (do_intdiv): Make division by zero fatal in MPFR case. + 2017-04-03 Arnold D. Robbins <arnold@skeeve.com> * inplace.c (inplace_end): Correct the function name in the diff --git a/extension/Makefile.in b/extension/Makefile.in index c386eac6..000c3b78 100644 --- a/extension/Makefile.in +++ b/extension/Makefile.in @@ -284,16 +284,16 @@ am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(filefuncs_la_SOURCES) $(fnmatch_la_SOURCES) \ $(fork_la_SOURCES) $(inplace_la_SOURCES) $(intdiv_la_SOURCES) \ - $(ordchr_la_SOURCES) $(readdir_la_SOURCES) $(readdir_test_la_SOURCES) \ - $(readfile_la_SOURCES) $(revoutput_la_SOURCES) \ - $(revtwoway_la_SOURCES) $(rwarray_la_SOURCES) \ - $(testext_la_SOURCES) $(time_la_SOURCES) + $(ordchr_la_SOURCES) $(readdir_la_SOURCES) \ + $(readdir_test_la_SOURCES) $(readfile_la_SOURCES) \ + $(revoutput_la_SOURCES) $(revtwoway_la_SOURCES) \ + $(rwarray_la_SOURCES) $(testext_la_SOURCES) $(time_la_SOURCES) DIST_SOURCES = $(filefuncs_la_SOURCES) $(fnmatch_la_SOURCES) \ $(fork_la_SOURCES) $(inplace_la_SOURCES) $(intdiv_la_SOURCES) \ - $(ordchr_la_SOURCES) $(readdir_la_SOURCES) $(readdir_test_la_SOURCES) \ - $(readfile_la_SOURCES) $(revoutput_la_SOURCES) \ - $(revtwoway_la_SOURCES) $(rwarray_la_SOURCES) \ - $(testext_la_SOURCES) $(time_la_SOURCES) + $(ordchr_la_SOURCES) $(readdir_la_SOURCES) \ + $(readdir_test_la_SOURCES) $(readfile_la_SOURCES) \ + $(revoutput_la_SOURCES) $(revtwoway_la_SOURCES) \ + $(rwarray_la_SOURCES) $(testext_la_SOURCES) $(time_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ diff --git a/extension/configure b/extension/configure index 580cc150..7ae66543 100755 --- a/extension/configure +++ b/extension/configure @@ -12943,8 +12943,8 @@ $as_echo "#define HAVE_MPFR 1" >>confdefs.h ;; esac -for ac_func in fdopendir fnmatch gettimeofday fmod \ - getdtablesize nanosleep select statvfs GetSystemTimeAsFileTime +for ac_func in fdopendir fmod fnmatch getdtablesize \ + gettimeofday nanosleep select statvfs GetSystemTimeAsFileTime do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" diff --git a/extension/configure.ac b/extension/configure.ac index 58935b69..bde6e3d3 100644 --- a/extension/configure.ac +++ b/extension/configure.ac @@ -78,8 +78,8 @@ case `uname -m` in ;; esac -AC_CHECK_FUNCS(fdopendir fnmatch gettimeofday fmod \ - getdtablesize nanosleep select statvfs GetSystemTimeAsFileTime) +AC_CHECK_FUNCS(fdopendir fmod fnmatch getdtablesize \ + gettimeofday nanosleep select statvfs GetSystemTimeAsFileTime) GAWK_FUNC_DIRFD GAWK_PREREQ_DIRFD diff --git a/extension/intdiv.c b/extension/intdiv.c index 2f446c47..bde92893 100644 --- a/extension/intdiv.c +++ b/extension/intdiv.c @@ -29,6 +29,8 @@ static const char *ext_version = "intdiv extension: version 1.0"; int plugin_is_GPL_compatible; +/* double_to_int --- get the integer part of a double */ + static double double_to_int(double d) { @@ -39,6 +41,8 @@ double_to_int(double d) return d; } +/* array_set_number --- set an array element to a numeric value */ + static void array_set_number(awk_array_t array, const char *sub, size_t sublen, double num) { @@ -49,6 +53,8 @@ array_set_number(awk_array_t array, const char *sub, size_t sublen, double num) #ifdef HAVE_MPFR +/* mpz_conv --- convert an awk_value_t to an MPZ value */ + static mpz_ptr mpz_conv(const awk_value_t *arg, mpz_ptr tmp) { @@ -71,6 +77,8 @@ mpz_conv(const awk_value_t *arg, mpz_ptr tmp) } } +/* array_set_mpz --- set an array element to an MPZ value */ + static void array_set_mpz(awk_array_t array, const char *sub, size_t sublen, mpz_ptr num) { @@ -136,8 +144,7 @@ do_intdiv(int nargs, awk_value_t *result, struct awk_ext_func *unused) array_set_number(array, "quotient", 8, quotient); array_set_number(array, "remainder", 9, remainder); #ifdef HAVE_MPFR - } - else { + } else { /* extended precision */ mpz_ptr numer, denom; mpz_t numer_tmp, denom_tmp; @@ -155,11 +162,13 @@ do_intdiv(int nargs, awk_value_t *result, struct awk_ext_func *unused) return make_number(-1, result); } if (mpz_sgn(denom) == 0) { - warning(ext_id, _("intdiv: division by zero attempted")); if (numer == numer_tmp) mpz_clear(numer); if (denom == denom_tmp) mpz_clear(denom); + + fatal(ext_id, _("intdiv: division by zero attempted")); + // won't get here, but keep the compiler happy return make_number(-1, result); } @@ -103,11 +103,11 @@ cleanup_mpfr(void) /* mpg_node --- allocate a node to store MPFR float or GMP integer */ NODE * -mpg_node(unsigned int tp) +mpg_node(unsigned int flags) { - NODE *r = make_number_node(tp); + NODE *r = make_number_node(flags); - if (tp == MPFN) + if (flags == MPFN) /* Initialize, set precision to the default precision, and value to NaN */ mpfr_init(r->mpg_numbr); else |