annotate Modules/mpzmodule.c @ 16798:258dcafe2d0b legacy-trunk

Gustavo Niemeyer <niemeyer@conectiva.com>: Fixed recno support (keys are integers rather than strings). Work around DB bug that cause stdin to be closed by rnopen() when the DB file needed to exist but did not (no longer segfaults). This closes SF tracker patch #403445. Also wrapped some long lines and added whitespace around operators -- FLD.
author Fred Drake <fdrake@acm.org>
date Tue, 27 Feb 2001 18:56:46 +0000
parents bf9c24beda7d
children faf7f171a9f3 0b64550a7461
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
d15d8f5141a8 Peter Funk:
Guido van Rossum <guido@python.org>
parents: 9634
diff changeset
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
d15d8f5141a8 Peter Funk:
Guido van Rossum <guido@python.org>
parents: 9634
diff changeset
68 #define BITS_PER_MP_LIMB mp_bits_per_limb
d15d8f5141a8 Peter Funk:
Guido van Rossum <guido@python.org>
parents: 9634
diff changeset
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
d15d8f5141a8 Peter Funk:
Guido van Rossum <guido@python.org>
parents: 9634
diff changeset
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 */