aboutsummaryrefslogtreecommitdiffstats
path: root/awk.h
diff options
context:
space:
mode:
Diffstat (limited to 'awk.h')
-rw-r--r--awk.h51
1 files changed, 25 insertions, 26 deletions
diff --git a/awk.h b/awk.h
index 02fb3e04..9944ea95 100644
--- a/awk.h
+++ b/awk.h
@@ -466,7 +466,7 @@ typedef struct exp_node {
#define wstlen sub.val.wslen
#define numbr sub.val.nm.fltnum
#ifdef HAVE_MPFR
-#define mpfr_numbr sub.val.nm.mpnum
+#define mpg_numbr sub.val.nm.mpnum
#endif
/* Node_arrayfor */
@@ -1018,10 +1018,13 @@ extern NODE **fields_arr;
extern int sourceline;
extern char *source;
extern int (*interpret)(INSTRUCTION *); /* interpreter routine */
-extern NODE *(*make_number)(AWKNUM );
-extern NODE *(*m_force_number)(NODE *);
+extern NODE *(*make_number)(double); /* double instead of AWKNUM on purpose */
+extern NODE *(*str2number)(NODE *);
extern NODE *(*format_val)(const char *, int, NODE *);
+typedef int (*Func_pre_exec)(INSTRUCTION **);
+typedef void (*Func_post_exec)(INSTRUCTION *);
+
#if __GNUC__ < 2
extern NODE *_t; /* used as temporary in macros */
#endif
@@ -1060,7 +1063,7 @@ extern int do_flags;
#define DO_PROFILE 0x1000
/* debug the program */
#define DO_DEBUG 0x2000
-/* mpfr */
+/* arbitrary-precision floating-point math */
#define DO_MPFR 0x4000
#define do_traditional (do_flags & DO_TRADITIONAL)
@@ -1103,11 +1106,12 @@ extern struct lconv loc;
#endif /* HAVE_LOCALE_H */
#ifdef HAVE_MPFR
-extern mpfr_prec_t PRECISION;
-extern mpfr_rnd_t RND_MODE;
+extern mpfr_prec_t PRECISION;
+extern mpfr_rnd_t RND_MODE;
extern mpfr_t MNR;
extern mpfr_t MFNR;
extern mpz_t mpzval;
+extern int do_subnormalize; /* IEEE 754 binary format emulation */
#endif
@@ -1200,21 +1204,18 @@ extern STACK_ITEM *stack_top;
/* ------------------------- Pseudo-functions ------------------------- */
#ifdef HAVE_MPFR
/* conversion to C types */
-#define get_number_ui(n) (((n)->flags & MPFN) ? mpfr_get_ui((n)->mpfr_numbr, RND_MODE) \
+#define get_number_ui(n) (((n)->flags & MPFN) ? mpfr_get_ui((n)->mpg_numbr, RND_MODE) \
: (unsigned long) (n)->numbr)
-#define get_number_si(n) (((n)->flags & MPFN) ? mpfr_get_si((n)->mpfr_numbr, RND_MODE) \
+#define get_number_si(n) (((n)->flags & MPFN) ? mpfr_get_si((n)->mpg_numbr, RND_MODE) \
: (long) (n)->numbr)
-#define get_number_d(n) (((n)->flags & MPFN) ? mpfr_get_d((n)->mpfr_numbr, RND_MODE) \
+#define get_number_d(n) (((n)->flags & MPFN) ? mpfr_get_d((n)->mpg_numbr, RND_MODE) \
: (double) (n)->numbr)
-#define get_number_uj(n) (((n)->flags & MPFN) ? mpfr_get_uj((n)->mpfr_numbr, RND_MODE) \
+#define get_number_uj(n) (((n)->flags & MPFN) ? mpfr_get_uj((n)->mpg_numbr, RND_MODE) \
: (uintmax_t) (n)->numbr)
-#define is_nonzero_num(n) (((n)->flags & MPFN) ? (! mpfr_zero_p((n)->mpfr_numbr)) \
+#define is_nonzero_num(n) (((n)->flags & MPFN) ? (! mpfr_zero_p((n)->mpg_numbr)) \
: ((n)->numbr != 0.0))
-
-/* increment NR or FNR */
-#define INCREMNT(X) (do_mpfr && X == (LONG_MAX - 1)) ? \
- (mpfr_add_ui(M##X, M##X, 1, RND_MODE), X = 0) : X++
+#define SUBNORMALIZE(r, t) do_subnormalize ? mpfr_subnormalize(r, t, RND_MODE) : (void)0
#else
#define get_number_ui(n) (unsigned long) (n)->numbr
#define get_number_si(n) (long) (n)->numbr
@@ -1222,8 +1223,6 @@ extern STACK_ITEM *stack_top;
#define get_number_uj(n) (uintmax_t) (n)->numbr
#define is_nonzero_num(n) ((n)->numbr != 0.0)
-
-#define INCREMNT(X) X++
#endif
#define is_identchar(c) (isalnum(c) || (c) == '_')
@@ -1265,7 +1264,7 @@ extern STACK_ITEM *stack_top;
#define efree(p) free(p)
#ifdef GAWKDEBUG
-#define force_number m_force_number
+#define force_number str2number
#define dupnode r_dupnode
#define unref r_unref
#define m_force_string r_force_string
@@ -1284,7 +1283,7 @@ extern NODE *r_force_string(NODE *s);
(_tn->flags & MALLOC) ? (_tn->valref++, _tn) : r_dupnode(_tn); })
#define force_number(n) __extension__ ({ NODE *_tn = (n); \
- (_tn->flags & NUMCUR) ? _tn : m_force_number(_tn); })
+ (_tn->flags & NUMCUR) ? _tn : str2number(_tn); })
#define force_string(s) __extension__ ({ NODE *_ts = (s); m_force_string(_ts); })
@@ -1292,7 +1291,7 @@ extern NODE *r_force_string(NODE *s);
#define dupnode(n) (_t = (n), \
(_t->flags & MALLOC) ? (_t->valref++, _t) : r_dupnode(_t))
-#define force_number m_force_number
+#define force_number str2number
#define force_string(s) (_t = (s), m_force_string(_t))
#endif /* __GNUC__ */
#endif /* GAWKDEBUG */
@@ -1374,6 +1373,7 @@ extern SRCFILE *add_srcfile(int stype, char *src, SRCFILE *curr, int *already_in
extern void register_deferred_variable(const char *name, NODE *(*load_func)(void));
extern int files_are_same(char *path, SRCFILE *src);
extern void valinfo(NODE *n, Func_print print_func, FILE *fp);
+extern void negate_num(NODE *n);
/* builtin.c */
extern double double_to_int(double d);
extern NODE *do_exp(int nargs);
@@ -1444,13 +1444,13 @@ extern const char *flags2str(int);
extern const char *genflags2str(int flagval, const struct flagtab *tab);
extern const char *nodetype2str(NODETYPE type);
extern void load_casetable(void);
-
extern AWKNUM calc_exp(AWKNUM x1, AWKNUM x2);
extern const char *opcode2str(OPCODE type);
extern const char *op2str(OPCODE type);
extern NODE **r_get_lhs(NODE *n, int reference);
extern STACK_ITEM *grow_stack(void);
extern void dump_fcall_stack(FILE *fp);
+extern int register_exec_hook(Func_pre_exec preh, Func_post_exec posth);
/* ext.c */
NODE *do_ext(int nargs);
NODE *load_ext(const char *lib_name, const char *init_func, NODE *obj);
@@ -1526,8 +1526,8 @@ extern long getenv_long(const char *name);
extern void set_PREC(void);
extern void set_RNDMODE(void);
#ifdef HAVE_MPFR
-extern void mpfr_update_var(NODE *);
-extern long mpfr_set_var(NODE *);
+extern void mpg_update_var(NODE *);
+extern long mpg_set_var(NODE *);
extern NODE *do_mpfr_and(int);
extern NODE *do_mpfr_atan2(int);
extern NODE *do_mpfr_compl(int);
@@ -1545,9 +1545,8 @@ extern NODE *do_mpfr_srand(int);
extern NODE *do_mpfr_strtonum(int);
extern NODE *do_mpfr_xor(int);
extern void init_mpfr(const char *);
-extern NODE *mpfr_node();
-extern void op_mpfr_assign(OPCODE op);
-const char *mpfr_fmt(const char *mesg, ...);
+extern NODE *mpg_node();
+const char *mpg_fmt(const char *mesg, ...);
#endif
/* msg.c */
extern void gawk_exit(int status);