blob: 9f7272c60a556bc70e35a72b063cbdd918961e3d [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001
2/* Long (arbitrary precision) integer object implementation */
3
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004/* XXX The functional organization of this file is terrible */
5
Guido van Rossumc0b618a1997-05-02 03:12:38 +00006#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +00007#include "longintrepr.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00009#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000010
Guido van Rossume32e0141992-01-19 16:31:05 +000011#define ABS(x) ((x) < 0 ? -(x) : (x))
12
13/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000014static PyLongObject *long_normalize(PyLongObject *);
15static PyLongObject *mul1(PyLongObject *, wdigit);
16static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
Tim Peters212e6142001-07-14 12:23:19 +000017static PyLongObject *divrem1(PyLongObject *, digit, digit *);
Tim Peters9f688bf2000-07-07 15:53:28 +000018static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000019
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000020static int ticker; /* XXX Could be shared with ceval? */
21
Guido van Rossumc0b618a1997-05-02 03:12:38 +000022#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000023 if (--ticker < 0) { \
24 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000025 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000026 }
27
Guido van Rossumedcc38a1991-05-05 20:09:44 +000028/* Normalize (remove leading zeros from) a long int object.
29 Doesn't attempt to free the storage--in most cases, due to the nature
30 of the algorithms used, this could save at most be one word anyway. */
31
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000033long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000034{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000035 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000036 register int i = j;
37
38 while (i > 0 && v->ob_digit[i-1] == 0)
39 --i;
40 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000041 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000042 return v;
43}
44
45/* Allocate a new long int object with size digits.
46 Return NULL and set exception if we run out of memory. */
47
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000049_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000050{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000052}
53
54/* Create a new long int object from a C long int */
55
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000057PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000058{
Tim Petersce9de2f2001-06-14 04:56:19 +000059 PyLongObject *v;
60 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
61 int ndigits = 0;
62 int negative = 0;
63
64 if (ival < 0) {
65 ival = -ival;
66 negative = 1;
67 }
68
69 /* Count the number of Python digits.
70 We used to pick 5 ("big enough for anything"), but that's a
71 waste of time and space given that 5*15 = 75 bits are rarely
72 needed. */
73 t = (unsigned long)ival;
74 while (t) {
75 ++ndigits;
76 t >>= SHIFT;
77 }
78 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000079 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +000080 digit *p = v->ob_digit;
81 v->ob_size = negative ? -ndigits : ndigits;
82 t = (unsigned long)ival;
83 while (t) {
84 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000085 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000087 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000089}
90
Guido van Rossum53756b11997-01-03 17:14:46 +000091/* Create a new long int object from a C unsigned long int */
92
Guido van Rossumc0b618a1997-05-02 03:12:38 +000093PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000094PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +000095{
Tim Petersce9de2f2001-06-14 04:56:19 +000096 PyLongObject *v;
97 unsigned long t;
98 int ndigits = 0;
99
100 /* Count the number of Python digits. */
101 t = (unsigned long)ival;
102 while (t) {
103 ++ndigits;
104 t >>= SHIFT;
105 }
106 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000107 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000108 digit *p = v->ob_digit;
109 v->ob_size = ndigits;
110 while (ival) {
111 *p++ = (digit)(ival & MASK);
112 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000113 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000114 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000116}
117
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000118/* Create a new long int object from a C double */
119
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000122{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000124 double frac;
125 int i, ndig, expo, neg;
126 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000127 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000128 PyErr_SetString(PyExc_OverflowError,
129 "cannot convert float infinity to long");
130 return NULL;
131 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000132 if (dval < 0.0) {
133 neg = 1;
134 dval = -dval;
135 }
136 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
137 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000139 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000141 if (v == NULL)
142 return NULL;
143 frac = ldexp(frac, (expo-1) % SHIFT + 1);
144 for (i = ndig; --i >= 0; ) {
145 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000146 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000147 frac = frac - (double)bits;
148 frac = ldexp(frac, SHIFT);
149 }
150 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000151 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000153}
154
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000155/* Get a C long int from a long int object.
156 Returns -1 and sets an error condition if overflow occurs. */
157
158long
Tim Peters9f688bf2000-07-07 15:53:28 +0000159PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000160{
Guido van Rossumf7531811998-05-26 14:33:37 +0000161 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000163 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000164 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000165
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000166 if (vv == NULL || !PyLong_Check(vv)) {
167 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000168 return -1;
169 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000171 i = v->ob_size;
172 sign = 1;
173 x = 0;
174 if (i < 0) {
175 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000176 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000177 }
178 while (--i >= 0) {
179 prev = x;
180 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000181 if ((x >> SHIFT) != prev)
182 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000183 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000184 /* Haven't lost any bits, but if the sign bit is set we're in
185 * trouble *unless* this is the min negative number. So,
186 * trouble iff sign bit set && (positive || some bit set other
187 * than the sign bit).
188 */
189 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
190 goto overflow;
191 return (long)x * sign;
192
193 overflow:
194 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000195 "long int too large to convert");
Guido van Rossumf7531811998-05-26 14:33:37 +0000196 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000197}
198
Guido van Rossum53756b11997-01-03 17:14:46 +0000199/* Get a C long int from a long int object.
200 Returns -1 and sets an error condition if overflow occurs. */
201
202unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000203PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000204{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000206 unsigned long x, prev;
207 int i;
208
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 if (vv == NULL || !PyLong_Check(vv)) {
210 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000211 return (unsigned long) -1;
212 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000214 i = v->ob_size;
215 x = 0;
216 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000218 "can't convert negative value to unsigned long");
219 return (unsigned long) -1;
220 }
221 while (--i >= 0) {
222 prev = x;
223 x = (x << SHIFT) + v->ob_digit[i];
224 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000226 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000227 return (unsigned long) -1;
228 }
229 }
230 return x;
231}
232
Tim Peters2a9b3672001-06-11 21:23:58 +0000233PyObject *
234_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
235 int little_endian, int is_signed)
236{
237 const unsigned char* pstartbyte;/* LSB of bytes */
238 int incr; /* direction to move pstartbyte */
239 const unsigned char* pendbyte; /* MSB of bytes */
240 size_t numsignificantbytes; /* number of bytes that matter */
241 size_t ndigits; /* number of Python long digits */
242 PyLongObject* v; /* result */
243 int idigit = 0; /* next free index in v->ob_digit */
244
245 if (n == 0)
246 return PyLong_FromLong(0L);
247
248 if (little_endian) {
249 pstartbyte = bytes;
250 pendbyte = bytes + n - 1;
251 incr = 1;
252 }
253 else {
254 pstartbyte = bytes + n - 1;
255 pendbyte = bytes;
256 incr = -1;
257 }
258
259 if (is_signed)
260 is_signed = *pendbyte >= 0x80;
261
262 /* Compute numsignificantbytes. This consists of finding the most
263 significant byte. Leading 0 bytes are insignficant if the number
264 is positive, and leading 0xff bytes if negative. */
265 {
266 size_t i;
267 const unsigned char* p = pendbyte;
268 const int pincr = -incr; /* search MSB to LSB */
269 const unsigned char insignficant = is_signed ? 0xff : 0x00;
270
271 for (i = 0; i < n; ++i, p += pincr) {
272 if (*p != insignficant)
273 break;
274 }
275 numsignificantbytes = n - i;
276 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
277 actually has 2 significant bytes. OTOH, 0xff0001 ==
278 -0x00ffff, so we wouldn't *need* to bump it there; but we
279 do for 0xffff = -0x0001. To be safe without bothering to
280 check every case, bump it regardless. */
281 if (is_signed && numsignificantbytes < n)
282 ++numsignificantbytes;
283 }
284
285 /* How many Python long digits do we need? We have
286 8*numsignificantbytes bits, and each Python long digit has SHIFT
287 bits, so it's the ceiling of the quotient. */
288 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
289 if (ndigits > (size_t)INT_MAX)
290 return PyErr_NoMemory();
291 v = _PyLong_New((int)ndigits);
292 if (v == NULL)
293 return NULL;
294
295 /* Copy the bits over. The tricky parts are computing 2's-comp on
296 the fly for signed numbers, and dealing with the mismatch between
297 8-bit bytes and (probably) 15-bit Python digits.*/
298 {
299 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000300 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000301 twodigits accum = 0; /* sliding register */
302 unsigned int accumbits = 0; /* number of bits in accum */
303 const unsigned char* p = pstartbyte;
304
305 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000306 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000307 /* Compute correction for 2's comp, if needed. */
308 if (is_signed) {
309 thisbyte = (0xff ^ thisbyte) + carry;
310 carry = thisbyte >> 8;
311 thisbyte &= 0xff;
312 }
313 /* Because we're going LSB to MSB, thisbyte is
314 more significant than what's already in accum,
315 so needs to be prepended to accum. */
316 accum |= thisbyte << accumbits;
317 accumbits += 8;
318 if (accumbits >= SHIFT) {
319 /* There's enough to fill a Python digit. */
320 assert(idigit < (int)ndigits);
321 v->ob_digit[idigit] = (digit)(accum & MASK);
322 ++idigit;
323 accum >>= SHIFT;
324 accumbits -= SHIFT;
325 assert(accumbits < SHIFT);
326 }
327 }
328 assert(accumbits < SHIFT);
329 if (accumbits) {
330 assert(idigit < (int)ndigits);
331 v->ob_digit[idigit] = (digit)accum;
332 ++idigit;
333 }
334 }
335
336 v->ob_size = is_signed ? -idigit : idigit;
337 return (PyObject *)long_normalize(v);
338}
339
340int
341_PyLong_AsByteArray(PyLongObject* v,
342 unsigned char* bytes, size_t n,
343 int little_endian, int is_signed)
344{
345 int i; /* index into v->ob_digit */
346 int ndigits; /* |v->ob_size| */
347 twodigits accum; /* sliding register */
348 unsigned int accumbits; /* # bits in accum */
349 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
350 twodigits carry; /* for computing 2's-comp */
351 size_t j; /* # bytes filled */
352 unsigned char* p; /* pointer to next byte in bytes */
353 int pincr; /* direction to move p */
354
355 assert(v != NULL && PyLong_Check(v));
356
357 if (v->ob_size < 0) {
358 ndigits = -(v->ob_size);
359 if (!is_signed) {
360 PyErr_SetString(PyExc_TypeError,
361 "can't convert negative long to unsigned");
362 return -1;
363 }
364 do_twos_comp = 1;
365 }
366 else {
367 ndigits = v->ob_size;
368 do_twos_comp = 0;
369 }
370
371 if (little_endian) {
372 p = bytes;
373 pincr = 1;
374 }
375 else {
376 p = bytes + n - 1;
377 pincr = -1;
378 }
379
Tim Peters898cf852001-06-13 20:50:08 +0000380 /* Copy over all the Python digits.
381 It's crucial that every Python digit except for the MSD contribute
382 exactly SHIFT bits to the total, so first assert that the long is
383 normalized. */
384 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000385 j = 0;
386 accum = 0;
387 accumbits = 0;
388 carry = do_twos_comp ? 1 : 0;
389 for (i = 0; i < ndigits; ++i) {
390 twodigits thisdigit = v->ob_digit[i];
391 if (do_twos_comp) {
392 thisdigit = (thisdigit ^ MASK) + carry;
393 carry = thisdigit >> SHIFT;
394 thisdigit &= MASK;
395 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000396 /* Because we're going LSB to MSB, thisdigit is more
397 significant than what's already in accum, so needs to be
398 prepended to accum. */
399 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000400 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000401
Tim Petersede05092001-06-14 08:53:38 +0000402 /* The most-significant digit may be (probably is) at least
403 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000404 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000405 /* Count # of sign bits -- they needn't be stored,
406 * although for signed conversion we need later to
407 * make sure at least one sign bit gets stored.
408 * First shift conceptual sign bit to real sign bit.
409 */
410 stwodigits s = (stwodigits)(thisdigit <<
411 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000412 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000413 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000414 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000415 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000416 }
Tim Petersede05092001-06-14 08:53:38 +0000417 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000418 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000419
Tim Peters2a9b3672001-06-11 21:23:58 +0000420 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000421 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000422 if (j >= n)
423 goto Overflow;
424 ++j;
425 *p = (unsigned char)(accum & 0xff);
426 p += pincr;
427 accumbits -= 8;
428 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000429 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000430 }
431
432 /* Store the straggler (if any). */
433 assert(accumbits < 8);
434 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000435 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000436 if (j >= n)
437 goto Overflow;
438 ++j;
439 if (do_twos_comp) {
440 /* Fill leading bits of the byte with sign bits
441 (appropriately pretending that the long had an
442 infinite supply of sign bits). */
443 accum |= (~(twodigits)0) << accumbits;
444 }
445 *p = (unsigned char)(accum & 0xff);
446 p += pincr;
447 }
Tim Peters05607ad2001-06-13 21:01:27 +0000448 else if (j == n && n > 0 && is_signed) {
449 /* The main loop filled the byte array exactly, so the code
450 just above didn't get to ensure there's a sign bit, and the
451 loop below wouldn't add one either. Make sure a sign bit
452 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000453 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000454 int sign_bit_set = msb >= 0x80;
455 assert(accumbits == 0);
456 if (sign_bit_set == do_twos_comp)
457 return 0;
458 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000459 goto Overflow;
460 }
Tim Peters05607ad2001-06-13 21:01:27 +0000461
462 /* Fill remaining bytes with copies of the sign bit. */
463 {
464 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
465 for ( ; j < n; ++j, p += pincr)
466 *p = signbyte;
467 }
468
Tim Peters2a9b3672001-06-11 21:23:58 +0000469 return 0;
470
471Overflow:
472 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
473 return -1;
474
475}
476
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000477/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000478
479double
Tim Peters9f688bf2000-07-07 15:53:28 +0000480PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000481{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000483 double x;
484 double multiplier = (double) (1L << SHIFT);
485 int i, sign;
486
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 if (vv == NULL || !PyLong_Check(vv)) {
488 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000489 return -1;
490 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000492 i = v->ob_size;
493 sign = 1;
494 x = 0.0;
495 if (i < 0) {
496 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000497 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000498 }
499 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000500 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000501 }
502 return x * sign;
503}
504
Guido van Rossum78694d91998-09-18 14:14:13 +0000505/* Create a new long (or int) object from a C pointer */
506
507PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000508PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000509{
Tim Peters70128a12001-06-16 08:48:40 +0000510#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000511 return PyInt_FromLong((long)p);
512#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000513
Tim Peters70128a12001-06-16 08:48:40 +0000514#ifndef HAVE_LONG_LONG
515# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
516#endif
517#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
518# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
519#endif
520 /* optimize null pointers */
521 if (p == NULL)
522 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000523 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000524
525#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000526}
527
528/* Get a C pointer from a long object (or an int object in some cases) */
529
530void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000531PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000532{
533 /* This function will allow int or long objects. If vv is neither,
534 then the PyLong_AsLong*() functions will raise the exception:
535 PyExc_SystemError, "bad argument to internal function"
536 */
Tim Peters70128a12001-06-16 08:48:40 +0000537#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000538 long x;
539
Tim Peters70128a12001-06-16 08:48:40 +0000540 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000541 x = PyInt_AS_LONG(vv);
542 else
543 x = PyLong_AsLong(vv);
544#else
Tim Peters70128a12001-06-16 08:48:40 +0000545
546#ifndef HAVE_LONG_LONG
547# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
548#endif
549#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
550# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
551#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000552 LONG_LONG x;
553
Tim Peters70128a12001-06-16 08:48:40 +0000554 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000555 x = PyInt_AS_LONG(vv);
556 else
557 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000558
559#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000560
561 if (x == -1 && PyErr_Occurred())
562 return NULL;
563 return (void *)x;
564}
565
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000566#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000567
568/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
569 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000570 */
571
Tim Peterscf37dfc2001-06-14 18:42:50 +0000572#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000573
574/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000575
576PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000577PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000578{
Tim Petersd1a7da62001-06-13 00:35:57 +0000579 LONG_LONG bytes = ival;
580 int one = 1;
581 return _PyLong_FromByteArray(
582 (unsigned char *)&bytes,
583 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000584}
585
Tim Petersd1a7da62001-06-13 00:35:57 +0000586/* Create a new long int object from a C unsigned LONG_LONG int. */
587
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000588PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000589PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000590{
Tim Petersd1a7da62001-06-13 00:35:57 +0000591 unsigned LONG_LONG bytes = ival;
592 int one = 1;
593 return _PyLong_FromByteArray(
594 (unsigned char *)&bytes,
595 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000596}
597
Guido van Rossum3293b071998-08-25 16:07:15 +0000598/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000599 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000600
Guido van Rossum3293b071998-08-25 16:07:15 +0000601LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000602PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000603{
Tim Petersd1a7da62001-06-13 00:35:57 +0000604 LONG_LONG bytes;
605 int one = 1;
606 int res;
607
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000608 if (vv == NULL || !PyLong_Check(vv)) {
609 PyErr_BadInternalCall();
610 return -1;
611 }
612
Tim Petersd1a7da62001-06-13 00:35:57 +0000613 res = _PyLong_AsByteArray(
614 (PyLongObject *)vv, (unsigned char *)&bytes,
615 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000616
Tim Peters9cb0c382001-06-13 20:45:17 +0000617 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000618}
619
Tim Petersd1a7da62001-06-13 00:35:57 +0000620/* Get a C unsigned LONG_LONG int from a long int object.
621 Return -1 and set an error if overflow occurs. */
622
Guido van Rossum3293b071998-08-25 16:07:15 +0000623unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000624PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000625{
Tim Petersd1a7da62001-06-13 00:35:57 +0000626 unsigned LONG_LONG bytes;
627 int one = 1;
628 int res;
629
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000630 if (vv == NULL || !PyLong_Check(vv)) {
631 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000632 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000633 }
634
Tim Petersd1a7da62001-06-13 00:35:57 +0000635 res = _PyLong_AsByteArray(
636 (PyLongObject *)vv, (unsigned char *)&bytes,
637 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000638
Tim Peters9cb0c382001-06-13 20:45:17 +0000639 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000640}
Tim Petersd1a7da62001-06-13 00:35:57 +0000641
642#undef IS_LITTLE_ENDIAN
643
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000644#endif /* HAVE_LONG_LONG */
645
Neil Schemenauerba872e22001-01-04 01:46:03 +0000646
647static int
648convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
649 if (PyLong_Check(v)) {
650 *a = (PyLongObject *) v;
651 Py_INCREF(v);
652 }
653 else if (PyInt_Check(v)) {
654 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
655 }
656 else {
657 return 0;
658 }
659 if (PyLong_Check(w)) {
660 *b = (PyLongObject *) w;
661 Py_INCREF(w);
662 }
663 else if (PyInt_Check(w)) {
664 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
665 }
666 else {
667 Py_DECREF(*a);
668 return 0;
669 }
670 return 1;
671}
672
673#define CONVERT_BINOP(v, w, a, b) \
674 if (!convert_binop(v, w, a, b)) { \
675 Py_INCREF(Py_NotImplemented); \
676 return Py_NotImplemented; \
677 }
678
679
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000680/* Multiply by a single digit, ignoring the sign. */
681
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000683mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000684{
685 return muladd1(a, n, (digit)0);
686}
687
688/* Multiply by a single digit and add a single digit, ignoring the sign. */
689
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000691muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000692{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000693 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000695 twodigits carry = extra;
696 int i;
697
698 if (z == NULL)
699 return NULL;
700 for (i = 0; i < size_a; ++i) {
701 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000702 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000703 carry >>= SHIFT;
704 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000705 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000706 return long_normalize(z);
707}
708
Tim Peters212e6142001-07-14 12:23:19 +0000709/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
710 in pout, and returning the remainder. pin and pout point at the LSD.
711 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
712 long_format, but that should be done with great care since longs are
713 immutable. */
714
715static digit
716inplace_divrem1(digit *pout, digit *pin, int size, digit n)
717{
718 twodigits rem = 0;
719
720 assert(n > 0 && n <= MASK);
721 pin += size;
722 pout += size;
723 while (--size >= 0) {
724 digit hi;
725 rem = (rem << SHIFT) + *--pin;
726 *--pout = hi = (digit)(rem / n);
727 rem -= hi * n;
728 }
729 return (digit)rem;
730}
731
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000732/* Divide a long integer by a digit, returning both the quotient
733 (as function result) and the remainder (through *prem).
734 The sign of a is ignored; n should not be zero. */
735
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000737divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000738{
Tim Peters212e6142001-07-14 12:23:19 +0000739 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000741
742 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000743 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000744 if (z == NULL)
745 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000746 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000747 return long_normalize(z);
748}
749
750/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000751 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000752 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000753
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000755long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000756{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757 register PyLongObject *a = (PyLongObject *)aa;
758 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000759 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000760 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000761 char *p;
762 int bits;
763 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000764
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 if (a == NULL || !PyLong_Check(a)) {
766 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000767 return NULL;
768 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000769 assert(base >= 2 && base <= 36);
770
771 /* Compute a rough upper bound for the length of the string */
772 i = base;
773 bits = 0;
774 while (i > 1) {
775 ++bits;
776 i >>= 1;
777 }
Fred Drake121ee271999-12-23 15:41:28 +0000778 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000780 if (str == NULL)
781 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000783 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000784 if (addL)
785 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000786 if (a->ob_size < 0)
787 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000788
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000789 if (a->ob_size == 0) {
790 *--p = '0';
791 }
792 else if ((base & (base - 1)) == 0) {
793 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000794 twodigits accum = 0;
795 int accumbits = 0; /* # of bits in accum */
796 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000797 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000798 while ((i >>= 1) > 1)
799 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000800
801 for (i = 0; i < size_a; ++i) {
802 accum |= a->ob_digit[i] << accumbits;
803 accumbits += SHIFT;
804 assert(accumbits >= basebits);
805 do {
806 char digit = (char)(accum & (base - 1));
807 digit += (digit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000808 assert(p > PyString_AS_STRING(str));
Tim Peters586b2e32001-07-15 09:11:14 +0000809 *--p = digit;
810 accumbits -= basebits;
811 accum >>= basebits;
812 } while (i < size_a-1 ? accumbits >= basebits :
813 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000814 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000815 }
816 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000817 /* Not 0, and base not a power of 2. Divide repeatedly by
818 base, but for speed use the highest power of base that
819 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000820 int size = size_a;
821 digit *pin = a->ob_digit;
822 PyLongObject *scratch;
823 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000824 digit powbase = base; /* powbase == base ** power */
825 int power = 1;
826 for (;;) {
827 unsigned long newpow = powbase * (unsigned long)base;
828 if (newpow >> SHIFT) /* doesn't fit in a digit */
829 break;
830 powbase = (digit)newpow;
831 ++power;
832 }
Tim Peters212e6142001-07-14 12:23:19 +0000833
834 /* Get a scratch area for repeated division. */
835 scratch = _PyLong_New(size);
836 if (scratch == NULL) {
837 Py_DECREF(str);
838 return NULL;
839 }
840
841 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000842 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000843 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000844 digit rem = inplace_divrem1(scratch->ob_digit,
845 pin, size, powbase);
846 pin = scratch->ob_digit; /* no need to use a again */
847 if (pin[size - 1] == 0)
848 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000849 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +0000850 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000851 Py_DECREF(str);
852 return NULL;
853 })
Tim Peters212e6142001-07-14 12:23:19 +0000854
855 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000856 assert(ntostore > 0);
857 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000858 digit nextrem = (digit)(rem / base);
859 char c = (char)(rem - nextrem * base);
860 assert(p > PyString_AS_STRING(str));
861 c += (c < 10) ? '0' : 'A'-10;
862 *--p = c;
863 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000864 --ntostore;
865 /* Termination is a bit delicate: must not
866 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +0000867 remaining quotient and rem are both 0. */
868 } while (ntostore && (size || rem));
869 } while (size != 0);
870 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000871 }
872
Guido van Rossum2c475421992-08-14 15:13:07 +0000873 if (base == 8) {
874 if (size_a != 0)
875 *--p = '0';
876 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000877 else if (base == 16) {
878 *--p = 'x';
879 *--p = '0';
880 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000881 else if (base != 10) {
882 *--p = '#';
883 *--p = '0' + base%10;
884 if (base > 10)
885 *--p = '0' + base/10;
886 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000887 if (sign)
888 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 if (p != PyString_AS_STRING(str)) {
890 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000891 assert(p > q);
892 do {
893 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000894 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 _PyString_Resize((PyObject **)&str,
896 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000897 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000898 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000899}
900
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000901PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000902PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000903{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000904 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000905 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000906 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000907
Guido van Rossum472c04f1996-12-05 21:57:21 +0000908 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000910 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000911 return NULL;
912 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000913 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000914 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000915 if (*str == '+')
916 ++str;
917 else if (*str == '-') {
918 ++str;
919 sign = -1;
920 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000921 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000922 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000923 if (base == 0) {
924 if (str[0] != '0')
925 base = 10;
926 else if (str[1] == 'x' || str[1] == 'X')
927 base = 16;
928 else
929 base = 8;
930 }
931 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
932 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000934 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000935 for ( ; z != NULL; ++str) {
936 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000938
939 if (*str <= '9')
940 k = *str - '0';
941 else if (*str >= 'a')
942 k = *str - 'a' + 10;
943 else if (*str >= 'A')
944 k = *str - 'A' + 10;
945 if (k < 0 || k >= base)
946 break;
947 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000949 z = temp;
950 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000951 if (z == NULL)
952 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000953 if (str == start)
954 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000955 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000956 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000957 if (*str == 'L' || *str == 'l')
958 str++;
959 while (*str && isspace(Py_CHARMASK(*str)))
960 str++;
961 if (*str != '\0')
962 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000963 if (pend)
964 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000966
967 onError:
968 PyErr_Format(PyExc_ValueError,
969 "invalid literal for long(): %.200s", orig_str);
970 Py_XDECREF(z);
971 return NULL;
972}
973
974PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000975PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000976{
977 char buffer[256];
978
979 if (length >= sizeof(buffer)) {
980 PyErr_SetString(PyExc_ValueError,
981 "long() literal too large to convert");
982 return NULL;
983 }
984 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
985 return NULL;
986
987 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000988}
989
Tim Peters9f688bf2000-07-07 15:53:28 +0000990/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +0000992 (PyLongObject *, PyLongObject *, PyLongObject **);
993static PyObject *long_pos(PyLongObject *);
994static int long_divrem(PyLongObject *, PyLongObject *,
995 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000996
997/* Long division with remainder, top-level routine */
998
Guido van Rossume32e0141992-01-19 16:31:05 +0000999static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001000long_divrem(PyLongObject *a, PyLongObject *b,
1001 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001002{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001003 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001004 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001005
1006 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001007 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001008 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001009 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001010 }
1011 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001012 (size_a == size_b &&
1013 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001014 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001015 *pdiv = _PyLong_New(0);
1016 Py_INCREF(a);
1017 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001018 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001019 }
1020 if (size_b == 1) {
1021 digit rem = 0;
1022 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001023 if (z == NULL)
1024 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001026 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001027 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001028 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001029 if (z == NULL)
1030 return -1;
1031 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001032 /* Set the signs.
1033 The quotient z has the sign of a*b;
1034 the remainder r has the sign of a,
1035 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001036 if ((a->ob_size < 0) != (b->ob_size < 0))
1037 z->ob_size = -(z->ob_size);
1038 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1039 (*prem)->ob_size = -((*prem)->ob_size);
1040 *pdiv = z;
1041 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001042}
1043
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001044/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001045
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001047x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001048{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001049 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001050 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001051 PyLongObject *v = mul1(v1, d);
1052 PyLongObject *w = mul1(w1, d);
1053 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001054 int j, k;
1055
1056 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057 Py_XDECREF(v);
1058 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001059 return NULL;
1060 }
1061
1062 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001063 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001064 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001065
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001066 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001068
1069 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1070 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1071 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001072 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001073 int i;
1074
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001075 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001076 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001077 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001078 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001079 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001080 if (vj == w->ob_digit[size_w-1])
1081 q = MASK;
1082 else
1083 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1084 w->ob_digit[size_w-1];
1085
1086 while (w->ob_digit[size_w-2]*q >
1087 ((
1088 ((twodigits)vj << SHIFT)
1089 + v->ob_digit[j-1]
1090 - q*w->ob_digit[size_w-1]
1091 ) << SHIFT)
1092 + v->ob_digit[j-2])
1093 --q;
1094
1095 for (i = 0; i < size_w && i+k < size_v; ++i) {
1096 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001097 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001098 carry += v->ob_digit[i+k] - z
1099 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001100 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001101 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1102 carry, SHIFT);
1103 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001104 }
1105
1106 if (i+k < size_v) {
1107 carry += v->ob_digit[i+k];
1108 v->ob_digit[i+k] = 0;
1109 }
1110
1111 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001112 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001113 else {
1114 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001115 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001116 carry = 0;
1117 for (i = 0; i < size_w && i+k < size_v; ++i) {
1118 carry += v->ob_digit[i+k] + w->ob_digit[i];
1119 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001120 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1121 BASE_TWODIGITS_TYPE,
1122 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001123 }
1124 }
1125 } /* for j, k */
1126
Guido van Rossumc206c761995-01-10 15:23:19 +00001127 if (a == NULL)
1128 *prem = NULL;
1129 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001130 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001131 *prem = divrem1(v, d, &d);
1132 /* d receives the (unused) remainder */
1133 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001134 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001135 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001136 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001137 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001138 Py_DECREF(v);
1139 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001140 return a;
1141}
1142
1143/* Methods */
1144
1145static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001146long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001147{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001148 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001149}
1150
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001151static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001152long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001153{
Fred Drake121ee271999-12-23 15:41:28 +00001154 return long_format(v, 10, 1);
1155}
1156
1157static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001158long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001159{
1160 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001161}
1162
1163static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001164long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001165{
1166 int sign;
1167
Guido van Rossumc6913e71991-11-19 20:26:46 +00001168 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001169 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001170 sign = 0;
1171 else
1172 sign = a->ob_size - b->ob_size;
1173 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001174 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001175 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001176 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1177 ;
1178 if (i < 0)
1179 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001180 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001181 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001182 if (a->ob_size < 0)
1183 sign = -sign;
1184 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001185 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001186 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001187}
1188
Guido van Rossum9bfef441993-03-29 10:43:31 +00001189static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001190long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001191{
1192 long x;
1193 int i, sign;
1194
1195 /* This is designed so that Python ints and longs with the
1196 same value hash to the same value, otherwise comparisons
1197 of mapping keys will turn out weird */
1198 i = v->ob_size;
1199 sign = 1;
1200 x = 0;
1201 if (i < 0) {
1202 sign = -1;
1203 i = -(i);
1204 }
1205 while (--i >= 0) {
1206 /* Force a 32-bit circular shift */
1207 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1208 x += v->ob_digit[i];
1209 }
1210 x = x * sign;
1211 if (x == -1)
1212 x = -2;
1213 return x;
1214}
1215
1216
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001217/* Add the absolute values of two long integers. */
1218
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001220x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001221{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001222 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001223 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001224 int i;
1225 digit carry = 0;
1226
1227 /* Ensure a is the larger of the two: */
1228 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001229 { PyLongObject *temp = a; a = b; b = temp; }
1230 { int size_temp = size_a;
1231 size_a = size_b;
1232 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001233 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001234 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001235 if (z == NULL)
1236 return NULL;
1237 for (i = 0; i < size_b; ++i) {
1238 carry += a->ob_digit[i] + b->ob_digit[i];
1239 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001240 carry >>= SHIFT;
1241 }
1242 for (; i < size_a; ++i) {
1243 carry += a->ob_digit[i];
1244 z->ob_digit[i] = carry & MASK;
1245 carry >>= SHIFT;
1246 }
1247 z->ob_digit[i] = carry;
1248 return long_normalize(z);
1249}
1250
1251/* Subtract the absolute values of two integers. */
1252
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001254x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001255{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001256 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001258 int i;
1259 int sign = 1;
1260 digit borrow = 0;
1261
1262 /* Ensure a is the larger of the two: */
1263 if (size_a < size_b) {
1264 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001265 { PyLongObject *temp = a; a = b; b = temp; }
1266 { int size_temp = size_a;
1267 size_a = size_b;
1268 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001269 }
1270 else if (size_a == size_b) {
1271 /* Find highest digit where a and b differ: */
1272 i = size_a;
1273 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1274 ;
1275 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001276 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001277 if (a->ob_digit[i] < b->ob_digit[i]) {
1278 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001279 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001280 }
1281 size_a = size_b = i+1;
1282 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001284 if (z == NULL)
1285 return NULL;
1286 for (i = 0; i < size_b; ++i) {
1287 /* The following assumes unsigned arithmetic
1288 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001289 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001290 z->ob_digit[i] = borrow & MASK;
1291 borrow >>= SHIFT;
1292 borrow &= 1; /* Keep only one sign bit */
1293 }
1294 for (; i < size_a; ++i) {
1295 borrow = a->ob_digit[i] - borrow;
1296 z->ob_digit[i] = borrow & MASK;
1297 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001298 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001299 }
1300 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001301 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001302 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001303 return long_normalize(z);
1304}
1305
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001307long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001308{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001309 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001310
Neil Schemenauerba872e22001-01-04 01:46:03 +00001311 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1312
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001313 if (a->ob_size < 0) {
1314 if (b->ob_size < 0) {
1315 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001316 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001317 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001318 }
1319 else
1320 z = x_sub(b, a);
1321 }
1322 else {
1323 if (b->ob_size < 0)
1324 z = x_sub(a, b);
1325 else
1326 z = x_add(a, b);
1327 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001328 Py_DECREF(a);
1329 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001330 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001331}
1332
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001334long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001335{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001336 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001337
Neil Schemenauerba872e22001-01-04 01:46:03 +00001338 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1339
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001340 if (a->ob_size < 0) {
1341 if (b->ob_size < 0)
1342 z = x_sub(a, b);
1343 else
1344 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001345 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001346 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001347 }
1348 else {
1349 if (b->ob_size < 0)
1350 z = x_add(a, b);
1351 else
1352 z = x_sub(a, b);
1353 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001354 Py_DECREF(a);
1355 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001356 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001357}
1358
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001360long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001361{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001362 /* sequence * long */
1363 long n = PyLong_AsLong((PyObject *) w);
1364 if (n == -1 && PyErr_Occurred())
1365 return NULL;
1366 else
1367 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1368}
1369
1370static PyObject *
1371long_mul(PyLongObject *v, PyLongObject *w)
1372{
1373 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001374 int size_a;
1375 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001376 int i;
1377
Neil Schemenauerba872e22001-01-04 01:46:03 +00001378 if (v->ob_type->tp_as_sequence &&
1379 v->ob_type->tp_as_sequence->sq_repeat) {
1380 return long_repeat((PyObject *)v, w);
1381 }
1382 else if (w->ob_type->tp_as_sequence &&
1383 w->ob_type->tp_as_sequence->sq_repeat) {
1384 return long_repeat((PyObject *)w, v);
1385 }
1386
1387 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1388
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001389 size_a = ABS(a->ob_size);
1390 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001391 if (size_a > size_b) {
1392 /* we are faster with the small object on the left */
1393 int hold_sa = size_a;
1394 PyLongObject *hold_a = a;
1395 size_a = size_b;
1396 size_b = hold_sa;
1397 a = b;
1398 b = hold_a;
1399 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001401 if (z == NULL) {
1402 Py_DECREF(a);
1403 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001404 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001405 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001406 for (i = 0; i < z->ob_size; ++i)
1407 z->ob_digit[i] = 0;
1408 for (i = 0; i < size_a; ++i) {
1409 twodigits carry = 0;
1410 twodigits f = a->ob_digit[i];
1411 int j;
1412
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001413 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001414 Py_DECREF(a);
1415 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001416 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001417 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001418 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001419 for (j = 0; j < size_b; ++j) {
1420 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001421 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001422 carry >>= SHIFT;
1423 }
1424 for (; carry != 0; ++j) {
1425 assert(i+j < z->ob_size);
1426 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001427 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001428 carry >>= SHIFT;
1429 }
1430 }
1431 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001432 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001433 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001434 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001435 Py_DECREF(a);
1436 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001437 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001438}
1439
Guido van Rossume32e0141992-01-19 16:31:05 +00001440/* The / and % operators are now defined in terms of divmod().
1441 The expression a mod b has the value a - b*floor(a/b).
1442 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001443 |a| by |b|, with the sign of a. This is also expressed
1444 as a - b*trunc(a/b), if trunc truncates towards zero.
1445 Some examples:
1446 a b a rem b a mod b
1447 13 10 3 3
1448 -13 10 -3 7
1449 13 -10 3 -7
1450 -13 -10 -3 -3
1451 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001452 have different signs. We then subtract one from the 'div'
1453 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001454
Guido van Rossume32e0141992-01-19 16:31:05 +00001455static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001456l_divmod(PyLongObject *v, PyLongObject *w,
1457 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001458{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001459 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001460
1461 if (long_divrem(v, w, &div, &mod) < 0)
1462 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001463 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1464 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001465 PyLongObject *temp;
1466 PyLongObject *one;
1467 temp = (PyLongObject *) long_add(mod, w);
1468 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001469 mod = temp;
1470 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001471 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001472 return -1;
1473 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001474 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001475 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001476 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1477 Py_DECREF(mod);
1478 Py_DECREF(div);
1479 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001480 return -1;
1481 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001482 Py_DECREF(one);
1483 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001484 div = temp;
1485 }
1486 *pdiv = div;
1487 *pmod = mod;
1488 return 0;
1489}
1490
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001491static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001492long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001493{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001494 PyLongObject *a, *b, *div, *mod;
1495
1496 CONVERT_BINOP(v, w, &a, &b);
1497
1498 if (l_divmod(a, b, &div, &mod) < 0) {
1499 Py_DECREF(a);
1500 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001501 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001502 }
1503 Py_DECREF(a);
1504 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001505 Py_DECREF(mod);
1506 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001507}
1508
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001510long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001511{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001512 PyLongObject *a, *b, *div, *mod;
1513
1514 CONVERT_BINOP(v, w, &a, &b);
1515
1516 if (l_divmod(a, b, &div, &mod) < 0) {
1517 Py_DECREF(a);
1518 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001519 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001520 }
1521 Py_DECREF(a);
1522 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001523 Py_DECREF(div);
1524 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001525}
1526
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001527static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001528long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001529{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001530 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001531 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001532
1533 CONVERT_BINOP(v, w, &a, &b);
1534
1535 if (l_divmod(a, b, &div, &mod) < 0) {
1536 Py_DECREF(a);
1537 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001538 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001539 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001540 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001541 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001542 PyTuple_SetItem(z, 0, (PyObject *) div);
1543 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001544 }
1545 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001546 Py_DECREF(div);
1547 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001548 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001549 Py_DECREF(a);
1550 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001551 return z;
1552}
1553
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001554static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001555long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001556{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001557 PyLongObject *a, *b;
1558 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001559 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001560 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001561
1562 CONVERT_BINOP(v, w, &a, &b);
1563 if (PyLong_Check(x) || Py_None == x) {
1564 c = x;
1565 Py_INCREF(x);
1566 }
1567 else if (PyInt_Check(x)) {
1568 c = PyLong_FromLong(PyInt_AS_LONG(x));
1569 }
1570 else {
1571 Py_DECREF(a);
1572 Py_DECREF(b);
1573 Py_INCREF(Py_NotImplemented);
1574 return Py_NotImplemented;
1575 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001576
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001577 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001578 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001579 /* Return a float. This works because we know that
1580 this calls float_pow() which converts its
1581 arguments to double. */
1582 Py_DECREF(a);
1583 Py_DECREF(b);
1584 Py_DECREF(c);
1585 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001586 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001587 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001588 for (i = 0; i < size_b; ++i) {
1589 digit bi = b->ob_digit[i];
1590 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001591
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001592 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001593 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001594
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001595 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001596 temp = (PyLongObject *)long_mul(z, a);
1597 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001598 if (c!=Py_None && temp!=NULL) {
1599 if (l_divmod(temp,(PyLongObject *)c,
1600 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001601 Py_DECREF(temp);
1602 z = NULL;
1603 goto error;
1604 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001605 Py_XDECREF(div);
1606 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001607 temp = mod;
1608 }
1609 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001610 if (z == NULL)
1611 break;
1612 }
1613 bi >>= 1;
1614 if (bi == 0 && i+1 == size_b)
1615 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001616 temp = (PyLongObject *)long_mul(a, a);
1617 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001618 if (c!=Py_None && temp!=NULL) {
1619 if (l_divmod(temp, (PyLongObject *)c, &div,
1620 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001621 Py_DECREF(temp);
1622 z = NULL;
1623 goto error;
1624 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001625 Py_XDECREF(div);
1626 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001627 temp = mod;
1628 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001629 a = temp;
1630 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001631 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001632 z = NULL;
1633 break;
1634 }
1635 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001636 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001637 break;
1638 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001639 if (c!=Py_None && z!=NULL) {
1640 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001641 Py_DECREF(z);
1642 z = NULL;
1643 }
1644 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001645 Py_XDECREF(div);
1646 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001647 z = mod;
1648 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001649 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001650 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001651 Py_XDECREF(a);
1652 Py_DECREF(b);
1653 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001654 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001655}
1656
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001657static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001658long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001659{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001660 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001661 PyLongObject *x;
1662 PyLongObject *w;
1663 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001664 if (w == NULL)
1665 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001666 x = (PyLongObject *) long_add(v, w);
1667 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001668 if (x == NULL)
1669 return NULL;
1670 if (x->ob_size != 0)
1671 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001672 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001673}
1674
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001675static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001676long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001677{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001678 Py_INCREF(v);
1679 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001680}
1681
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001682static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001683long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001684{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001685 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001686 int i, n;
1687 n = ABS(v->ob_size);
1688 if (n == 0) {
1689 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001690 Py_INCREF(v);
1691 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001692 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001693 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001694 if (z == NULL)
1695 return NULL;
1696 for (i = 0; i < n; i++)
1697 z->ob_digit[i] = v->ob_digit[i];
1698 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001699 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001700}
1701
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001702static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001703long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001704{
1705 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001706 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001707 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001708 Py_INCREF(v);
1709 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001710 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001711}
1712
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001713static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001714long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001715{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001716 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001717}
1718
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001719static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001720long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001721{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001722 PyLongObject *a, *b;
1723 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001724 long shiftby;
1725 int newsize, wordshift, loshift, hishift, i, j;
1726 digit lomask, himask;
1727
Neil Schemenauerba872e22001-01-04 01:46:03 +00001728 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1729
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001730 if (a->ob_size < 0) {
1731 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001732 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001733 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001734 if (a1 == NULL)
1735 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001736 a2 = (PyLongObject *) long_rshift(a1, b);
1737 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001738 if (a2 == NULL)
1739 goto rshift_error;
1740 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001741 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001742 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001743 else {
1744
1745 shiftby = PyLong_AsLong((PyObject *)b);
1746 if (shiftby == -1L && PyErr_Occurred())
1747 goto rshift_error;
1748 if (shiftby < 0) {
1749 PyErr_SetString(PyExc_ValueError,
1750 "negative shift count");
1751 goto rshift_error;
1752 }
1753 wordshift = shiftby / SHIFT;
1754 newsize = ABS(a->ob_size) - wordshift;
1755 if (newsize <= 0) {
1756 z = _PyLong_New(0);
1757 Py_DECREF(a);
1758 Py_DECREF(b);
1759 return (PyObject *)z;
1760 }
1761 loshift = shiftby % SHIFT;
1762 hishift = SHIFT - loshift;
1763 lomask = ((digit)1 << hishift) - 1;
1764 himask = MASK ^ lomask;
1765 z = _PyLong_New(newsize);
1766 if (z == NULL)
1767 goto rshift_error;
1768 if (a->ob_size < 0)
1769 z->ob_size = -(z->ob_size);
1770 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1771 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1772 if (i+1 < newsize)
1773 z->ob_digit[i] |=
1774 (a->ob_digit[j+1] << hishift) & himask;
1775 }
1776 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001777 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001778rshift_error:
1779 Py_DECREF(a);
1780 Py_DECREF(b);
1781 return (PyObject *) z;
1782
Guido van Rossumc6913e71991-11-19 20:26:46 +00001783}
1784
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001785static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001786long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001787{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001788 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001789 PyLongObject *a, *b;
1790 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001791 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001792 int oldsize, newsize, wordshift, remshift, i, j;
1793 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001794
Neil Schemenauerba872e22001-01-04 01:46:03 +00001795 CONVERT_BINOP(v, w, &a, &b);
1796
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001797 shiftby = PyLong_AsLong((PyObject *)b);
1798 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001799 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001800 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001801 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001802 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001803 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001804 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001805 PyErr_SetString(PyExc_ValueError,
1806 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001807 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001808 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001809 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1810 wordshift = (int)shiftby / SHIFT;
1811 remshift = (int)shiftby - wordshift * SHIFT;
1812
1813 oldsize = ABS(a->ob_size);
1814 newsize = oldsize + wordshift;
1815 if (remshift)
1816 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001817 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001818 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001819 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001820 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001821 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001822 for (i = 0; i < wordshift; i++)
1823 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001824 accum = 0;
1825 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1826 accum |= a->ob_digit[j] << remshift;
1827 z->ob_digit[i] = (digit)(accum & MASK);
1828 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001829 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001830 if (remshift)
1831 z->ob_digit[newsize-1] = (digit)accum;
1832 else
1833 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001834 z = long_normalize(z);
1835lshift_error:
1836 Py_DECREF(a);
1837 Py_DECREF(b);
1838 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001839}
1840
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001841
1842/* Bitwise and/xor/or operations */
1843
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001844#define MAX(x, y) ((x) < (y) ? (y) : (x))
1845#define MIN(x, y) ((x) > (y) ? (y) : (x))
1846
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001847static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001848long_bitwise(PyLongObject *a,
1849 int op, /* '&', '|', '^' */
1850 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001851{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001852 digit maska, maskb; /* 0 or MASK */
1853 int negz;
1854 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001855 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001856 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001857 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001858 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001859
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001860 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001861 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001862 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001863 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001864 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001865 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001866 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001867 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001868 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001869 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001870 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001871 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001872 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001873 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001874 maskb = 0;
1875 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001876
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001877 negz = 0;
1878 switch (op) {
1879 case '^':
1880 if (maska != maskb) {
1881 maska ^= MASK;
1882 negz = -1;
1883 }
1884 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001885 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001886 if (maska && maskb) {
1887 op = '|';
1888 maska ^= MASK;
1889 maskb ^= MASK;
1890 negz = -1;
1891 }
1892 break;
1893 case '|':
1894 if (maska || maskb) {
1895 op = '&';
1896 maska ^= MASK;
1897 maskb ^= MASK;
1898 negz = -1;
1899 }
1900 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001901 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001902
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001903 /* JRH: The original logic here was to allocate the result value (z)
1904 as the longer of the two operands. However, there are some cases
1905 where the result is guaranteed to be shorter than that: AND of two
1906 positives, OR of two negatives: use the shorter number. AND with
1907 mixed signs: use the positive number. OR with mixed signs: use the
1908 negative number. After the transformations above, op will be '&'
1909 iff one of these cases applies, and mask will be non-0 for operands
1910 whose length should be ignored.
1911 */
1912
1913 size_a = a->ob_size;
1914 size_b = b->ob_size;
1915 size_z = op == '&'
1916 ? (maska
1917 ? size_b
1918 : (maskb ? size_a : MIN(size_a, size_b)))
1919 : MAX(size_a, size_b);
1920 z = _PyLong_New(size_z);
1921 if (a == NULL || b == NULL || z == NULL) {
1922 Py_XDECREF(a);
1923 Py_XDECREF(b);
1924 Py_XDECREF(z);
1925 return NULL;
1926 }
1927
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001928 for (i = 0; i < size_z; ++i) {
1929 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1930 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1931 switch (op) {
1932 case '&': z->ob_digit[i] = diga & digb; break;
1933 case '|': z->ob_digit[i] = diga | digb; break;
1934 case '^': z->ob_digit[i] = diga ^ digb; break;
1935 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001936 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001937
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001938 Py_DECREF(a);
1939 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001940 z = long_normalize(z);
1941 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001942 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001943 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001944 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001945 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001946}
1947
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001948static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001949long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001950{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001951 PyLongObject *a, *b;
1952 PyObject *c;
1953 CONVERT_BINOP(v, w, &a, &b);
1954 c = long_bitwise(a, '&', b);
1955 Py_DECREF(a);
1956 Py_DECREF(b);
1957 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001958}
1959
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001960static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001961long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001962{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001963 PyLongObject *a, *b;
1964 PyObject *c;
1965 CONVERT_BINOP(v, w, &a, &b);
1966 c = long_bitwise(a, '^', b);
1967 Py_DECREF(a);
1968 Py_DECREF(b);
1969 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001970}
1971
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001972static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001973long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001974{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001975 PyLongObject *a, *b;
1976 PyObject *c;
1977 CONVERT_BINOP(v, w, &a, &b);
1978 c = long_bitwise(a, '|', b);
1979 Py_DECREF(a);
1980 Py_DECREF(b);
1981 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001982}
1983
Guido van Rossum4668b002001-08-08 05:00:18 +00001984static PyObject *
1985long_true_divide(PyObject *v, PyObject *w)
1986{
1987 return PyFloat_Type.tp_as_number->nb_divide(v, w);
1988}
1989
Guido van Rossum234f9421993-06-17 12:35:49 +00001990static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001991long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001992{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001993 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001994 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001995 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001996 return 0;
1997 }
1998 return 1; /* Can't do it */
1999}
2000
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002001static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002002long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002003{
2004 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002005 x = PyLong_AsLong(v);
2006 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002007 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002008 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002009}
2010
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002011static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002012long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002013{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002014 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002015 return v;
2016}
2017
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002018static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002019long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002020{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002021 double result;
2022 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002023 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00002024 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002025 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002026}
2027
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002028static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002029long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002030{
Fred Drake121ee271999-12-23 15:41:28 +00002031 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002032}
2033
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002034static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002035long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002036{
Fred Drake121ee271999-12-23 15:41:28 +00002037 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002038}
2039
Tim Peters6d6c1a32001-08-02 04:15:00 +00002040static PyObject *
2041long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2042{
2043 PyObject *x = NULL;
2044 int base = -909; /* unlikely! */
2045 static char *kwlist[] = {"x", "base", 0};
2046
2047 assert(type == &PyLong_Type);
2048 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2049 &x, &base))
2050 return NULL;
2051 if (x == NULL)
2052 return PyLong_FromLong(0L);
2053 if (base == -909)
2054 return PyNumber_Long(x);
2055 else if (PyString_Check(x))
2056 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
2057 else if (PyUnicode_Check(x))
2058 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2059 PyUnicode_GET_SIZE(x),
2060 base);
2061 else {
2062 PyErr_SetString(PyExc_TypeError,
2063 "long() can't convert non-string with explicit base");
2064 return NULL;
2065 }
2066}
2067
2068static char long_doc[] =
2069"long(x[, base]) -> integer\n\
2070\n\
2071Convert a string or number to a long integer, if possible. A floating\n\
2072point argument will be truncated towards zero (this does not include a\n\
2073string representation of a floating point number!) When converting a\n\
2074string, use the optional base. It is an error to supply a base when\n\
2075converting a non-string.";
2076
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002077static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002078 (binaryfunc) long_add, /*nb_add*/
2079 (binaryfunc) long_sub, /*nb_subtract*/
2080 (binaryfunc) long_mul, /*nb_multiply*/
2081 (binaryfunc) long_div, /*nb_divide*/
2082 (binaryfunc) long_mod, /*nb_remainder*/
2083 (binaryfunc) long_divmod, /*nb_divmod*/
2084 (ternaryfunc) long_pow, /*nb_power*/
2085 (unaryfunc) long_neg, /*nb_negative*/
2086 (unaryfunc) long_pos, /*tp_positive*/
2087 (unaryfunc) long_abs, /*tp_absolute*/
2088 (inquiry) long_nonzero, /*tp_nonzero*/
2089 (unaryfunc) long_invert, /*nb_invert*/
2090 (binaryfunc) long_lshift, /*nb_lshift*/
2091 (binaryfunc) long_rshift, /*nb_rshift*/
2092 (binaryfunc) long_and, /*nb_and*/
2093 (binaryfunc) long_xor, /*nb_xor*/
2094 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002095 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002096 (unaryfunc) long_int, /*nb_int*/
2097 (unaryfunc) long_long, /*nb_long*/
2098 (unaryfunc) long_float, /*nb_float*/
2099 (unaryfunc) long_oct, /*nb_oct*/
2100 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002101 0, /* nb_inplace_add */
2102 0, /* nb_inplace_subtract */
2103 0, /* nb_inplace_multiply */
2104 0, /* nb_inplace_divide */
2105 0, /* nb_inplace_remainder */
2106 0, /* nb_inplace_power */
2107 0, /* nb_inplace_lshift */
2108 0, /* nb_inplace_rshift */
2109 0, /* nb_inplace_and */
2110 0, /* nb_inplace_xor */
2111 0, /* nb_inplace_or */
2112 (binaryfunc)long_div, /* nb_floor_divide */
2113 long_true_divide, /* nb_true_divide */
2114 0, /* nb_inplace_floor_divide */
2115 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002116};
2117
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002118PyTypeObject PyLong_Type = {
2119 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002120 0, /* ob_size */
2121 "long", /* tp_name */
2122 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2123 sizeof(digit), /* tp_itemsize */
2124 (destructor)long_dealloc, /* tp_dealloc */
2125 0, /* tp_print */
2126 0, /* tp_getattr */
2127 0, /* tp_setattr */
2128 (cmpfunc)long_compare, /* tp_compare */
2129 (reprfunc)long_repr, /* tp_repr */
2130 &long_as_number, /* tp_as_number */
2131 0, /* tp_as_sequence */
2132 0, /* tp_as_mapping */
2133 (hashfunc)long_hash, /* tp_hash */
2134 0, /* tp_call */
2135 (reprfunc)long_str, /* tp_str */
2136 PyObject_GenericGetAttr, /* tp_getattro */
2137 0, /* tp_setattro */
2138 0, /* tp_as_buffer */
2139 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
2140 long_doc, /* tp_doc */
2141 0, /* tp_traverse */
2142 0, /* tp_clear */
2143 0, /* tp_richcompare */
2144 0, /* tp_weaklistoffset */
2145 0, /* tp_iter */
2146 0, /* tp_iternext */
2147 0, /* tp_methods */
2148 0, /* tp_members */
2149 0, /* tp_getset */
2150 0, /* tp_base */
2151 0, /* tp_dict */
2152 0, /* tp_descr_get */
2153 0, /* tp_descr_set */
2154 0, /* tp_dictoffset */
2155 0, /* tp_init */
2156 0, /* tp_alloc */
2157 long_new, /* tp_new */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002158};