Mercurial > cpython-lru_cache-weakref
annotate Modules/mpzmodule.c @ 17581:c1937faabb23 2.1
Added support for optional explanation parameter to the \versionadded
macro.
Refactored do_cmd_versionadded() and do_cmd_versionchanged() to do most
of the work in a helper function, with the do_cmd_*() wrappers just supplying
a portion of the replacement text.
| author | Fred Drake <fdrake@acm.org> |
|---|---|
| date | Wed, 18 Apr 2001 17:29:14 +0000 |
| parents | bf9c24beda7d |
| children | faf7f171a9f3 0b64550a7461 |
| rev | line source |
|---|---|
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 /* MPZ module */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 /* This module provides an interface to an alternate Multi-Precision |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 library, GNU MP in this case */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
6 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
7 /* XXX note: everywhere where mpz_size is called, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 sizeof (limb) == sizeof (long) has been assumed. */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
9 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
10 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
11 /* MPZ objects */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
12 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
13 #include "Python.h" |
|
2123
fd5ab7e828fc
cosmetic changes so these modules will work with the strict new naming scheme
Guido van Rossum <guido@python.org>
parents:
2061
diff
changeset
|
14 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
15 #include <assert.h> |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
16 #include <sys/types.h> /* For size_t */ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
17 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
18 /* |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
19 ** These are the cpp-flags used in this file... |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
20 ** |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
21 ** |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
22 ** MPZ_MDIV_BUG works around the mpz_m{div,mod,...} routines. |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
23 ** This bug has been fixed in a later release of |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
24 ** GMP. |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
25 ** |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
26 ** MPZ_GET_STR_BUG mpz_get_str corrupts memory, seems to be fixed |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
27 ** in a later release |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
28 ** |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
29 ** MPZ_DEBUG generates a bunch of diagnostic messages |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
30 ** |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
31 ** MPZ_SPARE_MALLOC if set, results in extra code that tries to |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
32 ** minimize the creation of extra objects. |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
33 ** |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
34 ** MPZ_TEST_DIV extra diagnostic output on stderr, when division |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
35 ** routines are involved |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
36 ** |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
37 ** MPZ_LIB_DOES_CHECKING if set, assumes that mpz library doesn't call |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
38 ** alloca with arg < 0 (when casted to a signed |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
39 ** integral type). |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
40 ** |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
41 ** MPZ_CONVERSIONS_AS_METHODS if set, presents the conversions as |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
42 ** methods. e.g., `mpz(5).long() == 5L' |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
43 ** Later, Guido provided an interface to the |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
44 ** standard functions. So this flag has no been |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
45 ** cleared, and `long(mpz(5)) == 5L' |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
46 ** |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
47 ** MP_TEST_ALLOC If set, you would discover why MPZ_GET_STR_BUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
48 ** is needed |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
49 ** |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
50 ** MAKEDUMMYINT Must be set if dynamic linking will be used |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
51 */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
52 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
53 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
54 /* |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
55 ** IMHO, mpz_m{div,mod,divmod}() do the wrong things when the denominator < 0 |
|
4052
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
56 ** This has been fixed with gmp release 2.0 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
57 */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
58 /*#define MPZ_MDIV_BUG fixed the (for me) nexessary parts in libgmp.a */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
59 /* |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
60 ** IMO, mpz_get_str() assumes a bit too large target space, if he doesn't |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
61 ** allocate it himself |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
62 */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
63 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
64 #include "gmp.h" |
| 11847 | 65 |
|
11858
bbb751f55d04
Better fix for mpzmodule problem reported by Peter Funk: just use
Andrew M. Kuchling <amk@amk.ca>
parents:
11847
diff
changeset
|
66 #if __GNU_MP__ + 0 == 2 |
|
bbb751f55d04
Better fix for mpzmodule problem reported by Peter Funk: just use
Andrew M. Kuchling <amk@amk.ca>
parents:
11847
diff
changeset
|
67 #define GMP2 |
| 11847 | 68 #define BITS_PER_MP_LIMB mp_bits_per_limb |
| 69 #else | |
|
11858
bbb751f55d04
Better fix for mpzmodule problem reported by Peter Funk: just use
Andrew M. Kuchling <amk@amk.ca>
parents:
11847
diff
changeset
|
70 #define MPZ_GET_STR_BUG |
|
6853
672a657abba8
Untested change to include gmp-mparam.h instead of gmp-impl.h.
Guido van Rossum <guido@python.org>
parents:
6085
diff
changeset
|
71 #include "gmp-mparam.h" |
| 11847 | 72 #endif |
|
4052
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
73 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
74 typedef struct { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
75 PyObject_HEAD |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
76 MP_INT mpz; /* the actual number */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
77 } mpzobject; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
78 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
79 staticforward PyTypeObject MPZtype; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
80 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
81 #define is_mpzobject(v) ((v)->ob_type == &MPZtype) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
82 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
83 static const char initialiser_name[] = "mpz"; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
84 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
85 /* #define MPZ_DEBUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
86 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
87 static mpzobject * |
|
13651
8a063423e0b7
Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
88 newmpzobject(void) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
89 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
90 mpzobject *mpzp; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
91 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
92 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
93 #ifdef MPZ_DEBUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
94 fputs( "mpz_object() called...\n", stderr ); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
95 #endif /* def MPZ_DEBUG */ |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11858
diff
changeset
|
96 mpzp = PyObject_New(mpzobject, &MPZtype); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
97 if (mpzp == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
98 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
99 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
100 mpz_init(&mpzp->mpz); /* actual initialisation */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
101 return mpzp; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
102 } /* newmpzobject() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
103 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
104 #ifdef MPZ_GET_STR_BUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
105 #include "longlong.h" |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
106 #endif /* def MPZ_GET_STR_BUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
107 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
108 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
109 mpz_format(PyObject *objp, int base, unsigned char withname) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
110 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
111 mpzobject *mpzp = (mpzobject *)objp; |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
112 PyStringObject *strobjp; |
|
13083
e0c903112e4e
Trent Mick: use size_t instead of int where appropriate (mpz_format()).
Guido van Rossum <guido@python.org>
parents:
12576
diff
changeset
|
113 size_t i; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
114 int cmpres; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
115 int taglong; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
116 char *cp; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
117 char prefix[5], *tcp; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
118 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
119 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
120 tcp = &prefix[0]; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
121 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
122 if (mpzp == NULL || !is_mpzobject(mpzp)) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
123 PyErr_BadInternalCall(); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
124 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
125 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
126 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
127 assert(base >= 2 && base <= 36); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
128 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
129 if (withname) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
130 i = strlen(initialiser_name) + 2; /* e.g. 'mpz(' + ')' */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
131 else |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
132 i = 0; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
133 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
134 if ((cmpres = mpz_cmp_si(&mpzp->mpz, 0L)) == 0) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
135 base = 10; /* '0' in every base, right */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
136 else if (cmpres < 0) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
137 *tcp++ = '-'; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
138 i += 1; /* space to hold '-' */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
139 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
140 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
141 #ifdef MPZ_DEBUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
142 fprintf(stderr, "mpz_format: mpz_sizeinbase %d\n", |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
143 (int)mpz_sizeinbase(&mpzp->mpz, base)); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
144 #endif /* def MPZ_DEBUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
145 #ifdef MPZ_GET_STR_BUG |
|
4052
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
146 #ifdef GMP2 |
|
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
147 i += ((size_t) abs(mpzp->mpz._mp_size) * BITS_PER_MP_LIMB |
|
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
148 * __mp_bases[base].chars_per_bit_exactly) + 1; |
|
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
149 #else |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
150 i += ((size_t) abs(mpzp->mpz.size) * BITS_PER_MP_LIMB |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
151 * __mp_bases[base].chars_per_bit_exactly) + 1; |
|
4052
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
152 #endif |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
153 #else /* def MPZ_GET_STR_BUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
154 i += (int)mpz_sizeinbase(&mpzp->mpz, base); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
155 #endif /* def MPZ_GET_STR_BUG else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
156 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
157 if (base == 16) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
158 *tcp++ = '0'; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
159 *tcp++ = 'x'; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
160 i += 2; /* space to hold '0x' */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
161 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
162 else if (base == 8) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
163 *tcp++ = '0'; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
164 i += 1; /* space to hold the extra '0' */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
165 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
166 else if (base > 10) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
167 *tcp++ = '0' + base / 10; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
168 *tcp++ = '0' + base % 10; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
169 *tcp++ = '#'; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
170 i += 3; /* space to hold e.g. '12#' */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
171 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
172 else if (base < 10) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
173 *tcp++ = '0' + base; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
174 *tcp++ = '#'; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
175 i += 2; /* space to hold e.g. '6#' */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
176 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
177 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
178 /* |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
179 ** the following code looks if we need a 'L' attached to the number |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
180 ** it will also attach an 'L' to the value -0x80000000 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
181 */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
182 taglong = 0; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
183 if (mpz_size(&mpzp->mpz) > 1 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
184 || (long)mpz_get_ui(&mpzp->mpz) < 0L) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
185 taglong = 1; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
186 i += 1; /* space to hold 'L' */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
187 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
188 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
189 #ifdef MPZ_DEBUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
190 fprintf(stderr, "mpz_format: requesting string size %d\n", i); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
191 #endif /* def MPZ_DEBUG */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
192 if ((strobjp = |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
193 (PyStringObject *)PyString_FromStringAndSize((char *)0, i)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
194 == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
195 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
196 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
197 /* get the beginning of the string memory and start copying things */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
198 cp = PyString_AS_STRING(strobjp); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
199 if (withname) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
200 strcpy(cp, initialiser_name); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
201 cp += strlen(initialiser_name); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
202 *cp++ = '('; /*')'*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
203 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
204 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
205 /* copy the already prepared prefix; e.g. sign and base indicator */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
206 *tcp = '\0'; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
207 strcpy(cp, prefix); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
208 cp += tcp - prefix; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
209 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
210 /* since' we have the sign already, let the lib think it's a positive |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
211 number */ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
212 if (cmpres < 0) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
213 mpz_neg(&mpzp->mpz,&mpzp->mpz); /* hack Hack HAck HACk HACK */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
214 (void)mpz_get_str(cp, base, &mpzp->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
215 if (cmpres < 0) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
216 mpz_neg(&mpzp->mpz,&mpzp->mpz); /* hack Hack HAck HACk HACK */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
217 #ifdef MPZ_DEBUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
218 fprintf(stderr, "mpz_format: base (ultim) %d, mpz_get_str: %s\n", |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
219 base, cp); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
220 #endif /* def MPZ_DEBUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
221 cp += strlen(cp); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
222 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
223 if (taglong) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
224 *cp++ = 'L'; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
225 if (withname) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
226 *cp++ = /*'('*/ ')'; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
227 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
228 *cp = '\0'; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
229 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
230 #ifdef MPZ_DEBUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
231 fprintf(stderr, |
|
13210
ff243b0f16ee
Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents:
13083
diff
changeset
|
232 "mpz_format: cp (str end) %p, begin %p, diff %d, i %d\n", |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
233 cp, PyString_AS_STRING(strobjp), |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
234 cp - PyString_AS_STRING(strobjp), i); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
235 #endif /* def MPZ_DEBUG */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
236 assert(cp - PyString_AS_STRING(strobjp) <= i); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
237 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
238 if (cp - PyString_AS_STRING(strobjp) != i) { |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
239 strobjp->ob_size -= i - (cp - PyString_AS_STRING(strobjp)); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
240 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
241 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
242 return (PyObject *)strobjp; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
243 } /* mpz_format() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
244 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
245 /* MPZ methods */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
246 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
247 static void |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
248 mpz_dealloc(mpzobject *mpzp) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
249 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
250 #ifdef MPZ_DEBUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
251 fputs( "mpz_dealloc() called...\n", stderr ); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
252 #endif /* def MPZ_DEBUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
253 mpz_clear(&mpzp->mpz); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11858
diff
changeset
|
254 PyObject_Del(mpzp); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
255 } /* mpz_dealloc() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
256 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
257 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
258 /* pointers to frequently used values 0, 1 and -1 */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
259 static mpzobject *mpz_value_zero, *mpz_value_one, *mpz_value_mone; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
260 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
261 static int |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
262 mpz_compare(mpzobject *a, mpzobject *b) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
263 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
264 int cmpres; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
265 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
266 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
267 /* guido sez it's better to return -1, 0 or 1 */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
268 return (cmpres = mpz_cmp( &a->mpz, &b->mpz )) == 0 ? 0 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
269 : cmpres > 0 ? 1 : -1; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
270 } /* mpz_compare() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
271 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
272 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
273 mpz_addition(mpzobject *a, mpzobject *b) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
274 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
275 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
276 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
277 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
278 #ifdef MPZ_SPARE_MALLOC |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
279 if (mpz_cmp_ui(&a->mpz, (unsigned long int)0) == 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
280 Py_INCREF(b); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
281 return (PyObject *)b; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
282 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
283 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
284 if (mpz_cmp_ui(&b->mpz, (unsigned long int)0) == 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
285 Py_INCREF(a); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
286 return (PyObject *)a; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
287 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
288 #endif /* def MPZ_SPARE_MALLOC */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
289 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
290 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
291 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
292 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
293 mpz_add(&z->mpz, &a->mpz, &b->mpz); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
294 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
295 } /* mpz_addition() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
296 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
297 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
298 mpz_substract(mpzobject *a, mpzobject *b) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
299 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
300 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
301 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
302 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
303 #ifdef MPZ_SPARE_MALLOC |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
304 if (mpz_cmp_ui(&b->mpz, (unsigned long int)0) == 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
305 Py_INCREF(a); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
306 return (PyObject *)a; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
307 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
308 #endif /* MPZ_SPARE_MALLOC */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
309 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
310 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
311 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
312 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
313 mpz_sub(&z->mpz, &a->mpz, &b->mpz); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
314 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
315 } /* mpz_substract() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
316 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
317 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
318 mpz_multiply(mpzobject *a, mpzobject *b) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
319 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
320 #ifdef MPZ_SPARE_MALLOC |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
321 int cmpres; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
322 #endif /* def MPZ_SPARE_MALLOC */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
323 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
324 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
325 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
326 #ifdef MPZ_SPARE_MALLOC |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
327 if ((cmpres = mpz_cmp_ui(&a->mpz, (unsigned long int)0)) == 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
328 Py_INCREF(mpz_value_zero); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
329 return (PyObject *)mpz_value_zero; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
330 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
331 if (cmpres > 0 && mpz_cmp_ui(&a->mpz, (unsigned long int)1) == 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
332 Py_INCREF(b); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
333 return (PyObject *)b; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
334 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
335 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
336 if ((cmpres = mpz_cmp_ui(&b->mpz, (unsigned long_int)0)) == 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
337 Py_INCREF(mpz_value_zero); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
338 return (PyObject *)mpz_value_zero; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
339 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
340 if (cmpres > 0 && mpz_cmp_ui(&b->mpz, (unsigned long int)1) == 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
341 Py_INCREF(a); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
342 return (PyObject *)a; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
343 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
344 #endif /* MPZ_SPARE_MALLOC */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
345 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
346 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
347 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
348 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
349 mpz_mul( &z->mpz, &a->mpz, &b->mpz ); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
350 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
351 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
352 } /* mpz_multiply() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
353 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
354 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
355 mpz_divide(mpzobject *a, mpzobject *b) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
356 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
357 #ifdef MPZ_SPARE_MALLOC |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
358 int cmpres; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
359 #endif /* def MPZ_SPARE_MALLOC */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
360 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
361 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
362 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
363 if (( |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
364 #ifdef MPZ_SPARE_MALLOC |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
365 cmpres = |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
366 #endif /* def MPZ_SPARE_MALLOC */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
367 mpz_cmp_ui(&b->mpz, (unsigned long int)0)) == 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
368 PyErr_SetString(PyExc_ZeroDivisionError, "mpz./ by zero"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
369 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
370 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
371 #ifdef MPZ_SPARE_MALLOC |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
372 if (cmpres > 0 && mpz_cmp_ui(&b->mpz(unsigned long int)1) == 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
373 Py_INCREF(a); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
374 return (PyObject *)a; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
375 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
376 #endif /* def MPZ_SPARE_MALLOC */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
377 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
378 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
379 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
380 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
381 #ifdef MPZ_TEST_DIV |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
382 fputs("mpz_divide: div result", stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
383 mpz_div(&z->mpz, &a->mpz, &b->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
384 mpz_out_str(stderr, 10, &z->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
385 putc('\n', stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
386 #endif /* def MPZ_TEST_DIV */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
387 #ifdef MPZ_MDIV_BUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
388 if ((mpz_cmp_ui(&a->mpz, (unsigned long int)0) < 0) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
389 != (mpz_cmp_ui(&b->mpz, (unsigned long int)0) < 0)) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
390 /* |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
391 ** numerator has other sign than denominator: we have |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
392 ** to look at the remainder for a correction, since mpz_mdiv |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
393 ** also calls mpz_divmod, I can as well do it myself |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
394 */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
395 MP_INT tmpmpz; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
396 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
397 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
398 mpz_init(&tmpmpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
399 mpz_divmod(&z->mpz, &tmpmpz, &a->mpz, &b->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
400 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
401 if (mpz_cmp_ui(&tmpmpz, (unsigned long int)0) != 0) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
402 mpz_sub_ui(&z->mpz, &z->mpz, (unsigned long int)1); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
403 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
404 mpz_clear(&tmpmpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
405 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
406 else |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
407 mpz_div(&z->mpz, &a->mpz, &b->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
408 /* the ``naive'' implementation does it right for operands |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
409 having the same sign */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
410 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
411 #else /* def MPZ_MDIV_BUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
412 mpz_mdiv(&z->mpz, &a->mpz, &b->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
413 #endif /* def MPZ_MDIV_BUG else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
414 #ifdef MPZ_TEST_DIV |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
415 fputs("mpz_divide: mdiv result", stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
416 mpz_out_str(stderr, 10, &z->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
417 putc('\n', stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
418 #endif /* def MPZ_TEST_DIV */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
419 return (PyObject *)z; |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
420 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
421 } /* mpz_divide() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
422 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
423 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
424 mpz_remainder(mpzobject *a, mpzobject *b) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
425 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
426 #ifdef MPZ_SPARE_MALLOC |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
427 int cmpres; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
428 #endif /* def MPZ_SPARE_MALLOC */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
429 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
430 |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
431 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
432 if (( |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
433 #ifdef MPZ_SPARE_MALLOC |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
434 cmpres = |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
435 #endif /* def MPZ_SPARE_MALLOC */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
436 mpz_cmp_ui(&b->mpz, (unsigned long int)0)) == 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
437 PyErr_SetString(PyExc_ZeroDivisionError, "mpz.% by zero"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
438 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
439 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
440 #ifdef MPZ_SPARE_MALLOC |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
441 if (cmpres > 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
442 if ((cmpres = mpz_cmp_ui(&b->mpz, (unsigned long int)2)) == 0) |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
443 { |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
444 Py_INCREF(mpz_value_one); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
445 return (PyObject *)mpz_value_one; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
446 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
447 if (cmpres < 0) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
448 /* b must be 1 now */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
449 Py_INCREF(mpz_value_zero); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
450 return (PyObject *)mpz_value_zero; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
451 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
452 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
453 #endif /* def MPZ_SPARE_MALLOC */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
454 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
455 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
456 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
457 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
458 #ifdef MPZ_TEST_DIV |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
459 fputs("mpz_remain: mod result", stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
460 mpz_mod(&z->mpz, &a->mpz, &b->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
461 mpz_out_str(stderr, 10, &z->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
462 putc('\n', stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
463 #endif /* def MPZ_TEST_DIV */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
464 #ifdef MPZ_MDIV_BUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
465 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
466 /* the ``naive'' implementation does it right for operands |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
467 having the same sign */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
468 mpz_mod(&z->mpz, &a->mpz, &b->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
469 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
470 /* assumption: z, a and b all point to different locations */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
471 if ((mpz_cmp_ui(&a->mpz, (unsigned long int)0) < 0) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
472 != (mpz_cmp_ui(&b->mpz, (unsigned long int)0) < 0) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
473 && mpz_cmp_ui(&z->mpz, (unsigned long int)0) != 0) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
474 mpz_add(&z->mpz, &z->mpz, &b->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
475 /* |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
476 ** numerator has other sign than denominator: we have |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
477 ** to look at the remainder for a correction, since mpz_mdiv |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
478 ** also calls mpz_divmod, I can as well do it myself |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
479 */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
480 #else /* def MPZ_MDIV_BUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
481 mpz_mmod(&z->mpz, &a->mpz, &b->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
482 #endif /* def MPZ_MDIV_BUG else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
483 #ifdef MPZ_TEST_DIV |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
484 fputs("mpz_remain: mmod result", stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
485 mpz_out_str(stderr, 10, &z->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
486 putc('\n', stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
487 #endif /* def MPZ_TEST_DIV */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
488 return (PyObject *)z; |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
489 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
490 } /* mpz_remainder() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
491 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
492 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
493 mpz_div_and_mod(mpzobject *a, mpzobject *b) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
494 { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
495 PyObject *z = NULL; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
496 mpzobject *x = NULL, *y = NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
497 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
498 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
499 if (mpz_cmp_ui(&b->mpz, (unsigned long int)0) == 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
500 PyErr_SetString(PyExc_ZeroDivisionError, "mpz.divmod by zero"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
501 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
502 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
503 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
504 if ((z = PyTuple_New(2)) == NULL |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
505 || (x = newmpzobject()) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
506 || (y = newmpzobject()) == NULL) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
507 Py_XDECREF(z); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
508 Py_XDECREF(x); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
509 Py_XDECREF(y); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
510 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
511 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
512 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
513 #ifdef MPZ_TEST_DIV |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
514 fputs("mpz_divmod: dm result", stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
515 mpz_divmod(&x->mpz, &y->mpz, &a->mpz, &b->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
516 mpz_out_str(stderr, 10, &x->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
517 putc('\n', stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
518 mpz_out_str(stderr, 10, &y->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
519 putc('\n', stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
520 #endif /* def MPZ_TEST_DIV */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
521 #ifdef MPZ_MDIV_BUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
522 mpz_divmod(&x->mpz, &y->mpz, &a->mpz, &b->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
523 if ((mpz_cmp_ui(&a->mpz, (unsigned long int)0) < 0) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
524 != (mpz_cmp_ui(&b->mpz, (unsigned long int)0) < 0) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
525 && mpz_cmp_ui(&y->mpz, (unsigned long int)0) != 0) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
526 /* |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
527 ** numerator has other sign than denominator: we have |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
528 ** to look at the remainder for a correction. |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
529 */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
530 mpz_add(&y->mpz, &y->mpz, &b->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
531 mpz_sub_ui(&x->mpz, &x->mpz, (unsigned long int)1); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
532 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
533 #else /* def MPZ_MDIV_BUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
534 mpz_mdivmod( &x->mpz, &y->mpz, &a->mpz, &b->mpz ); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
535 #endif /* def MPZ_MDIV_BUG else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
536 #ifdef MPZ_TEST_DIV |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
537 fputs("mpz_divmod: mdm result", stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
538 mpz_out_str(stderr, 10, &x->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
539 putc('\n', stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
540 mpz_out_str(stderr, 10, &y->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
541 putc('\n', stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
542 #endif /* def MPZ_TEST_DIV */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
543 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
544 (void)PyTuple_SetItem(z, 0, (PyObject *)x); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
545 (void)PyTuple_SetItem(z, 1, (PyObject *)y); |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
546 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
547 return z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
548 } /* mpz_div_and_mod() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
549 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
550 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
551 mpz_power(mpzobject *a, mpzobject *b, mpzobject *m) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
552 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
553 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
554 int cmpres; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
555 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
556 if ((PyObject *)m != Py_None) { |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
557 mpzobject *z2; |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
558 Py_INCREF(Py_None); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
559 z=(mpzobject *)mpz_power(a, b, (mpzobject *)Py_None); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
560 Py_DECREF(Py_None); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
561 if (z==NULL) return((PyObject *)z); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
562 z2=(mpzobject *)mpz_remainder(z, m); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
563 Py_DECREF(z); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
564 return((PyObject *)z2); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
565 } |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
566 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
567 if ((cmpres = mpz_cmp_ui(&b->mpz, (unsigned long int)0)) == 0) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
568 /* the gnu-mp lib sets pow(0,0) to 0, we to 1 */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
569 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
570 Py_INCREF(mpz_value_one); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
571 return (PyObject *)mpz_value_one; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
572 } |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
573 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
574 if (cmpres < 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
575 PyErr_SetString(PyExc_ValueError, |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
576 "mpz.pow to negative exponent"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
577 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
578 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
579 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
580 if ((cmpres = mpz_cmp_ui(&a->mpz, (unsigned long int)0)) == 0) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
581 /* the base is 0 */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
582 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
583 Py_INCREF(mpz_value_zero); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
584 return (PyObject *)mpz_value_zero; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
585 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
586 else if (cmpres > 0 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
587 && mpz_cmp_ui(&a->mpz, (unsigned long int)1) == 0) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
588 /* the base is 1 */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
589 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
590 Py_INCREF(mpz_value_one); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
591 return (PyObject *)mpz_value_one; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
592 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
593 else if (cmpres < 0 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
594 && mpz_cmp_si(&a->mpz, (long int)-1) == 0) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
595 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
596 MP_INT tmpmpz; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
597 /* the base is -1: pow(-1, any) == 1,-1 for even,uneven b */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
598 /* XXX this code needs to be optimized: what's better? |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
599 mpz_mmod_ui or mpz_mod_2exp, I choose for the latter |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
600 for *un*obvious reasons */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
601 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
602 /* is the exponent even? */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
603 mpz_init(&tmpmpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
604 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
605 /* look to the remainder after a division by (1 << 1) */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
606 mpz_mod_2exp(&tmpmpz, &b->mpz, (unsigned long int)1); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
607 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
608 if (mpz_cmp_ui(&tmpmpz, (unsigned int)0) == 0) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
609 mpz_clear(&tmpmpz); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
610 Py_INCREF(mpz_value_one); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
611 return (PyObject *)mpz_value_one; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
612 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
613 mpz_clear(&tmpmpz); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
614 Py_INCREF(mpz_value_mone); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
615 return (PyObject *)mpz_value_mone; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
616 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
617 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
618 #ifdef MPZ_LIB_DOES_CHECKING |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
619 /* check if it's doable: sizeof(exp) > sizeof(long) && |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
620 abs(base) > 1 ?? --> No Way */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
621 if (mpz_size(&b->mpz) > 1) |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
622 return (PyObject *)PyErr_NoMemory(); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
623 #else /* def MPZ_LIB_DOES_CHECKING */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
624 /* wet finger method */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
625 if (mpz_cmp_ui(&b->mpz, (unsigned long int)0x10000) >= 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
626 PyErr_SetString(PyExc_ValueError, |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
627 "mpz.pow outrageous exponent"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
628 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
629 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
630 #endif /* def MPZ_LIB_DOES_CHECKING else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
631 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
632 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
633 return NULL; |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
634 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
635 mpz_pow_ui(&z->mpz, &a->mpz, mpz_get_ui(&b->mpz)); |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
636 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
637 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
638 } /* mpz_power() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
639 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
640 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
641 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
642 mpz_negative(mpzobject *v) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
643 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
644 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
645 |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
646 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
647 #ifdef MPZ_SPARE_MALLOC |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
648 if (mpz_cmp_ui(&v->mpz, (unsigned long int)0) == 0) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
649 /* -0 == 0 */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
650 Py_INCREF(v); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
651 return (PyObject *)v; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
652 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
653 #endif /* def MPZ_SPARE_MALLOC */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
654 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
655 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
656 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
657 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
658 mpz_neg(&z->mpz, &v->mpz); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
659 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
660 } /* mpz_negative() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
661 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
662 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
663 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
664 mpz_positive(mpzobject *v) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
665 { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
666 Py_INCREF(v); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
667 return (PyObject *)v; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
668 } /* mpz_positive() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
669 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
670 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
671 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
672 mpz_absolute(mpzobject *v) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
673 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
674 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
675 |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
676 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
677 if (mpz_cmp_ui(&v->mpz, (unsigned long int)0) >= 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
678 Py_INCREF(v); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
679 return (PyObject *)v; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
680 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
681 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
682 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
683 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
684 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
685 mpz_neg(&z->mpz, &v->mpz); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
686 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
687 } /* mpz_absolute() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
688 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
689 static int |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
690 mpz_nonzero(mpzobject *v) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
691 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
692 return mpz_cmp_ui(&v->mpz, (unsigned long int)0) != 0; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
693 } /* mpz_nonzero() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
694 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
695 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
696 py_mpz_invert(mpzobject *v) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
697 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
698 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
699 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
700 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
701 /* I think mpz_com does exactly what needed */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
702 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
703 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
704 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
705 mpz_com(&z->mpz, &v->mpz); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
706 return (PyObject *)z; |
|
4052
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
707 } /* py_mpz_invert() */ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
708 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
709 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
710 mpz_lshift(mpzobject *a, mpzobject *b) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
711 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
712 int cmpres; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
713 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
714 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
715 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
716 if ((cmpres = mpz_cmp_ui(&b->mpz, (unsigned long int)0)) == 0) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
717 /* a << 0 == a */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
718 Py_INCREF(a); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
719 return (PyObject *)a; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
720 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
721 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
722 if (cmpres < 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
723 PyErr_SetString(PyExc_ValueError, |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
724 "mpz.<< negative shift count"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
725 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
726 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
727 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
728 #ifdef MPZ_LIB_DOES_CHECKING |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
729 if (mpz_size(&b->mpz) > 1) |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
730 return (PyObject *)PyErr_NoMemory(); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
731 #else /* def MPZ_LIB_DOES_CHECKING */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
732 /* wet finger method */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
733 if (mpz_cmp_ui(&b->mpz, (unsigned long int)0x10000) >= 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
734 PyErr_SetString(PyExc_ValueError, |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
735 "mpz.<< outrageous shift count"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
736 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
737 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
738 #endif /* def MPZ_LIB_DOES_CHECKING else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
739 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
740 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
741 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
742 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
743 mpz_mul_2exp(&z->mpz, &a->mpz, mpz_get_ui(&b->mpz)); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
744 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
745 } /* mpz_lshift() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
746 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
747 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
748 mpz_rshift(mpzobject *a, mpzobject *b) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
749 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
750 int cmpres; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
751 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
752 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
753 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
754 if ((cmpres = mpz_cmp_ui(&b->mpz, (unsigned long int)0)) == 0) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
755 /* a >> 0 == a */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
756 Py_INCREF(a); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
757 return (PyObject *)a; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
758 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
759 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
760 if (cmpres < 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
761 PyErr_SetString(PyExc_ValueError, |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
762 "mpz.>> negative shift count"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
763 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
764 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
765 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
766 if (mpz_size(&b->mpz) > 1) |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
767 return (PyObject *)PyErr_NoMemory(); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
768 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
769 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
770 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
771 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
772 mpz_div_2exp(&z->mpz, &a->mpz, mpz_get_ui(&b->mpz)); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
773 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
774 } /* mpz_rshift() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
775 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
776 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
777 mpz_andfunc(mpzobject *a, mpzobject *b) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
778 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
779 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
780 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
781 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
782 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
783 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
784 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
785 mpz_and(&z->mpz, &a->mpz, &b->mpz); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
786 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
787 } /* mpz_andfunc() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
788 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
789 /* hack Hack HAck HACk HACK, XXX this code is dead slow */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
790 void |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
791 mpz_xor(MP_INT *res, const MP_INT *op1, const MP_INT *op2) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
792 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
793 MP_INT tmpmpz; |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
794 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
795 mpz_init(&tmpmpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
796 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
797 mpz_and(res, op1, op2); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
798 mpz_com(&tmpmpz, res); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
799 mpz_ior(res, op1, op2); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
800 mpz_and(res, res, &tmpmpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
801 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
802 mpz_clear(&tmpmpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
803 } /* mpz_xor() HACK */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
804 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
805 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
806 mpz_xorfunc(mpzobject *a, mpzobject *b) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
807 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
808 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
809 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
810 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
811 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
812 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
813 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
814 mpz_xor(&z->mpz, &a->mpz, &b->mpz); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
815 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
816 } /* mpz_xorfunc() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
817 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
818 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
819 mpz_orfunc(mpzobject *a, mpzobject *b) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
820 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
821 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
822 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
823 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
824 if ((z = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
825 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
826 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
827 mpz_ior(&z->mpz, &a->mpz, &b->mpz); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
828 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
829 } /* mpz_orfunc() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
830 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
831 /* MPZ initialisation */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
832 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
833 #include "longintrepr.h" |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
834 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
835 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
836 MPZ_mpz(PyObject *self, PyObject *args) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
837 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
838 mpzobject *mpzp; |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
839 PyObject *objp; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
840 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
841 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
842 #ifdef MPZ_DEBUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
843 fputs("MPZ_mpz() called...\n", stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
844 #endif /* def MPZ_DEBUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
845 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
846 if (!PyArg_Parse(args, "O", &objp)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
847 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
848 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
849 /* at least we know it's some object */ |
|
4645
68c4b06cfff7
Renamed a few symbols that were found in comments.
Barry Warsaw <barry@python.org>
parents:
4644
diff
changeset
|
850 /* note DON't Py_DECREF args NEITHER objp */ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
851 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
852 if (PyInt_Check(objp)) { |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
853 long lval; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
854 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
855 if (!PyArg_Parse(objp, "l", &lval)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
856 return NULL; |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
857 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
858 if (lval == (long)0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
859 Py_INCREF(mpz_value_zero); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
860 mpzp = mpz_value_zero; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
861 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
862 else if (lval == (long)1) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
863 Py_INCREF(mpz_value_one); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
864 mpzp = mpz_value_one; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
865 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
866 else if ((mpzp = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
867 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
868 else mpz_set_si(&mpzp->mpz, lval); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
869 } |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
870 else if (PyLong_Check(objp)) { |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
871 MP_INT mplongdigit; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
872 int i; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
873 unsigned char isnegative; |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
874 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
875 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
876 if ((mpzp = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
877 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
878 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
879 mpz_set_si(&mpzp->mpz, 0L); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
880 mpz_init(&mplongdigit); |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
881 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
882 /* how we're gonna handle this? */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
883 if ((isnegative = |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
884 ((i = ((PyLongObject *)objp)->ob_size) < 0) )) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
885 i = -i; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
886 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
887 while (i--) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
888 mpz_set_ui(&mplongdigit, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
889 (unsigned long) |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
890 ((PyLongObject *)objp)->ob_digit[i]); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
891 mpz_mul_2exp(&mplongdigit,&mplongdigit, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
892 (unsigned long int)i * SHIFT); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
893 mpz_ior(&mpzp->mpz, &mpzp->mpz, &mplongdigit); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
894 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
895 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
896 if (isnegative) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
897 mpz_neg(&mpzp->mpz, &mpzp->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
898 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
899 /* get rid of allocation for tmp variable */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
900 mpz_clear(&mplongdigit); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
901 } |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
902 else if (PyString_Check(objp)) { |
|
9634
8586d911fb39
Fixed bug reported to Gregor Hoffleit:
Andrew M. Kuchling <amk@amk.ca>
parents:
9588
diff
changeset
|
903 unsigned char *cp = (unsigned char *)PyString_AS_STRING(objp); |
|
9307
928ea5a409e5
Use the t# format where appropriate. Greg Stein.
Guido van Rossum <guido@python.org>
parents:
7834
diff
changeset
|
904 int len = PyString_GET_SIZE(objp); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
905 MP_INT mplongdigit; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
906 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
907 if ((mpzp = newmpzobject()) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
908 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
909 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
910 mpz_set_si(&mpzp->mpz, 0L); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
911 mpz_init(&mplongdigit); |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
912 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
913 /* let's do it the same way as with the long conversion: |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
914 without thinking how it can be faster (-: :-) */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
915 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
916 cp += len; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
917 while (len--) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
918 mpz_set_ui(&mplongdigit, (unsigned long)*--cp ); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
919 mpz_mul_2exp(&mplongdigit,&mplongdigit, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
920 (unsigned long int)len * 8); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
921 mpz_ior(&mpzp->mpz, &mpzp->mpz, &mplongdigit); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
922 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
923 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
924 /* get rid of allocation for tmp variable */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
925 mpz_clear(&mplongdigit); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
926 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
927 else if (is_mpzobject(objp)) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
928 Py_INCREF(objp); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
929 mpzp = (mpzobject *)objp; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
930 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
931 else { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
932 PyErr_SetString(PyExc_TypeError, |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
933 "mpz.mpz() expects integer, long, string or mpz object argument"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
934 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
935 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
936 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
937 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
938 #ifdef MPZ_DEBUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
939 fputs("MPZ_mpz: created mpz=", stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
940 mpz_out_str(stderr, 10, &mpzp->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
941 putc('\n', stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
942 #endif /* def MPZ_DEBUG */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
943 return (PyObject *)mpzp; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
944 } /* MPZ_mpz() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
945 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
946 static mpzobject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
947 mpz_mpzcoerce(PyObject *z) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
948 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
949 /* shortcut: 9 out of 10 times the type is already ok */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
950 if (is_mpzobject(z)) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
951 Py_INCREF(z); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
952 return (mpzobject *)z; /* coercion succeeded */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
953 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
954 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
955 /* what types do we accept?: intobjects and longobjects */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
956 if (PyInt_Check(z) || PyLong_Check(z)) |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
957 return (mpzobject *)MPZ_mpz((PyObject *)NULL, z); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
958 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
959 PyErr_SetString(PyExc_TypeError, |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
960 "number coercion (to mpzobject) failed"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
961 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
962 } /* mpz_mpzcoerce() */ |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
963 |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
964 /* Forward */ |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13256
diff
changeset
|
965 static void mpz_divm(MP_INT *res, const MP_INT *num, |
|
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13256
diff
changeset
|
966 const MP_INT *den, const MP_INT *mod); |
|
1425
72bddfad351a
* mpzmodule.c: cast some methods to the proper type.
Guido van Rossum <guido@python.org>
parents:
1400
diff
changeset
|
967 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
968 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
969 MPZ_powm(PyObject *self, PyObject *args) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
970 { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
971 PyObject *base, *exp, *mod; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
972 mpzobject *mpzbase = NULL, *mpzexp = NULL, *mpzmod = NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
973 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
974 int tstres; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
975 |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
976 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
977 if (!PyArg_Parse(args, "(OOO)", &base, &exp, &mod)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
978 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
979 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
980 if ((mpzbase = mpz_mpzcoerce(base)) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
981 || (mpzexp = mpz_mpzcoerce(exp)) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
982 || (mpzmod = mpz_mpzcoerce(mod)) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
983 || (z = newmpzobject()) == NULL) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
984 Py_XDECREF(mpzbase); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
985 Py_XDECREF(mpzexp); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
986 Py_XDECREF(mpzmod); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
987 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
988 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
989 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
990 if ((tstres=mpz_cmp_ui(&mpzexp->mpz, (unsigned long int)0)) == 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
991 Py_INCREF(mpz_value_one); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
992 return (PyObject *)mpz_value_one; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
993 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
994 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
995 if (tstres < 0) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
996 MP_INT absexp; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
997 /* negative exp */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
998 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
999 mpz_init_set(&absexp, &mpzexp->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1000 mpz_abs(&absexp, &absexp); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1001 mpz_powm(&z->mpz, &mpzbase->mpz, &absexp, &mpzmod->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1002 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1003 mpz_divm(&z->mpz, &mpz_value_one->mpz, &z->mpz, &mpzmod->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1004 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1005 mpz_clear(&absexp); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1006 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1007 else { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1008 mpz_powm(&z->mpz, &mpzbase->mpz, &mpzexp->mpz, &mpzmod->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1009 } |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1010 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1011 Py_DECREF(mpzbase); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1012 Py_DECREF(mpzexp); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1013 Py_DECREF(mpzmod); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1014 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1015 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1016 } /* MPZ_powm() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1017 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1018 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1019 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1020 MPZ_gcd(PyObject *self, PyObject *args) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1021 { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1022 PyObject *op1, *op2; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1023 mpzobject *mpzop1 = NULL, *mpzop2 = NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1024 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1025 |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1026 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1027 if (!PyArg_Parse(args, "(OO)", &op1, &op2)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1028 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1029 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1030 if ((mpzop1 = mpz_mpzcoerce(op1)) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1031 || (mpzop2 = mpz_mpzcoerce(op2)) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1032 || (z = newmpzobject()) == NULL) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1033 Py_XDECREF(mpzop1); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1034 Py_XDECREF(mpzop2); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1035 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1036 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1037 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1038 /* ok, we have three mpzobjects, and an initialised result holder */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1039 mpz_gcd(&z->mpz, &mpzop1->mpz, &mpzop2->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1040 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1041 Py_DECREF(mpzop1); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1042 Py_DECREF(mpzop2); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1043 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1044 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1045 } /* MPZ_gcd() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1046 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1047 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1048 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1049 MPZ_gcdext(PyObject *self, PyObject *args) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1050 { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1051 PyObject *op1, *op2, *z = NULL; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1052 mpzobject *mpzop1 = NULL, *mpzop2 = NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1053 mpzobject *g = NULL, *s = NULL, *t = NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1054 |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1055 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1056 if (!PyArg_Parse(args, "(OO)", &op1, &op2)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1057 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1058 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1059 if ((mpzop1 = mpz_mpzcoerce(op1)) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1060 || (mpzop2 = mpz_mpzcoerce(op2)) == NULL |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1061 || (z = PyTuple_New(3)) == NULL |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1062 || (g = newmpzobject()) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1063 || (s = newmpzobject()) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1064 || (t = newmpzobject()) == NULL) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1065 Py_XDECREF(mpzop1); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1066 Py_XDECREF(mpzop2); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1067 Py_XDECREF(z); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1068 Py_XDECREF(g); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1069 Py_XDECREF(s); |
|
4645
68c4b06cfff7
Renamed a few symbols that were found in comments.
Barry Warsaw <barry@python.org>
parents:
4644
diff
changeset
|
1070 /*Py_XDECREF(t);*/ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1071 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1072 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1073 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1074 mpz_gcdext(&g->mpz, &s->mpz, &t->mpz, &mpzop1->mpz, &mpzop2->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1075 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1076 Py_DECREF(mpzop1); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1077 Py_DECREF(mpzop2); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1078 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1079 (void)PyTuple_SetItem(z, 0, (PyObject *)g); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1080 (void)PyTuple_SetItem(z, 1, (PyObject *)s); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1081 (void)PyTuple_SetItem(z, 2, (PyObject *)t); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1082 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1083 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1084 } /* MPZ_gcdext() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1085 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1086 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1087 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1088 MPZ_sqrt(PyObject *self, PyObject *args) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1089 { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1090 PyObject *op; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1091 mpzobject *mpzop = NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1092 mpzobject *z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1093 |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1094 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1095 if (!PyArg_Parse(args, "O", &op)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1096 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1097 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1098 if ((mpzop = mpz_mpzcoerce(op)) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1099 || (z = newmpzobject()) == NULL) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1100 Py_XDECREF(mpzop); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1101 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1102 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1103 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1104 mpz_sqrt(&z->mpz, &mpzop->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1105 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1106 Py_DECREF(mpzop); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1107 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1108 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1109 } /* MPZ_sqrt() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1110 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1111 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1112 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1113 MPZ_sqrtrem(PyObject *self, PyObject *args) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1114 { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1115 PyObject *op, *z = NULL; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1116 mpzobject *mpzop = NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1117 mpzobject *root = NULL, *rem = NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1118 |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1119 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1120 if (!PyArg_Parse(args, "O", &op)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1121 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1122 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1123 if ((mpzop = mpz_mpzcoerce(op)) == NULL |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1124 || (z = PyTuple_New(2)) == NULL |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1125 || (root = newmpzobject()) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1126 || (rem = newmpzobject()) == NULL) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1127 Py_XDECREF(mpzop); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1128 Py_XDECREF(z); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1129 Py_XDECREF(root); |
|
4645
68c4b06cfff7
Renamed a few symbols that were found in comments.
Barry Warsaw <barry@python.org>
parents:
4644
diff
changeset
|
1130 /*Py_XDECREF(rem);*/ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1131 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1132 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1133 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1134 mpz_sqrtrem(&root->mpz, &rem->mpz, &mpzop->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1135 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1136 Py_DECREF(mpzop); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1137 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1138 (void)PyTuple_SetItem(z, 0, (PyObject *)root); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1139 (void)PyTuple_SetItem(z, 1, (PyObject *)rem); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1140 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1141 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1142 } /* MPZ_sqrtrem() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1143 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1144 |
|
1425
72bddfad351a
* mpzmodule.c: cast some methods to the proper type.
Guido van Rossum <guido@python.org>
parents:
1400
diff
changeset
|
1145 static void |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1146 mpz_divm(MP_INT *res, const MP_INT *num, const MP_INT *den, const MP_INT *mod) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1147 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1148 MP_INT s0, s1, q, r, x, d0, d1; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1149 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1150 mpz_init_set(&s0, num); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1151 mpz_init_set_ui(&s1, 0); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1152 mpz_init(&q); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1153 mpz_init(&r); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1154 mpz_init(&x); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1155 mpz_init_set(&d0, den); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1156 mpz_init_set(&d1, mod); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1157 |
|
4052
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
1158 #ifdef GMP2 |
|
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
1159 while (d1._mp_size != 0) { |
|
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
1160 #else |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1161 while (d1.size != 0) { |
|
4052
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
1162 #endif |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1163 mpz_divmod(&q, &r, &d0, &d1); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1164 mpz_set(&d0, &d1); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1165 mpz_set(&d1, &r); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1166 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1167 mpz_mul(&x, &s1, &q); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1168 mpz_sub(&x, &s0, &x); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1169 mpz_set(&s0, &s1); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1170 mpz_set(&s1, &x); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1171 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1172 |
|
4052
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
1173 #ifdef GMP2 |
|
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
1174 if (d0._mp_size != 1 || d0._mp_d[0] != 1) |
|
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
1175 res->_mp_size = 0; /* trouble: the gcd != 1; set s to zero */ |
|
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
1176 #else |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1177 if (d0.size != 1 || d0.d[0] != 1) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1178 res->size = 0; /* trouble: the gcd != 1; set s to zero */ |
|
4052
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
1179 #endif |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1180 else { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1181 #ifdef MPZ_MDIV_BUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1182 /* watch out here! first check the signs, and then perform |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1183 the mpz_mod() since mod could point to res */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1184 if ((s0.size < 0) != (mod->size < 0)) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1185 mpz_mod(res, &s0, mod); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1186 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1187 if (res->size) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1188 mpz_add(res, res, mod); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1189 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1190 else |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1191 mpz_mod(res, &s0, mod); |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1192 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1193 #else /* def MPZ_MDIV_BUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1194 mpz_mmod(res, &s0, mod); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1195 #endif /* def MPZ_MDIV_BUG else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1196 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1197 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1198 mpz_clear(&s0); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1199 mpz_clear(&s1); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1200 mpz_clear(&q); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1201 mpz_clear(&r); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1202 mpz_clear(&x); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1203 mpz_clear(&d0); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1204 mpz_clear(&d1); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1205 } /* mpz_divm() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1206 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1207 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1208 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1209 MPZ_divm(PyObject *self, PyObject *args) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1210 { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1211 PyObject *num, *den, *mod; |
|
15158
7b07d62d2c79
Another gcc -Wall warning squashed:
Fred Drake <fdrake@acm.org>
parents:
14375
diff
changeset
|
1212 mpzobject *mpznum, *mpzden = NULL, *mpzmod = NULL; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1213 mpzobject *z = NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1214 |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1215 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1216 if (!PyArg_Parse(args, "(OOO)", &num, &den, &mod)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1217 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1218 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1219 if ((mpznum = mpz_mpzcoerce(num)) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1220 || (mpzden = mpz_mpzcoerce(den)) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1221 || (mpzmod = mpz_mpzcoerce(mod)) == NULL |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1222 || (z = newmpzobject()) == NULL ) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1223 Py_XDECREF(mpznum); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1224 Py_XDECREF(mpzden); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1225 Py_XDECREF(mpzmod); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1226 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1227 } |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1228 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1229 mpz_divm(&z->mpz, &mpznum->mpz, &mpzden->mpz, &mpzmod->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1230 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1231 Py_DECREF(mpznum); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1232 Py_DECREF(mpzden); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1233 Py_DECREF(mpzmod); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1234 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1235 if (mpz_cmp_ui(&z->mpz, (unsigned long int)0) == 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1236 Py_DECREF(z); |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1237 PyErr_SetString(PyExc_ValueError, |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1238 "gcd(den, mod) != 1 or num == 0"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1239 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1240 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1241 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1242 return (PyObject *)z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1243 } /* MPZ_divm() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1244 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1245 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1246 /* MPZ methods-as-attributes */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1247 #ifdef MPZ_CONVERSIONS_AS_METHODS |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1248 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1249 mpz_int(mpzobject *self, PyObject *args) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1250 #else /* def MPZ_CONVERSIONS_AS_METHODS */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1251 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1252 mpz_int(mpzobject *self) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1253 #endif /* def MPZ_CONVERSIONS_AS_METHODS else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1254 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1255 long sli; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1256 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1257 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1258 #ifdef MPZ_CONVERSIONS_AS_METHODS |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1259 if (!PyArg_NoArgs(args)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1260 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1261 #endif /* def MPZ_CONVERSIONS_AS_METHODS */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1262 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1263 if (mpz_size(&self->mpz) > 1 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1264 || (sli = (long)mpz_get_ui(&self->mpz)) < (long)0 ) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1265 PyErr_SetString(PyExc_ValueError, |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1266 "mpz.int() arg too long to convert"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1267 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1268 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1269 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1270 if (mpz_cmp_ui(&self->mpz, (unsigned long)0) < 0) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1271 sli = -sli; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1272 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1273 return PyInt_FromLong(sli); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1274 } /* mpz_int() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1275 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1276 static PyObject * |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1277 #ifdef MPZ_CONVERSIONS_AS_METHODS |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1278 mpz_long(mpzobject *self, PyObject *args) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1279 #else /* def MPZ_CONVERSIONS_AS_METHODS */ |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1280 mpz_long(mpzobject *self) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1281 #endif /* def MPZ_CONVERSIONS_AS_METHODS else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1282 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1283 int i, isnegative; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1284 unsigned long int uli; |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1285 PyLongObject *longobjp; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1286 int ldcount; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1287 int bitpointer, newbitpointer; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1288 MP_INT mpzscratch; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1289 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1290 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1291 #ifdef MPZ_CONVERSIONS_AS_METHODS |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1292 if (!PyArg_NoArgs(args)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1293 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1294 #endif /* def MPZ_CONVERSIONS_AS_METHODS */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1295 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1296 /* determine length of python-long to be allocated */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1297 if ((longobjp = _PyLong_New(i = (int) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1298 ((mpz_size(&self->mpz) * BITS_PER_MP_LIMB |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1299 + SHIFT - 1) / |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1300 SHIFT))) == NULL) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1301 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1302 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1303 /* determine sign, and copy self to scratch var */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1304 mpz_init_set(&mpzscratch, &self->mpz); |
|
4052
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
1305 if ((isnegative = (mpz_cmp_ui(&self->mpz, (unsigned long int)0) < 0))) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1306 mpz_neg(&mpzscratch, &mpzscratch); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1307 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1308 /* let those bits come, let those bits go, |
|
4645
68c4b06cfff7
Renamed a few symbols that were found in comments.
Barry Warsaw <barry@python.org>
parents:
4644
diff
changeset
|
1309 e.g. dismantle mpzscratch, build PyLongObject */ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1310 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1311 bitpointer = 0; /* the number of valid bits in stock */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1312 newbitpointer = 0; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1313 ldcount = 0; /* the python-long limb counter */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1314 uli = (unsigned long int)0; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1315 while (i--) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1316 longobjp->ob_digit[ldcount] = uli & MASK; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1317 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1318 /* check if we've had enough bits for this digit */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1319 if (bitpointer < SHIFT) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1320 uli = mpz_get_ui(&mpzscratch); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1321 longobjp->ob_digit[ldcount] |= |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1322 (uli << bitpointer) & MASK; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1323 uli >>= SHIFT-bitpointer; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1324 bitpointer += BITS_PER_MP_LIMB; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1325 mpz_div_2exp(&mpzscratch, &mpzscratch, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1326 BITS_PER_MP_LIMB); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1327 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1328 else |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1329 uli >>= SHIFT; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1330 bitpointer -= SHIFT; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1331 ldcount++; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1332 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1333 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1334 assert(mpz_cmp_ui(&mpzscratch, (unsigned long int)0) == 0); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1335 mpz_clear(&mpzscratch); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1336 assert(ldcount <= longobjp->ob_size); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1337 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1338 /* long_normalize() is file-static */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1339 /* longobjp = long_normalize(longobjp); */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1340 while (ldcount > 0 && longobjp->ob_digit[ldcount-1] == 0) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1341 ldcount--; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1342 longobjp->ob_size = ldcount; |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1343 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1344 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1345 if (isnegative) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1346 longobjp->ob_size = -longobjp->ob_size; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1347 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1348 return (PyObject *)longobjp; |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1349 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1350 } /* mpz_long() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1351 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1352 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1353 /* I would have avoided pow() anyways, so ... */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1354 static const double multiplier = 256.0 * 256.0 * 256.0 * 256.0; |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1355 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1356 #ifdef MPZ_CONVERSIONS_AS_METHODS |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1357 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1358 mpz_float(mpzobject *self, PyObject *args) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1359 #else /* def MPZ_CONVERSIONS_AS_METHODS */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1360 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1361 mpz_float(mpzobject *self) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1362 #endif /* def MPZ_CONVERSIONS_AS_METHODS else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1363 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1364 int i, isnegative; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1365 double x; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1366 double mulstate; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1367 MP_INT mpzscratch; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1368 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1369 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1370 #ifdef MPZ_CONVERSIONS_AS_METHODS |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1371 if (!PyArg_NoArgs(args)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1372 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1373 #endif /* def MPZ_CONVERSIONS_AS_METHODS */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1374 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1375 i = (int)mpz_size(&self->mpz); |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1376 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1377 /* determine sign, and copy abs(self) to scratch var */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1378 if ((isnegative = (mpz_cmp_ui(&self->mpz, (unsigned long int)0) < 0))) |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1379 { |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1380 mpz_init(&mpzscratch); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1381 mpz_neg(&mpzscratch, &self->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1382 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1383 else |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1384 mpz_init_set(&mpzscratch, &self->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1385 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1386 /* let those bits come, let those bits go, |
|
4645
68c4b06cfff7
Renamed a few symbols that were found in comments.
Barry Warsaw <barry@python.org>
parents:
4644
diff
changeset
|
1387 e.g. dismantle mpzscratch, build PyFloatObject */ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1388 |
|
5120
a48f3678f9e1
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4645
diff
changeset
|
1389 /* Can this overflow? Dunno, protect against that possibility. */ |
|
a48f3678f9e1
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4645
diff
changeset
|
1390 PyFPE_START_PROTECT("mpz_float", return 0) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1391 x = 0.0; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1392 mulstate = 1.0; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1393 while (i--) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1394 x += mulstate * mpz_get_ui(&mpzscratch); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1395 mulstate *= multiplier; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1396 mpz_div_2exp(&mpzscratch, &mpzscratch, BITS_PER_MP_LIMB); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1397 } |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5120
diff
changeset
|
1398 PyFPE_END_PROTECT(mulstate) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1399 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1400 assert(mpz_cmp_ui(&mpzscratch, (unsigned long int)0) == 0); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1401 mpz_clear(&mpzscratch); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1402 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1403 if (isnegative) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1404 x = -x; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1405 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1406 return PyFloat_FromDouble(x); |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1407 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1408 } /* mpz_float() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1409 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1410 #ifdef MPZ_CONVERSIONS_AS_METHODS |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1411 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1412 mpz_hex(mpzobject *self, PyObject *args) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1413 #else /* def MPZ_CONVERSIONS_AS_METHODS */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1414 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1415 mpz_hex(mpzobject *self) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1416 #endif /* def MPZ_CONVERSIONS_AS_METHODS else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1417 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1418 #ifdef MPZ_CONVERSIONS_AS_METHODS |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1419 if (!PyArg_NoArgs(args)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1420 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1421 #endif /* def MPZ_CONVERSIONS_AS_METHODS */ |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1422 |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1423 return mpz_format((PyObject *)self, 16, (unsigned char)1); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1424 } /* mpz_hex() */ |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1425 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1426 #ifdef MPZ_CONVERSIONS_AS_METHODS |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1427 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1428 mpz_oct(mpzobject *self, PyObject *args) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1429 #else /* def MPZ_CONVERSIONS_AS_METHODS */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1430 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1431 mpz_oct(mpzobject *self) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1432 #endif /* def MPZ_CONVERSIONS_AS_METHODS else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1433 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1434 #ifdef MPZ_CONVERSIONS_AS_METHODS |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1435 if (!PyArg_NoArgs(args)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1436 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1437 #endif /* def MPZ_CONVERSIONS_AS_METHODS */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1438 |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1439 return mpz_format((PyObject *)self, 8, (unsigned char)1); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1440 } /* mpz_oct() */ |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1441 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1442 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1443 mpz_binary(mpzobject *self, PyObject *args) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1444 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1445 int size; |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1446 PyStringObject *strobjp; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1447 char *cp; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1448 MP_INT mp; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1449 unsigned long ldigit; |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1450 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1451 if (!PyArg_NoArgs(args)) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1452 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1453 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1454 if (mpz_cmp_ui(&self->mpz, (unsigned long int)0) < 0) { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1455 PyErr_SetString(PyExc_ValueError, |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1456 "mpz.binary() arg must be >= 0"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1457 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1458 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1459 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1460 mpz_init_set(&mp, &self->mpz); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1461 size = (int)mpz_size(&mp); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1462 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1463 if ((strobjp = (PyStringObject *) |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1464 PyString_FromStringAndSize( |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1465 (char *)0, size * sizeof (unsigned long int))) == NULL) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1466 return NULL; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1467 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1468 /* get the beginning of the string memory and start copying things */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1469 cp = PyString_AS_STRING(strobjp); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1470 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1471 /* this has been programmed using a (fairly) decent lib-i/f it could |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1472 be must faster if we looked into the GMP lib */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1473 while (size--) { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1474 ldigit = mpz_get_ui(&mp); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1475 mpz_div_2exp(&mp, &mp, BITS_PER_MP_LIMB); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1476 *cp++ = (unsigned char)(ldigit & 0xFF); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1477 *cp++ = (unsigned char)((ldigit >>= 8) & 0xFF); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1478 *cp++ = (unsigned char)((ldigit >>= 8) & 0xFF); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1479 *cp++ = (unsigned char)((ldigit >>= 8) & 0xFF); |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1480 if (sizeof(ldigit) == 8 && BITS_PER_MP_LIMB == 64) { |
|
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1481 *cp++ = (unsigned char)((ldigit >>= 8) & 0xFF); |
|
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1482 *cp++ = (unsigned char)((ldigit >>= 8) & 0xFF); |
|
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1483 *cp++ = (unsigned char)((ldigit >>= 8) & 0xFF); |
|
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1484 *cp++ = (unsigned char)((ldigit >>= 8) & 0xFF); |
|
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1485 } |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1486 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1487 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1488 while (strobjp->ob_size && !*--cp) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1489 strobjp->ob_size--; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1490 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1491 return (PyObject *)strobjp; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1492 } /* mpz_binary() */ |
|
16574
bf9c24beda7d
Richard Fish <rfish@users.sourceforge.net>:
Fred Drake <fdrake@acm.org>
parents:
16469
diff
changeset
|
1493 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1494 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1495 static PyMethodDef mpz_methods[] = { |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1496 #ifdef MPZ_CONVERSIONS_AS_METHODS |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1497 {"int", mpz_int}, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1498 {"long", mpz_long}, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1499 {"float", mpz_float}, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1500 {"hex", mpz_hex}, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1501 {"oct", mpz_oct}, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1502 #endif /* def MPZ_CONVERSIONS_AS_METHODS */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1503 {"binary", (PyCFunction)mpz_binary}, |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1504 {NULL, NULL} /* sentinel */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1505 }; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1506 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1507 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1508 mpz_getattr(mpzobject *self, char *name) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1509 { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1510 return Py_FindMethod(mpz_methods, (PyObject *)self, name); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1511 } /* mpz_getattr() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1512 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1513 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1514 static int |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1515 mpz_coerce(PyObject **pv, PyObject **pw) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1516 { |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1517 PyObject *z; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1518 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1519 #ifdef MPZ_DEBUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1520 fputs("mpz_coerce() called...\n", stderr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1521 #endif /* def MPZ_DEBUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1522 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1523 assert(is_mpzobject(*pv)); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1524 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1525 /* always convert other arg to mpz value, except for floats */ |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1526 if (!PyFloat_Check(*pw)) { |
|
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1527 if ((z = (PyObject *)mpz_mpzcoerce(*pw)) == NULL) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1528 return -1; /* -1: an error always has been set */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1529 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1530 Py_INCREF(*pv); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1531 *pw = z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1532 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1533 else { |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1534 #ifdef MPZ_CONVERSIONS_AS_METHODS |
|
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1535 if ((z = mpz_float((mpzobject *)(*pv), NULL)) == NULL) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1536 return -1; |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1537 #else /* def MPZ_CONVERSIONS_AS_METHODS */ |
|
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1538 if ((z = mpz_float((mpzobject *)(*pv))) == NULL) |
|
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1539 return -1; |
|
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1540 #endif /* def MPZ_CONVERSIONS_AS_METHODS else */ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1541 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1542 Py_INCREF(*pw); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1543 *pv = z; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1544 } |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1545 return 0; /* coercion succeeded */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1546 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1547 } /* mpz_coerce() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1548 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1549 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1550 static PyObject * |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1551 mpz_repr(PyObject *v) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1552 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1553 return mpz_format(v, 10, (unsigned char)1); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1554 } /* mpz_repr() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1555 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1556 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1557 |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1558 #define UF (unaryfunc) |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1559 #define BF (binaryfunc) |
|
2055
cf31eab6ab5a
Another bulky set of minor changes.
Guido van Rossum <guido@python.org>
parents:
1746
diff
changeset
|
1560 #define TF (ternaryfunc) |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1561 #define IF (inquiry) |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1562 #define CF (coercion) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1563 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1564 static PyNumberMethods mpz_as_number = { |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1565 BF mpz_addition, /*nb_add*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1566 BF mpz_substract, /*nb_subtract*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1567 BF mpz_multiply, /*nb_multiply*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1568 BF mpz_divide, /*nb_divide*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1569 BF mpz_remainder, /*nb_remainder*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1570 BF mpz_div_and_mod, /*nb_divmod*/ |
|
2055
cf31eab6ab5a
Another bulky set of minor changes.
Guido van Rossum <guido@python.org>
parents:
1746
diff
changeset
|
1571 TF mpz_power, /*nb_power*/ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1572 UF mpz_negative, /*nb_negative*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1573 UF mpz_positive, /*tp_positive*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1574 UF mpz_absolute, /*tp_absolute*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1575 IF mpz_nonzero, /*tp_nonzero*/ |
|
4052
ef6c89fe21ed
Changes by Rob Hooft for GMP 2.0.2
Guido van Rossum <guido@python.org>
parents:
2309
diff
changeset
|
1576 UF py_mpz_invert, /*nb_invert*/ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1577 BF mpz_lshift, /*nb_lshift*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1578 BF mpz_rshift, /*nb_rshift*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1579 BF mpz_andfunc, /*nb_and*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1580 BF mpz_xorfunc, /*nb_xor*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1581 BF mpz_orfunc, /*nb_or*/ |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1582 CF mpz_coerce, /*nb_coerce*/ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1583 #ifndef MPZ_CONVERSIONS_AS_METHODS |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1584 UF mpz_int, /*nb_int*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1585 UF mpz_long, /*nb_long*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1586 UF mpz_float, /*nb_float*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1587 UF mpz_oct, /*nb_oct*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1588 UF mpz_hex, /*nb_hex*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1589 #endif /* ndef MPZ_CONVERSIONS_AS_METHODS */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1590 }; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1591 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1592 static PyTypeObject MPZtype = { |
|
16469
c0b0fc13279e
Patch #103523, to make mpz module compile with Cygwin
Andrew M. Kuchling <amk@amk.ca>
parents:
15158
diff
changeset
|
1593 PyObject_HEAD_INIT(NULL) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1594 0, /*ob_size*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1595 "mpz", /*tp_name*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1596 sizeof(mpzobject), /*tp_size*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1597 0, /*tp_itemsize*/ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1598 /* methods */ |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1599 (destructor)mpz_dealloc, /*tp_dealloc*/ |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1600 0, /*tp_print*/ |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1601 (getattrfunc)mpz_getattr, /*tp_getattr*/ |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1602 0, /*tp_setattr*/ |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1603 (cmpfunc)mpz_compare, /*tp_compare*/ |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1604 (reprfunc)mpz_repr, /*tp_repr*/ |
|
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1605 &mpz_as_number, /*tp_as_number*/ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1606 }; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1607 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1608 /* List of functions exported by this module */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1609 |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1610 static PyMethodDef mpz_functions[] = { |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1611 #if 0 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1612 {initialiser_name, MPZ_mpz}, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1613 #else /* 0 */ |
|
4645
68c4b06cfff7
Renamed a few symbols that were found in comments.
Barry Warsaw <barry@python.org>
parents:
4644
diff
changeset
|
1614 /* until guido ``fixes'' struct PyMethodDef */ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1615 {(char *)initialiser_name, MPZ_mpz}, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1616 #endif /* 0 else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1617 {"powm", MPZ_powm}, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1618 {"gcd", MPZ_gcd}, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1619 {"gcdext", MPZ_gcdext}, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1620 {"sqrt", MPZ_sqrt}, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1621 {"sqrtrem", MPZ_sqrtrem}, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1622 {"divm", MPZ_divm}, |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1623 {NULL, NULL} /* Sentinel */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1624 }; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1625 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1626 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1627 /* #define MP_TEST_ALLOC */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1628 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1629 #ifdef MP_TEST_ALLOC |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1630 #define MP_TEST_SIZE 4 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1631 static const char mp_test_magic[MP_TEST_SIZE] = {'\xAA','\xAA','\xAA','\xAA'}; |
|
13651
8a063423e0b7
Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
1632 static mp_test_error(int *location) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1633 { |
|
13620
5b727ab37092
Spelling fixes supplied by Rob W. W. Hooft. All these are fixes in either
Thomas Wouters <thomas@python.org>
parents:
13518
diff
changeset
|
1634 /* assumptions: *alloc returns address divisible by 4, |
|
5b727ab37092
Spelling fixes supplied by Rob W. W. Hooft. All these are fixes in either
Thomas Wouters <thomas@python.org>
parents:
13518
diff
changeset
|
1635 mpz_* routines allocate in chunks divisible by four */ |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1636 fprintf(stderr, "MP_TEST_ERROR: location holds 0x%08d\n", *location ); |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1637 Py_FatalError("MP_TEST_ERROR"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1638 } /* static mp_test_error() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1639 #define MP_EXTRA_ALLOC(size) ((size) + MP_TEST_SIZE) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1640 #define MP_SET_TEST(basep,size) (void)memcpy( ((char *)(basep))+(size), mp_test_magic, MP_TEST_SIZE) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1641 #define MP_DO_TEST(basep,size) if ( !memcmp( ((char *)(basep))+(size), mp_test_magic, MP_TEST_SIZE ) ) \ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1642 ; \ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1643 else \ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1644 mp_test_error((int *)((char *)(basep) + size)) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1645 #else /* def MP_TEST_ALLOC */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1646 #define MP_EXTRA_ALLOC(size) (size) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1647 #define MP_SET_TEST(basep,size) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1648 #define MP_DO_TEST(basep,size) |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1649 #endif /* def MP_TEST_ALLOC else */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1650 |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1651 void *mp_allocate(size_t alloc_size) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1652 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1653 void *res; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1654 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1655 #ifdef MPZ_DEBUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1656 fprintf(stderr, "mp_allocate : size %ld\n", |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1657 alloc_size); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1658 #endif /* def MPZ_DEBUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1659 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1660 if ( (res = malloc(MP_EXTRA_ALLOC(alloc_size))) == NULL ) |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1661 Py_FatalError("mp_allocate failure"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1662 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1663 #ifdef MPZ_DEBUG |
|
13210
ff243b0f16ee
Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents:
13083
diff
changeset
|
1664 fprintf(stderr, "mp_allocate : address %08p\n", res); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1665 #endif /* def MPZ_DEBUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1666 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1667 MP_SET_TEST(res,alloc_size); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1668 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1669 return res; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1670 } /* mp_allocate() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1671 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1672 |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1673 void *mp_reallocate(void *ptr, size_t old_size, size_t new_size) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1674 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1675 void *res; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1676 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1677 #ifdef MPZ_DEBUG |
|
13210
ff243b0f16ee
Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents:
13083
diff
changeset
|
1678 fprintf(stderr, "mp_reallocate: old address %08p, old size %ld\n", |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1679 ptr, old_size); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1680 #endif /* def MPZ_DEBUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1681 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1682 MP_DO_TEST(ptr, old_size); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1683 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1684 if ( (res = realloc(ptr, MP_EXTRA_ALLOC(new_size))) == NULL ) |
|
4644
f4ba9e07d9bf
Renamed, ungrandly. We don't have the GNU MP library here so we can't
Barry Warsaw <barry@python.org>
parents:
4503
diff
changeset
|
1685 Py_FatalError("mp_reallocate failure"); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1686 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1687 #ifdef MPZ_DEBUG |
|
13210
ff243b0f16ee
Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents:
13083
diff
changeset
|
1688 fprintf(stderr, "mp_reallocate: new address %08p, new size %ld\n", |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1689 res, new_size); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1690 #endif /* def MPZ_DEBUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1691 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1692 MP_SET_TEST(res, new_size); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1693 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1694 return res; |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1695 } /* mp_reallocate() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1696 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1697 |
|
13518
86704432d283
ANSI-fication, added #ifdef construction in mpz_coerce
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13447
diff
changeset
|
1698 void mp_free(void *ptr, size_t size) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1699 { |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1700 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1701 #ifdef MPZ_DEBUG |
|
13210
ff243b0f16ee
Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents:
13083
diff
changeset
|
1702 fprintf(stderr, "mp_free : old address %08p, old size %ld\n", |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1703 ptr, size); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1704 #endif /* def MPZ_DEBUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1705 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1706 MP_DO_TEST(ptr, size); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1707 free(ptr); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1708 } /* mp_free() */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1709 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1710 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1711 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1712 /* Initialize this module. */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1713 |
|
9588
38023a425e48
Add DL_EXPORT() to all modules that could possibly be used
Guido van Rossum <guido@python.org>
parents:
9307
diff
changeset
|
1714 DL_EXPORT(void) |
|
13651
8a063423e0b7
Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
1715 initmpz(void) |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1716 { |
|
7834
147c1067ca33
Export MPZType -- the type of mpz objects....
Fred Drake <fdrake@acm.org>
parents:
6853
diff
changeset
|
1717 PyObject *module; |
|
147c1067ca33
Export MPZType -- the type of mpz objects....
Fred Drake <fdrake@acm.org>
parents:
6853
diff
changeset
|
1718 PyObject *dict; |
|
147c1067ca33
Export MPZType -- the type of mpz objects....
Fred Drake <fdrake@acm.org>
parents:
6853
diff
changeset
|
1719 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1720 #ifdef MPZ_DEBUG |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1721 fputs( "initmpz() called...\n", stderr ); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1722 #endif /* def MPZ_DEBUG */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1723 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1724 mp_set_memory_functions( mp_allocate, mp_reallocate, mp_free ); |
|
16469
c0b0fc13279e
Patch #103523, to make mpz module compile with Cygwin
Andrew M. Kuchling <amk@amk.ca>
parents:
15158
diff
changeset
|
1725 MPZtype.ob_type = &PyType_Type; |
|
7834
147c1067ca33
Export MPZType -- the type of mpz objects....
Fred Drake <fdrake@acm.org>
parents:
6853
diff
changeset
|
1726 module = Py_InitModule("mpz", mpz_functions); |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1727 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1728 /* create some frequently used constants */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1729 if ((mpz_value_zero = newmpzobject()) == NULL) |
|
14346
5397fdf88ec2
Do the absolute minimal amount of modifications to eradicate
Barry Warsaw <barry@python.org>
parents:
13651
diff
changeset
|
1730 goto finally; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1731 mpz_set_ui(&mpz_value_zero->mpz, (unsigned long int)0); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1732 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1733 if ((mpz_value_one = newmpzobject()) == NULL) |
|
14346
5397fdf88ec2
Do the absolute minimal amount of modifications to eradicate
Barry Warsaw <barry@python.org>
parents:
13651
diff
changeset
|
1734 goto finally; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1735 mpz_set_ui(&mpz_value_one->mpz, (unsigned long int)1); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1736 |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1737 if ((mpz_value_mone = newmpzobject()) == NULL) |
|
14346
5397fdf88ec2
Do the absolute minimal amount of modifications to eradicate
Barry Warsaw <barry@python.org>
parents:
13651
diff
changeset
|
1738 goto finally; |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1739 mpz_set_si(&mpz_value_mone->mpz, (long)-1); |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1740 |
|
7834
147c1067ca33
Export MPZType -- the type of mpz objects....
Fred Drake <fdrake@acm.org>
parents:
6853
diff
changeset
|
1741 dict = PyModule_GetDict(module); |
|
147c1067ca33
Export MPZType -- the type of mpz objects....
Fred Drake <fdrake@acm.org>
parents:
6853
diff
changeset
|
1742 if (dict != NULL) { |
|
147c1067ca33
Export MPZType -- the type of mpz objects....
Fred Drake <fdrake@acm.org>
parents:
6853
diff
changeset
|
1743 PyDict_SetItemString(dict, "MPZType", (PyObject*)&MPZtype); |
|
147c1067ca33
Export MPZType -- the type of mpz objects....
Fred Drake <fdrake@acm.org>
parents:
6853
diff
changeset
|
1744 } |
|
14346
5397fdf88ec2
Do the absolute minimal amount of modifications to eradicate
Barry Warsaw <barry@python.org>
parents:
13651
diff
changeset
|
1745 finally: |
|
5397fdf88ec2
Do the absolute minimal amount of modifications to eradicate
Barry Warsaw <barry@python.org>
parents:
13651
diff
changeset
|
1746 return; |
|
5397fdf88ec2
Do the absolute minimal amount of modifications to eradicate
Barry Warsaw <barry@python.org>
parents:
13651
diff
changeset
|
1747 } /* initmpz() */ |
|
7834
147c1067ca33
Export MPZType -- the type of mpz objects....
Fred Drake <fdrake@acm.org>
parents:
6853
diff
changeset
|
1748 |
|
1132
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1749 #ifdef MAKEDUMMYINT |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1750 int _mpz_dummy_int; /* XXX otherwise, we're .bss-less (DYNLOAD->Jack?) */ |
|
6461dac9a9f2
* mymalloc.h: always allocate one extra byte, since some malloc's
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1751 #endif /* def MAKEDUMMYINT */ |
