blob: 7a04f1e4daddb002fb166f5428b287cb24472525 [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
Tim Peters5af4e6c2002-08-12 02:31:19 +000011/* For long multiplication, use the O(N**2) school algorithm unless
12 * both operands contain more than KARATSUBA_CUTOFF digits (this
13 * being an internal Python long digit, in base BASE).
14 */
15#define KARATSUBA_CUTOFF 35
16
Guido van Rossume32e0141992-01-19 16:31:05 +000017#define ABS(x) ((x) < 0 ? -(x) : (x))
18
Tim Peters5af4e6c2002-08-12 02:31:19 +000019#undef MIN
20#undef MAX
21#define MAX(x, y) ((x) < (y) ? (y) : (x))
22#define MIN(x, y) ((x) > (y) ? (y) : (x))
23
Guido van Rossume32e0141992-01-19 16:31:05 +000024/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000025static PyLongObject *long_normalize(PyLongObject *);
26static PyLongObject *mul1(PyLongObject *, wdigit);
27static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
Tim Peters212e6142001-07-14 12:23:19 +000028static PyLongObject *divrem1(PyLongObject *, digit, digit *);
Tim Peters9f688bf2000-07-07 15:53:28 +000029static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000030
Guido van Rossumc0b618a1997-05-02 03:12:38 +000031#define SIGCHECK(PyTryBlock) \
Skip Montanarod581d772002-09-03 20:10:45 +000032 if (--_Py_Ticker < 0) { \
33 _Py_Ticker = _Py_CheckInterval; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000035 }
36
Guido van Rossumedcc38a1991-05-05 20:09:44 +000037/* Normalize (remove leading zeros from) a long int object.
38 Doesn't attempt to free the storage--in most cases, due to the nature
39 of the algorithms used, this could save at most be one word anyway. */
40
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000042long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000043{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000044 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000045 register int i = j;
Tim Peters5af4e6c2002-08-12 02:31:19 +000046
Guido van Rossumedcc38a1991-05-05 20:09:44 +000047 while (i > 0 && v->ob_digit[i-1] == 0)
48 --i;
49 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000050 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000051 return v;
52}
53
54/* Allocate a new long int object with size digits.
55 Return NULL and set exception if we run out of memory. */
56
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000058_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000059{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000060 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000061}
62
Tim Peters64b5ce32001-09-10 20:52:51 +000063PyObject *
64_PyLong_Copy(PyLongObject *src)
65{
66 PyLongObject *result;
67 int i;
68
69 assert(src != NULL);
70 i = src->ob_size;
71 if (i < 0)
72 i = -(i);
73 result = _PyLong_New(i);
74 if (result != NULL) {
Tim Peters5329cdb2002-03-02 04:18:04 +000075 result->ob_size = src->ob_size;
Tim Peters64b5ce32001-09-10 20:52:51 +000076 while (--i >= 0)
77 result->ob_digit[i] = src->ob_digit[i];
78 }
79 return (PyObject *)result;
80}
81
Guido van Rossumedcc38a1991-05-05 20:09:44 +000082/* Create a new long int object from a C long int */
83
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000085PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086{
Tim Petersce9de2f2001-06-14 04:56:19 +000087 PyLongObject *v;
88 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
89 int ndigits = 0;
90 int negative = 0;
91
92 if (ival < 0) {
93 ival = -ival;
94 negative = 1;
95 }
96
97 /* Count the number of Python digits.
98 We used to pick 5 ("big enough for anything"), but that's a
99 waste of time and space given that 5*15 = 75 bits are rarely
100 needed. */
101 t = (unsigned long)ival;
102 while (t) {
103 ++ndigits;
104 t >>= SHIFT;
105 }
106 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000107 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000108 digit *p = v->ob_digit;
109 v->ob_size = negative ? -ndigits : ndigits;
110 t = (unsigned long)ival;
111 while (t) {
112 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000113 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000114 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000115 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000117}
118
Guido van Rossum53756b11997-01-03 17:14:46 +0000119/* Create a new long int object from a C unsigned long int */
120
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000122PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +0000123{
Tim Petersce9de2f2001-06-14 04:56:19 +0000124 PyLongObject *v;
125 unsigned long t;
126 int ndigits = 0;
127
128 /* Count the number of Python digits. */
129 t = (unsigned long)ival;
130 while (t) {
131 ++ndigits;
132 t >>= SHIFT;
133 }
134 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000135 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000136 digit *p = v->ob_digit;
137 v->ob_size = ndigits;
138 while (ival) {
139 *p++ = (digit)(ival & MASK);
140 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000141 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000142 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000144}
145
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000146/* Create a new long int object from a C double */
147
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000150{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000152 double frac;
153 int i, ndig, expo, neg;
154 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000155 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000156 PyErr_SetString(PyExc_OverflowError,
157 "cannot convert float infinity to long");
158 return NULL;
159 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000160 if (dval < 0.0) {
161 neg = 1;
162 dval = -dval;
163 }
164 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
165 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000166 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000167 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000169 if (v == NULL)
170 return NULL;
171 frac = ldexp(frac, (expo-1) % SHIFT + 1);
172 for (i = ndig; --i >= 0; ) {
173 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000174 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000175 frac = frac - (double)bits;
176 frac = ldexp(frac, SHIFT);
177 }
178 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000179 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000180 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000181}
182
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000183/* Get a C long int from a long int object.
184 Returns -1 and sets an error condition if overflow occurs. */
185
186long
Tim Peters9f688bf2000-07-07 15:53:28 +0000187PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000188{
Guido van Rossumf7531811998-05-26 14:33:37 +0000189 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000191 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000192 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000193
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 if (vv == NULL || !PyLong_Check(vv)) {
Guido van Rossum7e35d572001-09-15 03:14:32 +0000195 if (vv != NULL && PyInt_Check(vv))
196 return PyInt_AsLong(vv);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000198 return -1;
199 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000201 i = v->ob_size;
202 sign = 1;
203 x = 0;
204 if (i < 0) {
205 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000206 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000207 }
208 while (--i >= 0) {
209 prev = x;
210 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000211 if ((x >> SHIFT) != prev)
212 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000213 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000214 /* Haven't lost any bits, but if the sign bit is set we're in
215 * trouble *unless* this is the min negative number. So,
216 * trouble iff sign bit set && (positive || some bit set other
217 * than the sign bit).
218 */
219 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
220 goto overflow;
221 return (long)x * sign;
222
223 overflow:
224 PyErr_SetString(PyExc_OverflowError,
Skip Montanarobafedec2001-09-13 19:05:30 +0000225 "long int too large to convert to int");
Guido van Rossumf7531811998-05-26 14:33:37 +0000226 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000227}
228
Guido van Rossumd8c80482002-08-13 00:24:58 +0000229/* Get a C unsigned long int from a long int object.
Guido van Rossum53756b11997-01-03 17:14:46 +0000230 Returns -1 and sets an error condition if overflow occurs. */
231
232unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000233PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000234{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000236 unsigned long x, prev;
237 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000238
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239 if (vv == NULL || !PyLong_Check(vv)) {
240 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000241 return (unsigned long) -1;
242 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000244 i = v->ob_size;
245 x = 0;
246 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000247 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000248 "can't convert negative value to unsigned long");
249 return (unsigned long) -1;
250 }
251 while (--i >= 0) {
252 prev = x;
253 x = (x << SHIFT) + v->ob_digit[i];
254 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000255 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000256 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000257 return (unsigned long) -1;
258 }
259 }
260 return x;
261}
262
Tim Petersbaefd9e2003-01-28 20:37:45 +0000263size_t
264_PyLong_NumBits(PyObject *vv)
265{
266 PyLongObject *v = (PyLongObject *)vv;
267 size_t result = 1; /* for the sign bit */
268 size_t ndigits = ABS(v->ob_size);
269
270 assert(v != NULL);
271 assert(PyLong_Check(v));
272 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
273 if (ndigits > 0) {
274 size_t product;
275 digit msd = v->ob_digit[ndigits - 1];
276
277 product = (ndigits - 1) * SHIFT;
278 if (product / SHIFT != ndigits - 1)
279 goto Overflow;
280 result += product;
281 if (result < product)
282 goto Overflow;
283 do {
284 ++result;
285 if (result == 0)
286 goto Overflow;
287 msd >>= 1;
288 } while (msd);
289 }
290 return result;
291
292Overflow:
293 PyErr_SetString(PyExc_OverflowError, "long has too many bits "
294 "to express in a platform size_t");
295 return (size_t)-1;
296}
297
Tim Peters2a9b3672001-06-11 21:23:58 +0000298PyObject *
299_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
300 int little_endian, int is_signed)
301{
302 const unsigned char* pstartbyte;/* LSB of bytes */
303 int incr; /* direction to move pstartbyte */
304 const unsigned char* pendbyte; /* MSB of bytes */
305 size_t numsignificantbytes; /* number of bytes that matter */
306 size_t ndigits; /* number of Python long digits */
307 PyLongObject* v; /* result */
308 int idigit = 0; /* next free index in v->ob_digit */
309
310 if (n == 0)
311 return PyLong_FromLong(0L);
312
313 if (little_endian) {
314 pstartbyte = bytes;
315 pendbyte = bytes + n - 1;
316 incr = 1;
317 }
318 else {
319 pstartbyte = bytes + n - 1;
320 pendbyte = bytes;
321 incr = -1;
322 }
323
324 if (is_signed)
325 is_signed = *pendbyte >= 0x80;
326
327 /* Compute numsignificantbytes. This consists of finding the most
328 significant byte. Leading 0 bytes are insignficant if the number
329 is positive, and leading 0xff bytes if negative. */
330 {
331 size_t i;
332 const unsigned char* p = pendbyte;
333 const int pincr = -incr; /* search MSB to LSB */
334 const unsigned char insignficant = is_signed ? 0xff : 0x00;
335
336 for (i = 0; i < n; ++i, p += pincr) {
337 if (*p != insignficant)
338 break;
339 }
340 numsignificantbytes = n - i;
341 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
342 actually has 2 significant bytes. OTOH, 0xff0001 ==
343 -0x00ffff, so we wouldn't *need* to bump it there; but we
344 do for 0xffff = -0x0001. To be safe without bothering to
345 check every case, bump it regardless. */
346 if (is_signed && numsignificantbytes < n)
347 ++numsignificantbytes;
348 }
349
350 /* How many Python long digits do we need? We have
351 8*numsignificantbytes bits, and each Python long digit has SHIFT
352 bits, so it's the ceiling of the quotient. */
353 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
354 if (ndigits > (size_t)INT_MAX)
355 return PyErr_NoMemory();
356 v = _PyLong_New((int)ndigits);
357 if (v == NULL)
358 return NULL;
359
360 /* Copy the bits over. The tricky parts are computing 2's-comp on
361 the fly for signed numbers, and dealing with the mismatch between
362 8-bit bytes and (probably) 15-bit Python digits.*/
363 {
364 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000365 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000366 twodigits accum = 0; /* sliding register */
367 unsigned int accumbits = 0; /* number of bits in accum */
368 const unsigned char* p = pstartbyte;
369
370 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000371 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000372 /* Compute correction for 2's comp, if needed. */
373 if (is_signed) {
374 thisbyte = (0xff ^ thisbyte) + carry;
375 carry = thisbyte >> 8;
376 thisbyte &= 0xff;
377 }
378 /* Because we're going LSB to MSB, thisbyte is
379 more significant than what's already in accum,
380 so needs to be prepended to accum. */
381 accum |= thisbyte << accumbits;
382 accumbits += 8;
383 if (accumbits >= SHIFT) {
384 /* There's enough to fill a Python digit. */
385 assert(idigit < (int)ndigits);
386 v->ob_digit[idigit] = (digit)(accum & MASK);
387 ++idigit;
388 accum >>= SHIFT;
389 accumbits -= SHIFT;
390 assert(accumbits < SHIFT);
391 }
392 }
393 assert(accumbits < SHIFT);
394 if (accumbits) {
395 assert(idigit < (int)ndigits);
396 v->ob_digit[idigit] = (digit)accum;
397 ++idigit;
398 }
399 }
400
401 v->ob_size = is_signed ? -idigit : idigit;
402 return (PyObject *)long_normalize(v);
403}
404
405int
406_PyLong_AsByteArray(PyLongObject* v,
407 unsigned char* bytes, size_t n,
408 int little_endian, int is_signed)
409{
410 int i; /* index into v->ob_digit */
411 int ndigits; /* |v->ob_size| */
412 twodigits accum; /* sliding register */
413 unsigned int accumbits; /* # bits in accum */
414 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
415 twodigits carry; /* for computing 2's-comp */
416 size_t j; /* # bytes filled */
417 unsigned char* p; /* pointer to next byte in bytes */
418 int pincr; /* direction to move p */
419
420 assert(v != NULL && PyLong_Check(v));
421
422 if (v->ob_size < 0) {
423 ndigits = -(v->ob_size);
424 if (!is_signed) {
425 PyErr_SetString(PyExc_TypeError,
426 "can't convert negative long to unsigned");
427 return -1;
428 }
429 do_twos_comp = 1;
430 }
431 else {
432 ndigits = v->ob_size;
433 do_twos_comp = 0;
434 }
435
436 if (little_endian) {
437 p = bytes;
438 pincr = 1;
439 }
440 else {
441 p = bytes + n - 1;
442 pincr = -1;
443 }
444
Tim Peters898cf852001-06-13 20:50:08 +0000445 /* Copy over all the Python digits.
446 It's crucial that every Python digit except for the MSD contribute
447 exactly SHIFT bits to the total, so first assert that the long is
448 normalized. */
449 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000450 j = 0;
451 accum = 0;
452 accumbits = 0;
453 carry = do_twos_comp ? 1 : 0;
454 for (i = 0; i < ndigits; ++i) {
455 twodigits thisdigit = v->ob_digit[i];
456 if (do_twos_comp) {
457 thisdigit = (thisdigit ^ MASK) + carry;
458 carry = thisdigit >> SHIFT;
459 thisdigit &= MASK;
460 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000461 /* Because we're going LSB to MSB, thisdigit is more
462 significant than what's already in accum, so needs to be
463 prepended to accum. */
464 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000465 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000466
Tim Petersede05092001-06-14 08:53:38 +0000467 /* The most-significant digit may be (probably is) at least
468 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000469 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000470 /* Count # of sign bits -- they needn't be stored,
471 * although for signed conversion we need later to
472 * make sure at least one sign bit gets stored.
473 * First shift conceptual sign bit to real sign bit.
474 */
475 stwodigits s = (stwodigits)(thisdigit <<
476 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000477 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000478 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000479 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000480 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000481 }
Tim Petersede05092001-06-14 08:53:38 +0000482 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000483 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000484
Tim Peters2a9b3672001-06-11 21:23:58 +0000485 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000486 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000487 if (j >= n)
488 goto Overflow;
489 ++j;
490 *p = (unsigned char)(accum & 0xff);
491 p += pincr;
492 accumbits -= 8;
493 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000494 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000495 }
496
497 /* Store the straggler (if any). */
498 assert(accumbits < 8);
499 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000500 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000501 if (j >= n)
502 goto Overflow;
503 ++j;
504 if (do_twos_comp) {
505 /* Fill leading bits of the byte with sign bits
506 (appropriately pretending that the long had an
507 infinite supply of sign bits). */
508 accum |= (~(twodigits)0) << accumbits;
509 }
510 *p = (unsigned char)(accum & 0xff);
511 p += pincr;
512 }
Tim Peters05607ad2001-06-13 21:01:27 +0000513 else if (j == n && n > 0 && is_signed) {
514 /* The main loop filled the byte array exactly, so the code
515 just above didn't get to ensure there's a sign bit, and the
516 loop below wouldn't add one either. Make sure a sign bit
517 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000518 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000519 int sign_bit_set = msb >= 0x80;
520 assert(accumbits == 0);
521 if (sign_bit_set == do_twos_comp)
522 return 0;
523 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000524 goto Overflow;
525 }
Tim Peters05607ad2001-06-13 21:01:27 +0000526
527 /* Fill remaining bytes with copies of the sign bit. */
528 {
529 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
530 for ( ; j < n; ++j, p += pincr)
531 *p = signbyte;
532 }
533
Tim Peters2a9b3672001-06-11 21:23:58 +0000534 return 0;
535
536Overflow:
537 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
538 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000539
Tim Peters2a9b3672001-06-11 21:23:58 +0000540}
541
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000542double
543_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
544{
545/* NBITS_WANTED should be > the number of bits in a double's precision,
546 but small enough so that 2**NBITS_WANTED is within the normal double
547 range. nbitsneeded is set to 1 less than that because the most-significant
548 Python digit contains at least 1 significant bit, but we don't want to
549 bother counting them (catering to the worst case cheaply).
550
551 57 is one more than VAX-D double precision; I (Tim) don't know of a double
552 format with more precision than that; it's 1 larger so that we add in at
553 least one round bit to stand in for the ignored least-significant bits.
554*/
555#define NBITS_WANTED 57
556 PyLongObject *v;
557 double x;
558 const double multiplier = (double)(1L << SHIFT);
559 int i, sign;
560 int nbitsneeded;
561
562 if (vv == NULL || !PyLong_Check(vv)) {
563 PyErr_BadInternalCall();
564 return -1;
565 }
566 v = (PyLongObject *)vv;
567 i = v->ob_size;
568 sign = 1;
569 if (i < 0) {
570 sign = -1;
571 i = -(i);
572 }
573 else if (i == 0) {
574 *exponent = 0;
575 return 0.0;
576 }
577 --i;
578 x = (double)v->ob_digit[i];
579 nbitsneeded = NBITS_WANTED - 1;
580 /* Invariant: i Python digits remain unaccounted for. */
581 while (i > 0 && nbitsneeded > 0) {
582 --i;
583 x = x * multiplier + (double)v->ob_digit[i];
584 nbitsneeded -= SHIFT;
585 }
586 /* There are i digits we didn't shift in. Pretending they're all
587 zeroes, the true value is x * 2**(i*SHIFT). */
588 *exponent = i;
589 assert(x > 0.0);
590 return x * sign;
591#undef NBITS_WANTED
592}
593
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000594/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000595
596double
Tim Peters9f688bf2000-07-07 15:53:28 +0000597PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000598{
Tim Peters9fffa3e2001-09-04 05:14:19 +0000599 int e;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000600 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000601
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 if (vv == NULL || !PyLong_Check(vv)) {
603 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000604 return -1;
605 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000606 x = _PyLong_AsScaledDouble(vv, &e);
607 if (x == -1.0 && PyErr_Occurred())
608 return -1.0;
609 if (e > INT_MAX / SHIFT)
610 goto overflow;
611 errno = 0;
612 x = ldexp(x, e * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000613 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000614 goto overflow;
615 return x;
616
617overflow:
618 PyErr_SetString(PyExc_OverflowError,
619 "long int too large to convert to float");
620 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000621}
622
Guido van Rossum78694d91998-09-18 14:14:13 +0000623/* Create a new long (or int) object from a C pointer */
624
625PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000626PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000627{
Tim Peters70128a12001-06-16 08:48:40 +0000628#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000629 return PyInt_FromLong((long)p);
630#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000631
Tim Peters70128a12001-06-16 08:48:40 +0000632#ifndef HAVE_LONG_LONG
633# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
634#endif
635#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
636# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
637#endif
638 /* optimize null pointers */
639 if (p == NULL)
640 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000641 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000642
643#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000644}
645
646/* Get a C pointer from a long object (or an int object in some cases) */
647
648void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000649PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000650{
651 /* This function will allow int or long objects. If vv is neither,
652 then the PyLong_AsLong*() functions will raise the exception:
653 PyExc_SystemError, "bad argument to internal function"
654 */
Tim Peters70128a12001-06-16 08:48:40 +0000655#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000656 long x;
657
Tim Peters70128a12001-06-16 08:48:40 +0000658 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000659 x = PyInt_AS_LONG(vv);
660 else
661 x = PyLong_AsLong(vv);
662#else
Tim Peters70128a12001-06-16 08:48:40 +0000663
664#ifndef HAVE_LONG_LONG
665# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
666#endif
667#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
668# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
669#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000670 LONG_LONG x;
671
Tim Peters70128a12001-06-16 08:48:40 +0000672 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000673 x = PyInt_AS_LONG(vv);
674 else
675 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000676
677#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000678
679 if (x == -1 && PyErr_Occurred())
680 return NULL;
681 return (void *)x;
682}
683
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000684#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000685
686/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
687 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000688 */
689
Tim Peterscf37dfc2001-06-14 18:42:50 +0000690#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000691
692/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000693
694PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000695PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000696{
Tim Petersd1a7da62001-06-13 00:35:57 +0000697 LONG_LONG bytes = ival;
698 int one = 1;
699 return _PyLong_FromByteArray(
700 (unsigned char *)&bytes,
701 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000702}
703
Tim Petersd1a7da62001-06-13 00:35:57 +0000704/* Create a new long int object from a C unsigned LONG_LONG int. */
705
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000706PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000707PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000708{
Tim Petersd1a7da62001-06-13 00:35:57 +0000709 unsigned LONG_LONG bytes = ival;
710 int one = 1;
711 return _PyLong_FromByteArray(
712 (unsigned char *)&bytes,
713 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000714}
715
Guido van Rossum3293b071998-08-25 16:07:15 +0000716/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000717 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000718
Guido van Rossum3293b071998-08-25 16:07:15 +0000719LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000720PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000721{
Tim Petersd1a7da62001-06-13 00:35:57 +0000722 LONG_LONG bytes;
723 int one = 1;
724 int res;
725
Tim Petersd38b1c72001-09-30 05:09:37 +0000726 if (vv == NULL) {
727 PyErr_BadInternalCall();
728 return -1;
729 }
730 if (!PyLong_Check(vv)) {
731 if (PyInt_Check(vv))
732 return (LONG_LONG)PyInt_AsLong(vv);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000733 PyErr_BadInternalCall();
734 return -1;
735 }
736
Tim Petersd1a7da62001-06-13 00:35:57 +0000737 res = _PyLong_AsByteArray(
738 (PyLongObject *)vv, (unsigned char *)&bytes,
739 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000740
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000741 /* Plan 9 can't handle LONG_LONG in ? : expressions */
742 if (res < 0)
Jeremy Hyltonc4ad0bc2002-04-23 20:01:20 +0000743 return (LONG_LONG)-1;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000744 else
745 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000746}
747
Tim Petersd1a7da62001-06-13 00:35:57 +0000748/* Get a C unsigned LONG_LONG int from a long int object.
749 Return -1 and set an error if overflow occurs. */
750
Guido van Rossum3293b071998-08-25 16:07:15 +0000751unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000752PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000753{
Tim Petersd1a7da62001-06-13 00:35:57 +0000754 unsigned LONG_LONG bytes;
755 int one = 1;
756 int res;
757
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000758 if (vv == NULL || !PyLong_Check(vv)) {
759 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000760 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000761 }
762
Tim Petersd1a7da62001-06-13 00:35:57 +0000763 res = _PyLong_AsByteArray(
764 (PyLongObject *)vv, (unsigned char *)&bytes,
765 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000766
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000767 /* Plan 9 can't handle LONG_LONG in ? : expressions */
768 if (res < 0)
769 return (unsigned LONG_LONG)res;
770 else
771 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000772}
Tim Petersd1a7da62001-06-13 00:35:57 +0000773
774#undef IS_LITTLE_ENDIAN
775
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000776#endif /* HAVE_LONG_LONG */
777
Neil Schemenauerba872e22001-01-04 01:46:03 +0000778
779static int
780convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
Tim Peters5af4e6c2002-08-12 02:31:19 +0000781 if (PyLong_Check(v)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000782 *a = (PyLongObject *) v;
783 Py_INCREF(v);
784 }
785 else if (PyInt_Check(v)) {
786 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
787 }
788 else {
789 return 0;
790 }
Tim Peters5af4e6c2002-08-12 02:31:19 +0000791 if (PyLong_Check(w)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000792 *b = (PyLongObject *) w;
793 Py_INCREF(w);
794 }
795 else if (PyInt_Check(w)) {
796 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
797 }
798 else {
799 Py_DECREF(*a);
800 return 0;
801 }
802 return 1;
803}
804
805#define CONVERT_BINOP(v, w, a, b) \
806 if (!convert_binop(v, w, a, b)) { \
807 Py_INCREF(Py_NotImplemented); \
808 return Py_NotImplemented; \
809 }
810
Tim Peters877a2122002-08-12 05:09:36 +0000811/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
812 * is modified in place, by adding y to it. Carries are propagated as far as
813 * x[m-1], and the remaining carry (0 or 1) is returned.
814 */
815static digit
816v_iadd(digit *x, int m, digit *y, int n)
817{
818 int i;
819 digit carry = 0;
820
821 assert(m >= n);
822 for (i = 0; i < n; ++i) {
823 carry += x[i] + y[i];
824 x[i] = carry & MASK;
825 carry >>= SHIFT;
826 assert((carry & 1) == carry);
827 }
828 for (; carry && i < m; ++i) {
829 carry += x[i];
830 x[i] = carry & MASK;
831 carry >>= SHIFT;
832 assert((carry & 1) == carry);
833 }
834 return carry;
835}
836
837/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
838 * is modified in place, by subtracting y from it. Borrows are propagated as
839 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
840 */
841static digit
842v_isub(digit *x, int m, digit *y, int n)
843{
844 int i;
845 digit borrow = 0;
846
847 assert(m >= n);
848 for (i = 0; i < n; ++i) {
849 borrow = x[i] - y[i] - borrow;
850 x[i] = borrow & MASK;
851 borrow >>= SHIFT;
852 borrow &= 1; /* keep only 1 sign bit */
853 }
854 for (; borrow && i < m; ++i) {
855 borrow = x[i] - borrow;
856 x[i] = borrow & MASK;
857 borrow >>= SHIFT;
858 borrow &= 1;
859 }
860 return borrow;
861}
Neil Schemenauerba872e22001-01-04 01:46:03 +0000862
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000863/* Multiply by a single digit, ignoring the sign. */
864
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000866mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000867{
868 return muladd1(a, n, (digit)0);
869}
870
871/* Multiply by a single digit and add a single digit, ignoring the sign. */
872
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000874muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000875{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000876 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000877 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000878 twodigits carry = extra;
879 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000880
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000881 if (z == NULL)
882 return NULL;
883 for (i = 0; i < size_a; ++i) {
884 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000885 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000886 carry >>= SHIFT;
887 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000888 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000889 return long_normalize(z);
890}
891
Tim Peters212e6142001-07-14 12:23:19 +0000892/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
893 in pout, and returning the remainder. pin and pout point at the LSD.
894 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
895 long_format, but that should be done with great care since longs are
896 immutable. */
897
898static digit
899inplace_divrem1(digit *pout, digit *pin, int size, digit n)
900{
901 twodigits rem = 0;
902
903 assert(n > 0 && n <= MASK);
904 pin += size;
905 pout += size;
906 while (--size >= 0) {
907 digit hi;
908 rem = (rem << SHIFT) + *--pin;
909 *--pout = hi = (digit)(rem / n);
910 rem -= hi * n;
911 }
912 return (digit)rem;
913}
914
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000915/* Divide a long integer by a digit, returning both the quotient
916 (as function result) and the remainder (through *prem).
917 The sign of a is ignored; n should not be zero. */
918
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000920divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000921{
Tim Peters212e6142001-07-14 12:23:19 +0000922 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000924
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000925 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000927 if (z == NULL)
928 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000929 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000930 return long_normalize(z);
931}
932
933/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000934 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000935 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000936
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000938long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000939{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 register PyLongObject *a = (PyLongObject *)aa;
941 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000942 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000943 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000944 char *p;
945 int bits;
946 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000947
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948 if (a == NULL || !PyLong_Check(a)) {
949 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000950 return NULL;
951 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000952 assert(base >= 2 && base <= 36);
Tim Peters5af4e6c2002-08-12 02:31:19 +0000953
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000954 /* Compute a rough upper bound for the length of the string */
955 i = base;
956 bits = 0;
957 while (i > 1) {
958 ++bits;
959 i >>= 1;
960 }
Fred Drake121ee271999-12-23 15:41:28 +0000961 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000962 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000963 if (str == NULL)
964 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000966 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000967 if (addL)
968 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000969 if (a->ob_size < 0)
970 sign = '-';
Tim Peters5af4e6c2002-08-12 02:31:19 +0000971
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000972 if (a->ob_size == 0) {
973 *--p = '0';
974 }
975 else if ((base & (base - 1)) == 0) {
976 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000977 twodigits accum = 0;
978 int accumbits = 0; /* # of bits in accum */
979 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000980 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000981 while ((i >>= 1) > 1)
982 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000983
984 for (i = 0; i < size_a; ++i) {
Tim Peters0d2d87d2002-08-20 19:00:22 +0000985 accum |= (twodigits)a->ob_digit[i] << accumbits;
Tim Peters586b2e32001-07-15 09:11:14 +0000986 accumbits += SHIFT;
987 assert(accumbits >= basebits);
988 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000989 char cdigit = (char)(accum & (base - 1));
990 cdigit += (cdigit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000991 assert(p > PyString_AS_STRING(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000992 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +0000993 accumbits -= basebits;
994 accum >>= basebits;
995 } while (i < size_a-1 ? accumbits >= basebits :
996 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000997 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000998 }
999 else {
Tim Petersfad225f2001-07-13 02:59:26 +00001000 /* Not 0, and base not a power of 2. Divide repeatedly by
1001 base, but for speed use the highest power of base that
1002 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +00001003 int size = size_a;
1004 digit *pin = a->ob_digit;
1005 PyLongObject *scratch;
1006 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +00001007 digit powbase = base; /* powbase == base ** power */
1008 int power = 1;
1009 for (;;) {
1010 unsigned long newpow = powbase * (unsigned long)base;
1011 if (newpow >> SHIFT) /* doesn't fit in a digit */
1012 break;
1013 powbase = (digit)newpow;
1014 ++power;
1015 }
Tim Peters212e6142001-07-14 12:23:19 +00001016
1017 /* Get a scratch area for repeated division. */
1018 scratch = _PyLong_New(size);
1019 if (scratch == NULL) {
1020 Py_DECREF(str);
1021 return NULL;
1022 }
1023
1024 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001025 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001026 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +00001027 digit rem = inplace_divrem1(scratch->ob_digit,
1028 pin, size, powbase);
1029 pin = scratch->ob_digit; /* no need to use a again */
1030 if (pin[size - 1] == 0)
1031 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001032 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +00001033 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001034 Py_DECREF(str);
1035 return NULL;
1036 })
Tim Peters212e6142001-07-14 12:23:19 +00001037
1038 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001039 assert(ntostore > 0);
1040 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001041 digit nextrem = (digit)(rem / base);
1042 char c = (char)(rem - nextrem * base);
1043 assert(p > PyString_AS_STRING(str));
1044 c += (c < 10) ? '0' : 'A'-10;
1045 *--p = c;
1046 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001047 --ntostore;
1048 /* Termination is a bit delicate: must not
1049 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +00001050 remaining quotient and rem are both 0. */
1051 } while (ntostore && (size || rem));
1052 } while (size != 0);
1053 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001054 }
1055
Guido van Rossum2c475421992-08-14 15:13:07 +00001056 if (base == 8) {
1057 if (size_a != 0)
1058 *--p = '0';
1059 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +00001060 else if (base == 16) {
1061 *--p = 'x';
1062 *--p = '0';
1063 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001064 else if (base != 10) {
1065 *--p = '#';
1066 *--p = '0' + base%10;
1067 if (base > 10)
1068 *--p = '0' + base/10;
1069 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001070 if (sign)
1071 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001072 if (p != PyString_AS_STRING(str)) {
1073 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001074 assert(p > q);
1075 do {
1076 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001077 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 _PyString_Resize((PyObject **)&str,
1079 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001080 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001082}
1083
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001084PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001085PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001086{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001087 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001088 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001089 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001090
Guido van Rossum472c04f1996-12-05 21:57:21 +00001091 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001092 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001093 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001094 return NULL;
1095 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001096 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001097 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001098 if (*str == '+')
1099 ++str;
1100 else if (*str == '-') {
1101 ++str;
1102 sign = -1;
1103 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001104 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001105 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001106 if (base == 0) {
1107 if (str[0] != '0')
1108 base = 10;
1109 else if (str[1] == 'x' || str[1] == 'X')
1110 base = 16;
1111 else
1112 base = 8;
1113 }
1114 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1115 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001116 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +00001117 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001118 for ( ; z != NULL; ++str) {
1119 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001120 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001121
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001122 if (*str <= '9')
1123 k = *str - '0';
1124 else if (*str >= 'a')
1125 k = *str - 'a' + 10;
1126 else if (*str >= 'A')
1127 k = *str - 'A' + 10;
1128 if (k < 0 || k >= base)
1129 break;
1130 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001131 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001132 z = temp;
1133 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001134 if (z == NULL)
1135 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001136 if (str == start)
1137 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001138 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001139 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001140 if (*str == 'L' || *str == 'l')
1141 str++;
1142 while (*str && isspace(Py_CHARMASK(*str)))
1143 str++;
1144 if (*str != '\0')
1145 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001146 if (pend)
1147 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001148 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001149
1150 onError:
Tim Peters5af4e6c2002-08-12 02:31:19 +00001151 PyErr_Format(PyExc_ValueError,
Guido van Rossum9e896b32000-04-05 20:11:21 +00001152 "invalid literal for long(): %.200s", orig_str);
1153 Py_XDECREF(z);
1154 return NULL;
1155}
1156
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001157#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001158PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001159PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001160{
Walter Dörwald07e14762002-11-06 16:15:14 +00001161 PyObject *result;
1162 char *buffer = PyMem_MALLOC(length+1);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001163
Walter Dörwald07e14762002-11-06 16:15:14 +00001164 if (buffer == NULL)
1165 return NULL;
1166
1167 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) {
1168 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001169 return NULL;
1170 }
Walter Dörwald07e14762002-11-06 16:15:14 +00001171 result = PyLong_FromString(buffer, NULL, base);
1172 PyMem_FREE(buffer);
1173 return result;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001174}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001175#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001176
Tim Peters9f688bf2000-07-07 15:53:28 +00001177/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001178static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001179 (PyLongObject *, PyLongObject *, PyLongObject **);
1180static PyObject *long_pos(PyLongObject *);
1181static int long_divrem(PyLongObject *, PyLongObject *,
1182 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001183
1184/* Long division with remainder, top-level routine */
1185
Guido van Rossume32e0141992-01-19 16:31:05 +00001186static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001187long_divrem(PyLongObject *a, PyLongObject *b,
1188 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001189{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001190 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001192
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001193 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001194 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001195 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001196 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001197 }
1198 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001199 (size_a == size_b &&
1200 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001201 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202 *pdiv = _PyLong_New(0);
1203 Py_INCREF(a);
1204 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001205 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001206 }
1207 if (size_b == 1) {
1208 digit rem = 0;
1209 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001210 if (z == NULL)
1211 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001213 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001214 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001215 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001216 if (z == NULL)
1217 return -1;
1218 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001219 /* Set the signs.
1220 The quotient z has the sign of a*b;
1221 the remainder r has the sign of a,
1222 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001223 if ((a->ob_size < 0) != (b->ob_size < 0))
1224 z->ob_size = -(z->ob_size);
1225 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1226 (*prem)->ob_size = -((*prem)->ob_size);
1227 *pdiv = z;
1228 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001229}
1230
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001231/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001232
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001233static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001234x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001235{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001236 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001237 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001238 PyLongObject *v = mul1(v1, d);
1239 PyLongObject *w = mul1(w1, d);
1240 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001241 int j, k;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001242
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001243 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001244 Py_XDECREF(v);
1245 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001246 return NULL;
1247 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001248
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001249 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001250 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001251 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001252
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001253 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254 a = _PyLong_New(size_v - size_w + 1);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001255
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001256 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1257 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1258 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001259 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001260 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001261
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001262 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001264 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001265 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001266 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001267 if (vj == w->ob_digit[size_w-1])
1268 q = MASK;
1269 else
1270 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1271 w->ob_digit[size_w-1];
Tim Peters5af4e6c2002-08-12 02:31:19 +00001272
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001273 while (w->ob_digit[size_w-2]*q >
1274 ((
1275 ((twodigits)vj << SHIFT)
1276 + v->ob_digit[j-1]
1277 - q*w->ob_digit[size_w-1]
1278 ) << SHIFT)
1279 + v->ob_digit[j-2])
1280 --q;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001281
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001282 for (i = 0; i < size_w && i+k < size_v; ++i) {
1283 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001284 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 carry += v->ob_digit[i+k] - z
1286 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001287 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001288 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1289 carry, SHIFT);
1290 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001291 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001292
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001293 if (i+k < size_v) {
1294 carry += v->ob_digit[i+k];
1295 v->ob_digit[i+k] = 0;
1296 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001297
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001298 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001299 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001300 else {
1301 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001302 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001303 carry = 0;
1304 for (i = 0; i < size_w && i+k < size_v; ++i) {
1305 carry += v->ob_digit[i+k] + w->ob_digit[i];
1306 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001307 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1308 BASE_TWODIGITS_TYPE,
1309 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001310 }
1311 }
1312 } /* for j, k */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001313
Guido van Rossumc206c761995-01-10 15:23:19 +00001314 if (a == NULL)
1315 *prem = NULL;
1316 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001317 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001318 *prem = divrem1(v, d, &d);
1319 /* d receives the (unused) remainder */
1320 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001321 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001322 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001323 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001324 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325 Py_DECREF(v);
1326 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001327 return a;
1328}
1329
1330/* Methods */
1331
1332static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001333long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001334{
Guido van Rossum9475a232001-10-05 20:51:39 +00001335 v->ob_type->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001336}
1337
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001338static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001339long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001340{
Fred Drake121ee271999-12-23 15:41:28 +00001341 return long_format(v, 10, 1);
1342}
1343
1344static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001345long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001346{
1347 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001348}
1349
1350static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001351long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001352{
1353 int sign;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001354
Guido van Rossumc6913e71991-11-19 20:26:46 +00001355 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001356 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001357 sign = 0;
1358 else
1359 sign = a->ob_size - b->ob_size;
1360 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001361 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001362 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001363 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1364 ;
1365 if (i < 0)
1366 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001367 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001368 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001369 if (a->ob_size < 0)
1370 sign = -sign;
1371 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001372 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001373 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001374}
1375
Guido van Rossum9bfef441993-03-29 10:43:31 +00001376static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001377long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001378{
1379 long x;
1380 int i, sign;
1381
1382 /* This is designed so that Python ints and longs with the
1383 same value hash to the same value, otherwise comparisons
1384 of mapping keys will turn out weird */
1385 i = v->ob_size;
1386 sign = 1;
1387 x = 0;
1388 if (i < 0) {
1389 sign = -1;
1390 i = -(i);
1391 }
1392 while (--i >= 0) {
1393 /* Force a 32-bit circular shift */
1394 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1395 x += v->ob_digit[i];
1396 }
1397 x = x * sign;
1398 if (x == -1)
1399 x = -2;
1400 return x;
1401}
1402
1403
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001404/* Add the absolute values of two long integers. */
1405
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001407x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001408{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001409 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001410 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001411 int i;
1412 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001413
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001414 /* Ensure a is the larger of the two: */
1415 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001416 { PyLongObject *temp = a; a = b; b = temp; }
1417 { int size_temp = size_a;
1418 size_a = size_b;
1419 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001420 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001421 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001422 if (z == NULL)
1423 return NULL;
1424 for (i = 0; i < size_b; ++i) {
1425 carry += a->ob_digit[i] + b->ob_digit[i];
1426 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001427 carry >>= SHIFT;
1428 }
1429 for (; i < size_a; ++i) {
1430 carry += a->ob_digit[i];
1431 z->ob_digit[i] = carry & MASK;
1432 carry >>= SHIFT;
1433 }
1434 z->ob_digit[i] = carry;
1435 return long_normalize(z);
1436}
1437
1438/* Subtract the absolute values of two integers. */
1439
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001440static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001441x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001442{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001443 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001444 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001445 int i;
1446 int sign = 1;
1447 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001448
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001449 /* Ensure a is the larger of the two: */
1450 if (size_a < size_b) {
1451 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452 { PyLongObject *temp = a; a = b; b = temp; }
1453 { int size_temp = size_a;
1454 size_a = size_b;
1455 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001456 }
1457 else if (size_a == size_b) {
1458 /* Find highest digit where a and b differ: */
1459 i = size_a;
1460 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1461 ;
1462 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001463 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001464 if (a->ob_digit[i] < b->ob_digit[i]) {
1465 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001467 }
1468 size_a = size_b = i+1;
1469 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001470 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001471 if (z == NULL)
1472 return NULL;
1473 for (i = 0; i < size_b; ++i) {
1474 /* The following assumes unsigned arithmetic
1475 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001476 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001477 z->ob_digit[i] = borrow & MASK;
1478 borrow >>= SHIFT;
1479 borrow &= 1; /* Keep only one sign bit */
1480 }
1481 for (; i < size_a; ++i) {
1482 borrow = a->ob_digit[i] - borrow;
1483 z->ob_digit[i] = borrow & MASK;
1484 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001485 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001486 }
1487 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001488 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001489 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001490 return long_normalize(z);
1491}
1492
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001493static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001494long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001495{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001496 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001497
Neil Schemenauerba872e22001-01-04 01:46:03 +00001498 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1499
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001500 if (a->ob_size < 0) {
1501 if (b->ob_size < 0) {
1502 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001503 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001504 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001505 }
1506 else
1507 z = x_sub(b, a);
1508 }
1509 else {
1510 if (b->ob_size < 0)
1511 z = x_sub(a, b);
1512 else
1513 z = x_add(a, b);
1514 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001515 Py_DECREF(a);
1516 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001517 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001518}
1519
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001520static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001521long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001522{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001523 PyLongObject *a, *b, *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001524
Neil Schemenauerba872e22001-01-04 01:46:03 +00001525 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1526
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001527 if (a->ob_size < 0) {
1528 if (b->ob_size < 0)
1529 z = x_sub(a, b);
1530 else
1531 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001532 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001533 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001534 }
1535 else {
1536 if (b->ob_size < 0)
1537 z = x_add(a, b);
1538 else
1539 z = x_sub(a, b);
1540 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001541 Py_DECREF(a);
1542 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001544}
1545
Tim Peters5af4e6c2002-08-12 02:31:19 +00001546/* Grade school multiplication, ignoring the signs.
1547 * Returns the absolute value of the product, or NULL if error.
1548 */
1549static PyLongObject *
1550x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001551{
Tim Peters5af4e6c2002-08-12 02:31:19 +00001552 PyLongObject *z;
1553 int size_a = ABS(a->ob_size);
1554 int size_b = ABS(b->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001555 int i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001556
Tim Peters5af4e6c2002-08-12 02:31:19 +00001557 z = _PyLong_New(size_a + size_b);
1558 if (z == NULL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001559 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001560
1561 memset(z->ob_digit, 0, z->ob_size * sizeof(digit));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001562 for (i = 0; i < size_a; ++i) {
1563 twodigits carry = 0;
1564 twodigits f = a->ob_digit[i];
1565 int j;
Tim Peters115c8882002-08-12 18:25:43 +00001566 digit *pz = z->ob_digit + i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001567
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001568 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001570 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001571 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001572 for (j = 0; j < size_b; ++j) {
Tim Peters115c8882002-08-12 18:25:43 +00001573 carry += *pz + b->ob_digit[j] * f;
1574 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001575 carry >>= SHIFT;
1576 }
1577 for (; carry != 0; ++j) {
1578 assert(i+j < z->ob_size);
Tim Peters115c8882002-08-12 18:25:43 +00001579 carry += *pz;
1580 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001581 carry >>= SHIFT;
1582 }
1583 }
Tim Peters44121a62002-08-12 06:17:58 +00001584 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001585}
1586
1587/* A helper for Karatsuba multiplication (k_mul).
1588 Takes a long "n" and an integer "size" representing the place to
1589 split, and sets low and high such that abs(n) == (high << size) + low,
1590 viewing the shift as being by digits. The sign bit is ignored, and
1591 the return values are >= 0.
1592 Returns 0 on success, -1 on failure.
1593*/
1594static int
1595kmul_split(PyLongObject *n, int size, PyLongObject **high, PyLongObject **low)
1596{
1597 PyLongObject *hi, *lo;
1598 int size_lo, size_hi;
1599 const int size_n = ABS(n->ob_size);
1600
1601 size_lo = MIN(size_n, size);
1602 size_hi = size_n - size_lo;
1603
1604 if ((hi = _PyLong_New(size_hi)) == NULL)
1605 return -1;
1606 if ((lo = _PyLong_New(size_lo)) == NULL) {
1607 Py_DECREF(hi);
1608 return -1;
1609 }
1610
1611 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
1612 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
1613
1614 *high = long_normalize(hi);
1615 *low = long_normalize(lo);
1616 return 0;
1617}
1618
Tim Peters60004642002-08-12 22:01:34 +00001619static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
1620
Tim Peters5af4e6c2002-08-12 02:31:19 +00001621/* Karatsuba multiplication. Ignores the input signs, and returns the
1622 * absolute value of the product (or NULL if error).
1623 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
1624 */
1625static PyLongObject *
1626k_mul(PyLongObject *a, PyLongObject *b)
1627{
Tim Peters738eda72002-08-12 15:08:20 +00001628 int asize = ABS(a->ob_size);
1629 int bsize = ABS(b->ob_size);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001630 PyLongObject *ah = NULL;
1631 PyLongObject *al = NULL;
1632 PyLongObject *bh = NULL;
1633 PyLongObject *bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001634 PyLongObject *ret = NULL;
Tim Peters738eda72002-08-12 15:08:20 +00001635 PyLongObject *t1, *t2, *t3;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001636 int shift; /* the number of digits we split off */
1637 int i;
Tim Peters738eda72002-08-12 15:08:20 +00001638
Tim Peters5af4e6c2002-08-12 02:31:19 +00001639 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
1640 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
1641 * Then the original product is
Tim Peters18c15b92002-08-12 02:43:58 +00001642 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
Tim Peters5af4e6c2002-08-12 02:31:19 +00001643 * By picking X to be a power of 2, "*X" is just shifting, and it's
1644 * been reduced to 3 multiplies on numbers half the size.
1645 */
1646
Tim Petersfc07e562002-08-12 02:54:10 +00001647 /* We want to split based on the larger number; fiddle so that b
Tim Peters5af4e6c2002-08-12 02:31:19 +00001648 * is largest.
1649 */
Tim Peters738eda72002-08-12 15:08:20 +00001650 if (asize > bsize) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001651 t1 = a;
1652 a = b;
1653 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00001654
1655 i = asize;
1656 asize = bsize;
1657 bsize = i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001658 }
1659
1660 /* Use gradeschool math when either number is too small. */
Tim Peters738eda72002-08-12 15:08:20 +00001661 if (asize <= KARATSUBA_CUTOFF) {
Tim Peters738eda72002-08-12 15:08:20 +00001662 if (asize == 0)
Tim Peters44121a62002-08-12 06:17:58 +00001663 return _PyLong_New(0);
1664 else
1665 return x_mul(a, b);
1666 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001667
Tim Peters60004642002-08-12 22:01:34 +00001668 /* If a is small compared to b, splitting on b gives a degenerate
1669 * case with ah==0, and Karatsuba may be (even much) less efficient
1670 * than "grade school" then. However, we can still win, by viewing
1671 * b as a string of "big digits", each of width a->ob_size. That
1672 * leads to a sequence of balanced calls to k_mul.
1673 */
1674 if (2 * asize <= bsize)
1675 return k_lopsided_mul(a, b);
1676
Tim Petersd6974a52002-08-13 20:37:51 +00001677 /* Split a & b into hi & lo pieces. */
Tim Peters738eda72002-08-12 15:08:20 +00001678 shift = bsize >> 1;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001679 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
Tim Petersd6974a52002-08-13 20:37:51 +00001680 assert(ah->ob_size > 0); /* the split isn't degenerate */
1681
Tim Peters5af4e6c2002-08-12 02:31:19 +00001682 if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
1683
Tim Petersd64c1de2002-08-12 17:36:03 +00001684 /* The plan:
1685 * 1. Allocate result space (asize + bsize digits: that's always
1686 * enough).
1687 * 2. Compute ah*bh, and copy into result at 2*shift.
1688 * 3. Compute al*bl, and copy into result at 0. Note that this
1689 * can't overlap with #2.
1690 * 4. Subtract al*bl from the result, starting at shift. This may
1691 * underflow (borrow out of the high digit), but we don't care:
1692 * we're effectively doing unsigned arithmetic mod
1693 * BASE**(sizea + sizeb), and so long as the *final* result fits,
1694 * borrows and carries out of the high digit can be ignored.
1695 * 5. Subtract ah*bh from the result, starting at shift.
1696 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
1697 * at shift.
1698 */
1699
1700 /* 1. Allocate result space. */
Tim Peters70b041b2002-08-12 19:38:01 +00001701 ret = _PyLong_New(asize + bsize);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001702 if (ret == NULL) goto fail;
1703#ifdef Py_DEBUG
1704 /* Fill with trash, to catch reference to uninitialized digits. */
1705 memset(ret->ob_digit, 0xDF, ret->ob_size * sizeof(digit));
1706#endif
Tim Peters44121a62002-08-12 06:17:58 +00001707
Tim Petersd64c1de2002-08-12 17:36:03 +00001708 /* 2. t1 <- ah*bh, and copy into high digits of result. */
Tim Peters738eda72002-08-12 15:08:20 +00001709 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
1710 assert(t1->ob_size >= 0);
1711 assert(2*shift + t1->ob_size <= ret->ob_size);
1712 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
1713 t1->ob_size * sizeof(digit));
1714
1715 /* Zero-out the digits higher than the ah*bh copy. */
1716 i = ret->ob_size - 2*shift - t1->ob_size;
Tim Peters44121a62002-08-12 06:17:58 +00001717 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001718 memset(ret->ob_digit + 2*shift + t1->ob_size, 0,
Tim Peters44121a62002-08-12 06:17:58 +00001719 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001720
Tim Petersd64c1de2002-08-12 17:36:03 +00001721 /* 3. t2 <- al*bl, and copy into the low digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001722 if ((t2 = k_mul(al, bl)) == NULL) {
1723 Py_DECREF(t1);
1724 goto fail;
1725 }
1726 assert(t2->ob_size >= 0);
1727 assert(t2->ob_size <= 2*shift); /* no overlap with high digits */
1728 memcpy(ret->ob_digit, t2->ob_digit, t2->ob_size * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001729
1730 /* Zero out remaining digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001731 i = 2*shift - t2->ob_size; /* number of uninitialized digits */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001732 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001733 memset(ret->ob_digit + t2->ob_size, 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001734
Tim Petersd64c1de2002-08-12 17:36:03 +00001735 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
1736 * because it's fresher in cache.
1737 */
Tim Peters738eda72002-08-12 15:08:20 +00001738 i = ret->ob_size - shift; /* # digits after shift */
Tim Petersd64c1de2002-08-12 17:36:03 +00001739 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, t2->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001740 Py_DECREF(t2);
1741
Tim Petersd64c1de2002-08-12 17:36:03 +00001742 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, t1->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001743 Py_DECREF(t1);
1744
Tim Petersd64c1de2002-08-12 17:36:03 +00001745 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001746 if ((t1 = x_add(ah, al)) == NULL) goto fail;
1747 Py_DECREF(ah);
1748 Py_DECREF(al);
1749 ah = al = NULL;
1750
1751 if ((t2 = x_add(bh, bl)) == NULL) {
1752 Py_DECREF(t1);
1753 goto fail;
1754 }
1755 Py_DECREF(bh);
1756 Py_DECREF(bl);
1757 bh = bl = NULL;
1758
Tim Peters738eda72002-08-12 15:08:20 +00001759 t3 = k_mul(t1, t2);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001760 Py_DECREF(t1);
1761 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00001762 if (t3 == NULL) goto fail;
Tim Peters547607c2002-08-12 19:43:49 +00001763 assert(t3->ob_size >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001764
Tim Petersd6974a52002-08-13 20:37:51 +00001765 /* Add t3. It's not obvious why we can't run out of room here.
1766 * See the (*) comment after this function.
Tim Petersd8b21732002-08-12 19:30:26 +00001767 */
Tim Petersd64c1de2002-08-12 17:36:03 +00001768 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, t3->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001769 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001770
Tim Peters5af4e6c2002-08-12 02:31:19 +00001771 return long_normalize(ret);
1772
1773 fail:
1774 Py_XDECREF(ret);
1775 Py_XDECREF(ah);
1776 Py_XDECREF(al);
1777 Py_XDECREF(bh);
1778 Py_XDECREF(bl);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001779 return NULL;
1780}
1781
Tim Petersd6974a52002-08-13 20:37:51 +00001782/* (*) Why adding t3 can't "run out of room" above.
1783
Tim Petersab86c2b2002-08-15 20:06:00 +00001784Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
1785to start with:
Tim Petersd6974a52002-08-13 20:37:51 +00001786
Tim Petersab86c2b2002-08-15 20:06:00 +000017871. For any integer i, i = c(i/2) + f(i/2). In particular,
1788 bsize = c(bsize/2) + f(bsize/2).
17892. shift = f(bsize/2)
17903. asize <= bsize
17914. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
1792 routine, so asize > bsize/2 >= f(bsize/2) in this routine.
Tim Petersd6974a52002-08-13 20:37:51 +00001793
Tim Petersab86c2b2002-08-15 20:06:00 +00001794We allocated asize + bsize result digits, and add t3 into them at an offset
1795of shift. This leaves asize+bsize-shift allocated digit positions for t3
1796to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
1797asize + c(bsize/2) available digit positions.
Tim Petersd6974a52002-08-13 20:37:51 +00001798
Tim Petersab86c2b2002-08-15 20:06:00 +00001799bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
1800at most c(bsize/2) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001801
Tim Petersab86c2b2002-08-15 20:06:00 +00001802If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
1803digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
1804most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001805
Tim Petersab86c2b2002-08-15 20:06:00 +00001806The product (ah+al)*(bh+bl) therefore has at most
Tim Petersd6974a52002-08-13 20:37:51 +00001807
Tim Petersab86c2b2002-08-15 20:06:00 +00001808 c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
Tim Petersd6974a52002-08-13 20:37:51 +00001809
Tim Petersab86c2b2002-08-15 20:06:00 +00001810and we have asize + c(bsize/2) available digit positions. We need to show
1811this is always enough. An instance of c(bsize/2) cancels out in both, so
1812the question reduces to whether asize digits is enough to hold
1813(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
1814then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
1815asize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
1816digit is enough to hold 2 bits. This is so since SHIFT=15 >= 2. If
1817asize == bsize, then we're asking whether bsize digits is enough to hold
Tim Peterse417de02002-08-15 20:10:45 +00001818c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
1819is enough to hold 2 bits. This is so if bsize >= 2, which holds because
1820bsize >= KARATSUBA_CUTOFF >= 2.
Tim Peters8e966ee2002-08-14 16:36:23 +00001821
Tim Peters48d52c02002-08-14 17:07:32 +00001822Note that since there's always enough room for (ah+al)*(bh+bl), and that's
1823clearly >= each of ah*bh and al*bl, there's always enough room to subtract
1824ah*bh and al*bl too.
Tim Petersd6974a52002-08-13 20:37:51 +00001825*/
1826
Tim Peters60004642002-08-12 22:01:34 +00001827/* b has at least twice the digits of a, and a is big enough that Karatsuba
1828 * would pay off *if* the inputs had balanced sizes. View b as a sequence
1829 * of slices, each with a->ob_size digits, and multiply the slices by a,
1830 * one at a time. This gives k_mul balanced inputs to work with, and is
1831 * also cache-friendly (we compute one double-width slice of the result
1832 * at a time, then move on, never bactracking except for the helpful
1833 * single-width slice overlap between successive partial sums).
1834 */
1835static PyLongObject *
1836k_lopsided_mul(PyLongObject *a, PyLongObject *b)
1837{
1838 const int asize = ABS(a->ob_size);
1839 int bsize = ABS(b->ob_size);
1840 int nbdone; /* # of b digits already multiplied */
1841 PyLongObject *ret;
1842 PyLongObject *bslice = NULL;
1843
1844 assert(asize > KARATSUBA_CUTOFF);
1845 assert(2 * asize <= bsize);
1846
1847 /* Allocate result space, and zero it out. */
1848 ret = _PyLong_New(asize + bsize);
1849 if (ret == NULL)
1850 return NULL;
1851 memset(ret->ob_digit, 0, ret->ob_size * sizeof(digit));
1852
1853 /* Successive slices of b are copied into bslice. */
Tim Peters12034032002-08-12 22:10:00 +00001854 bslice = _PyLong_New(asize);
Tim Peters60004642002-08-12 22:01:34 +00001855 if (bslice == NULL)
1856 goto fail;
1857
1858 nbdone = 0;
1859 while (bsize > 0) {
1860 PyLongObject *product;
1861 const int nbtouse = MIN(bsize, asize);
1862
1863 /* Multiply the next slice of b by a. */
1864 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
1865 nbtouse * sizeof(digit));
1866 bslice->ob_size = nbtouse;
1867 product = k_mul(a, bslice);
1868 if (product == NULL)
1869 goto fail;
1870
1871 /* Add into result. */
1872 (void)v_iadd(ret->ob_digit + nbdone, ret->ob_size - nbdone,
1873 product->ob_digit, product->ob_size);
1874 Py_DECREF(product);
1875
1876 bsize -= nbtouse;
1877 nbdone += nbtouse;
1878 }
1879
1880 Py_DECREF(bslice);
1881 return long_normalize(ret);
1882
1883 fail:
1884 Py_DECREF(ret);
1885 Py_XDECREF(bslice);
1886 return NULL;
1887}
Tim Peters5af4e6c2002-08-12 02:31:19 +00001888
1889static PyObject *
1890long_mul(PyLongObject *v, PyLongObject *w)
1891{
1892 PyLongObject *a, *b, *z;
1893
1894 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001895 Py_INCREF(Py_NotImplemented);
1896 return Py_NotImplemented;
1897 }
1898
Tim Petersd64c1de2002-08-12 17:36:03 +00001899 z = k_mul(a, b);
Tim Peters9973d742002-08-15 19:41:06 +00001900 /* Negate if exactly one of the inputs is negative. */
1901 if (((a->ob_size ^ b->ob_size) < 0) && z)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001902 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001903 Py_DECREF(a);
1904 Py_DECREF(b);
Tim Peters9973d742002-08-15 19:41:06 +00001905 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001906}
1907
Guido van Rossume32e0141992-01-19 16:31:05 +00001908/* The / and % operators are now defined in terms of divmod().
1909 The expression a mod b has the value a - b*floor(a/b).
1910 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001911 |a| by |b|, with the sign of a. This is also expressed
1912 as a - b*trunc(a/b), if trunc truncates towards zero.
1913 Some examples:
1914 a b a rem b a mod b
1915 13 10 3 3
1916 -13 10 -3 7
1917 13 -10 3 -7
1918 -13 -10 -3 -3
1919 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001920 have different signs. We then subtract one from the 'div'
1921 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001922
Guido van Rossume32e0141992-01-19 16:31:05 +00001923static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00001924l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00001925 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001926{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001927 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001928
Guido van Rossume32e0141992-01-19 16:31:05 +00001929 if (long_divrem(v, w, &div, &mod) < 0)
1930 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001931 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1932 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001933 PyLongObject *temp;
1934 PyLongObject *one;
1935 temp = (PyLongObject *) long_add(mod, w);
1936 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001937 mod = temp;
1938 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001939 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001940 return -1;
1941 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001942 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001943 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001944 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1945 Py_DECREF(mod);
1946 Py_DECREF(div);
1947 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001948 return -1;
1949 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001950 Py_DECREF(one);
1951 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001952 div = temp;
1953 }
1954 *pdiv = div;
1955 *pmod = mod;
1956 return 0;
1957}
1958
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001959static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001960long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001961{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001962 PyLongObject *a, *b, *div, *mod;
1963
1964 CONVERT_BINOP(v, w, &a, &b);
1965
1966 if (l_divmod(a, b, &div, &mod) < 0) {
1967 Py_DECREF(a);
1968 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001969 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001970 }
1971 Py_DECREF(a);
1972 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001973 Py_DECREF(mod);
1974 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001975}
1976
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001977static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001978long_classic_div(PyObject *v, PyObject *w)
1979{
1980 PyLongObject *a, *b, *div, *mod;
1981
1982 CONVERT_BINOP(v, w, &a, &b);
1983
1984 if (Py_DivisionWarningFlag &&
1985 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1986 div = NULL;
1987 else if (l_divmod(a, b, &div, &mod) < 0)
1988 div = NULL;
1989 else
1990 Py_DECREF(mod);
1991
1992 Py_DECREF(a);
1993 Py_DECREF(b);
1994 return (PyObject *)div;
1995}
1996
1997static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00001998long_true_divide(PyObject *v, PyObject *w)
1999{
Tim Peterse2a60002001-09-04 06:17:36 +00002000 PyLongObject *a, *b;
2001 double ad, bd;
Tim Peters6f97e492001-11-04 23:09:40 +00002002 int aexp, bexp, failed;
Tim Peterse2a60002001-09-04 06:17:36 +00002003
2004 CONVERT_BINOP(v, w, &a, &b);
2005 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
2006 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00002007 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
2008 Py_DECREF(a);
2009 Py_DECREF(b);
2010 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00002011 return NULL;
2012
2013 if (bd == 0.0) {
2014 PyErr_SetString(PyExc_ZeroDivisionError,
2015 "long division or modulo by zero");
2016 return NULL;
2017 }
2018
2019 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
2020 ad /= bd; /* overflow/underflow impossible here */
2021 aexp -= bexp;
2022 if (aexp > INT_MAX / SHIFT)
2023 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00002024 else if (aexp < -(INT_MAX / SHIFT))
2025 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002026 errno = 0;
2027 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00002028 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002029 goto overflow;
2030 return PyFloat_FromDouble(ad);
2031
2032overflow:
2033 PyErr_SetString(PyExc_OverflowError,
2034 "long/long too large for a float");
2035 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002036
Tim Peters20dab9f2001-09-04 05:31:47 +00002037}
2038
2039static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002040long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002041{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002042 PyLongObject *a, *b, *div, *mod;
2043
2044 CONVERT_BINOP(v, w, &a, &b);
2045
2046 if (l_divmod(a, b, &div, &mod) < 0) {
2047 Py_DECREF(a);
2048 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00002049 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002050 }
2051 Py_DECREF(a);
2052 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002053 Py_DECREF(div);
2054 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002055}
2056
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002057static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002058long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002059{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002060 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002061 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002062
2063 CONVERT_BINOP(v, w, &a, &b);
2064
2065 if (l_divmod(a, b, &div, &mod) < 0) {
2066 Py_DECREF(a);
2067 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002068 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002069 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002070 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002071 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002072 PyTuple_SetItem(z, 0, (PyObject *) div);
2073 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002074 }
2075 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002076 Py_DECREF(div);
2077 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002078 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002079 Py_DECREF(a);
2080 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002081 return z;
2082}
2083
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002084static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002085long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002086{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002087 PyLongObject *a, *b;
2088 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002089 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002090 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002091
2092 CONVERT_BINOP(v, w, &a, &b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002093 if (PyLong_Check(x) || Py_None == x) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002094 c = x;
2095 Py_INCREF(x);
2096 }
2097 else if (PyInt_Check(x)) {
2098 c = PyLong_FromLong(PyInt_AS_LONG(x));
2099 }
2100 else {
2101 Py_DECREF(a);
2102 Py_DECREF(b);
2103 Py_INCREF(Py_NotImplemented);
2104 return Py_NotImplemented;
2105 }
Tim Peters4c483c42001-09-05 06:24:58 +00002106
2107 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
2108 PyErr_SetString(PyExc_ValueError,
2109 "pow() 3rd argument cannot be 0");
2110 z = NULL;
2111 goto error;
2112 }
2113
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002114 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002115 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002116 Py_DECREF(a);
2117 Py_DECREF(b);
2118 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00002119 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00002120 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
2121 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00002122 return NULL;
2123 }
2124 /* Return a float. This works because we know that
2125 this calls float_pow() which converts its
2126 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002127 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002128 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002129 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002130 for (i = 0; i < size_b; ++i) {
2131 digit bi = b->ob_digit[i];
2132 int j;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002133
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002134 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002135 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002136
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002137 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002138 temp = (PyLongObject *)long_mul(z, a);
2139 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002140 if (c!=Py_None && temp!=NULL) {
2141 if (l_divmod(temp,(PyLongObject *)c,
2142 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002143 Py_DECREF(temp);
2144 z = NULL;
2145 goto error;
2146 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002147 Py_XDECREF(div);
2148 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002149 temp = mod;
2150 }
2151 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002152 if (z == NULL)
2153 break;
2154 }
2155 bi >>= 1;
2156 if (bi == 0 && i+1 == size_b)
2157 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002158 temp = (PyLongObject *)long_mul(a, a);
2159 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002160 if (c!=Py_None && temp!=NULL) {
2161 if (l_divmod(temp, (PyLongObject *)c, &div,
2162 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002163 Py_DECREF(temp);
2164 z = NULL;
2165 goto error;
2166 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002167 Py_XDECREF(div);
2168 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002169 temp = mod;
2170 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002171 a = temp;
2172 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002173 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002174 z = NULL;
2175 break;
2176 }
2177 }
Guido van Rossumc206c761995-01-10 15:23:19 +00002178 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002179 break;
2180 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002181 if (c!=Py_None && z!=NULL) {
2182 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002183 Py_DECREF(z);
2184 z = NULL;
2185 }
2186 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002187 Py_XDECREF(div);
2188 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002189 z = mod;
2190 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002191 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002192 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00002193 Py_XDECREF(a);
2194 Py_DECREF(b);
2195 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002196 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002197}
2198
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002199static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002200long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002201{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002202 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002203 PyLongObject *x;
2204 PyLongObject *w;
2205 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002206 if (w == NULL)
2207 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002208 x = (PyLongObject *) long_add(v, w);
2209 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002210 if (x == NULL)
2211 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00002212 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002213 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002214}
2215
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002216static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002217long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002218{
Tim Peters69c2de32001-09-11 22:31:33 +00002219 if (PyLong_CheckExact(v)) {
2220 Py_INCREF(v);
2221 return (PyObject *)v;
2222 }
2223 else
2224 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002225}
2226
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002227static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002228long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002229{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002230 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002231 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002232 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002233 Py_INCREF(v);
2234 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002235 }
Tim Peters69c2de32001-09-11 22:31:33 +00002236 z = (PyLongObject *)_PyLong_Copy(v);
2237 if (z != NULL)
2238 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002239 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002240}
2241
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002242static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002243long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002244{
2245 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002246 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00002247 else
2248 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002249}
2250
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002251static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002252long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002253{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002254 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002255}
2256
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002257static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002258long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002259{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002260 PyLongObject *a, *b;
2261 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002262 long shiftby;
2263 int newsize, wordshift, loshift, hishift, i, j;
2264 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002265
Neil Schemenauerba872e22001-01-04 01:46:03 +00002266 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2267
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002268 if (a->ob_size < 0) {
2269 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002270 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002271 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002272 if (a1 == NULL)
2273 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002274 a2 = (PyLongObject *) long_rshift(a1, b);
2275 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002276 if (a2 == NULL)
2277 goto rshift_error;
2278 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002279 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002280 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002281 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002282
Neil Schemenauerba872e22001-01-04 01:46:03 +00002283 shiftby = PyLong_AsLong((PyObject *)b);
2284 if (shiftby == -1L && PyErr_Occurred())
2285 goto rshift_error;
2286 if (shiftby < 0) {
2287 PyErr_SetString(PyExc_ValueError,
2288 "negative shift count");
2289 goto rshift_error;
2290 }
2291 wordshift = shiftby / SHIFT;
2292 newsize = ABS(a->ob_size) - wordshift;
2293 if (newsize <= 0) {
2294 z = _PyLong_New(0);
2295 Py_DECREF(a);
2296 Py_DECREF(b);
2297 return (PyObject *)z;
2298 }
2299 loshift = shiftby % SHIFT;
2300 hishift = SHIFT - loshift;
2301 lomask = ((digit)1 << hishift) - 1;
2302 himask = MASK ^ lomask;
2303 z = _PyLong_New(newsize);
2304 if (z == NULL)
2305 goto rshift_error;
2306 if (a->ob_size < 0)
2307 z->ob_size = -(z->ob_size);
2308 for (i = 0, j = wordshift; i < newsize; i++, j++) {
2309 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
2310 if (i+1 < newsize)
2311 z->ob_digit[i] |=
2312 (a->ob_digit[j+1] << hishift) & himask;
2313 }
2314 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002315 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002316rshift_error:
2317 Py_DECREF(a);
2318 Py_DECREF(b);
2319 return (PyObject *) z;
2320
Guido van Rossumc6913e71991-11-19 20:26:46 +00002321}
2322
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002323static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002324long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002325{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002326 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002327 PyLongObject *a, *b;
2328 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002329 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002330 int oldsize, newsize, wordshift, remshift, i, j;
2331 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002332
Neil Schemenauerba872e22001-01-04 01:46:03 +00002333 CONVERT_BINOP(v, w, &a, &b);
2334
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002335 shiftby = PyLong_AsLong((PyObject *)b);
2336 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00002337 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002338 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002339 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002340 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002341 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002342 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002343 PyErr_SetString(PyExc_ValueError,
2344 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002345 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002346 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002347 /* wordshift, remshift = divmod(shiftby, SHIFT) */
2348 wordshift = (int)shiftby / SHIFT;
2349 remshift = (int)shiftby - wordshift * SHIFT;
2350
2351 oldsize = ABS(a->ob_size);
2352 newsize = oldsize + wordshift;
2353 if (remshift)
2354 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002355 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002356 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002357 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002358 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002359 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002360 for (i = 0; i < wordshift; i++)
2361 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002362 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002363 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00002364 accum |= (twodigits)a->ob_digit[j] << remshift;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002365 z->ob_digit[i] = (digit)(accum & MASK);
2366 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002367 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002368 if (remshift)
2369 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002370 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002371 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002372 z = long_normalize(z);
2373lshift_error:
2374 Py_DECREF(a);
2375 Py_DECREF(b);
2376 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002377}
2378
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002379
2380/* Bitwise and/xor/or operations */
2381
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002382static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002383long_bitwise(PyLongObject *a,
2384 int op, /* '&', '|', '^' */
2385 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002386{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002387 digit maska, maskb; /* 0 or MASK */
2388 int negz;
2389 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002390 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002391 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002392 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002393 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002394
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002395 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002396 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002397 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002398 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002399 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002400 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002401 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002402 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002403 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002404 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002405 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002406 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002407 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002408 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002409 maskb = 0;
2410 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002411
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002412 negz = 0;
2413 switch (op) {
2414 case '^':
2415 if (maska != maskb) {
2416 maska ^= MASK;
2417 negz = -1;
2418 }
2419 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002420 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002421 if (maska && maskb) {
2422 op = '|';
2423 maska ^= MASK;
2424 maskb ^= MASK;
2425 negz = -1;
2426 }
2427 break;
2428 case '|':
2429 if (maska || maskb) {
2430 op = '&';
2431 maska ^= MASK;
2432 maskb ^= MASK;
2433 negz = -1;
2434 }
2435 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002436 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002437
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002438 /* JRH: The original logic here was to allocate the result value (z)
2439 as the longer of the two operands. However, there are some cases
2440 where the result is guaranteed to be shorter than that: AND of two
2441 positives, OR of two negatives: use the shorter number. AND with
2442 mixed signs: use the positive number. OR with mixed signs: use the
2443 negative number. After the transformations above, op will be '&'
2444 iff one of these cases applies, and mask will be non-0 for operands
2445 whose length should be ignored.
2446 */
2447
2448 size_a = a->ob_size;
2449 size_b = b->ob_size;
2450 size_z = op == '&'
2451 ? (maska
2452 ? size_b
2453 : (maskb ? size_a : MIN(size_a, size_b)))
2454 : MAX(size_a, size_b);
2455 z = _PyLong_New(size_z);
2456 if (a == NULL || b == NULL || z == NULL) {
2457 Py_XDECREF(a);
2458 Py_XDECREF(b);
2459 Py_XDECREF(z);
2460 return NULL;
2461 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002462
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002463 for (i = 0; i < size_z; ++i) {
2464 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2465 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2466 switch (op) {
2467 case '&': z->ob_digit[i] = diga & digb; break;
2468 case '|': z->ob_digit[i] = diga | digb; break;
2469 case '^': z->ob_digit[i] = diga ^ digb; break;
2470 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002471 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002472
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002473 Py_DECREF(a);
2474 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002475 z = long_normalize(z);
2476 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002477 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002478 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002479 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002480 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002481}
2482
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002483static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002484long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002485{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002486 PyLongObject *a, *b;
2487 PyObject *c;
2488 CONVERT_BINOP(v, w, &a, &b);
2489 c = long_bitwise(a, '&', b);
2490 Py_DECREF(a);
2491 Py_DECREF(b);
2492 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002493}
2494
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002495static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002496long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002497{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002498 PyLongObject *a, *b;
2499 PyObject *c;
2500 CONVERT_BINOP(v, w, &a, &b);
2501 c = long_bitwise(a, '^', b);
2502 Py_DECREF(a);
2503 Py_DECREF(b);
2504 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002505}
2506
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002507static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002508long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002509{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002510 PyLongObject *a, *b;
2511 PyObject *c;
2512 CONVERT_BINOP(v, w, &a, &b);
2513 c = long_bitwise(a, '|', b);
2514 Py_DECREF(a);
2515 Py_DECREF(b);
2516 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002517}
2518
Guido van Rossum234f9421993-06-17 12:35:49 +00002519static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002520long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002521{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002522 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002523 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002524 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002525 return 0;
2526 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002527 else if (PyLong_Check(*pw)) {
2528 Py_INCREF(*pv);
2529 Py_INCREF(*pw);
2530 return 0;
2531 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002532 return 1; /* Can't do it */
2533}
2534
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002535static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002536long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002537{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002538 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002539 return v;
2540}
2541
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002542static PyObject *
Walter Dörwaldf1715402002-11-19 20:49:15 +00002543long_int(PyObject *v)
2544{
2545 long x;
2546 x = PyLong_AsLong(v);
2547 if (PyErr_Occurred()) {
2548 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2549 PyErr_Clear();
2550 if (PyLong_CheckExact(v)) {
2551 Py_INCREF(v);
2552 return v;
2553 }
2554 else
2555 return _PyLong_Copy((PyLongObject *)v);
2556 }
2557 else
2558 return NULL;
2559 }
2560 return PyInt_FromLong(x);
2561}
2562
2563static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002564long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002565{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002566 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002567 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002568 if (result == -1.0 && PyErr_Occurred())
2569 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002570 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002571}
2572
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002573static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002574long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002575{
Fred Drake121ee271999-12-23 15:41:28 +00002576 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002577}
2578
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002579static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002580long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002581{
Fred Drake121ee271999-12-23 15:41:28 +00002582 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002583}
Jeremy Hylton938ace62002-07-17 16:30:39 +00002584
2585static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00002586long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002587
Tim Peters6d6c1a32001-08-02 04:15:00 +00002588static PyObject *
2589long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2590{
2591 PyObject *x = NULL;
2592 int base = -909; /* unlikely! */
2593 static char *kwlist[] = {"x", "base", 0};
2594
Guido van Rossumbef14172001-08-29 15:47:46 +00002595 if (type != &PyLong_Type)
2596 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002597 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2598 &x, &base))
2599 return NULL;
2600 if (x == NULL)
2601 return PyLong_FromLong(0L);
2602 if (base == -909)
2603 return PyNumber_Long(x);
2604 else if (PyString_Check(x))
2605 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002606#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002607 else if (PyUnicode_Check(x))
2608 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2609 PyUnicode_GET_SIZE(x),
2610 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002611#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002612 else {
2613 PyErr_SetString(PyExc_TypeError,
2614 "long() can't convert non-string with explicit base");
2615 return NULL;
2616 }
2617}
2618
Guido van Rossumbef14172001-08-29 15:47:46 +00002619/* Wimpy, slow approach to tp_new calls for subtypes of long:
2620 first create a regular long from whatever arguments we got,
2621 then allocate a subtype instance and initialize it from
2622 the regular long. The regular long is then thrown away.
2623*/
2624static PyObject *
2625long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2626{
2627 PyLongObject *tmp, *new;
2628 int i, n;
2629
2630 assert(PyType_IsSubtype(type, &PyLong_Type));
2631 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2632 if (tmp == NULL)
2633 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002634 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002635 n = tmp->ob_size;
2636 if (n < 0)
2637 n = -n;
2638 new = (PyLongObject *)type->tp_alloc(type, n);
2639 if (new == NULL)
2640 return NULL;
2641 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002642 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002643 for (i = 0; i < n; i++)
2644 new->ob_digit[i] = tmp->ob_digit[i];
2645 Py_DECREF(tmp);
2646 return (PyObject *)new;
2647}
2648
Guido van Rossum5d9113d2003-01-29 17:58:45 +00002649static PyObject *
2650long_getnewargs(PyLongObject *v)
2651{
2652 return Py_BuildValue("(N)", _PyLong_Copy(v));
2653}
2654
2655static PyMethodDef long_methods[] = {
2656 {"__getnewargs__", (PyCFunction)long_getnewargs, METH_NOARGS},
2657 {NULL, NULL} /* sentinel */
2658};
2659
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002660PyDoc_STRVAR(long_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002661"long(x[, base]) -> integer\n\
2662\n\
2663Convert a string or number to a long integer, if possible. A floating\n\
2664point argument will be truncated towards zero (this does not include a\n\
2665string representation of a floating point number!) When converting a\n\
2666string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002667converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002668
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002669static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002670 (binaryfunc) long_add, /*nb_add*/
2671 (binaryfunc) long_sub, /*nb_subtract*/
2672 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002673 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002674 (binaryfunc) long_mod, /*nb_remainder*/
2675 (binaryfunc) long_divmod, /*nb_divmod*/
2676 (ternaryfunc) long_pow, /*nb_power*/
2677 (unaryfunc) long_neg, /*nb_negative*/
2678 (unaryfunc) long_pos, /*tp_positive*/
2679 (unaryfunc) long_abs, /*tp_absolute*/
2680 (inquiry) long_nonzero, /*tp_nonzero*/
2681 (unaryfunc) long_invert, /*nb_invert*/
2682 (binaryfunc) long_lshift, /*nb_lshift*/
2683 (binaryfunc) long_rshift, /*nb_rshift*/
2684 (binaryfunc) long_and, /*nb_and*/
2685 (binaryfunc) long_xor, /*nb_xor*/
2686 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002687 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002688 (unaryfunc) long_int, /*nb_int*/
2689 (unaryfunc) long_long, /*nb_long*/
2690 (unaryfunc) long_float, /*nb_float*/
2691 (unaryfunc) long_oct, /*nb_oct*/
2692 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002693 0, /* nb_inplace_add */
2694 0, /* nb_inplace_subtract */
2695 0, /* nb_inplace_multiply */
2696 0, /* nb_inplace_divide */
2697 0, /* nb_inplace_remainder */
2698 0, /* nb_inplace_power */
2699 0, /* nb_inplace_lshift */
2700 0, /* nb_inplace_rshift */
2701 0, /* nb_inplace_and */
2702 0, /* nb_inplace_xor */
2703 0, /* nb_inplace_or */
2704 (binaryfunc)long_div, /* nb_floor_divide */
2705 long_true_divide, /* nb_true_divide */
2706 0, /* nb_inplace_floor_divide */
2707 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002708};
2709
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002710PyTypeObject PyLong_Type = {
2711 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002712 0, /* ob_size */
2713 "long", /* tp_name */
2714 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2715 sizeof(digit), /* tp_itemsize */
2716 (destructor)long_dealloc, /* tp_dealloc */
2717 0, /* tp_print */
2718 0, /* tp_getattr */
2719 0, /* tp_setattr */
2720 (cmpfunc)long_compare, /* tp_compare */
2721 (reprfunc)long_repr, /* tp_repr */
2722 &long_as_number, /* tp_as_number */
2723 0, /* tp_as_sequence */
2724 0, /* tp_as_mapping */
2725 (hashfunc)long_hash, /* tp_hash */
2726 0, /* tp_call */
2727 (reprfunc)long_str, /* tp_str */
2728 PyObject_GenericGetAttr, /* tp_getattro */
2729 0, /* tp_setattro */
2730 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002731 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2732 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002733 long_doc, /* tp_doc */
2734 0, /* tp_traverse */
2735 0, /* tp_clear */
2736 0, /* tp_richcompare */
2737 0, /* tp_weaklistoffset */
2738 0, /* tp_iter */
2739 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00002740 long_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002741 0, /* tp_members */
2742 0, /* tp_getset */
2743 0, /* tp_base */
2744 0, /* tp_dict */
2745 0, /* tp_descr_get */
2746 0, /* tp_descr_set */
2747 0, /* tp_dictoffset */
2748 0, /* tp_init */
2749 0, /* tp_alloc */
2750 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00002751 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002752};