aboutsummaryrefslogtreecommitdiffstats
path: root/awk.h
diff options
context:
space:
mode:
authorjohn haque <j.eh@mchsi.com>2012-02-14 08:13:19 -0600
committerjohn haque <j.eh@mchsi.com>2012-02-14 08:13:19 -0600
commit06a6f16495e2a3d0cb664fc473107d3cdbe6f11e (patch)
treee9cd44bcd2ea18759036e894c09199378f960c2d /awk.h
parentcd44d957787e162df4348028c22e8b9621000790 (diff)
downloadegawk-06a6f16495e2a3d0cb664fc473107d3cdbe6f11e.tar.gz
egawk-06a6f16495e2a3d0cb664fc473107d3cdbe6f11e.tar.bz2
egawk-06a6f16495e2a3d0cb664fc473107d3cdbe6f11e.zip
Add infrastructure for MPFR/GMP support.
Diffstat (limited to 'awk.h')
-rw-r--r--awk.h109
1 files changed, 94 insertions, 15 deletions
diff --git a/awk.h b/awk.h
index 72593902..f08c10bf 100644
--- a/awk.h
+++ b/awk.h
@@ -25,6 +25,8 @@
/* ------------------------------ Includes ------------------------------ */
+#define HAVE_MPFR 1
+
/*
* config.h absolutely, positively, *M*U*S*T* be included before
* any system headers. Otherwise, extreme death, destruction
@@ -195,6 +197,17 @@ typedef void *stackoverflow_context_t;
this is a hack but it gives us the right semantics */
#define lintwarn (*(set_loc(__FILE__, __LINE__),lintfunc))
+#ifdef HAVE_MPFR
+#include <gmp.h>
+#include <mpfr.h>
+#ifndef MPFR_RNDN
+#define MPFR_RNDN GMP_RNDN
+#define MPFR_RNDZ GMP_RNDZ
+#define MPFR_RNDU GMP_RNDU
+#define MPFR_RNDD GMP_RNDD
+#endif
+#endif
+
#include "regex.h"
#include "dfa.h"
typedef struct Regexp {
@@ -369,9 +382,14 @@ typedef struct exp_node {
} nodep;
struct {
- AWKNUM fltnum; /* this is here for optimal packing of
- * the structure on many machines
- */
+ union {
+ AWKNUM fltnum; /* this is here for optimal packing of
+ * the structure on many machines
+ */
+#ifdef HAVE_MPFR
+ mpfr_t mpnum;
+#endif
+ } nm;
char *sp;
size_t slen;
long sref;
@@ -402,12 +420,13 @@ typedef struct exp_node {
* lazy conversion to string.
*/
# define WSTRCUR 0x0400 /* wide str value is current */
+# define MPFN 0x0800 /* multiple precision floating-point number */
/* type = Node_var_array */
-# define ARRAYMAXED 0x0800 /* array is at max size */
-# define HALFHAT 0x1000 /* half-capacity Hashed Array Tree;
+# define ARRAYMAXED 0x1000 /* array is at max size */
+# define HALFHAT 0x2000 /* half-capacity Hashed Array Tree;
* See cint_array.c */
-# define XARRAY 0x2000
+# define XARRAY 0x4000
} NODE;
#define vname sub.nodep.name
@@ -446,7 +465,10 @@ typedef struct exp_node {
#define stfmt sub.val.idx
#define wstptr sub.val.wsp
#define wstlen sub.val.wslen
-#define numbr sub.val.fltnum
+#define numbr sub.val.nm.fltnum
+#ifdef HAVE_MPFR
+#define mpfr_numbr sub.val.nm.mpnum
+#endif
/* Node_arrayfor */
#define for_list sub.nodep.r.av
@@ -990,13 +1012,15 @@ extern NODE *FNR_node, *FS_node, *IGNORECASE_node, *NF_node;
extern NODE *NR_node, *OFMT_node, *OFS_node, *ORS_node, *RLENGTH_node;
extern NODE *RSTART_node, *RS_node, *RT_node, *SUBSEP_node, *PROCINFO_node;
extern NODE *LINT_node, *ERRNO_node, *TEXTDOMAIN_node, *FPAT_node;
+extern NODE *PREC_node, *RNDMODE_node;
extern NODE *Nnull_string;
extern NODE *Null_field;
extern NODE **fields_arr;
extern int sourceline;
extern char *source;
extern int (*interpret)(INSTRUCTION *); /* interpreter routine */
-
+extern NODE *(*make_number)(AWKNUM );
+extern AWKNUM (*m_force_number)(NODE *);
#if __GNUC__ < 2
extern NODE *_t; /* used as temporary in macros */
@@ -1036,7 +1060,8 @@ extern int do_flags;
#define DO_PROFILE 0x1000
/* debug the program */
#define DO_DEBUG 0x2000
-
+/* mpfr */
+#define DO_MPFR 0x4000
#define do_traditional (do_flags & DO_TRADITIONAL)
#define do_posix (do_flags & DO_POSIX)
@@ -1049,7 +1074,7 @@ extern int do_flags;
#define do_tidy_mem (do_flags & DO_TIDY_MEM)
#define do_sandbox (do_flags & DO_SANDBOX)
#define do_debug (do_flags & DO_DEBUG)
-
+#define do_mpfr (do_flags & DO_MPFR)
extern int do_optimize;
extern int use_lc_numeric;
@@ -1077,6 +1102,12 @@ extern int ngroups;
extern struct lconv loc;
#endif /* HAVE_LOCALE_H */
+#ifdef HAVE_MPFR
+extern mpfr_prec_t PRECISION;
+extern mpfr_rnd_t RND_MODE;
+#endif
+
+
extern const char *myname;
extern const char def_strftime_format[];
@@ -1167,6 +1198,28 @@ extern STACK_ITEM *stack_top;
#endif /* __GNUC__ */
/* ------------------------- 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) \
+ : (unsigned long) (n)->numbr)
+#define get_number_si(n) (((n)->flags & MPFN) ? mpfr_get_si((n)->mpfr_numbr, RND_MODE) \
+ : (long) (n)->numbr)
+#define get_number_d(n) (((n)->flags & MPFN) ? mpfr_get_d((n)->mpfr_numbr, RND_MODE) \
+ : (double) (n)->numbr)
+#define get_number_uj(n) (((n)->flags & MPFN) ? mpfr_get_uj((n)->mpfr_numbr, RND_MODE) \
+ : (uintmax_t) (n)->numbr)
+
+#define is_nonzero_num(n) (((n)->flags & MPFN) ? (! mpfr_zero_p((n)->mpfr_numbr)) \
+ : ((n)->numbr != 0.0))
+#else
+#define get_number_ui(n) (unsigned long) (n)->numbr
+#define get_number_si(n) (long) (n)->numbr
+#define get_number_d(n) (double) (n)->numbr
+#define get_number_uj(n) (uintmax_t) (n)->numbr
+
+#define is_nonzero_num(n) ((n)->numbr != 0.0)
+#endif
+
#define is_identchar(c) (isalnum(c) || (c) == '_')
#define var_uninitialized(n) ((n)->var_value == Nnull_string)
@@ -1206,7 +1259,7 @@ extern STACK_ITEM *stack_top;
#define efree(p) free(p)
#ifdef GAWKDEBUG
-#define force_number r_force_number
+#define force_number m_force_number
#define dupnode r_dupnode
#define unref r_unref
#define m_force_string r_force_string
@@ -1225,7 +1278,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->numbr : r_force_number(_tn); })
+ (_tn->flags & NUMCUR) ? _tn->numbr : m_force_number(_tn); })
#define force_string(s) __extension__ ({ NODE *_ts = (s); m_force_string(_ts); })
@@ -1233,7 +1286,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 r_force_number
+#define force_number m_force_number
#define force_string(s) (_t = (s), m_force_string(_t))
#endif /* __GNUC__ */
#endif /* GAWKDEBUG */
@@ -1462,6 +1515,32 @@ extern int is_std_var(const char *var);
extern char *estrdup(const char *str, size_t len);
extern void update_global_values();
extern long getenv_long(const char *name);
+
+/* mpfr.c */
+#ifdef HAVE_MPFR
+extern void set_PREC(void);
+extern void set_RNDMODE(void);
+extern NODE *do_and_mpfr(int);
+extern NODE *do_atan2_mpfr(int);
+extern NODE *do_compl_mpfr(int);
+extern NODE *do_cos_mpfr(int);
+extern NODE *do_exp_mpfr(int);
+extern NODE *do_int_mpfr(int);
+extern NODE *do_log_mpfr(int);
+extern NODE *do_lshift_mpfr(int);
+extern NODE *do_or_mpfr(int);
+extern NODE *do_rand_mpfr(int);
+extern NODE *do_rhift_mpfr(int);
+extern NODE *do_sin_mpfr(int);
+extern NODE *do_sqrt_mpfr(int);
+extern NODE *do_srand_mpfr(int);
+extern NODE *do_strtonum_mpfr(int);
+extern NODE *do_xor_mpfr(int);
+extern void init_mpfr(const char *);
+extern AWKNUM force_mpfr_number(NODE *n);
+extern NODE *mpfr_node();
+extern NODE *make_mpfr_number(double x);
+#endif
/* msg.c */
extern void gawk_exit(int status);
extern void err(const char *s, const char *emsg, va_list argp) ATTRIBUTE_PRINTF(2, 0);
@@ -1490,7 +1569,7 @@ extern void pp_string_fp(Func_print print_func, FILE *fp, const char *str,
extern AWKNUM r_force_number(NODE *n);
extern NODE *format_val(const char *format, int index, NODE *s);
extern NODE *r_dupnode(NODE *n);
-extern NODE *make_number(AWKNUM x);
+extern NODE *r_make_number(AWKNUM x);
extern NODE *r_make_str_node(const char *s, size_t len, int flags);
extern void *more_blocks(int id);
extern void r_unref(NODE *tmp);
@@ -1522,7 +1601,7 @@ extern void resetup(void);
extern int avoid_dfa(NODE *re, char *str, size_t len);
extern int reisstring(const char *text, size_t len, Regexp *re, const char *buf);
extern int remaybelong(const char *text, size_t len);
-extern int isnondecimal(const char *str, int use_locale);
+extern int get_numbase(const char *str, int use_locale);
/* symbol.c */
extern NODE *install_symbol(char *name, NODETYPE type);