Build Fix -- compatibility issue with newer autoconf
[sxemacs] / src / ent / ent-pseumpc.h
1 /*
2   ent-pseumpc.h -- Numeric types for SXEmacs
3   Copyright (C) 2005, 2006 Sebastian Freundt
4
5   Author:  Sebastian Freundt
6
7 This file is part of SXEmacs
8
9 SXEmacs is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14 SXEmacs is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program.  If not, see <http://www.gnu.org/licenses/>. */
21
22
23 #ifndef INCLUDED_number_pseumpc_h_
24 #define INCLUDED_number_pseumpc_h_
25
26 #ifdef UNO
27 /* Uno complains about several inline functions that include conditions with
28    assignments and side effects if we don't do this */
29 #undef __GNUC__
30 #endif
31
32 #ifdef HAVE_MPFR_H
33 # include "mpfr.h"
34 #endif
35
36 struct bigc
37 {
38         bigfr real;
39         bigfr imag;
40 };
41 typedef struct bigc bigc[1];
42
43 \f
44 struct Lisp_Bigc
45 {
46         struct lrecord_header lheader;
47         bigc data;
48 };
49 typedef struct Lisp_Bigc Lisp_Bigc;
50
51 DECLARE_LRECORD(bigc, Lisp_Bigc);
52 #define XBIGC(x) XRECORD(x, bigc, Lisp_Bigc)
53 #define wrap_bigc(p) wrap_object(p)
54 #define BIGCP(x) RECORDP(x, bigc)
55 #define CHECK_BIGC(x) CHECK_RECORD(x, bigc)
56 #define CONCHECK_BIGC(x) CONCHECK_RECORD(x, bigc)
57
58 #define bigc_data(f) ((f)->data)
59 #define XBIGC_DATA(x) bigc_data(XBIGC(x))
60 #define XBIGC_GET_PREC(x) bigc_get_prec(XBIGC_DATA(x))
61 #define XBIGC_SET_PREC(x,p) bigc_set_prec(XBIGC_DATA(x), p)
62
63 #define XBIGC_RE(x) bigc_re(XBIGC_DATA(x))
64 #define XBIGC_IM(x) bigc_im(XBIGC_DATA(x))
65
66 #define BIGC_ARITH_RETURN(f,op) do                                      \
67 {                                                                       \
68         Lisp_Object retval = make_bigc_bc(XBIGC_DATA(f));               \
69         bigc_##op(XBIGC_DATA(retval), XBIGC_DATA(f));                   \
70         return retval;                                                  \
71 } while (0)
72
73 #define BIGC_ARITH_RETURN1(f,op,arg) do                                 \
74 {                                                                       \
75         Lisp_Object retval = make_bigc_bc(XBIGC_DATA(f));               \
76         bigc_##op(XBIGC_DATA(retval), XBIGC_DATA(f), arg);              \
77         return retval;                                                  \
78 } while (0)
79
80 #define BIGC_INIT_PREC(f, prec) do                                      \
81 {                                                                       \
82         bigc_init_prec(f, internal_get_precision(prec));                \
83 } while (0)
84
85 extern Lisp_Object make_bigc(fpfloat, fpfloat, unsigned long);
86 extern Lisp_Object make_bigc_bfr(bigfr, bigfr, unsigned long);
87 extern Lisp_Object make_bigc_bc(bigc);
88
89 extern bigc ent_scratch_bigc;
90
91 \f
92 /******************************** Bigcs ********************************/
93
94 /***** Bigc: basic functions *****/
95 extern void bigc_init(bigc);
96 extern void bigc_init_prec(bigc, unsigned long);
97 extern void bigc_init_2prec(bigc, unsigned long, unsigned long);
98 extern void bigc_fini(bigc);
99 #define bigc_hashcode(f)                (bigfr_hashcode(bigc_re(f)) ^ \
100                                          bigfr_hashcode(bigc_im(f)))
101 #define bigc_get_prec(f)                max(bigfr_get_prec(bigc_re(f)), \
102                                             bigfr_get_prec(bigc_im(f)))
103 extern void bigc_set_prec(bigc, unsigned long);
104 #define bigc_set_default_prec(prec)
105 #define bigc_get_default_prec()         bigfr_get_default_prec()
106
107 /***** Bigc: conversions *****/
108 extern Bufbyte *bigc_to_string(bigc, int);
109
110 /***** Bigc: converting assignments *****/
111 extern void bigc_set(bigc, bigc);
112 extern void bigc_set_long(bigc, long);
113 extern void bigc_set_long_long(bigc, long, long);
114 extern void bigc_set_ulong(bigc, unsigned long);
115 extern void bigc_set_ulong_ulong(bigc, unsigned long, unsigned long);
116 extern void bigc_set_fpfloat(bigc, fpfloat);
117 extern void bigc_set_fpfloat_fpfloat(bigc, fpfloat, fpfloat);
118 extern void bigc_set_bigfr(bigc, bigfr);
119 extern void bigc_set_bigfr_bigfr(bigc, bigfr, bigfr);
120
121 #define bigc_re(z)                      ((z)->real)
122 #define bigc_im(z)                      ((z)->imag)
123
124 /***** Bigc: comparisons *****/
125 extern int bigc_eq(bigc, bigc);
126 #define bigc_cmp(f1,f2)             (bigc_eq(f1,f2) ? 0 : 1)
127
128 /***** Bigc: arithmetic *****/
129 extern void bigc_neg(bigc, bigc);
130 extern void bigc_abs(bigfr, bigc);
131 extern void bigc_norm(bigfr, bigc);
132 extern void bigc_conj(bigc, bigc);
133 extern void bigc_add(bigc, bigc, bigc);
134 extern void bigc_sub(bigc, bigc, bigc);
135 extern void bigc_mul(bigc, bigc, bigc);
136 extern void bigc_div(bigc, bigc, bigc);
137 #if defined HAVE_MPZ && defined WITH_GMP
138 extern void bigc_pow(bigc, bigc, unsigned long);
139 #endif
140
141 extern void bigc_sqrt(bigc, bigc);
142
143 /* Advanced functions */
144 #define bigc_exp(res, f)
145
146 /* indefinite handling */
147 extern int bigc_nan_p(bigc);
148 extern int bigc_inf_p(bigc);
149
150 extern Lisp_Object read_bigc_string(char*);
151
152 extern void init_optables_BIGC_T(void);
153 extern void init_ent_mpc(void);
154 extern void syms_of_ent_mpc(void);
155 extern void vars_of_ent_mpc(void);
156
157 #endif /* INCLUDED_number_pseumpc_h_ */