Mercurial > hg > xemacs-beta
annotate src/number-mp.h @ 4843:715b15990d0a
add more foo_checking_assert macros
lisp.h: Add structure_checking_assert(), gc_checking_assert(), etc. for
all types of error-checking. Also FOO_checking_assert_with_message()
and inline_FOO_checking_assert() -- the latter for use in an inline
function where you want the calling function's line/file to be reported
(requires some conspiracy with the function itself).
Add disabled_assert(), disabled_assert_at_line(),
disabled_assert_with_message(), for what to do when an assert is
disabled. Formerly, we used to do ((void) 0), but now we do
((void) x), so the variable appears used and any side effects of the
expression do get done. In Unicode-internal, the standard assert()
uses this, but not yet in this workspace.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Wed, 13 Jan 2010 03:01:43 -0600 |
parents | 2fc0e2f18322 |
children | ba07c880114a |
rev | line source |
---|---|
1983 | 1 /* Definitions of numeric types for XEmacs using the MP library. |
2 Copyright (C) 2004 Jerry James. | |
3 | |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with XEmacs; see the file COPYING. If not, write to | |
4802
2fc0e2f18322
Don't create any bignums before pdumping. Add bignum, ratio, and bigfloat
Jerry James <james@xemacs.org>
parents:
1983
diff
changeset
|
18 the Free Software Foundation, Inc., 51 Franklin St - Fifth Floor, |
2fc0e2f18322
Don't create any bignums before pdumping. Add bignum, ratio, and bigfloat
Jerry James <james@xemacs.org>
parents:
1983
diff
changeset
|
19 Boston, MA 02111-1301, USA. */ |
1983 | 20 |
21 /* Synched up with: Not in FSF. */ | |
22 | |
23 /* This library defines the following types: | |
24 bignum = MINT | |
25 | |
26 The MP library does not include support for ratios or bigfloats. | |
27 */ | |
28 | |
29 #ifndef INCLUDED_number_mp_h_ | |
30 #define INCLUDED_number_mp_h_ | |
31 | |
32 /* BSD MP libraries without MP_PREFIX define a function named pow in mp.h that | |
33 has a different prototype from the one in math.h. We don't use that | |
34 function anyway, so we do this for safety purposes. However, this means | |
35 that number-mp.h must always be included before math.h. */ | |
36 #define pow mp_pow | |
37 #include <mp.h> | |
38 #undef pow | |
39 | |
40 #ifdef MP_PREFIX | |
41 #define MP_GCD mp_gcd | |
42 #define MP_ITOM mp_itom | |
43 #define MP_MADD mp_madd | |
44 #define MP_MCMP mp_mcmp | |
45 #define MP_MDIV mp_mdiv | |
46 #define MP_MFREE mp_mfree | |
47 #define MP_MSUB mp_msub | |
48 #define MP_MULT mp_mult | |
49 #define MP_SDIV mp_sdiv | |
50 #ifdef HAVE_MP_MOVE | |
51 #define MP_MOVE(x,y) mp_move (x, y) | |
52 #else | |
53 #define MP_MOVE(x,y) mp_madd (x, bignum_zero, y) | |
54 #endif | |
55 #else | |
56 #define MP_GCD gcd | |
57 #define MP_ITOM itom | |
58 #define MP_MADD madd | |
59 #define MP_MCMP mcmp | |
60 #define MP_MDIV mdiv | |
61 #define MP_MFREE mfree | |
62 #define MP_MSUB msub | |
63 #define MP_MULT mult | |
64 #define MP_SDIV sdiv | |
65 #ifdef HAVE_MP_MOVE | |
66 #define MP_MOVE(x,y) move (x, y) | |
67 #else | |
68 #define MP_MOVE(x,y) madd (x, bignum_zero, y) | |
69 #endif | |
70 #endif | |
71 | |
72 typedef MINT *bignum; | |
73 | |
74 extern void init_number_mp(void); | |
75 | |
76 | |
77 /********************************* Bignums **********************************/ | |
78 | |
79 #define HAVE_BIGNUM 1 | |
80 | |
81 extern MINT *bignum_zero, *intern_bignum; | |
82 extern MINT *bignum_min_int, *bignum_max_int, *bignum_max_uint; | |
83 extern MINT *bignum_min_long, *bignum_max_long, *bignum_max_ulong; | |
84 extern short div_rem; | |
85 | |
86 /***** Bignum: basic functions *****/ | |
87 #define bignum_init(b) (b = MP_ITOM (0)) | |
88 #define bignum_fini(b) MP_MFREE (b) | |
89 #define bignum_hashcode(b) bignum_to_uint (b) | |
90 #define bignum_sign(b) MP_MCMP (b, bignum_zero) | |
91 #define bignum_evenp(b) (MP_SDIV (b, 2, intern_bignum, &div_rem), \ | |
92 div_rem == 0) | |
93 #define bignum_oddp(b) (MP_SDIV (b, 2, intern_bignum, &div_rem), \ | |
94 div_rem != 0) | |
95 | |
96 /***** Bignum: size *****/ | |
97 #define bignum_fits_int_p(b) (MP_MCMP (b, bignum_min_int) >= 0 && \ | |
98 MP_MCMP (b, bignum_max_int) <= 0) | |
99 #define bignum_fits_uint_p(b) (MP_MCMP (b, bignum_zero) >= 0 && \ | |
100 MP_MCMP (b, bignum_max_uint) <= 0) | |
101 #define bignum_fits_long_p(b) (MP_MCMP (b, bignum_min_long) >= 0 && \ | |
102 MP_MCMP (b, bignum_max_long) <= 0) | |
103 #define bignum_fits_ulong_p(b) (MP_MCMP (b, bignum_zero) >= 0 && \ | |
104 MP_MCMP (b, bignum_max_ulong) <= 0) | |
105 | |
106 /***** Bignum: conversions *****/ | |
107 extern char *bignum_to_string(bignum, int); | |
108 extern int bignum_to_int(bignum); | |
109 extern unsigned int bignum_to_uint(bignum); | |
110 extern long bignum_to_long(bignum); | |
111 extern unsigned long bignum_to_ulong(bignum); | |
112 extern double bignum_to_double(bignum); | |
113 | |
114 /***** Bignum: converting assignments *****/ | |
115 #define bignum_set(b1, b2) MP_MOVE (b2, b1) | |
116 extern int bignum_set_string(bignum, const char *, int); | |
117 extern void bignum_set_long(bignum, long); | |
118 extern void bignum_set_ulong(bignum, unsigned long); | |
119 extern void bignum_set_double(bignum, double); | |
120 | |
121 /***** Bignum: comparisons *****/ | |
122 #define bignum_cmp(b1,b2) MP_MCMP (b1, b2) | |
123 #define bignum_lt(b1,b2) (MP_MCMP (b1, b2) < 0) | |
124 #define bignum_le(b1,b2) (MP_MCMP (b1, b2) <= 0) | |
125 #define bignum_eql(b1,b2) (MP_MCMP (b1, b2) == 0) | |
126 #define bignum_ge(b1,b2) (MP_MCMP (b1, b2) >= 0) | |
127 #define bignum_gt(b1,b2) (MP_MCMP (b1, b2) > 0) | |
128 | |
129 /***** Bignum: arithmetic *****/ | |
130 #define bignum_neg(b,b2) MP_MSUB (bignum_zero, b2, b) | |
131 #define bignum_abs(b,b2) (MP_MCMP (b2, bignum_zero) < 0 \ | |
132 ? MP_MSUB (bignum_zero, b2, b) \ | |
133 : MP_MADD (bignum_zero, b2, b)) | |
134 #define bignum_add(b,b1,b2) MP_MADD (b1, b2, b) | |
135 #define bignum_sub(b,b1,b2) MP_MSUB (b1, b2, b) | |
136 #define bignum_mul(b,b1,b2) MP_MULT (b1, b2, b) | |
137 extern int bignum_divisible_p(bignum, bignum); | |
138 #define bignum_div(b,b1,b2) MP_MDIV (b1, b2, b, intern_bignum) | |
139 extern void bignum_ceil(bignum, bignum, bignum); | |
140 extern void bignum_floor(bignum, bignum, bignum); | |
141 #define bignum_mod(b,b1,b2) MP_MDIV (b1, b2, intern_bignum, b) | |
142 extern void bignum_pow(bignum, bignum, unsigned long); | |
143 #define bignum_gcd(res,b1,b2) MP_GCD (b1, b2, res) | |
144 extern void bignum_lcm(bignum, bignum, bignum); | |
145 | |
146 /***** Bignum: bit manipulations *****/ | |
147 extern void bignum_and(bignum, bignum, bignum); | |
148 extern void bignum_ior(bignum, bignum, bignum); | |
149 extern void bignum_xor(bignum, bignum, bignum); | |
150 extern void bignum_not(bignum, bignum); | |
151 extern void bignum_setbit(bignum, unsigned long); | |
152 extern void bignum_clrbit(bignum, unsigned long); | |
153 extern int bignum_testbit(bignum, unsigned long); | |
154 extern void bignum_lshift(bignum, bignum, unsigned long); | |
155 extern void bignum_rshift(bignum, bignum, unsigned long); | |
156 | |
157 /***** Bignum: random numbers *****/ | |
158 extern void bignum_random_seed(unsigned long); | |
159 extern void bignum_random(bignum, bignum); | |
160 | |
161 #endif /* INCLUDED_number_mp_h_ */ |