aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--awk.h1
-rw-r--r--mpfr.c20
-rw-r--r--node.c5
4 files changed, 32 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 1ac0efb9..45c2de22 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,15 @@
2020-07-08 Arnold D. Robbins <arnold@skeeve.com>
* str_array.c (str_lookup): If a pure number, copy to a string. Fixes
- at least printfchar test for MPFR, possibly some others.
+ at printfchar test for MPFR.
+
+ Fix typeregex2 and typedregex3 tests for MPFR:
+
+ * mpfr.c (mpg_zero): No longer static inline.
+ (force_mpnum): Handle the case of a strongly typed regex.
+ (mpg_interpret): Add tracing for do_itrace.
+ * awk.h (mpg_zero): Add declaration.
+ * node.c (make_typed_regex): Init to zero for MPFR via mpg_zero.
2020-07-07 Arnold D. Robbins <arnold@skeeve.com>
diff --git a/awk.h b/awk.h
index 0dc3d3e9..4ff1141b 100644
--- a/awk.h
+++ b/awk.h
@@ -1673,6 +1673,7 @@ extern void cleanup_mpfr(void);
extern NODE *mpg_node(unsigned int);
extern const char *mpg_fmt(const char *, ...);
extern int mpg_strtoui(mpz_ptr, char *, size_t, char **, int);
+extern void mpg_zero(NODE *n);
#endif
/* msg.c */
extern void gawk_exit(int status);
diff --git a/mpfr.c b/mpfr.c
index 3b4258cc..3ffcba17 100644
--- a/mpfr.c
+++ b/mpfr.c
@@ -247,7 +247,7 @@ mpg_maybe_float(const char *str, int use_locale)
/* mpg_zero --- initialize with arbitrary-precision integer(GMP) and set value to zero */
-static inline void
+void
mpg_zero(NODE *n)
{
if (is_mpg_float(n)) {
@@ -271,7 +271,7 @@ force_mpnum(NODE *n, int do_nondec, int use_locale)
char save;
int tval, base = 10;
- if (n->stlen == 0) {
+ if (n->stlen == 0 || (n->flags & REGEX) != 0) {
mpg_zero(n);
return false;
}
@@ -1525,7 +1525,13 @@ mpg_interpret(INSTRUCTION **cp)
NODE **lhs;
int tval; /* the ternary value returned by a MPFR function */
- switch ((op = pc->opcode)) {
+ op = pc->opcode;
+ if (do_itrace) {
+ fprintf(stderr, "+ mpg_interpret: %s: ", opcode2str(op));
+ fflush(stderr);
+ }
+
+ switch (op) {
case Op_plus_i:
t2 = force_number(pc->memory);
goto plus;
@@ -1750,10 +1756,18 @@ mod:
break;
default:
+ if (do_itrace) {
+ fprintf(stderr, "unhandled\n", opcode2str(op));
+ fflush(stderr);
+ }
return true; /* unhandled */
}
*cp = pc->nexti; /* next instruction to execute */
+ if (do_itrace) {
+ fprintf(stderr, "handled\n", opcode2str(op));
+ fflush(stderr);
+ }
return false;
}
diff --git a/node.c b/node.c
index 2db6a1ef..ecb9ad0e 100644
--- a/node.c
+++ b/node.c
@@ -479,6 +479,11 @@ make_typed_regex(const char *re, size_t len)
n2 = make_string(re, len);
n2->typed_re = n;
+#if HAVE_MPFR
+ if (do_mpfr)
+ mpg_zero(n2);
+ else
+#endif
n2->numbr = 0;
n2->flags |= NUMCUR|STRCUR|REGEX;
n2->flags &= ~(STRING|NUMBER);