blob: 9d7243f7e018028ee3f1db8fef61839a8fc87caf [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 Peters5b8132f2003-01-31 15:52:05 +0000263int
264_PyLong_Sign(PyObject *vv)
265{
266 PyLongObject *v = (PyLongObject *)vv;
Tim Petersee1a53c2003-02-02 02:57:53 +0000267 const int ndigits = ABS(v->ob_size);
Tim Peters5b8132f2003-01-31 15:52:05 +0000268
269 assert(v != NULL);
270 assert(PyLong_Check(v));
271 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
272
Tim Petersee1a53c2003-02-02 02:57:53 +0000273 return v->ob_size == 0 ? 0 : (v->ob_size < 0 ? -1 : 1);
Tim Peters5b8132f2003-01-31 15:52:05 +0000274}
275
Tim Petersbaefd9e2003-01-28 20:37:45 +0000276size_t
277_PyLong_NumBits(PyObject *vv)
278{
279 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000280 size_t result = 0;
281 int ndigits = ABS(v->ob_size);
Tim Petersbaefd9e2003-01-28 20:37:45 +0000282
283 assert(v != NULL);
284 assert(PyLong_Check(v));
285 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
286 if (ndigits > 0) {
Tim Petersbaefd9e2003-01-28 20:37:45 +0000287 digit msd = v->ob_digit[ndigits - 1];
288
Tim Peters5b8132f2003-01-31 15:52:05 +0000289 result = (ndigits - 1) * SHIFT;
Tim Peters08a1d9c2003-01-31 21:45:13 +0000290 if (result / SHIFT != (size_t)ndigits - 1)
Tim Petersbaefd9e2003-01-28 20:37:45 +0000291 goto Overflow;
292 do {
293 ++result;
294 if (result == 0)
295 goto Overflow;
296 msd >>= 1;
297 } while (msd);
298 }
299 return result;
300
301Overflow:
302 PyErr_SetString(PyExc_OverflowError, "long has too many bits "
303 "to express in a platform size_t");
304 return (size_t)-1;
305}
306
Tim Peters2a9b3672001-06-11 21:23:58 +0000307PyObject *
308_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
309 int little_endian, int is_signed)
310{
311 const unsigned char* pstartbyte;/* LSB of bytes */
312 int incr; /* direction to move pstartbyte */
313 const unsigned char* pendbyte; /* MSB of bytes */
314 size_t numsignificantbytes; /* number of bytes that matter */
315 size_t ndigits; /* number of Python long digits */
316 PyLongObject* v; /* result */
317 int idigit = 0; /* next free index in v->ob_digit */
318
319 if (n == 0)
320 return PyLong_FromLong(0L);
321
322 if (little_endian) {
323 pstartbyte = bytes;
324 pendbyte = bytes + n - 1;
325 incr = 1;
326 }
327 else {
328 pstartbyte = bytes + n - 1;
329 pendbyte = bytes;
330 incr = -1;
331 }
332
333 if (is_signed)
334 is_signed = *pendbyte >= 0x80;
335
336 /* Compute numsignificantbytes. This consists of finding the most
337 significant byte. Leading 0 bytes are insignficant if the number
338 is positive, and leading 0xff bytes if negative. */
339 {
340 size_t i;
341 const unsigned char* p = pendbyte;
342 const int pincr = -incr; /* search MSB to LSB */
343 const unsigned char insignficant = is_signed ? 0xff : 0x00;
344
345 for (i = 0; i < n; ++i, p += pincr) {
346 if (*p != insignficant)
347 break;
348 }
349 numsignificantbytes = n - i;
350 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
351 actually has 2 significant bytes. OTOH, 0xff0001 ==
352 -0x00ffff, so we wouldn't *need* to bump it there; but we
353 do for 0xffff = -0x0001. To be safe without bothering to
354 check every case, bump it regardless. */
355 if (is_signed && numsignificantbytes < n)
356 ++numsignificantbytes;
357 }
358
359 /* How many Python long digits do we need? We have
360 8*numsignificantbytes bits, and each Python long digit has SHIFT
361 bits, so it's the ceiling of the quotient. */
362 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
363 if (ndigits > (size_t)INT_MAX)
364 return PyErr_NoMemory();
365 v = _PyLong_New((int)ndigits);
366 if (v == NULL)
367 return NULL;
368
369 /* Copy the bits over. The tricky parts are computing 2's-comp on
370 the fly for signed numbers, and dealing with the mismatch between
371 8-bit bytes and (probably) 15-bit Python digits.*/
372 {
373 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000374 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000375 twodigits accum = 0; /* sliding register */
376 unsigned int accumbits = 0; /* number of bits in accum */
377 const unsigned char* p = pstartbyte;
378
379 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000380 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000381 /* Compute correction for 2's comp, if needed. */
382 if (is_signed) {
383 thisbyte = (0xff ^ thisbyte) + carry;
384 carry = thisbyte >> 8;
385 thisbyte &= 0xff;
386 }
387 /* Because we're going LSB to MSB, thisbyte is
388 more significant than what's already in accum,
389 so needs to be prepended to accum. */
390 accum |= thisbyte << accumbits;
391 accumbits += 8;
392 if (accumbits >= SHIFT) {
393 /* There's enough to fill a Python digit. */
394 assert(idigit < (int)ndigits);
395 v->ob_digit[idigit] = (digit)(accum & MASK);
396 ++idigit;
397 accum >>= SHIFT;
398 accumbits -= SHIFT;
399 assert(accumbits < SHIFT);
400 }
401 }
402 assert(accumbits < SHIFT);
403 if (accumbits) {
404 assert(idigit < (int)ndigits);
405 v->ob_digit[idigit] = (digit)accum;
406 ++idigit;
407 }
408 }
409
410 v->ob_size = is_signed ? -idigit : idigit;
411 return (PyObject *)long_normalize(v);
412}
413
414int
415_PyLong_AsByteArray(PyLongObject* v,
416 unsigned char* bytes, size_t n,
417 int little_endian, int is_signed)
418{
419 int i; /* index into v->ob_digit */
420 int ndigits; /* |v->ob_size| */
421 twodigits accum; /* sliding register */
422 unsigned int accumbits; /* # bits in accum */
423 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
424 twodigits carry; /* for computing 2's-comp */
425 size_t j; /* # bytes filled */
426 unsigned char* p; /* pointer to next byte in bytes */
427 int pincr; /* direction to move p */
428
429 assert(v != NULL && PyLong_Check(v));
430
431 if (v->ob_size < 0) {
432 ndigits = -(v->ob_size);
433 if (!is_signed) {
434 PyErr_SetString(PyExc_TypeError,
435 "can't convert negative long to unsigned");
436 return -1;
437 }
438 do_twos_comp = 1;
439 }
440 else {
441 ndigits = v->ob_size;
442 do_twos_comp = 0;
443 }
444
445 if (little_endian) {
446 p = bytes;
447 pincr = 1;
448 }
449 else {
450 p = bytes + n - 1;
451 pincr = -1;
452 }
453
Tim Peters898cf852001-06-13 20:50:08 +0000454 /* Copy over all the Python digits.
455 It's crucial that every Python digit except for the MSD contribute
456 exactly SHIFT bits to the total, so first assert that the long is
457 normalized. */
458 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000459 j = 0;
460 accum = 0;
461 accumbits = 0;
462 carry = do_twos_comp ? 1 : 0;
463 for (i = 0; i < ndigits; ++i) {
464 twodigits thisdigit = v->ob_digit[i];
465 if (do_twos_comp) {
466 thisdigit = (thisdigit ^ MASK) + carry;
467 carry = thisdigit >> SHIFT;
468 thisdigit &= MASK;
469 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000470 /* Because we're going LSB to MSB, thisdigit is more
471 significant than what's already in accum, so needs to be
472 prepended to accum. */
473 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000474 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000475
Tim Petersede05092001-06-14 08:53:38 +0000476 /* The most-significant digit may be (probably is) at least
477 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000478 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000479 /* Count # of sign bits -- they needn't be stored,
480 * although for signed conversion we need later to
481 * make sure at least one sign bit gets stored.
482 * First shift conceptual sign bit to real sign bit.
483 */
484 stwodigits s = (stwodigits)(thisdigit <<
485 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000486 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000487 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000488 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000489 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000490 }
Tim Petersede05092001-06-14 08:53:38 +0000491 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000492 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000493
Tim Peters2a9b3672001-06-11 21:23:58 +0000494 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000495 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000496 if (j >= n)
497 goto Overflow;
498 ++j;
499 *p = (unsigned char)(accum & 0xff);
500 p += pincr;
501 accumbits -= 8;
502 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000503 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000504 }
505
506 /* Store the straggler (if any). */
507 assert(accumbits < 8);
508 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000509 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000510 if (j >= n)
511 goto Overflow;
512 ++j;
513 if (do_twos_comp) {
514 /* Fill leading bits of the byte with sign bits
515 (appropriately pretending that the long had an
516 infinite supply of sign bits). */
517 accum |= (~(twodigits)0) << accumbits;
518 }
519 *p = (unsigned char)(accum & 0xff);
520 p += pincr;
521 }
Tim Peters05607ad2001-06-13 21:01:27 +0000522 else if (j == n && n > 0 && is_signed) {
523 /* The main loop filled the byte array exactly, so the code
524 just above didn't get to ensure there's a sign bit, and the
525 loop below wouldn't add one either. Make sure a sign bit
526 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000527 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000528 int sign_bit_set = msb >= 0x80;
529 assert(accumbits == 0);
530 if (sign_bit_set == do_twos_comp)
531 return 0;
532 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000533 goto Overflow;
534 }
Tim Peters05607ad2001-06-13 21:01:27 +0000535
536 /* Fill remaining bytes with copies of the sign bit. */
537 {
538 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
539 for ( ; j < n; ++j, p += pincr)
540 *p = signbyte;
541 }
542
Tim Peters2a9b3672001-06-11 21:23:58 +0000543 return 0;
544
545Overflow:
546 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
547 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000548
Tim Peters2a9b3672001-06-11 21:23:58 +0000549}
550
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000551double
552_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
553{
554/* NBITS_WANTED should be > the number of bits in a double's precision,
555 but small enough so that 2**NBITS_WANTED is within the normal double
556 range. nbitsneeded is set to 1 less than that because the most-significant
557 Python digit contains at least 1 significant bit, but we don't want to
558 bother counting them (catering to the worst case cheaply).
559
560 57 is one more than VAX-D double precision; I (Tim) don't know of a double
561 format with more precision than that; it's 1 larger so that we add in at
562 least one round bit to stand in for the ignored least-significant bits.
563*/
564#define NBITS_WANTED 57
565 PyLongObject *v;
566 double x;
567 const double multiplier = (double)(1L << SHIFT);
568 int i, sign;
569 int nbitsneeded;
570
571 if (vv == NULL || !PyLong_Check(vv)) {
572 PyErr_BadInternalCall();
573 return -1;
574 }
575 v = (PyLongObject *)vv;
576 i = v->ob_size;
577 sign = 1;
578 if (i < 0) {
579 sign = -1;
580 i = -(i);
581 }
582 else if (i == 0) {
583 *exponent = 0;
584 return 0.0;
585 }
586 --i;
587 x = (double)v->ob_digit[i];
588 nbitsneeded = NBITS_WANTED - 1;
589 /* Invariant: i Python digits remain unaccounted for. */
590 while (i > 0 && nbitsneeded > 0) {
591 --i;
592 x = x * multiplier + (double)v->ob_digit[i];
593 nbitsneeded -= SHIFT;
594 }
595 /* There are i digits we didn't shift in. Pretending they're all
596 zeroes, the true value is x * 2**(i*SHIFT). */
597 *exponent = i;
598 assert(x > 0.0);
599 return x * sign;
600#undef NBITS_WANTED
601}
602
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000603/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000604
605double
Tim Peters9f688bf2000-07-07 15:53:28 +0000606PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000607{
Tim Peters9fffa3e2001-09-04 05:14:19 +0000608 int e;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000609 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000610
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611 if (vv == NULL || !PyLong_Check(vv)) {
612 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000613 return -1;
614 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000615 x = _PyLong_AsScaledDouble(vv, &e);
616 if (x == -1.0 && PyErr_Occurred())
617 return -1.0;
618 if (e > INT_MAX / SHIFT)
619 goto overflow;
620 errno = 0;
621 x = ldexp(x, e * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000622 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000623 goto overflow;
624 return x;
625
626overflow:
627 PyErr_SetString(PyExc_OverflowError,
628 "long int too large to convert to float");
629 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000630}
631
Guido van Rossum78694d91998-09-18 14:14:13 +0000632/* Create a new long (or int) object from a C pointer */
633
634PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000635PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000636{
Tim Peters70128a12001-06-16 08:48:40 +0000637#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000638 return PyInt_FromLong((long)p);
639#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000640
Tim Peters70128a12001-06-16 08:48:40 +0000641#ifndef HAVE_LONG_LONG
642# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
643#endif
644#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
645# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
646#endif
647 /* optimize null pointers */
648 if (p == NULL)
649 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000650 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000651
652#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000653}
654
655/* Get a C pointer from a long object (or an int object in some cases) */
656
657void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000658PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000659{
660 /* This function will allow int or long objects. If vv is neither,
661 then the PyLong_AsLong*() functions will raise the exception:
662 PyExc_SystemError, "bad argument to internal function"
663 */
Tim Peters70128a12001-06-16 08:48:40 +0000664#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000665 long x;
666
Tim Peters70128a12001-06-16 08:48:40 +0000667 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000668 x = PyInt_AS_LONG(vv);
669 else
670 x = PyLong_AsLong(vv);
671#else
Tim Peters70128a12001-06-16 08:48:40 +0000672
673#ifndef HAVE_LONG_LONG
674# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
675#endif
676#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
677# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
678#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000679 LONG_LONG x;
680
Tim Peters70128a12001-06-16 08:48:40 +0000681 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000682 x = PyInt_AS_LONG(vv);
683 else
684 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000685
686#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000687
688 if (x == -1 && PyErr_Occurred())
689 return NULL;
690 return (void *)x;
691}
692
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000693#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000694
695/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
696 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000697 */
698
Tim Peterscf37dfc2001-06-14 18:42:50 +0000699#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000700
701/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000702
703PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000704PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000705{
Tim Petersd1a7da62001-06-13 00:35:57 +0000706 LONG_LONG bytes = ival;
707 int one = 1;
708 return _PyLong_FromByteArray(
709 (unsigned char *)&bytes,
710 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000711}
712
Tim Petersd1a7da62001-06-13 00:35:57 +0000713/* Create a new long int object from a C unsigned LONG_LONG int. */
714
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000715PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000716PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000717{
Tim Petersd1a7da62001-06-13 00:35:57 +0000718 unsigned LONG_LONG bytes = ival;
719 int one = 1;
720 return _PyLong_FromByteArray(
721 (unsigned char *)&bytes,
722 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000723}
724
Guido van Rossum3293b071998-08-25 16:07:15 +0000725/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000726 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000727
Guido van Rossum3293b071998-08-25 16:07:15 +0000728LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000729PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000730{
Tim Petersd1a7da62001-06-13 00:35:57 +0000731 LONG_LONG bytes;
732 int one = 1;
733 int res;
734
Tim Petersd38b1c72001-09-30 05:09:37 +0000735 if (vv == NULL) {
736 PyErr_BadInternalCall();
737 return -1;
738 }
739 if (!PyLong_Check(vv)) {
740 if (PyInt_Check(vv))
741 return (LONG_LONG)PyInt_AsLong(vv);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000742 PyErr_BadInternalCall();
743 return -1;
744 }
745
Tim Petersd1a7da62001-06-13 00:35:57 +0000746 res = _PyLong_AsByteArray(
747 (PyLongObject *)vv, (unsigned char *)&bytes,
748 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000749
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000750 /* Plan 9 can't handle LONG_LONG in ? : expressions */
751 if (res < 0)
Jeremy Hyltonc4ad0bc2002-04-23 20:01:20 +0000752 return (LONG_LONG)-1;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000753 else
754 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000755}
756
Tim Petersd1a7da62001-06-13 00:35:57 +0000757/* Get a C unsigned LONG_LONG int from a long int object.
758 Return -1 and set an error if overflow occurs. */
759
Guido van Rossum3293b071998-08-25 16:07:15 +0000760unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000761PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000762{
Tim Petersd1a7da62001-06-13 00:35:57 +0000763 unsigned LONG_LONG bytes;
764 int one = 1;
765 int res;
766
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000767 if (vv == NULL || !PyLong_Check(vv)) {
768 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000769 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000770 }
771
Tim Petersd1a7da62001-06-13 00:35:57 +0000772 res = _PyLong_AsByteArray(
773 (PyLongObject *)vv, (unsigned char *)&bytes,
774 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000775
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000776 /* Plan 9 can't handle LONG_LONG in ? : expressions */
777 if (res < 0)
778 return (unsigned LONG_LONG)res;
779 else
780 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000781}
Tim Petersd1a7da62001-06-13 00:35:57 +0000782
783#undef IS_LITTLE_ENDIAN
784
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000785#endif /* HAVE_LONG_LONG */
786
Neil Schemenauerba872e22001-01-04 01:46:03 +0000787
788static int
789convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
Tim Peters5af4e6c2002-08-12 02:31:19 +0000790 if (PyLong_Check(v)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000791 *a = (PyLongObject *) v;
792 Py_INCREF(v);
793 }
794 else if (PyInt_Check(v)) {
795 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
796 }
797 else {
798 return 0;
799 }
Tim Peters5af4e6c2002-08-12 02:31:19 +0000800 if (PyLong_Check(w)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000801 *b = (PyLongObject *) w;
802 Py_INCREF(w);
803 }
804 else if (PyInt_Check(w)) {
805 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
806 }
807 else {
808 Py_DECREF(*a);
809 return 0;
810 }
811 return 1;
812}
813
814#define CONVERT_BINOP(v, w, a, b) \
815 if (!convert_binop(v, w, a, b)) { \
816 Py_INCREF(Py_NotImplemented); \
817 return Py_NotImplemented; \
818 }
819
Tim Peters877a2122002-08-12 05:09:36 +0000820/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
821 * is modified in place, by adding y to it. Carries are propagated as far as
822 * x[m-1], and the remaining carry (0 or 1) is returned.
823 */
824static digit
825v_iadd(digit *x, int m, digit *y, int n)
826{
827 int i;
828 digit carry = 0;
829
830 assert(m >= n);
831 for (i = 0; i < n; ++i) {
832 carry += x[i] + y[i];
833 x[i] = carry & MASK;
834 carry >>= SHIFT;
835 assert((carry & 1) == carry);
836 }
837 for (; carry && i < m; ++i) {
838 carry += x[i];
839 x[i] = carry & MASK;
840 carry >>= SHIFT;
841 assert((carry & 1) == carry);
842 }
843 return carry;
844}
845
846/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
847 * is modified in place, by subtracting y from it. Borrows are propagated as
848 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
849 */
850static digit
851v_isub(digit *x, int m, digit *y, int n)
852{
853 int i;
854 digit borrow = 0;
855
856 assert(m >= n);
857 for (i = 0; i < n; ++i) {
858 borrow = x[i] - y[i] - borrow;
859 x[i] = borrow & MASK;
860 borrow >>= SHIFT;
861 borrow &= 1; /* keep only 1 sign bit */
862 }
863 for (; borrow && i < m; ++i) {
864 borrow = x[i] - borrow;
865 x[i] = borrow & MASK;
866 borrow >>= SHIFT;
867 borrow &= 1;
868 }
869 return borrow;
870}
Neil Schemenauerba872e22001-01-04 01:46:03 +0000871
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000872/* Multiply by a single digit, ignoring the sign. */
873
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000875mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000876{
877 return muladd1(a, n, (digit)0);
878}
879
880/* Multiply by a single digit and add a single digit, ignoring the sign. */
881
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000883muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000884{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000885 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000886 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000887 twodigits carry = extra;
888 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000889
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000890 if (z == NULL)
891 return NULL;
892 for (i = 0; i < size_a; ++i) {
893 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000894 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000895 carry >>= SHIFT;
896 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000897 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000898 return long_normalize(z);
899}
900
Tim Peters212e6142001-07-14 12:23:19 +0000901/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
902 in pout, and returning the remainder. pin and pout point at the LSD.
903 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
904 long_format, but that should be done with great care since longs are
905 immutable. */
906
907static digit
908inplace_divrem1(digit *pout, digit *pin, int size, digit n)
909{
910 twodigits rem = 0;
911
912 assert(n > 0 && n <= MASK);
913 pin += size;
914 pout += size;
915 while (--size >= 0) {
916 digit hi;
917 rem = (rem << SHIFT) + *--pin;
918 *--pout = hi = (digit)(rem / n);
919 rem -= hi * n;
920 }
921 return (digit)rem;
922}
923
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000924/* Divide a long integer by a digit, returning both the quotient
925 (as function result) and the remainder (through *prem).
926 The sign of a is ignored; n should not be zero. */
927
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000929divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000930{
Tim Peters212e6142001-07-14 12:23:19 +0000931 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000933
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000934 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000936 if (z == NULL)
937 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000938 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000939 return long_normalize(z);
940}
941
942/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000943 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000944 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000945
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000947long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000948{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 register PyLongObject *a = (PyLongObject *)aa;
950 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000951 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000952 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000953 char *p;
954 int bits;
955 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000956
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957 if (a == NULL || !PyLong_Check(a)) {
958 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000959 return NULL;
960 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000961 assert(base >= 2 && base <= 36);
Tim Peters5af4e6c2002-08-12 02:31:19 +0000962
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000963 /* Compute a rough upper bound for the length of the string */
964 i = base;
965 bits = 0;
966 while (i > 1) {
967 ++bits;
968 i >>= 1;
969 }
Fred Drake121ee271999-12-23 15:41:28 +0000970 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000972 if (str == NULL)
973 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000975 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000976 if (addL)
977 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000978 if (a->ob_size < 0)
979 sign = '-';
Tim Peters5af4e6c2002-08-12 02:31:19 +0000980
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000981 if (a->ob_size == 0) {
982 *--p = '0';
983 }
984 else if ((base & (base - 1)) == 0) {
985 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000986 twodigits accum = 0;
987 int accumbits = 0; /* # of bits in accum */
988 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000989 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000990 while ((i >>= 1) > 1)
991 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000992
993 for (i = 0; i < size_a; ++i) {
Tim Peters0d2d87d2002-08-20 19:00:22 +0000994 accum |= (twodigits)a->ob_digit[i] << accumbits;
Tim Peters586b2e32001-07-15 09:11:14 +0000995 accumbits += SHIFT;
996 assert(accumbits >= basebits);
997 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000998 char cdigit = (char)(accum & (base - 1));
999 cdigit += (cdigit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001000 assert(p > PyString_AS_STRING(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +00001001 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +00001002 accumbits -= basebits;
1003 accum >>= basebits;
1004 } while (i < size_a-1 ? accumbits >= basebits :
1005 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001006 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001007 }
1008 else {
Tim Petersfad225f2001-07-13 02:59:26 +00001009 /* Not 0, and base not a power of 2. Divide repeatedly by
1010 base, but for speed use the highest power of base that
1011 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +00001012 int size = size_a;
1013 digit *pin = a->ob_digit;
1014 PyLongObject *scratch;
1015 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +00001016 digit powbase = base; /* powbase == base ** power */
1017 int power = 1;
1018 for (;;) {
1019 unsigned long newpow = powbase * (unsigned long)base;
1020 if (newpow >> SHIFT) /* doesn't fit in a digit */
1021 break;
1022 powbase = (digit)newpow;
1023 ++power;
1024 }
Tim Peters212e6142001-07-14 12:23:19 +00001025
1026 /* Get a scratch area for repeated division. */
1027 scratch = _PyLong_New(size);
1028 if (scratch == NULL) {
1029 Py_DECREF(str);
1030 return NULL;
1031 }
1032
1033 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001034 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001035 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +00001036 digit rem = inplace_divrem1(scratch->ob_digit,
1037 pin, size, powbase);
1038 pin = scratch->ob_digit; /* no need to use a again */
1039 if (pin[size - 1] == 0)
1040 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001041 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +00001042 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001043 Py_DECREF(str);
1044 return NULL;
1045 })
Tim Peters212e6142001-07-14 12:23:19 +00001046
1047 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001048 assert(ntostore > 0);
1049 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001050 digit nextrem = (digit)(rem / base);
1051 char c = (char)(rem - nextrem * base);
1052 assert(p > PyString_AS_STRING(str));
1053 c += (c < 10) ? '0' : 'A'-10;
1054 *--p = c;
1055 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001056 --ntostore;
1057 /* Termination is a bit delicate: must not
1058 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +00001059 remaining quotient and rem are both 0. */
1060 } while (ntostore && (size || rem));
1061 } while (size != 0);
1062 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001063 }
1064
Guido van Rossum2c475421992-08-14 15:13:07 +00001065 if (base == 8) {
1066 if (size_a != 0)
1067 *--p = '0';
1068 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +00001069 else if (base == 16) {
1070 *--p = 'x';
1071 *--p = '0';
1072 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001073 else if (base != 10) {
1074 *--p = '#';
1075 *--p = '0' + base%10;
1076 if (base > 10)
1077 *--p = '0' + base/10;
1078 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001079 if (sign)
1080 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081 if (p != PyString_AS_STRING(str)) {
1082 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001083 assert(p > q);
1084 do {
1085 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001086 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001087 _PyString_Resize((PyObject **)&str,
1088 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001089 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001090 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001091}
1092
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001093PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001094PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001095{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001096 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001097 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001098 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001099
Guido van Rossum472c04f1996-12-05 21:57:21 +00001100 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001102 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001103 return NULL;
1104 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001105 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001106 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001107 if (*str == '+')
1108 ++str;
1109 else if (*str == '-') {
1110 ++str;
1111 sign = -1;
1112 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001113 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001114 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001115 if (base == 0) {
1116 if (str[0] != '0')
1117 base = 10;
1118 else if (str[1] == 'x' || str[1] == 'X')
1119 base = 16;
1120 else
1121 base = 8;
1122 }
1123 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1124 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001125 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +00001126 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001127 for ( ; z != NULL; ++str) {
1128 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001129 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001130
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001131 if (*str <= '9')
1132 k = *str - '0';
1133 else if (*str >= 'a')
1134 k = *str - 'a' + 10;
1135 else if (*str >= 'A')
1136 k = *str - 'A' + 10;
1137 if (k < 0 || k >= base)
1138 break;
1139 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001140 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001141 z = temp;
1142 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001143 if (z == NULL)
1144 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001145 if (str == start)
1146 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001147 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001148 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001149 if (*str == 'L' || *str == 'l')
1150 str++;
1151 while (*str && isspace(Py_CHARMASK(*str)))
1152 str++;
1153 if (*str != '\0')
1154 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001155 if (pend)
1156 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001157 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001158
1159 onError:
Tim Peters5af4e6c2002-08-12 02:31:19 +00001160 PyErr_Format(PyExc_ValueError,
Guido van Rossum9e896b32000-04-05 20:11:21 +00001161 "invalid literal for long(): %.200s", orig_str);
1162 Py_XDECREF(z);
1163 return NULL;
1164}
1165
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001166#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001167PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001168PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001169{
Walter Dörwald07e14762002-11-06 16:15:14 +00001170 PyObject *result;
1171 char *buffer = PyMem_MALLOC(length+1);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001172
Walter Dörwald07e14762002-11-06 16:15:14 +00001173 if (buffer == NULL)
1174 return NULL;
1175
1176 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) {
1177 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001178 return NULL;
1179 }
Walter Dörwald07e14762002-11-06 16:15:14 +00001180 result = PyLong_FromString(buffer, NULL, base);
1181 PyMem_FREE(buffer);
1182 return result;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001183}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001184#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001185
Tim Peters9f688bf2000-07-07 15:53:28 +00001186/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001188 (PyLongObject *, PyLongObject *, PyLongObject **);
1189static PyObject *long_pos(PyLongObject *);
1190static int long_divrem(PyLongObject *, PyLongObject *,
1191 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001192
1193/* Long division with remainder, top-level routine */
1194
Guido van Rossume32e0141992-01-19 16:31:05 +00001195static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001196long_divrem(PyLongObject *a, PyLongObject *b,
1197 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001198{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001199 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001200 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001201
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001202 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001203 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001204 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001205 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001206 }
1207 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001208 (size_a == size_b &&
1209 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001210 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001211 *pdiv = _PyLong_New(0);
1212 Py_INCREF(a);
1213 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001214 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001215 }
1216 if (size_b == 1) {
1217 digit rem = 0;
1218 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001219 if (z == NULL)
1220 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001222 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001223 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001224 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001225 if (z == NULL)
1226 return -1;
1227 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001228 /* Set the signs.
1229 The quotient z has the sign of a*b;
1230 the remainder r has the sign of a,
1231 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001232 if ((a->ob_size < 0) != (b->ob_size < 0))
1233 z->ob_size = -(z->ob_size);
1234 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1235 (*prem)->ob_size = -((*prem)->ob_size);
1236 *pdiv = z;
1237 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001238}
1239
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001240/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001241
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001243x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001244{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001245 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001246 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001247 PyLongObject *v = mul1(v1, d);
1248 PyLongObject *w = mul1(w1, d);
1249 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001250 int j, k;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001251
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001252 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253 Py_XDECREF(v);
1254 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001255 return NULL;
1256 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001257
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001258 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001259 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001260 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001261
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001262 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 a = _PyLong_New(size_v - size_w + 1);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001264
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001265 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1266 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1267 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001268 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001269 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001270
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001271 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001272 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001273 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001274 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001275 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001276 if (vj == w->ob_digit[size_w-1])
1277 q = MASK;
1278 else
1279 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1280 w->ob_digit[size_w-1];
Tim Peters5af4e6c2002-08-12 02:31:19 +00001281
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001282 while (w->ob_digit[size_w-2]*q >
1283 ((
1284 ((twodigits)vj << SHIFT)
1285 + v->ob_digit[j-1]
1286 - q*w->ob_digit[size_w-1]
1287 ) << SHIFT)
1288 + v->ob_digit[j-2])
1289 --q;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001290
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001291 for (i = 0; i < size_w && i+k < size_v; ++i) {
1292 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001293 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001294 carry += v->ob_digit[i+k] - z
1295 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001296 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001297 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1298 carry, SHIFT);
1299 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001300 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001301
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001302 if (i+k < size_v) {
1303 carry += v->ob_digit[i+k];
1304 v->ob_digit[i+k] = 0;
1305 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001306
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001307 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001308 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001309 else {
1310 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001311 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001312 carry = 0;
1313 for (i = 0; i < size_w && i+k < size_v; ++i) {
1314 carry += v->ob_digit[i+k] + w->ob_digit[i];
1315 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001316 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1317 BASE_TWODIGITS_TYPE,
1318 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001319 }
1320 }
1321 } /* for j, k */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001322
Guido van Rossumc206c761995-01-10 15:23:19 +00001323 if (a == NULL)
1324 *prem = NULL;
1325 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001326 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001327 *prem = divrem1(v, d, &d);
1328 /* d receives the (unused) remainder */
1329 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001330 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001331 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001332 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001333 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334 Py_DECREF(v);
1335 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001336 return a;
1337}
1338
1339/* Methods */
1340
1341static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001342long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001343{
Guido van Rossum9475a232001-10-05 20:51:39 +00001344 v->ob_type->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001345}
1346
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001348long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001349{
Fred Drake121ee271999-12-23 15:41:28 +00001350 return long_format(v, 10, 1);
1351}
1352
1353static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001354long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001355{
1356 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001357}
1358
1359static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001360long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001361{
1362 int sign;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001363
Guido van Rossumc6913e71991-11-19 20:26:46 +00001364 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001365 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001366 sign = 0;
1367 else
1368 sign = a->ob_size - b->ob_size;
1369 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001370 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001371 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001372 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1373 ;
1374 if (i < 0)
1375 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001376 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001377 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001378 if (a->ob_size < 0)
1379 sign = -sign;
1380 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001381 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001382 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001383}
1384
Guido van Rossum9bfef441993-03-29 10:43:31 +00001385static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001386long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001387{
1388 long x;
1389 int i, sign;
1390
1391 /* This is designed so that Python ints and longs with the
1392 same value hash to the same value, otherwise comparisons
1393 of mapping keys will turn out weird */
1394 i = v->ob_size;
1395 sign = 1;
1396 x = 0;
1397 if (i < 0) {
1398 sign = -1;
1399 i = -(i);
1400 }
1401 while (--i >= 0) {
1402 /* Force a 32-bit circular shift */
1403 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1404 x += v->ob_digit[i];
1405 }
1406 x = x * sign;
1407 if (x == -1)
1408 x = -2;
1409 return x;
1410}
1411
1412
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001413/* Add the absolute values of two long integers. */
1414
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001416x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001417{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001418 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001420 int i;
1421 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001422
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001423 /* Ensure a is the larger of the two: */
1424 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001425 { PyLongObject *temp = a; a = b; b = temp; }
1426 { int size_temp = size_a;
1427 size_a = size_b;
1428 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001429 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001430 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001431 if (z == NULL)
1432 return NULL;
1433 for (i = 0; i < size_b; ++i) {
1434 carry += a->ob_digit[i] + b->ob_digit[i];
1435 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001436 carry >>= SHIFT;
1437 }
1438 for (; i < size_a; ++i) {
1439 carry += a->ob_digit[i];
1440 z->ob_digit[i] = carry & MASK;
1441 carry >>= SHIFT;
1442 }
1443 z->ob_digit[i] = carry;
1444 return long_normalize(z);
1445}
1446
1447/* Subtract the absolute values of two integers. */
1448
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001449static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001450x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001451{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001452 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001453 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001454 int i;
1455 int sign = 1;
1456 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001457
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001458 /* Ensure a is the larger of the two: */
1459 if (size_a < size_b) {
1460 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461 { PyLongObject *temp = a; a = b; b = temp; }
1462 { int size_temp = size_a;
1463 size_a = size_b;
1464 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001465 }
1466 else if (size_a == size_b) {
1467 /* Find highest digit where a and b differ: */
1468 i = size_a;
1469 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1470 ;
1471 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001472 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001473 if (a->ob_digit[i] < b->ob_digit[i]) {
1474 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001475 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001476 }
1477 size_a = size_b = i+1;
1478 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001479 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001480 if (z == NULL)
1481 return NULL;
1482 for (i = 0; i < size_b; ++i) {
1483 /* The following assumes unsigned arithmetic
1484 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001485 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001486 z->ob_digit[i] = borrow & MASK;
1487 borrow >>= SHIFT;
1488 borrow &= 1; /* Keep only one sign bit */
1489 }
1490 for (; i < size_a; ++i) {
1491 borrow = a->ob_digit[i] - borrow;
1492 z->ob_digit[i] = borrow & MASK;
1493 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001494 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001495 }
1496 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001497 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001498 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001499 return long_normalize(z);
1500}
1501
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001502static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001503long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001504{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001505 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001506
Neil Schemenauerba872e22001-01-04 01:46:03 +00001507 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1508
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001509 if (a->ob_size < 0) {
1510 if (b->ob_size < 0) {
1511 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001512 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001513 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001514 }
1515 else
1516 z = x_sub(b, a);
1517 }
1518 else {
1519 if (b->ob_size < 0)
1520 z = x_sub(a, b);
1521 else
1522 z = x_add(a, b);
1523 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001524 Py_DECREF(a);
1525 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001526 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001527}
1528
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001529static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001530long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001531{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001532 PyLongObject *a, *b, *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001533
Neil Schemenauerba872e22001-01-04 01:46:03 +00001534 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1535
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001536 if (a->ob_size < 0) {
1537 if (b->ob_size < 0)
1538 z = x_sub(a, b);
1539 else
1540 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001541 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001542 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001543 }
1544 else {
1545 if (b->ob_size < 0)
1546 z = x_add(a, b);
1547 else
1548 z = x_sub(a, b);
1549 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001550 Py_DECREF(a);
1551 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001552 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001553}
1554
Tim Peters5af4e6c2002-08-12 02:31:19 +00001555/* Grade school multiplication, ignoring the signs.
1556 * Returns the absolute value of the product, or NULL if error.
1557 */
1558static PyLongObject *
1559x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001560{
Tim Peters5af4e6c2002-08-12 02:31:19 +00001561 PyLongObject *z;
1562 int size_a = ABS(a->ob_size);
1563 int size_b = ABS(b->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001564 int i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001565
Tim Peters5af4e6c2002-08-12 02:31:19 +00001566 z = _PyLong_New(size_a + size_b);
1567 if (z == NULL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001568 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001569
1570 memset(z->ob_digit, 0, z->ob_size * sizeof(digit));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001571 for (i = 0; i < size_a; ++i) {
1572 twodigits carry = 0;
1573 twodigits f = a->ob_digit[i];
1574 int j;
Tim Peters115c8882002-08-12 18:25:43 +00001575 digit *pz = z->ob_digit + i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001576
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001577 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001578 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001579 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001580 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001581 for (j = 0; j < size_b; ++j) {
Tim Peters115c8882002-08-12 18:25:43 +00001582 carry += *pz + b->ob_digit[j] * f;
1583 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001584 carry >>= SHIFT;
1585 }
1586 for (; carry != 0; ++j) {
1587 assert(i+j < z->ob_size);
Tim Peters115c8882002-08-12 18:25:43 +00001588 carry += *pz;
1589 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001590 carry >>= SHIFT;
1591 }
1592 }
Tim Peters44121a62002-08-12 06:17:58 +00001593 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001594}
1595
1596/* A helper for Karatsuba multiplication (k_mul).
1597 Takes a long "n" and an integer "size" representing the place to
1598 split, and sets low and high such that abs(n) == (high << size) + low,
1599 viewing the shift as being by digits. The sign bit is ignored, and
1600 the return values are >= 0.
1601 Returns 0 on success, -1 on failure.
1602*/
1603static int
1604kmul_split(PyLongObject *n, int size, PyLongObject **high, PyLongObject **low)
1605{
1606 PyLongObject *hi, *lo;
1607 int size_lo, size_hi;
1608 const int size_n = ABS(n->ob_size);
1609
1610 size_lo = MIN(size_n, size);
1611 size_hi = size_n - size_lo;
1612
1613 if ((hi = _PyLong_New(size_hi)) == NULL)
1614 return -1;
1615 if ((lo = _PyLong_New(size_lo)) == NULL) {
1616 Py_DECREF(hi);
1617 return -1;
1618 }
1619
1620 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
1621 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
1622
1623 *high = long_normalize(hi);
1624 *low = long_normalize(lo);
1625 return 0;
1626}
1627
Tim Peters60004642002-08-12 22:01:34 +00001628static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
1629
Tim Peters5af4e6c2002-08-12 02:31:19 +00001630/* Karatsuba multiplication. Ignores the input signs, and returns the
1631 * absolute value of the product (or NULL if error).
1632 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
1633 */
1634static PyLongObject *
1635k_mul(PyLongObject *a, PyLongObject *b)
1636{
Tim Peters738eda72002-08-12 15:08:20 +00001637 int asize = ABS(a->ob_size);
1638 int bsize = ABS(b->ob_size);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001639 PyLongObject *ah = NULL;
1640 PyLongObject *al = NULL;
1641 PyLongObject *bh = NULL;
1642 PyLongObject *bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001643 PyLongObject *ret = NULL;
Tim Peters738eda72002-08-12 15:08:20 +00001644 PyLongObject *t1, *t2, *t3;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001645 int shift; /* the number of digits we split off */
1646 int i;
Tim Peters738eda72002-08-12 15:08:20 +00001647
Tim Peters5af4e6c2002-08-12 02:31:19 +00001648 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
1649 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
1650 * Then the original product is
Tim Peters18c15b92002-08-12 02:43:58 +00001651 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
Tim Peters5af4e6c2002-08-12 02:31:19 +00001652 * By picking X to be a power of 2, "*X" is just shifting, and it's
1653 * been reduced to 3 multiplies on numbers half the size.
1654 */
1655
Tim Petersfc07e562002-08-12 02:54:10 +00001656 /* We want to split based on the larger number; fiddle so that b
Tim Peters5af4e6c2002-08-12 02:31:19 +00001657 * is largest.
1658 */
Tim Peters738eda72002-08-12 15:08:20 +00001659 if (asize > bsize) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001660 t1 = a;
1661 a = b;
1662 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00001663
1664 i = asize;
1665 asize = bsize;
1666 bsize = i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001667 }
1668
1669 /* Use gradeschool math when either number is too small. */
Tim Peters738eda72002-08-12 15:08:20 +00001670 if (asize <= KARATSUBA_CUTOFF) {
Tim Peters738eda72002-08-12 15:08:20 +00001671 if (asize == 0)
Tim Peters44121a62002-08-12 06:17:58 +00001672 return _PyLong_New(0);
1673 else
1674 return x_mul(a, b);
1675 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001676
Tim Peters60004642002-08-12 22:01:34 +00001677 /* If a is small compared to b, splitting on b gives a degenerate
1678 * case with ah==0, and Karatsuba may be (even much) less efficient
1679 * than "grade school" then. However, we can still win, by viewing
1680 * b as a string of "big digits", each of width a->ob_size. That
1681 * leads to a sequence of balanced calls to k_mul.
1682 */
1683 if (2 * asize <= bsize)
1684 return k_lopsided_mul(a, b);
1685
Tim Petersd6974a52002-08-13 20:37:51 +00001686 /* Split a & b into hi & lo pieces. */
Tim Peters738eda72002-08-12 15:08:20 +00001687 shift = bsize >> 1;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001688 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
Tim Petersd6974a52002-08-13 20:37:51 +00001689 assert(ah->ob_size > 0); /* the split isn't degenerate */
1690
Tim Peters5af4e6c2002-08-12 02:31:19 +00001691 if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
1692
Tim Petersd64c1de2002-08-12 17:36:03 +00001693 /* The plan:
1694 * 1. Allocate result space (asize + bsize digits: that's always
1695 * enough).
1696 * 2. Compute ah*bh, and copy into result at 2*shift.
1697 * 3. Compute al*bl, and copy into result at 0. Note that this
1698 * can't overlap with #2.
1699 * 4. Subtract al*bl from the result, starting at shift. This may
1700 * underflow (borrow out of the high digit), but we don't care:
1701 * we're effectively doing unsigned arithmetic mod
1702 * BASE**(sizea + sizeb), and so long as the *final* result fits,
1703 * borrows and carries out of the high digit can be ignored.
1704 * 5. Subtract ah*bh from the result, starting at shift.
1705 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
1706 * at shift.
1707 */
1708
1709 /* 1. Allocate result space. */
Tim Peters70b041b2002-08-12 19:38:01 +00001710 ret = _PyLong_New(asize + bsize);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001711 if (ret == NULL) goto fail;
1712#ifdef Py_DEBUG
1713 /* Fill with trash, to catch reference to uninitialized digits. */
1714 memset(ret->ob_digit, 0xDF, ret->ob_size * sizeof(digit));
1715#endif
Tim Peters44121a62002-08-12 06:17:58 +00001716
Tim Petersd64c1de2002-08-12 17:36:03 +00001717 /* 2. t1 <- ah*bh, and copy into high digits of result. */
Tim Peters738eda72002-08-12 15:08:20 +00001718 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
1719 assert(t1->ob_size >= 0);
1720 assert(2*shift + t1->ob_size <= ret->ob_size);
1721 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
1722 t1->ob_size * sizeof(digit));
1723
1724 /* Zero-out the digits higher than the ah*bh copy. */
1725 i = ret->ob_size - 2*shift - t1->ob_size;
Tim Peters44121a62002-08-12 06:17:58 +00001726 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001727 memset(ret->ob_digit + 2*shift + t1->ob_size, 0,
Tim Peters44121a62002-08-12 06:17:58 +00001728 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001729
Tim Petersd64c1de2002-08-12 17:36:03 +00001730 /* 3. t2 <- al*bl, and copy into the low digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001731 if ((t2 = k_mul(al, bl)) == NULL) {
1732 Py_DECREF(t1);
1733 goto fail;
1734 }
1735 assert(t2->ob_size >= 0);
1736 assert(t2->ob_size <= 2*shift); /* no overlap with high digits */
1737 memcpy(ret->ob_digit, t2->ob_digit, t2->ob_size * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001738
1739 /* Zero out remaining digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001740 i = 2*shift - t2->ob_size; /* number of uninitialized digits */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001741 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001742 memset(ret->ob_digit + t2->ob_size, 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001743
Tim Petersd64c1de2002-08-12 17:36:03 +00001744 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
1745 * because it's fresher in cache.
1746 */
Tim Peters738eda72002-08-12 15:08:20 +00001747 i = ret->ob_size - shift; /* # digits after shift */
Tim Petersd64c1de2002-08-12 17:36:03 +00001748 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, t2->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001749 Py_DECREF(t2);
1750
Tim Petersd64c1de2002-08-12 17:36:03 +00001751 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, t1->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001752 Py_DECREF(t1);
1753
Tim Petersd64c1de2002-08-12 17:36:03 +00001754 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001755 if ((t1 = x_add(ah, al)) == NULL) goto fail;
1756 Py_DECREF(ah);
1757 Py_DECREF(al);
1758 ah = al = NULL;
1759
1760 if ((t2 = x_add(bh, bl)) == NULL) {
1761 Py_DECREF(t1);
1762 goto fail;
1763 }
1764 Py_DECREF(bh);
1765 Py_DECREF(bl);
1766 bh = bl = NULL;
1767
Tim Peters738eda72002-08-12 15:08:20 +00001768 t3 = k_mul(t1, t2);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001769 Py_DECREF(t1);
1770 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00001771 if (t3 == NULL) goto fail;
Tim Peters547607c2002-08-12 19:43:49 +00001772 assert(t3->ob_size >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001773
Tim Petersd6974a52002-08-13 20:37:51 +00001774 /* Add t3. It's not obvious why we can't run out of room here.
1775 * See the (*) comment after this function.
Tim Petersd8b21732002-08-12 19:30:26 +00001776 */
Tim Petersd64c1de2002-08-12 17:36:03 +00001777 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, t3->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001778 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001779
Tim Peters5af4e6c2002-08-12 02:31:19 +00001780 return long_normalize(ret);
1781
1782 fail:
1783 Py_XDECREF(ret);
1784 Py_XDECREF(ah);
1785 Py_XDECREF(al);
1786 Py_XDECREF(bh);
1787 Py_XDECREF(bl);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001788 return NULL;
1789}
1790
Tim Petersd6974a52002-08-13 20:37:51 +00001791/* (*) Why adding t3 can't "run out of room" above.
1792
Tim Petersab86c2b2002-08-15 20:06:00 +00001793Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
1794to start with:
Tim Petersd6974a52002-08-13 20:37:51 +00001795
Tim Petersab86c2b2002-08-15 20:06:00 +000017961. For any integer i, i = c(i/2) + f(i/2). In particular,
1797 bsize = c(bsize/2) + f(bsize/2).
17982. shift = f(bsize/2)
17993. asize <= bsize
18004. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
1801 routine, so asize > bsize/2 >= f(bsize/2) in this routine.
Tim Petersd6974a52002-08-13 20:37:51 +00001802
Tim Petersab86c2b2002-08-15 20:06:00 +00001803We allocated asize + bsize result digits, and add t3 into them at an offset
1804of shift. This leaves asize+bsize-shift allocated digit positions for t3
1805to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
1806asize + c(bsize/2) available digit positions.
Tim Petersd6974a52002-08-13 20:37:51 +00001807
Tim Petersab86c2b2002-08-15 20:06:00 +00001808bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
1809at most c(bsize/2) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001810
Tim Petersab86c2b2002-08-15 20:06:00 +00001811If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
1812digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
1813most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001814
Tim Petersab86c2b2002-08-15 20:06:00 +00001815The product (ah+al)*(bh+bl) therefore has at most
Tim Petersd6974a52002-08-13 20:37:51 +00001816
Tim Petersab86c2b2002-08-15 20:06:00 +00001817 c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
Tim Petersd6974a52002-08-13 20:37:51 +00001818
Tim Petersab86c2b2002-08-15 20:06:00 +00001819and we have asize + c(bsize/2) available digit positions. We need to show
1820this is always enough. An instance of c(bsize/2) cancels out in both, so
1821the question reduces to whether asize digits is enough to hold
1822(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
1823then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
1824asize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
1825digit is enough to hold 2 bits. This is so since SHIFT=15 >= 2. If
1826asize == bsize, then we're asking whether bsize digits is enough to hold
Tim Peterse417de02002-08-15 20:10:45 +00001827c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
1828is enough to hold 2 bits. This is so if bsize >= 2, which holds because
1829bsize >= KARATSUBA_CUTOFF >= 2.
Tim Peters8e966ee2002-08-14 16:36:23 +00001830
Tim Peters48d52c02002-08-14 17:07:32 +00001831Note that since there's always enough room for (ah+al)*(bh+bl), and that's
1832clearly >= each of ah*bh and al*bl, there's always enough room to subtract
1833ah*bh and al*bl too.
Tim Petersd6974a52002-08-13 20:37:51 +00001834*/
1835
Tim Peters60004642002-08-12 22:01:34 +00001836/* b has at least twice the digits of a, and a is big enough that Karatsuba
1837 * would pay off *if* the inputs had balanced sizes. View b as a sequence
1838 * of slices, each with a->ob_size digits, and multiply the slices by a,
1839 * one at a time. This gives k_mul balanced inputs to work with, and is
1840 * also cache-friendly (we compute one double-width slice of the result
1841 * at a time, then move on, never bactracking except for the helpful
1842 * single-width slice overlap between successive partial sums).
1843 */
1844static PyLongObject *
1845k_lopsided_mul(PyLongObject *a, PyLongObject *b)
1846{
1847 const int asize = ABS(a->ob_size);
1848 int bsize = ABS(b->ob_size);
1849 int nbdone; /* # of b digits already multiplied */
1850 PyLongObject *ret;
1851 PyLongObject *bslice = NULL;
1852
1853 assert(asize > KARATSUBA_CUTOFF);
1854 assert(2 * asize <= bsize);
1855
1856 /* Allocate result space, and zero it out. */
1857 ret = _PyLong_New(asize + bsize);
1858 if (ret == NULL)
1859 return NULL;
1860 memset(ret->ob_digit, 0, ret->ob_size * sizeof(digit));
1861
1862 /* Successive slices of b are copied into bslice. */
Tim Peters12034032002-08-12 22:10:00 +00001863 bslice = _PyLong_New(asize);
Tim Peters60004642002-08-12 22:01:34 +00001864 if (bslice == NULL)
1865 goto fail;
1866
1867 nbdone = 0;
1868 while (bsize > 0) {
1869 PyLongObject *product;
1870 const int nbtouse = MIN(bsize, asize);
1871
1872 /* Multiply the next slice of b by a. */
1873 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
1874 nbtouse * sizeof(digit));
1875 bslice->ob_size = nbtouse;
1876 product = k_mul(a, bslice);
1877 if (product == NULL)
1878 goto fail;
1879
1880 /* Add into result. */
1881 (void)v_iadd(ret->ob_digit + nbdone, ret->ob_size - nbdone,
1882 product->ob_digit, product->ob_size);
1883 Py_DECREF(product);
1884
1885 bsize -= nbtouse;
1886 nbdone += nbtouse;
1887 }
1888
1889 Py_DECREF(bslice);
1890 return long_normalize(ret);
1891
1892 fail:
1893 Py_DECREF(ret);
1894 Py_XDECREF(bslice);
1895 return NULL;
1896}
Tim Peters5af4e6c2002-08-12 02:31:19 +00001897
1898static PyObject *
1899long_mul(PyLongObject *v, PyLongObject *w)
1900{
1901 PyLongObject *a, *b, *z;
1902
1903 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001904 Py_INCREF(Py_NotImplemented);
1905 return Py_NotImplemented;
1906 }
1907
Tim Petersd64c1de2002-08-12 17:36:03 +00001908 z = k_mul(a, b);
Tim Peters9973d742002-08-15 19:41:06 +00001909 /* Negate if exactly one of the inputs is negative. */
1910 if (((a->ob_size ^ b->ob_size) < 0) && z)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001911 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001912 Py_DECREF(a);
1913 Py_DECREF(b);
Tim Peters9973d742002-08-15 19:41:06 +00001914 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001915}
1916
Guido van Rossume32e0141992-01-19 16:31:05 +00001917/* The / and % operators are now defined in terms of divmod().
1918 The expression a mod b has the value a - b*floor(a/b).
1919 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001920 |a| by |b|, with the sign of a. This is also expressed
1921 as a - b*trunc(a/b), if trunc truncates towards zero.
1922 Some examples:
1923 a b a rem b a mod b
1924 13 10 3 3
1925 -13 10 -3 7
1926 13 -10 3 -7
1927 -13 -10 -3 -3
1928 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001929 have different signs. We then subtract one from the 'div'
1930 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001931
Guido van Rossume32e0141992-01-19 16:31:05 +00001932static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00001933l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00001934 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001935{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001936 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001937
Guido van Rossume32e0141992-01-19 16:31:05 +00001938 if (long_divrem(v, w, &div, &mod) < 0)
1939 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001940 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1941 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001942 PyLongObject *temp;
1943 PyLongObject *one;
1944 temp = (PyLongObject *) long_add(mod, w);
1945 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001946 mod = temp;
1947 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001948 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001949 return -1;
1950 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001951 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001952 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001953 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1954 Py_DECREF(mod);
1955 Py_DECREF(div);
1956 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001957 return -1;
1958 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001959 Py_DECREF(one);
1960 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001961 div = temp;
1962 }
1963 *pdiv = div;
1964 *pmod = mod;
1965 return 0;
1966}
1967
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001968static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001969long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001970{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001971 PyLongObject *a, *b, *div, *mod;
1972
1973 CONVERT_BINOP(v, w, &a, &b);
1974
1975 if (l_divmod(a, b, &div, &mod) < 0) {
1976 Py_DECREF(a);
1977 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001978 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001979 }
1980 Py_DECREF(a);
1981 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001982 Py_DECREF(mod);
1983 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001984}
1985
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001986static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001987long_classic_div(PyObject *v, PyObject *w)
1988{
1989 PyLongObject *a, *b, *div, *mod;
1990
1991 CONVERT_BINOP(v, w, &a, &b);
1992
1993 if (Py_DivisionWarningFlag &&
1994 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1995 div = NULL;
1996 else if (l_divmod(a, b, &div, &mod) < 0)
1997 div = NULL;
1998 else
1999 Py_DECREF(mod);
2000
2001 Py_DECREF(a);
2002 Py_DECREF(b);
2003 return (PyObject *)div;
2004}
2005
2006static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00002007long_true_divide(PyObject *v, PyObject *w)
2008{
Tim Peterse2a60002001-09-04 06:17:36 +00002009 PyLongObject *a, *b;
2010 double ad, bd;
Tim Peters6f97e492001-11-04 23:09:40 +00002011 int aexp, bexp, failed;
Tim Peterse2a60002001-09-04 06:17:36 +00002012
2013 CONVERT_BINOP(v, w, &a, &b);
2014 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
2015 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00002016 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
2017 Py_DECREF(a);
2018 Py_DECREF(b);
2019 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00002020 return NULL;
2021
2022 if (bd == 0.0) {
2023 PyErr_SetString(PyExc_ZeroDivisionError,
2024 "long division or modulo by zero");
2025 return NULL;
2026 }
2027
2028 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
2029 ad /= bd; /* overflow/underflow impossible here */
2030 aexp -= bexp;
2031 if (aexp > INT_MAX / SHIFT)
2032 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00002033 else if (aexp < -(INT_MAX / SHIFT))
2034 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002035 errno = 0;
2036 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00002037 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002038 goto overflow;
2039 return PyFloat_FromDouble(ad);
2040
2041overflow:
2042 PyErr_SetString(PyExc_OverflowError,
2043 "long/long too large for a float");
2044 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002045
Tim Peters20dab9f2001-09-04 05:31:47 +00002046}
2047
2048static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002049long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002050{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002051 PyLongObject *a, *b, *div, *mod;
2052
2053 CONVERT_BINOP(v, w, &a, &b);
2054
2055 if (l_divmod(a, b, &div, &mod) < 0) {
2056 Py_DECREF(a);
2057 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00002058 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002059 }
2060 Py_DECREF(a);
2061 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002062 Py_DECREF(div);
2063 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002064}
2065
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002066static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002067long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002068{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002069 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002070 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002071
2072 CONVERT_BINOP(v, w, &a, &b);
2073
2074 if (l_divmod(a, b, &div, &mod) < 0) {
2075 Py_DECREF(a);
2076 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002077 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002078 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002079 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002080 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002081 PyTuple_SetItem(z, 0, (PyObject *) div);
2082 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002083 }
2084 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002085 Py_DECREF(div);
2086 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002087 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002088 Py_DECREF(a);
2089 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002090 return z;
2091}
2092
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002093static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002094long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002095{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002096 PyLongObject *a, *b;
2097 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002098 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002099 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002100
2101 CONVERT_BINOP(v, w, &a, &b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002102 if (PyLong_Check(x) || Py_None == x) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002103 c = x;
2104 Py_INCREF(x);
2105 }
2106 else if (PyInt_Check(x)) {
2107 c = PyLong_FromLong(PyInt_AS_LONG(x));
2108 }
2109 else {
2110 Py_DECREF(a);
2111 Py_DECREF(b);
2112 Py_INCREF(Py_NotImplemented);
2113 return Py_NotImplemented;
2114 }
Tim Peters4c483c42001-09-05 06:24:58 +00002115
2116 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
2117 PyErr_SetString(PyExc_ValueError,
2118 "pow() 3rd argument cannot be 0");
2119 z = NULL;
2120 goto error;
2121 }
2122
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002123 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002124 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002125 Py_DECREF(a);
2126 Py_DECREF(b);
2127 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00002128 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00002129 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
2130 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00002131 return NULL;
2132 }
2133 /* Return a float. This works because we know that
2134 this calls float_pow() which converts its
2135 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002136 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002137 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002138 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002139 for (i = 0; i < size_b; ++i) {
2140 digit bi = b->ob_digit[i];
2141 int j;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002142
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002143 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002144 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002145
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002146 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002147 temp = (PyLongObject *)long_mul(z, a);
2148 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002149 if (c!=Py_None && temp!=NULL) {
2150 if (l_divmod(temp,(PyLongObject *)c,
2151 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002152 Py_DECREF(temp);
2153 z = NULL;
2154 goto error;
2155 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002156 Py_XDECREF(div);
2157 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002158 temp = mod;
2159 }
2160 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002161 if (z == NULL)
2162 break;
2163 }
2164 bi >>= 1;
2165 if (bi == 0 && i+1 == size_b)
2166 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002167 temp = (PyLongObject *)long_mul(a, a);
2168 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002169 if (c!=Py_None && temp!=NULL) {
2170 if (l_divmod(temp, (PyLongObject *)c, &div,
2171 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002172 Py_DECREF(temp);
2173 z = NULL;
2174 goto error;
2175 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002176 Py_XDECREF(div);
2177 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002178 temp = mod;
2179 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002180 a = temp;
2181 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002182 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002183 z = NULL;
2184 break;
2185 }
2186 }
Guido van Rossumc206c761995-01-10 15:23:19 +00002187 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002188 break;
2189 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002190 if (c!=Py_None && z!=NULL) {
2191 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002192 Py_DECREF(z);
2193 z = NULL;
2194 }
2195 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002196 Py_XDECREF(div);
2197 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002198 z = mod;
2199 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002200 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002201 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00002202 Py_XDECREF(a);
2203 Py_DECREF(b);
2204 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002205 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002206}
2207
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002208static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002209long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002210{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002211 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002212 PyLongObject *x;
2213 PyLongObject *w;
2214 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002215 if (w == NULL)
2216 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002217 x = (PyLongObject *) long_add(v, w);
2218 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002219 if (x == NULL)
2220 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00002221 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002222 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002223}
2224
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002225static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002226long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002227{
Tim Peters69c2de32001-09-11 22:31:33 +00002228 if (PyLong_CheckExact(v)) {
2229 Py_INCREF(v);
2230 return (PyObject *)v;
2231 }
2232 else
2233 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002234}
2235
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002236static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002237long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002238{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002239 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002240 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002241 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002242 Py_INCREF(v);
2243 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002244 }
Tim Peters69c2de32001-09-11 22:31:33 +00002245 z = (PyLongObject *)_PyLong_Copy(v);
2246 if (z != NULL)
2247 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002248 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002249}
2250
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002251static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002252long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002253{
2254 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002255 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00002256 else
2257 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002258}
2259
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002260static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002261long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002262{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002263 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002264}
2265
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002266static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002267long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002268{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002269 PyLongObject *a, *b;
2270 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002271 long shiftby;
2272 int newsize, wordshift, loshift, hishift, i, j;
2273 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002274
Neil Schemenauerba872e22001-01-04 01:46:03 +00002275 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2276
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002277 if (a->ob_size < 0) {
2278 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002279 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002280 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002281 if (a1 == NULL)
2282 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002283 a2 = (PyLongObject *) long_rshift(a1, b);
2284 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002285 if (a2 == NULL)
2286 goto rshift_error;
2287 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002288 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002289 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002290 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002291
Neil Schemenauerba872e22001-01-04 01:46:03 +00002292 shiftby = PyLong_AsLong((PyObject *)b);
2293 if (shiftby == -1L && PyErr_Occurred())
2294 goto rshift_error;
2295 if (shiftby < 0) {
2296 PyErr_SetString(PyExc_ValueError,
2297 "negative shift count");
2298 goto rshift_error;
2299 }
2300 wordshift = shiftby / SHIFT;
2301 newsize = ABS(a->ob_size) - wordshift;
2302 if (newsize <= 0) {
2303 z = _PyLong_New(0);
2304 Py_DECREF(a);
2305 Py_DECREF(b);
2306 return (PyObject *)z;
2307 }
2308 loshift = shiftby % SHIFT;
2309 hishift = SHIFT - loshift;
2310 lomask = ((digit)1 << hishift) - 1;
2311 himask = MASK ^ lomask;
2312 z = _PyLong_New(newsize);
2313 if (z == NULL)
2314 goto rshift_error;
2315 if (a->ob_size < 0)
2316 z->ob_size = -(z->ob_size);
2317 for (i = 0, j = wordshift; i < newsize; i++, j++) {
2318 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
2319 if (i+1 < newsize)
2320 z->ob_digit[i] |=
2321 (a->ob_digit[j+1] << hishift) & himask;
2322 }
2323 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002324 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002325rshift_error:
2326 Py_DECREF(a);
2327 Py_DECREF(b);
2328 return (PyObject *) z;
2329
Guido van Rossumc6913e71991-11-19 20:26:46 +00002330}
2331
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002332static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002333long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002334{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002335 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002336 PyLongObject *a, *b;
2337 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002338 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002339 int oldsize, newsize, wordshift, remshift, i, j;
2340 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002341
Neil Schemenauerba872e22001-01-04 01:46:03 +00002342 CONVERT_BINOP(v, w, &a, &b);
2343
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002344 shiftby = PyLong_AsLong((PyObject *)b);
2345 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00002346 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002347 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002348 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002349 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002350 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002351 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002352 PyErr_SetString(PyExc_ValueError,
2353 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002354 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002355 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002356 /* wordshift, remshift = divmod(shiftby, SHIFT) */
2357 wordshift = (int)shiftby / SHIFT;
2358 remshift = (int)shiftby - wordshift * SHIFT;
2359
2360 oldsize = ABS(a->ob_size);
2361 newsize = oldsize + wordshift;
2362 if (remshift)
2363 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002364 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002365 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002366 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002367 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002368 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002369 for (i = 0; i < wordshift; i++)
2370 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002371 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002372 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00002373 accum |= (twodigits)a->ob_digit[j] << remshift;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002374 z->ob_digit[i] = (digit)(accum & MASK);
2375 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002376 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002377 if (remshift)
2378 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002379 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002380 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002381 z = long_normalize(z);
2382lshift_error:
2383 Py_DECREF(a);
2384 Py_DECREF(b);
2385 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002386}
2387
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002388
2389/* Bitwise and/xor/or operations */
2390
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002391static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002392long_bitwise(PyLongObject *a,
2393 int op, /* '&', '|', '^' */
2394 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002395{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002396 digit maska, maskb; /* 0 or MASK */
2397 int negz;
2398 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002399 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002400 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002401 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002402 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002403
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002404 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002405 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002406 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002407 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002408 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002409 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002410 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002411 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002412 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002413 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002414 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002415 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002416 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002417 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002418 maskb = 0;
2419 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002420
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002421 negz = 0;
2422 switch (op) {
2423 case '^':
2424 if (maska != maskb) {
2425 maska ^= MASK;
2426 negz = -1;
2427 }
2428 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002429 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002430 if (maska && maskb) {
2431 op = '|';
2432 maska ^= MASK;
2433 maskb ^= MASK;
2434 negz = -1;
2435 }
2436 break;
2437 case '|':
2438 if (maska || maskb) {
2439 op = '&';
2440 maska ^= MASK;
2441 maskb ^= MASK;
2442 negz = -1;
2443 }
2444 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002445 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002446
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002447 /* JRH: The original logic here was to allocate the result value (z)
2448 as the longer of the two operands. However, there are some cases
2449 where the result is guaranteed to be shorter than that: AND of two
2450 positives, OR of two negatives: use the shorter number. AND with
2451 mixed signs: use the positive number. OR with mixed signs: use the
2452 negative number. After the transformations above, op will be '&'
2453 iff one of these cases applies, and mask will be non-0 for operands
2454 whose length should be ignored.
2455 */
2456
2457 size_a = a->ob_size;
2458 size_b = b->ob_size;
2459 size_z = op == '&'
2460 ? (maska
2461 ? size_b
2462 : (maskb ? size_a : MIN(size_a, size_b)))
2463 : MAX(size_a, size_b);
2464 z = _PyLong_New(size_z);
2465 if (a == NULL || b == NULL || z == NULL) {
2466 Py_XDECREF(a);
2467 Py_XDECREF(b);
2468 Py_XDECREF(z);
2469 return NULL;
2470 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002471
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002472 for (i = 0; i < size_z; ++i) {
2473 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2474 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2475 switch (op) {
2476 case '&': z->ob_digit[i] = diga & digb; break;
2477 case '|': z->ob_digit[i] = diga | digb; break;
2478 case '^': z->ob_digit[i] = diga ^ digb; break;
2479 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002480 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002481
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002482 Py_DECREF(a);
2483 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002484 z = long_normalize(z);
2485 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002486 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002487 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002488 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002489 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002490}
2491
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002492static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002493long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002494{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002495 PyLongObject *a, *b;
2496 PyObject *c;
2497 CONVERT_BINOP(v, w, &a, &b);
2498 c = long_bitwise(a, '&', b);
2499 Py_DECREF(a);
2500 Py_DECREF(b);
2501 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002502}
2503
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002504static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002505long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002506{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002507 PyLongObject *a, *b;
2508 PyObject *c;
2509 CONVERT_BINOP(v, w, &a, &b);
2510 c = long_bitwise(a, '^', b);
2511 Py_DECREF(a);
2512 Py_DECREF(b);
2513 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002514}
2515
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002516static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002517long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002518{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002519 PyLongObject *a, *b;
2520 PyObject *c;
2521 CONVERT_BINOP(v, w, &a, &b);
2522 c = long_bitwise(a, '|', b);
2523 Py_DECREF(a);
2524 Py_DECREF(b);
2525 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002526}
2527
Guido van Rossum234f9421993-06-17 12:35:49 +00002528static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002529long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002530{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002531 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002532 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002533 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002534 return 0;
2535 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002536 else if (PyLong_Check(*pw)) {
2537 Py_INCREF(*pv);
2538 Py_INCREF(*pw);
2539 return 0;
2540 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002541 return 1; /* Can't do it */
2542}
2543
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002544static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002545long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002546{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002547 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002548 return v;
2549}
2550
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002551static PyObject *
Walter Dörwaldf1715402002-11-19 20:49:15 +00002552long_int(PyObject *v)
2553{
2554 long x;
2555 x = PyLong_AsLong(v);
2556 if (PyErr_Occurred()) {
2557 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2558 PyErr_Clear();
2559 if (PyLong_CheckExact(v)) {
2560 Py_INCREF(v);
2561 return v;
2562 }
2563 else
2564 return _PyLong_Copy((PyLongObject *)v);
2565 }
2566 else
2567 return NULL;
2568 }
2569 return PyInt_FromLong(x);
2570}
2571
2572static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002573long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002574{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002575 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002576 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002577 if (result == -1.0 && PyErr_Occurred())
2578 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002579 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002580}
2581
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002582static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002583long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002584{
Fred Drake121ee271999-12-23 15:41:28 +00002585 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002586}
2587
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002588static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002589long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002590{
Fred Drake121ee271999-12-23 15:41:28 +00002591 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002592}
Jeremy Hylton938ace62002-07-17 16:30:39 +00002593
2594static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00002595long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002596
Tim Peters6d6c1a32001-08-02 04:15:00 +00002597static PyObject *
2598long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2599{
2600 PyObject *x = NULL;
2601 int base = -909; /* unlikely! */
2602 static char *kwlist[] = {"x", "base", 0};
2603
Guido van Rossumbef14172001-08-29 15:47:46 +00002604 if (type != &PyLong_Type)
2605 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002606 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2607 &x, &base))
2608 return NULL;
2609 if (x == NULL)
2610 return PyLong_FromLong(0L);
2611 if (base == -909)
2612 return PyNumber_Long(x);
2613 else if (PyString_Check(x))
2614 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002615#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002616 else if (PyUnicode_Check(x))
2617 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2618 PyUnicode_GET_SIZE(x),
2619 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002620#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002621 else {
2622 PyErr_SetString(PyExc_TypeError,
2623 "long() can't convert non-string with explicit base");
2624 return NULL;
2625 }
2626}
2627
Guido van Rossumbef14172001-08-29 15:47:46 +00002628/* Wimpy, slow approach to tp_new calls for subtypes of long:
2629 first create a regular long from whatever arguments we got,
2630 then allocate a subtype instance and initialize it from
2631 the regular long. The regular long is then thrown away.
2632*/
2633static PyObject *
2634long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2635{
2636 PyLongObject *tmp, *new;
2637 int i, n;
2638
2639 assert(PyType_IsSubtype(type, &PyLong_Type));
2640 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2641 if (tmp == NULL)
2642 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002643 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002644 n = tmp->ob_size;
2645 if (n < 0)
2646 n = -n;
2647 new = (PyLongObject *)type->tp_alloc(type, n);
2648 if (new == NULL)
2649 return NULL;
2650 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002651 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002652 for (i = 0; i < n; i++)
2653 new->ob_digit[i] = tmp->ob_digit[i];
2654 Py_DECREF(tmp);
2655 return (PyObject *)new;
2656}
2657
Guido van Rossum5d9113d2003-01-29 17:58:45 +00002658static PyObject *
2659long_getnewargs(PyLongObject *v)
2660{
2661 return Py_BuildValue("(N)", _PyLong_Copy(v));
2662}
2663
2664static PyMethodDef long_methods[] = {
2665 {"__getnewargs__", (PyCFunction)long_getnewargs, METH_NOARGS},
2666 {NULL, NULL} /* sentinel */
2667};
2668
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002669PyDoc_STRVAR(long_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002670"long(x[, base]) -> integer\n\
2671\n\
2672Convert a string or number to a long integer, if possible. A floating\n\
2673point argument will be truncated towards zero (this does not include a\n\
2674string representation of a floating point number!) When converting a\n\
2675string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002676converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002677
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002678static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002679 (binaryfunc) long_add, /*nb_add*/
2680 (binaryfunc) long_sub, /*nb_subtract*/
2681 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002682 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002683 (binaryfunc) long_mod, /*nb_remainder*/
2684 (binaryfunc) long_divmod, /*nb_divmod*/
2685 (ternaryfunc) long_pow, /*nb_power*/
2686 (unaryfunc) long_neg, /*nb_negative*/
2687 (unaryfunc) long_pos, /*tp_positive*/
2688 (unaryfunc) long_abs, /*tp_absolute*/
2689 (inquiry) long_nonzero, /*tp_nonzero*/
2690 (unaryfunc) long_invert, /*nb_invert*/
2691 (binaryfunc) long_lshift, /*nb_lshift*/
2692 (binaryfunc) long_rshift, /*nb_rshift*/
2693 (binaryfunc) long_and, /*nb_and*/
2694 (binaryfunc) long_xor, /*nb_xor*/
2695 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002696 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002697 (unaryfunc) long_int, /*nb_int*/
2698 (unaryfunc) long_long, /*nb_long*/
2699 (unaryfunc) long_float, /*nb_float*/
2700 (unaryfunc) long_oct, /*nb_oct*/
2701 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002702 0, /* nb_inplace_add */
2703 0, /* nb_inplace_subtract */
2704 0, /* nb_inplace_multiply */
2705 0, /* nb_inplace_divide */
2706 0, /* nb_inplace_remainder */
2707 0, /* nb_inplace_power */
2708 0, /* nb_inplace_lshift */
2709 0, /* nb_inplace_rshift */
2710 0, /* nb_inplace_and */
2711 0, /* nb_inplace_xor */
2712 0, /* nb_inplace_or */
2713 (binaryfunc)long_div, /* nb_floor_divide */
2714 long_true_divide, /* nb_true_divide */
2715 0, /* nb_inplace_floor_divide */
2716 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002717};
2718
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002719PyTypeObject PyLong_Type = {
2720 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002721 0, /* ob_size */
2722 "long", /* tp_name */
2723 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2724 sizeof(digit), /* tp_itemsize */
2725 (destructor)long_dealloc, /* tp_dealloc */
2726 0, /* tp_print */
2727 0, /* tp_getattr */
2728 0, /* tp_setattr */
2729 (cmpfunc)long_compare, /* tp_compare */
2730 (reprfunc)long_repr, /* tp_repr */
2731 &long_as_number, /* tp_as_number */
2732 0, /* tp_as_sequence */
2733 0, /* tp_as_mapping */
2734 (hashfunc)long_hash, /* tp_hash */
2735 0, /* tp_call */
2736 (reprfunc)long_str, /* tp_str */
2737 PyObject_GenericGetAttr, /* tp_getattro */
2738 0, /* tp_setattro */
2739 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002740 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2741 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002742 long_doc, /* tp_doc */
2743 0, /* tp_traverse */
2744 0, /* tp_clear */
2745 0, /* tp_richcompare */
2746 0, /* tp_weaklistoffset */
2747 0, /* tp_iter */
2748 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00002749 long_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002750 0, /* tp_members */
2751 0, /* tp_getset */
2752 0, /* tp_base */
2753 0, /* tp_dict */
2754 0, /* tp_descr_get */
2755 0, /* tp_descr_set */
2756 0, /* tp_dictoffset */
2757 0, /* tp_init */
2758 0, /* tp_alloc */
2759 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00002760 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002761};