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