blob: d638c64412a51b69476614160d6e9f7cdddc090e [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumedcc38a1991-05-05 20:09:44 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumedcc38a1991-05-05 20:09:44 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumedcc38a1991-05-05 20:09:44 +000029
30******************************************************************/
31
32/* Long (arbitrary precision) integer object implementation */
33
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000034/* XXX The functional organization of this file is terrible */
35
Guido van Rossumc0b618a1997-05-02 03:12:38 +000036#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +000037#include "longintrepr.h"
Guido van Rossum687ec181995-03-04 22:43:47 +000038#include "mymath.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +000039
Guido van Rossumedcc38a1991-05-05 20:09:44 +000040#include <assert.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000041#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000042
Guido van Rossume32e0141992-01-19 16:31:05 +000043#define ABS(x) ((x) < 0 ? -(x) : (x))
44
45/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000046static PyLongObject *long_normalize Py_PROTO((PyLongObject *));
47static PyLongObject *mul1 Py_PROTO((PyLongObject *, wdigit));
48static PyLongObject *muladd1 Py_PROTO((PyLongObject *, wdigit, wdigit));
49static PyLongObject *divrem1 Py_PROTO((PyLongObject *, wdigit, digit *));
50static PyObject *long_format Py_PROTO((PyObject *aa, int base));
Guido van Rossume32e0141992-01-19 16:31:05 +000051
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000052static int ticker; /* XXX Could be shared with ceval? */
53
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000055 if (--ticker < 0) { \
56 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000058 }
59
Guido van Rossumedcc38a1991-05-05 20:09:44 +000060/* Normalize (remove leading zeros from) a long int object.
61 Doesn't attempt to free the storage--in most cases, due to the nature
62 of the algorithms used, this could save at most be one word anyway. */
63
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +000065long_normalize(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000067{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000068 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000069 register int i = j;
70
71 while (i > 0 && v->ob_digit[i-1] == 0)
72 --i;
73 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000074 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000075 return v;
76}
77
78/* Allocate a new long int object with size digits.
79 Return NULL and set exception if we run out of memory. */
80
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081PyLongObject *
82_PyLong_New(size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000083 int size;
84{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086}
87
88/* Create a new long int object from a C long int */
89
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090PyObject *
91PyLong_FromLong(ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000092 long ival;
93{
Guido van Rossum472c04f1996-12-05 21:57:21 +000094 /* Assume a C long fits in at most 5 'digits' */
95 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 PyLongObject *v = _PyLong_New(5);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000097 if (v != NULL) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000098 unsigned long t = ival;
99 int i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000100 if (ival < 0) {
Guido van Rossum472c04f1996-12-05 21:57:21 +0000101 t = -ival;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000102 v->ob_size = -(v->ob_size);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000103 }
104 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000105 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000106 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000107 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000108 v = long_normalize(v);
109 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000111}
112
Guido van Rossum53756b11997-01-03 17:14:46 +0000113/* Create a new long int object from a C unsigned long int */
114
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyObject *
Guido van Rossum53756b11997-01-03 17:14:46 +0000116PyLong_FromUnsignedLong(ival)
117 unsigned long ival;
118{
119 /* Assume a C long fits in at most 5 'digits' */
120 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 PyLongObject *v = _PyLong_New(5);
Guido van Rossum53756b11997-01-03 17:14:46 +0000122 if (v != NULL) {
123 unsigned long t = ival;
124 int i;
125 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000126 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum53756b11997-01-03 17:14:46 +0000127 t >>= SHIFT;
128 }
129 v = long_normalize(v);
130 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000132}
133
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000134/* Create a new long int object from a C double */
135
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136PyObject *
Guido van Rossum687ec181995-03-04 22:43:47 +0000137#ifdef MPW
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138PyLong_FromDouble(double dval)
Guido van Rossum687ec181995-03-04 22:43:47 +0000139#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140PyLong_FromDouble(dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000141 double dval;
Guido van Rossum687ec181995-03-04 22:43:47 +0000142#endif /* MPW */
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000143{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000145 double frac;
146 int i, ndig, expo, neg;
147 neg = 0;
148 if (dval < 0.0) {
149 neg = 1;
150 dval = -dval;
151 }
152 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
153 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000155 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000157 if (v == NULL)
158 return NULL;
159 frac = ldexp(frac, (expo-1) % SHIFT + 1);
160 for (i = ndig; --i >= 0; ) {
161 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000162 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000163 frac = frac - (double)bits;
164 frac = ldexp(frac, SHIFT);
165 }
166 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000167 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000169}
170
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000171/* Get a C long int from a long int object.
172 Returns -1 and sets an error condition if overflow occurs. */
173
174long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175PyLong_AsLong(vv)
176 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000177{
Guido van Rossumf7531811998-05-26 14:33:37 +0000178 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000180 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000181 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000182
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 if (vv == NULL || !PyLong_Check(vv)) {
184 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000185 return -1;
186 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000188 i = v->ob_size;
189 sign = 1;
190 x = 0;
191 if (i < 0) {
192 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000193 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000194 }
195 while (--i >= 0) {
196 prev = x;
197 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000198 if ((x >> SHIFT) != prev)
199 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000200 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000201 /* Haven't lost any bits, but if the sign bit is set we're in
202 * trouble *unless* this is the min negative number. So,
203 * trouble iff sign bit set && (positive || some bit set other
204 * than the sign bit).
205 */
206 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
207 goto overflow;
208 return (long)x * sign;
209
210 overflow:
211 PyErr_SetString(PyExc_OverflowError,
212 "long int too long to convert");
213 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000214}
215
Guido van Rossum53756b11997-01-03 17:14:46 +0000216/* Get a C long int from a long int object.
217 Returns -1 and sets an error condition if overflow occurs. */
218
219unsigned long
220PyLong_AsUnsignedLong(vv)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 PyObject *vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000222{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000224 unsigned long x, prev;
225 int i;
226
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 if (vv == NULL || !PyLong_Check(vv)) {
228 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000229 return (unsigned long) -1;
230 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000232 i = v->ob_size;
233 x = 0;
234 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000236 "can't convert negative value to unsigned long");
237 return (unsigned long) -1;
238 }
239 while (--i >= 0) {
240 prev = x;
241 x = (x << SHIFT) + v->ob_digit[i];
242 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000244 "long int too long to convert");
245 return (unsigned long) -1;
246 }
247 }
248 return x;
249}
250
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000251/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000252
253double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254PyLong_AsDouble(vv)
255 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000256{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000257 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000258 double x;
259 double multiplier = (double) (1L << SHIFT);
260 int i, sign;
261
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262 if (vv == NULL || !PyLong_Check(vv)) {
263 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000264 return -1;
265 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000266 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000267 i = v->ob_size;
268 sign = 1;
269 x = 0.0;
270 if (i < 0) {
271 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000272 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000273 }
274 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000275 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000276 }
277 return x * sign;
278}
279
280/* Multiply by a single digit, ignoring the sign. */
281
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000283mul1(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000284 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000285 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000286{
287 return muladd1(a, n, (digit)0);
288}
289
290/* Multiply by a single digit and add a single digit, ignoring the sign. */
291
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000293muladd1(a, n, extra)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000295 wdigit n;
296 wdigit extra;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000297{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000298 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000299 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000300 twodigits carry = extra;
301 int i;
302
303 if (z == NULL)
304 return NULL;
305 for (i = 0; i < size_a; ++i) {
306 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000307 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000308 carry >>= SHIFT;
309 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000310 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000311 return long_normalize(z);
312}
313
314/* Divide a long integer by a digit, returning both the quotient
315 (as function result) and the remainder (through *prem).
316 The sign of a is ignored; n should not be zero. */
317
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000318static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000319divrem1(a, n, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000321 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000322 digit *prem;
323{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000324 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000326 int i;
327 twodigits rem = 0;
328
329 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000331 if (z == NULL)
332 return NULL;
333 for (i = size; --i >= 0; ) {
334 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000335 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000336 rem %= n;
337 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000338 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000339 return long_normalize(z);
340}
341
342/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000343 Return a string object.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000344 If base is 8 or 16, add the proper prefix '0' or '0x'.
345 External linkage: used in bltinmodule.c by hex() and oct(). */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000346
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +0000348long_format(aa, base)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 PyObject *aa;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000350 int base;
351{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 register PyLongObject *a = (PyLongObject *)aa;
353 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000354 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000355 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000356 char *p;
357 int bits;
358 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000359
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360 if (a == NULL || !PyLong_Check(a)) {
361 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000362 return NULL;
363 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000364 assert(base >= 2 && base <= 36);
365
366 /* Compute a rough upper bound for the length of the string */
367 i = base;
368 bits = 0;
369 while (i > 1) {
370 ++bits;
371 i >>= 1;
372 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000373 i = 6 + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000375 if (str == NULL)
376 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000378 *p = '\0';
Guido van Rossumc6913e71991-11-19 20:26:46 +0000379 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000380 if (a->ob_size < 0)
381 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000382
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383 Py_INCREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000384 do {
385 digit rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 PyLongObject *temp = divrem1(a, (digit)base, &rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000387 if (temp == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000388 Py_DECREF(a);
389 Py_DECREF(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000390 return NULL;
391 }
392 if (rem < 10)
393 rem += '0';
394 else
395 rem += 'A'-10;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 assert(p > PyString_AS_STRING(str));
Guido van Rossum2095d241997-04-09 19:41:24 +0000397 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000399 a = temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000400 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 Py_DECREF(a);
402 Py_DECREF(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000403 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000404 })
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000405 } while (ABS(a->ob_size) != 0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 Py_DECREF(a);
Guido van Rossum2c475421992-08-14 15:13:07 +0000407 if (base == 8) {
408 if (size_a != 0)
409 *--p = '0';
410 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000411 else if (base == 16) {
412 *--p = 'x';
413 *--p = '0';
414 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000415 else if (base != 10) {
416 *--p = '#';
417 *--p = '0' + base%10;
418 if (base > 10)
419 *--p = '0' + base/10;
420 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000421 if (sign)
422 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 if (p != PyString_AS_STRING(str)) {
424 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000425 assert(p > q);
426 do {
427 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000428 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429 _PyString_Resize((PyObject **)&str,
430 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000431 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000432 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000433}
434
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000435#if 0
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000436/* Convert a string to a long int object, in a given base.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000437 Base zero implies a default depending on the number.
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000438 External linkage: used in compile.c and stropmodule.c. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000439
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000441long_scan(str, base)
442 char *str;
443 int base;
444{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 return PyLong_FromString(str, (char **)NULL, base);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000446}
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000447#endif
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000448
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449PyObject *
450PyLong_FromString(str, pend, base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000451 char *str;
452 char **pend;
453 int base;
454{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000455 int sign = 1;
Guido van Rossume6762971998-06-22 03:54:46 +0000456 char *start;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000458
Guido van Rossum472c04f1996-12-05 21:57:21 +0000459 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 PyErr_SetString(PyExc_ValueError,
461 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000462 return NULL;
463 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000464 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000465 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000466 if (*str == '+')
467 ++str;
468 else if (*str == '-') {
469 ++str;
470 sign = -1;
471 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000472 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000473 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000474 if (base == 0) {
475 if (str[0] != '0')
476 base = 10;
477 else if (str[1] == 'x' || str[1] == 'X')
478 base = 16;
479 else
480 base = 8;
481 }
482 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
483 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000485 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000486 for ( ; z != NULL; ++str) {
487 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000489
490 if (*str <= '9')
491 k = *str - '0';
492 else if (*str >= 'a')
493 k = *str - 'a' + 10;
494 else if (*str >= 'A')
495 k = *str - 'A' + 10;
496 if (k < 0 || k >= base)
497 break;
498 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000500 z = temp;
501 }
Guido van Rossume6762971998-06-22 03:54:46 +0000502 if (str == start) {
503 PyErr_SetString(PyExc_ValueError,
504 "no digits in long int constant");
505 return NULL;
506 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000507 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000508 z->ob_size = -(z->ob_size);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000509 if (pend)
510 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 return (PyObject *) z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000512}
513
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514static PyLongObject *x_divrem
515 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject **));
516static PyObject *long_pos Py_PROTO((PyLongObject *));
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000517static int long_divrem Py_PROTO((PyLongObject *, PyLongObject *,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518 PyLongObject **, PyLongObject **));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000519
520/* Long division with remainder, top-level routine */
521
Guido van Rossume32e0141992-01-19 16:31:05 +0000522static int
523long_divrem(a, b, pdiv, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 PyLongObject *a, *b;
525 PyLongObject **pdiv;
526 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000527{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000528 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000529 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000530
531 if (size_b == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 PyErr_SetString(PyExc_ZeroDivisionError, "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000533 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000534 }
535 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000536 (size_a == size_b &&
537 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000538 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 *pdiv = _PyLong_New(0);
540 Py_INCREF(a);
541 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000542 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000543 }
544 if (size_b == 1) {
545 digit rem = 0;
546 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000547 if (z == NULL)
548 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000550 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000551 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000552 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000553 if (z == NULL)
554 return -1;
555 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000556 /* Set the signs.
557 The quotient z has the sign of a*b;
558 the remainder r has the sign of a,
559 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000560 if ((a->ob_size < 0) != (b->ob_size < 0))
561 z->ob_size = -(z->ob_size);
562 if (a->ob_size < 0 && (*prem)->ob_size != 0)
563 (*prem)->ob_size = -((*prem)->ob_size);
564 *pdiv = z;
565 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000566}
567
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000568/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000569
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000571x_divrem(v1, w1, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 PyLongObject *v1, *w1;
573 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000574{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000575 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000576 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 PyLongObject *v = mul1(v1, d);
578 PyLongObject *w = mul1(w1, d);
579 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000580 int j, k;
581
582 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000583 Py_XDECREF(v);
584 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000585 return NULL;
586 }
587
588 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000589 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000590 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000591
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000592 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000594
595 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
596 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
597 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000598 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000599 int i;
600
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000601 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000603 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000604 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000605 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000606 if (vj == w->ob_digit[size_w-1])
607 q = MASK;
608 else
609 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
610 w->ob_digit[size_w-1];
611
612 while (w->ob_digit[size_w-2]*q >
613 ((
614 ((twodigits)vj << SHIFT)
615 + v->ob_digit[j-1]
616 - q*w->ob_digit[size_w-1]
617 ) << SHIFT)
618 + v->ob_digit[j-2])
619 --q;
620
621 for (i = 0; i < size_w && i+k < size_v; ++i) {
622 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000623 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 carry += v->ob_digit[i+k] - z
625 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000626 v->ob_digit[i+k] = carry & MASK;
627 carry = (carry >> SHIFT) - zz;
628 }
629
630 if (i+k < size_v) {
631 carry += v->ob_digit[i+k];
632 v->ob_digit[i+k] = 0;
633 }
634
635 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000636 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000637 else {
638 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000639 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000640 carry = 0;
641 for (i = 0; i < size_w && i+k < size_v; ++i) {
642 carry += v->ob_digit[i+k] + w->ob_digit[i];
643 v->ob_digit[i+k] = carry & MASK;
644 carry >>= SHIFT;
645 }
646 }
647 } /* for j, k */
648
Guido van Rossumc206c761995-01-10 15:23:19 +0000649 if (a == NULL)
650 *prem = NULL;
651 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000652 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000653 *prem = divrem1(v, d, &d);
654 /* d receives the (unused) remainder */
655 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000657 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000658 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000659 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660 Py_DECREF(v);
661 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000662 return a;
663}
664
665/* Methods */
666
Guido van Rossume32e0141992-01-19 16:31:05 +0000667/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668static void long_dealloc Py_PROTO((PyObject *));
669static PyObject *long_repr Py_PROTO((PyObject *));
670static int long_compare Py_PROTO((PyLongObject *, PyLongObject *));
671static long long_hash Py_PROTO((PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000672
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *));
674static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *));
675static PyObject *long_mul Py_PROTO((PyLongObject *, PyLongObject *));
676static PyObject *long_div Py_PROTO((PyLongObject *, PyLongObject *));
677static PyObject *long_mod Py_PROTO((PyLongObject *, PyLongObject *));
678static PyObject *long_divmod Py_PROTO((PyLongObject *, PyLongObject *));
679static PyObject *long_pow
680 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject *));
681static PyObject *long_neg Py_PROTO((PyLongObject *));
682static PyObject *long_pos Py_PROTO((PyLongObject *));
683static PyObject *long_abs Py_PROTO((PyLongObject *));
684static int long_nonzero Py_PROTO((PyLongObject *));
685static PyObject *long_invert Py_PROTO((PyLongObject *));
686static PyObject *long_lshift Py_PROTO((PyLongObject *, PyLongObject *));
687static PyObject *long_rshift Py_PROTO((PyLongObject *, PyLongObject *));
688static PyObject *long_and Py_PROTO((PyLongObject *, PyLongObject *));
689static PyObject *long_xor Py_PROTO((PyLongObject *, PyLongObject *));
690static PyObject *long_or Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000691
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000692static void
693long_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000695{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 PyMem_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000697}
698
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000699static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000700long_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000702{
Guido van Rossum8b27d921992-03-27 17:27:05 +0000703 return long_format(v, 10);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000704}
705
706static int
707long_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000709{
710 int sign;
711
Guido van Rossumc6913e71991-11-19 20:26:46 +0000712 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000713 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +0000714 sign = 0;
715 else
716 sign = a->ob_size - b->ob_size;
717 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000718 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000719 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000720 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
721 ;
722 if (i < 0)
723 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000724 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000725 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000726 if (a->ob_size < 0)
727 sign = -sign;
728 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000729 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000730 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000731}
732
Guido van Rossum9bfef441993-03-29 10:43:31 +0000733static long
734long_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 PyLongObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000736{
737 long x;
738 int i, sign;
739
740 /* This is designed so that Python ints and longs with the
741 same value hash to the same value, otherwise comparisons
742 of mapping keys will turn out weird */
743 i = v->ob_size;
744 sign = 1;
745 x = 0;
746 if (i < 0) {
747 sign = -1;
748 i = -(i);
749 }
750 while (--i >= 0) {
751 /* Force a 32-bit circular shift */
752 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
753 x += v->ob_digit[i];
754 }
755 x = x * sign;
756 if (x == -1)
757 x = -2;
758 return x;
759}
760
761
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000762/* Add the absolute values of two long integers. */
763
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764static PyLongObject *x_add Py_PROTO((PyLongObject *, PyLongObject *));
765static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000766x_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000768{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000769 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000771 int i;
772 digit carry = 0;
773
774 /* Ensure a is the larger of the two: */
775 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000776 { PyLongObject *temp = a; a = b; b = temp; }
777 { int size_temp = size_a;
778 size_a = size_b;
779 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000780 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000782 if (z == NULL)
783 return NULL;
784 for (i = 0; i < size_b; ++i) {
785 carry += a->ob_digit[i] + b->ob_digit[i];
786 z->ob_digit[i] = carry & MASK;
787 /* The following assumes unsigned shifts don't
788 propagate the sign bit. */
789 carry >>= SHIFT;
790 }
791 for (; i < size_a; ++i) {
792 carry += a->ob_digit[i];
793 z->ob_digit[i] = carry & MASK;
794 carry >>= SHIFT;
795 }
796 z->ob_digit[i] = carry;
797 return long_normalize(z);
798}
799
800/* Subtract the absolute values of two integers. */
801
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802static PyLongObject *x_sub Py_PROTO((PyLongObject *, PyLongObject *));
803static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000804x_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000806{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000807 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000808 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000809 int i;
810 int sign = 1;
811 digit borrow = 0;
812
813 /* Ensure a is the larger of the two: */
814 if (size_a < size_b) {
815 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816 { PyLongObject *temp = a; a = b; b = temp; }
817 { int size_temp = size_a;
818 size_a = size_b;
819 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000820 }
821 else if (size_a == size_b) {
822 /* Find highest digit where a and b differ: */
823 i = size_a;
824 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
825 ;
826 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000827 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000828 if (a->ob_digit[i] < b->ob_digit[i]) {
829 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000831 }
832 size_a = size_b = i+1;
833 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000835 if (z == NULL)
836 return NULL;
837 for (i = 0; i < size_b; ++i) {
838 /* The following assumes unsigned arithmetic
839 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000840 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000841 z->ob_digit[i] = borrow & MASK;
842 borrow >>= SHIFT;
843 borrow &= 1; /* Keep only one sign bit */
844 }
845 for (; i < size_a; ++i) {
846 borrow = a->ob_digit[i] - borrow;
847 z->ob_digit[i] = borrow & MASK;
848 borrow >>= SHIFT;
849 }
850 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +0000851 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000852 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000853 return long_normalize(z);
854}
855
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000857long_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 PyLongObject *a;
859 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000860{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000862
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000863 if (a->ob_size < 0) {
864 if (b->ob_size < 0) {
865 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +0000866 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000867 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000868 }
869 else
870 z = x_sub(b, a);
871 }
872 else {
873 if (b->ob_size < 0)
874 z = x_sub(a, b);
875 else
876 z = x_add(a, b);
877 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000878 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000879}
880
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000881static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000882long_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000883 PyLongObject *a;
884 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000885{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000886 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000887
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000888 if (a->ob_size < 0) {
889 if (b->ob_size < 0)
890 z = x_sub(a, b);
891 else
892 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +0000893 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000894 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000895 }
896 else {
897 if (b->ob_size < 0)
898 z = x_add(a, b);
899 else
900 z = x_sub(a, b);
901 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000903}
904
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000905static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000906long_mul(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907 PyLongObject *a;
908 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000909{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000910 int size_a;
911 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000912 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000913 int i;
914
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000915 size_a = ABS(a->ob_size);
916 size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000917 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000918 if (z == NULL)
919 return NULL;
920 for (i = 0; i < z->ob_size; ++i)
921 z->ob_digit[i] = 0;
922 for (i = 0; i < size_a; ++i) {
923 twodigits carry = 0;
924 twodigits f = a->ob_digit[i];
925 int j;
926
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000927 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000929 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000930 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000931 for (j = 0; j < size_b; ++j) {
932 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +0000933 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000934 carry >>= SHIFT;
935 }
936 for (; carry != 0; ++j) {
937 assert(i+j < z->ob_size);
938 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +0000939 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000940 carry >>= SHIFT;
941 }
942 }
943 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000944 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000945 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000946 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000948}
949
Guido van Rossume32e0141992-01-19 16:31:05 +0000950/* The / and % operators are now defined in terms of divmod().
951 The expression a mod b has the value a - b*floor(a/b).
952 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000953 |a| by |b|, with the sign of a. This is also expressed
954 as a - b*trunc(a/b), if trunc truncates towards zero.
955 Some examples:
956 a b a rem b a mod b
957 13 10 3 3
958 -13 10 -3 7
959 13 -10 3 -7
960 -13 -10 -3 -3
961 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000962 have different signs. We then subtract one from the 'div'
963 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000964
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965static int l_divmod Py_PROTO((PyLongObject *, PyLongObject *,
966 PyLongObject **, PyLongObject **));
Guido van Rossume32e0141992-01-19 16:31:05 +0000967static int
968l_divmod(v, w, pdiv, pmod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 PyLongObject *v;
970 PyLongObject *w;
971 PyLongObject **pdiv;
972 PyLongObject **pmod;
Guido van Rossume32e0141992-01-19 16:31:05 +0000973{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +0000975
976 if (long_divrem(v, w, &div, &mod) < 0)
977 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +0000978 if ((mod->ob_size < 0 && w->ob_size > 0) ||
979 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000980 PyLongObject *temp;
981 PyLongObject *one;
982 temp = (PyLongObject *) long_add(mod, w);
983 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +0000984 mod = temp;
985 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000986 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +0000987 return -1;
988 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +0000990 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
992 Py_DECREF(mod);
993 Py_DECREF(div);
994 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +0000995 return -1;
996 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997 Py_DECREF(one);
998 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +0000999 div = temp;
1000 }
1001 *pdiv = div;
1002 *pmod = mod;
1003 return 0;
1004}
1005
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001007long_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001008 PyLongObject *v;
1009 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001010{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001012 if (l_divmod(v, w, &div, &mod) < 0)
1013 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001014 Py_DECREF(mod);
1015 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001016}
1017
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001018static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001019long_mod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 PyLongObject *v;
1021 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001022{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001024 if (l_divmod(v, w, &div, &mod) < 0)
1025 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026 Py_DECREF(div);
1027 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001028}
1029
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001030static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001031long_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 PyLongObject *v;
1033 PyLongObject *w;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001034{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001035 PyObject *z;
1036 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001037 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001038 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001039 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001040 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041 PyTuple_SetItem(z, 0, (PyObject *) div);
1042 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001043 }
1044 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 Py_DECREF(div);
1046 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001047 }
1048 return z;
1049}
1050
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001051static PyObject *
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001052long_pow(a, b, c)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 PyLongObject *a;
1054 PyLongObject *b;
1055 PyLongObject *c;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001056{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001058 int size_b, i;
1059
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001060 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001061 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001062 PyErr_SetString(PyExc_ValueError,
1063 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001064 return NULL;
1065 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001066 z = (PyLongObject *)PyLong_FromLong(1L);
1067 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001068 for (i = 0; i < size_b; ++i) {
1069 digit bi = b->ob_digit[i];
1070 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001071
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001072 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001073 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001074
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001075 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001076 temp = (PyLongObject *)long_mul(z, a);
1077 Py_DECREF(z);
1078 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001079 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080 Py_XDECREF(div);
1081 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001082 temp = mod;
1083 }
1084 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001085 if (z == NULL)
1086 break;
1087 }
1088 bi >>= 1;
1089 if (bi == 0 && i+1 == size_b)
1090 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001091 temp = (PyLongObject *)long_mul(a, a);
1092 Py_DECREF(a);
1093 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001094 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001095 Py_XDECREF(div);
1096 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001097 temp = mod;
1098 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001099 a = temp;
1100 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001102 z = NULL;
1103 break;
1104 }
1105 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001106 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001107 break;
1108 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001109 Py_XDECREF(a);
1110 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001111 l_divmod(z, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001112 Py_XDECREF(div);
1113 Py_DECREF(z);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001114 z=mod;
1115 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001116 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001117}
1118
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001119static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001120long_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001122{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001123 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001124 PyLongObject *x;
1125 PyLongObject *w;
1126 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001127 if (w == NULL)
1128 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001129 x = (PyLongObject *) long_add(v, w);
1130 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001131 if (x == NULL)
1132 return NULL;
1133 if (x->ob_size != 0)
1134 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001136}
1137
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001138static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001139long_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001140 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001141{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001142 Py_INCREF(v);
1143 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001144}
1145
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001146static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001147long_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001148 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001149{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001150 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001151 int i, n;
1152 n = ABS(v->ob_size);
1153 if (n == 0) {
1154 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001155 Py_INCREF(v);
1156 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001157 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001158 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001159 if (z == NULL)
1160 return NULL;
1161 for (i = 0; i < n; i++)
1162 z->ob_digit[i] = v->ob_digit[i];
1163 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001164 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001165}
1166
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001167static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001168long_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001169 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001170{
1171 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001172 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001173 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174 Py_INCREF(v);
1175 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001176 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001177}
1178
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001179static int
1180long_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001181 PyLongObject *v;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001182{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001183 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001184}
1185
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001186static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001187long_rshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001188 PyLongObject *a;
1189 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001190{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001192 long shiftby;
1193 int newsize, wordshift, loshift, hishift, i, j;
1194 digit lomask, himask;
1195
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001196 if (a->ob_size < 0) {
1197 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001198 PyLongObject *a1, *a2, *a3;
1199 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001200 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001201 a2 = (PyLongObject *) long_rshift(a1, b);
1202 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001203 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001204 a3 = (PyLongObject *) long_invert(a2);
1205 Py_DECREF(a2);
1206 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001207 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001208
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001209 shiftby = PyLong_AsLong((PyObject *)b);
1210 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001211 return NULL;
1212 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001213 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001214 return NULL;
1215 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001216 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001217 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001218 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219 z = _PyLong_New(0);
1220 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001221 }
1222 loshift = shiftby % SHIFT;
1223 hishift = SHIFT - loshift;
1224 lomask = ((digit)1 << hishift) - 1;
1225 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001226 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001227 if (z == NULL)
1228 return NULL;
1229 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001230 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001231 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1232 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1233 if (i+1 < newsize)
1234 z->ob_digit[i] |=
1235 (a->ob_digit[j+1] << hishift) & himask;
1236 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001237 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001238}
1239
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001240static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001241long_lshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242 PyLongObject *a;
1243 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001244{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001245 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001246 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001247 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001248 int oldsize, newsize, wordshift, remshift, i, j;
1249 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001250
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251 shiftby = PyLong_AsLong((PyObject *)b);
1252 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001253 return NULL;
1254 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001255 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001256 return NULL;
1257 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001258 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001259 PyErr_SetString(PyExc_ValueError,
1260 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001261 return NULL;
1262 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001263 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1264 wordshift = (int)shiftby / SHIFT;
1265 remshift = (int)shiftby - wordshift * SHIFT;
1266
1267 oldsize = ABS(a->ob_size);
1268 newsize = oldsize + wordshift;
1269 if (remshift)
1270 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001272 if (z == NULL)
1273 return NULL;
1274 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001275 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001276 for (i = 0; i < wordshift; i++)
1277 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001278 accum = 0;
1279 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1280 accum |= a->ob_digit[j] << remshift;
1281 z->ob_digit[i] = (digit)(accum & MASK);
1282 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001283 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001284 if (remshift)
1285 z->ob_digit[newsize-1] = (digit)accum;
1286 else
1287 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001288 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001289}
1290
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001291
1292/* Bitwise and/xor/or operations */
1293
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001294#define MAX(x, y) ((x) < (y) ? (y) : (x))
1295#define MIN(x, y) ((x) > (y) ? (y) : (x))
1296
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001297static PyObject *long_bitwise Py_PROTO((PyLongObject *, int, PyLongObject *));
1298static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001299long_bitwise(a, op, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 PyLongObject *a;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001301 int op; /* '&', '|', '^' */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001303{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001304 digit maska, maskb; /* 0 or MASK */
1305 int negz;
1306 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001308 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001309 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001310 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001311
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001312 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001313 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001314 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001315 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001316 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001318 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001319 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001320 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001321 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001322 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001323 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001324 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001326 maskb = 0;
1327 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001328
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001329 size_a = a->ob_size;
1330 size_b = b->ob_size;
1331 size_z = MAX(size_a, size_b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001332 z = _PyLong_New(size_z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001333 if (a == NULL || b == NULL || z == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334 Py_XDECREF(a);
1335 Py_XDECREF(b);
1336 Py_XDECREF(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001337 return NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001338 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001339
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001340 negz = 0;
1341 switch (op) {
1342 case '^':
1343 if (maska != maskb) {
1344 maska ^= MASK;
1345 negz = -1;
1346 }
1347 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001348 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001349 if (maska && maskb) {
1350 op = '|';
1351 maska ^= MASK;
1352 maskb ^= MASK;
1353 negz = -1;
1354 }
1355 break;
1356 case '|':
1357 if (maska || maskb) {
1358 op = '&';
1359 maska ^= MASK;
1360 maskb ^= MASK;
1361 negz = -1;
1362 }
1363 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001364 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001365
1366 for (i = 0; i < size_z; ++i) {
1367 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1368 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1369 switch (op) {
1370 case '&': z->ob_digit[i] = diga & digb; break;
1371 case '|': z->ob_digit[i] = diga | digb; break;
1372 case '^': z->ob_digit[i] = diga ^ digb; break;
1373 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001374 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001375
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001376 Py_DECREF(a);
1377 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001378 z = long_normalize(z);
1379 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001380 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001381 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001383 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001384}
1385
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001386static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001387long_and(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001388 PyLongObject *a;
1389 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001390{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001391 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001392}
1393
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001394static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001395long_xor(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001396 PyLongObject *a;
1397 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001398{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001399 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001400}
1401
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001402static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001403long_or(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001404 PyLongObject *a;
1405 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001406{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001407 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001408}
1409
Guido van Rossum234f9421993-06-17 12:35:49 +00001410static int
Guido van Rossume6eefc21992-08-14 12:06:52 +00001411long_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001412 PyObject **pv;
1413 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001414{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415 if (PyInt_Check(*pw)) {
1416 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1417 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001418 return 0;
1419 }
1420 return 1; /* Can't do it */
1421}
1422
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001423static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001424long_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001425 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001426{
1427 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001428 x = PyLong_AsLong(v);
1429 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001430 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001431 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001432}
1433
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001434static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001435long_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001436 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001437{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001439 return v;
1440}
1441
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001443long_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001444 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001445{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001446 double result;
1447 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001448 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001449 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001450 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001451}
1452
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001453static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001454long_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001456{
1457 return long_format(v, 8);
1458}
1459
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001460static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001461long_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001462 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001463{
1464 return long_format(v, 16);
1465}
1466
1467
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001468#define UF (unaryfunc)
1469#define BF (binaryfunc)
1470#define TF (ternaryfunc)
1471#define IF (inquiry)
Guido van Rossum8b27d921992-03-27 17:27:05 +00001472
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001473static PyNumberMethods long_as_number = {
Guido van Rossum8b27d921992-03-27 17:27:05 +00001474 BF long_add, /*nb_add*/
1475 BF long_sub, /*nb_subtract*/
1476 BF long_mul, /*nb_multiply*/
1477 BF long_div, /*nb_divide*/
1478 BF long_mod, /*nb_remainder*/
1479 BF long_divmod, /*nb_divmod*/
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001480 TF long_pow, /*nb_power*/
Guido van Rossum8b27d921992-03-27 17:27:05 +00001481 UF long_neg, /*nb_negative*/
1482 UF long_pos, /*tp_positive*/
1483 UF long_abs, /*tp_absolute*/
1484 IF long_nonzero,/*tp_nonzero*/
1485 UF long_invert, /*nb_invert*/
1486 BF long_lshift, /*nb_lshift*/
1487 BF long_rshift, /*nb_rshift*/
1488 BF long_and, /*nb_and*/
1489 BF long_xor, /*nb_xor*/
1490 BF long_or, /*nb_or*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001491 (int (*) Py_FPROTO((PyObject **, PyObject **)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001492 (coercion)long_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001493 UF long_int, /*nb_int*/
1494 UF long_long, /*nb_long*/
1495 UF long_float, /*nb_float*/
1496 UF long_oct, /*nb_oct*/
1497 UF long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001498};
1499
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001500PyTypeObject PyLong_Type = {
1501 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001502 0,
1503 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001504 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001505 sizeof(digit),
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001506 (destructor)long_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001507 0, /*tp_print*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001508 0, /*tp_getattr*/
1509 0, /*tp_setattr*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001510 (int (*) Py_FPROTO((PyObject *, PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001511 (cmpfunc)long_compare, /*tp_compare*/
1512 (reprfunc)long_repr, /*tp_repr*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001513 &long_as_number,/*tp_as_number*/
1514 0, /*tp_as_sequence*/
1515 0, /*tp_as_mapping*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001516 (long (*) Py_FPROTO((PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001517 (hashfunc)long_hash, /*tp_hash*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001518};