blob: 856230e3d7cf11408044b33527b03847078a1be0 [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 Rossum23d6f0e1991-05-14 12:06:49 +000031static int ticker; /* XXX Could be shared with ceval? */
32
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000034 if (--ticker < 0) { \
35 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000036 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000037 }
38
Guido van Rossumedcc38a1991-05-05 20:09:44 +000039/* Normalize (remove leading zeros from) a long int object.
40 Doesn't attempt to free the storage--in most cases, due to the nature
41 of the algorithms used, this could save at most be one word anyway. */
42
Guido van Rossumc0b618a1997-05-02 03:12:38 +000043static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000044long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000045{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000046 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000047 register int i = j;
Tim Peters5af4e6c2002-08-12 02:31:19 +000048
Guido van Rossumedcc38a1991-05-05 20:09:44 +000049 while (i > 0 && v->ob_digit[i-1] == 0)
50 --i;
51 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000052 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000053 return v;
54}
55
56/* Allocate a new long int object with size digits.
57 Return NULL and set exception if we run out of memory. */
58
Guido van Rossumc0b618a1997-05-02 03:12:38 +000059PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000060_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000061{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000063}
64
Tim Peters64b5ce32001-09-10 20:52:51 +000065PyObject *
66_PyLong_Copy(PyLongObject *src)
67{
68 PyLongObject *result;
69 int i;
70
71 assert(src != NULL);
72 i = src->ob_size;
73 if (i < 0)
74 i = -(i);
75 result = _PyLong_New(i);
76 if (result != NULL) {
Tim Peters5329cdb2002-03-02 04:18:04 +000077 result->ob_size = src->ob_size;
Tim Peters64b5ce32001-09-10 20:52:51 +000078 while (--i >= 0)
79 result->ob_digit[i] = src->ob_digit[i];
80 }
81 return (PyObject *)result;
82}
83
Guido van Rossumedcc38a1991-05-05 20:09:44 +000084/* Create a new long int object from a C long int */
85
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000087PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000088{
Tim Petersce9de2f2001-06-14 04:56:19 +000089 PyLongObject *v;
90 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
91 int ndigits = 0;
92 int negative = 0;
93
94 if (ival < 0) {
95 ival = -ival;
96 negative = 1;
97 }
98
99 /* Count the number of Python digits.
100 We used to pick 5 ("big enough for anything"), but that's a
101 waste of time and space given that 5*15 = 75 bits are rarely
102 needed. */
103 t = (unsigned long)ival;
104 while (t) {
105 ++ndigits;
106 t >>= SHIFT;
107 }
108 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000109 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000110 digit *p = v->ob_digit;
111 v->ob_size = negative ? -ndigits : ndigits;
112 t = (unsigned long)ival;
113 while (t) {
114 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000115 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000116 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000117 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000119}
120
Guido van Rossum53756b11997-01-03 17:14:46 +0000121/* Create a new long int object from a C unsigned long int */
122
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000124PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +0000125{
Tim Petersce9de2f2001-06-14 04:56:19 +0000126 PyLongObject *v;
127 unsigned long t;
128 int ndigits = 0;
129
130 /* Count the number of Python digits. */
131 t = (unsigned long)ival;
132 while (t) {
133 ++ndigits;
134 t >>= SHIFT;
135 }
136 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000137 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000138 digit *p = v->ob_digit;
139 v->ob_size = ndigits;
140 while (ival) {
141 *p++ = (digit)(ival & MASK);
142 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000143 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000144 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000145 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000146}
147
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000148/* Create a new long int object from a C double */
149
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000152{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000153 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000154 double frac;
155 int i, ndig, expo, neg;
156 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000157 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000158 PyErr_SetString(PyExc_OverflowError,
159 "cannot convert float infinity to long");
160 return NULL;
161 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000162 if (dval < 0.0) {
163 neg = 1;
164 dval = -dval;
165 }
166 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
167 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000169 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000171 if (v == NULL)
172 return NULL;
173 frac = ldexp(frac, (expo-1) % SHIFT + 1);
174 for (i = ndig; --i >= 0; ) {
175 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000176 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000177 frac = frac - (double)bits;
178 frac = ldexp(frac, SHIFT);
179 }
180 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000181 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000183}
184
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000185/* Get a C long int from a long int object.
186 Returns -1 and sets an error condition if overflow occurs. */
187
188long
Tim Peters9f688bf2000-07-07 15:53:28 +0000189PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000190{
Guido van Rossumf7531811998-05-26 14:33:37 +0000191 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000193 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000194 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000195
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 if (vv == NULL || !PyLong_Check(vv)) {
Guido van Rossum7e35d572001-09-15 03:14:32 +0000197 if (vv != NULL && PyInt_Check(vv))
198 return PyInt_AsLong(vv);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000199 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000200 return -1;
201 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000202 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000203 i = v->ob_size;
204 sign = 1;
205 x = 0;
206 if (i < 0) {
207 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000208 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000209 }
210 while (--i >= 0) {
211 prev = x;
212 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000213 if ((x >> SHIFT) != prev)
214 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000215 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000216 /* Haven't lost any bits, but if the sign bit is set we're in
217 * trouble *unless* this is the min negative number. So,
218 * trouble iff sign bit set && (positive || some bit set other
219 * than the sign bit).
220 */
221 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
222 goto overflow;
223 return (long)x * sign;
224
225 overflow:
226 PyErr_SetString(PyExc_OverflowError,
Skip Montanarobafedec2001-09-13 19:05:30 +0000227 "long int too large to convert to int");
Guido van Rossumf7531811998-05-26 14:33:37 +0000228 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000229}
230
Guido van Rossumd8c80482002-08-13 00:24:58 +0000231/* Get a C unsigned long int from a long int object.
Guido van Rossum53756b11997-01-03 17:14:46 +0000232 Returns -1 and sets an error condition if overflow occurs. */
233
234unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000235PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000236{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000238 unsigned long x, prev;
239 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000240
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241 if (vv == NULL || !PyLong_Check(vv)) {
242 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000243 return (unsigned long) -1;
244 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000245 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000246 i = v->ob_size;
247 x = 0;
248 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000249 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000250 "can't convert negative value to unsigned long");
251 return (unsigned long) -1;
252 }
253 while (--i >= 0) {
254 prev = x;
255 x = (x << SHIFT) + v->ob_digit[i];
256 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000257 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000258 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000259 return (unsigned long) -1;
260 }
261 }
262 return x;
263}
264
Tim Peters2a9b3672001-06-11 21:23:58 +0000265PyObject *
266_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
267 int little_endian, int is_signed)
268{
269 const unsigned char* pstartbyte;/* LSB of bytes */
270 int incr; /* direction to move pstartbyte */
271 const unsigned char* pendbyte; /* MSB of bytes */
272 size_t numsignificantbytes; /* number of bytes that matter */
273 size_t ndigits; /* number of Python long digits */
274 PyLongObject* v; /* result */
275 int idigit = 0; /* next free index in v->ob_digit */
276
277 if (n == 0)
278 return PyLong_FromLong(0L);
279
280 if (little_endian) {
281 pstartbyte = bytes;
282 pendbyte = bytes + n - 1;
283 incr = 1;
284 }
285 else {
286 pstartbyte = bytes + n - 1;
287 pendbyte = bytes;
288 incr = -1;
289 }
290
291 if (is_signed)
292 is_signed = *pendbyte >= 0x80;
293
294 /* Compute numsignificantbytes. This consists of finding the most
295 significant byte. Leading 0 bytes are insignficant if the number
296 is positive, and leading 0xff bytes if negative. */
297 {
298 size_t i;
299 const unsigned char* p = pendbyte;
300 const int pincr = -incr; /* search MSB to LSB */
301 const unsigned char insignficant = is_signed ? 0xff : 0x00;
302
303 for (i = 0; i < n; ++i, p += pincr) {
304 if (*p != insignficant)
305 break;
306 }
307 numsignificantbytes = n - i;
308 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
309 actually has 2 significant bytes. OTOH, 0xff0001 ==
310 -0x00ffff, so we wouldn't *need* to bump it there; but we
311 do for 0xffff = -0x0001. To be safe without bothering to
312 check every case, bump it regardless. */
313 if (is_signed && numsignificantbytes < n)
314 ++numsignificantbytes;
315 }
316
317 /* How many Python long digits do we need? We have
318 8*numsignificantbytes bits, and each Python long digit has SHIFT
319 bits, so it's the ceiling of the quotient. */
320 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
321 if (ndigits > (size_t)INT_MAX)
322 return PyErr_NoMemory();
323 v = _PyLong_New((int)ndigits);
324 if (v == NULL)
325 return NULL;
326
327 /* Copy the bits over. The tricky parts are computing 2's-comp on
328 the fly for signed numbers, and dealing with the mismatch between
329 8-bit bytes and (probably) 15-bit Python digits.*/
330 {
331 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000332 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000333 twodigits accum = 0; /* sliding register */
334 unsigned int accumbits = 0; /* number of bits in accum */
335 const unsigned char* p = pstartbyte;
336
337 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000338 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000339 /* Compute correction for 2's comp, if needed. */
340 if (is_signed) {
341 thisbyte = (0xff ^ thisbyte) + carry;
342 carry = thisbyte >> 8;
343 thisbyte &= 0xff;
344 }
345 /* Because we're going LSB to MSB, thisbyte is
346 more significant than what's already in accum,
347 so needs to be prepended to accum. */
348 accum |= thisbyte << accumbits;
349 accumbits += 8;
350 if (accumbits >= SHIFT) {
351 /* There's enough to fill a Python digit. */
352 assert(idigit < (int)ndigits);
353 v->ob_digit[idigit] = (digit)(accum & MASK);
354 ++idigit;
355 accum >>= SHIFT;
356 accumbits -= SHIFT;
357 assert(accumbits < SHIFT);
358 }
359 }
360 assert(accumbits < SHIFT);
361 if (accumbits) {
362 assert(idigit < (int)ndigits);
363 v->ob_digit[idigit] = (digit)accum;
364 ++idigit;
365 }
366 }
367
368 v->ob_size = is_signed ? -idigit : idigit;
369 return (PyObject *)long_normalize(v);
370}
371
372int
373_PyLong_AsByteArray(PyLongObject* v,
374 unsigned char* bytes, size_t n,
375 int little_endian, int is_signed)
376{
377 int i; /* index into v->ob_digit */
378 int ndigits; /* |v->ob_size| */
379 twodigits accum; /* sliding register */
380 unsigned int accumbits; /* # bits in accum */
381 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
382 twodigits carry; /* for computing 2's-comp */
383 size_t j; /* # bytes filled */
384 unsigned char* p; /* pointer to next byte in bytes */
385 int pincr; /* direction to move p */
386
387 assert(v != NULL && PyLong_Check(v));
388
389 if (v->ob_size < 0) {
390 ndigits = -(v->ob_size);
391 if (!is_signed) {
392 PyErr_SetString(PyExc_TypeError,
393 "can't convert negative long to unsigned");
394 return -1;
395 }
396 do_twos_comp = 1;
397 }
398 else {
399 ndigits = v->ob_size;
400 do_twos_comp = 0;
401 }
402
403 if (little_endian) {
404 p = bytes;
405 pincr = 1;
406 }
407 else {
408 p = bytes + n - 1;
409 pincr = -1;
410 }
411
Tim Peters898cf852001-06-13 20:50:08 +0000412 /* Copy over all the Python digits.
413 It's crucial that every Python digit except for the MSD contribute
414 exactly SHIFT bits to the total, so first assert that the long is
415 normalized. */
416 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000417 j = 0;
418 accum = 0;
419 accumbits = 0;
420 carry = do_twos_comp ? 1 : 0;
421 for (i = 0; i < ndigits; ++i) {
422 twodigits thisdigit = v->ob_digit[i];
423 if (do_twos_comp) {
424 thisdigit = (thisdigit ^ MASK) + carry;
425 carry = thisdigit >> SHIFT;
426 thisdigit &= MASK;
427 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000428 /* Because we're going LSB to MSB, thisdigit is more
429 significant than what's already in accum, so needs to be
430 prepended to accum. */
431 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000432 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000433
Tim Petersede05092001-06-14 08:53:38 +0000434 /* The most-significant digit may be (probably is) at least
435 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000436 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000437 /* Count # of sign bits -- they needn't be stored,
438 * although for signed conversion we need later to
439 * make sure at least one sign bit gets stored.
440 * First shift conceptual sign bit to real sign bit.
441 */
442 stwodigits s = (stwodigits)(thisdigit <<
443 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000444 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000445 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000446 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000447 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000448 }
Tim Petersede05092001-06-14 08:53:38 +0000449 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000450 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000451
Tim Peters2a9b3672001-06-11 21:23:58 +0000452 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000453 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000454 if (j >= n)
455 goto Overflow;
456 ++j;
457 *p = (unsigned char)(accum & 0xff);
458 p += pincr;
459 accumbits -= 8;
460 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000461 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000462 }
463
464 /* Store the straggler (if any). */
465 assert(accumbits < 8);
466 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000467 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000468 if (j >= n)
469 goto Overflow;
470 ++j;
471 if (do_twos_comp) {
472 /* Fill leading bits of the byte with sign bits
473 (appropriately pretending that the long had an
474 infinite supply of sign bits). */
475 accum |= (~(twodigits)0) << accumbits;
476 }
477 *p = (unsigned char)(accum & 0xff);
478 p += pincr;
479 }
Tim Peters05607ad2001-06-13 21:01:27 +0000480 else if (j == n && n > 0 && is_signed) {
481 /* The main loop filled the byte array exactly, so the code
482 just above didn't get to ensure there's a sign bit, and the
483 loop below wouldn't add one either. Make sure a sign bit
484 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000485 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000486 int sign_bit_set = msb >= 0x80;
487 assert(accumbits == 0);
488 if (sign_bit_set == do_twos_comp)
489 return 0;
490 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000491 goto Overflow;
492 }
Tim Peters05607ad2001-06-13 21:01:27 +0000493
494 /* Fill remaining bytes with copies of the sign bit. */
495 {
496 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
497 for ( ; j < n; ++j, p += pincr)
498 *p = signbyte;
499 }
500
Tim Peters2a9b3672001-06-11 21:23:58 +0000501 return 0;
502
503Overflow:
504 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
505 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000506
Tim Peters2a9b3672001-06-11 21:23:58 +0000507}
508
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000509double
510_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
511{
512/* NBITS_WANTED should be > the number of bits in a double's precision,
513 but small enough so that 2**NBITS_WANTED is within the normal double
514 range. nbitsneeded is set to 1 less than that because the most-significant
515 Python digit contains at least 1 significant bit, but we don't want to
516 bother counting them (catering to the worst case cheaply).
517
518 57 is one more than VAX-D double precision; I (Tim) don't know of a double
519 format with more precision than that; it's 1 larger so that we add in at
520 least one round bit to stand in for the ignored least-significant bits.
521*/
522#define NBITS_WANTED 57
523 PyLongObject *v;
524 double x;
525 const double multiplier = (double)(1L << SHIFT);
526 int i, sign;
527 int nbitsneeded;
528
529 if (vv == NULL || !PyLong_Check(vv)) {
530 PyErr_BadInternalCall();
531 return -1;
532 }
533 v = (PyLongObject *)vv;
534 i = v->ob_size;
535 sign = 1;
536 if (i < 0) {
537 sign = -1;
538 i = -(i);
539 }
540 else if (i == 0) {
541 *exponent = 0;
542 return 0.0;
543 }
544 --i;
545 x = (double)v->ob_digit[i];
546 nbitsneeded = NBITS_WANTED - 1;
547 /* Invariant: i Python digits remain unaccounted for. */
548 while (i > 0 && nbitsneeded > 0) {
549 --i;
550 x = x * multiplier + (double)v->ob_digit[i];
551 nbitsneeded -= SHIFT;
552 }
553 /* There are i digits we didn't shift in. Pretending they're all
554 zeroes, the true value is x * 2**(i*SHIFT). */
555 *exponent = i;
556 assert(x > 0.0);
557 return x * sign;
558#undef NBITS_WANTED
559}
560
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000561/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000562
563double
Tim Peters9f688bf2000-07-07 15:53:28 +0000564PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000565{
Tim Peters9fffa3e2001-09-04 05:14:19 +0000566 int e;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000567 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000568
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 if (vv == NULL || !PyLong_Check(vv)) {
570 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000571 return -1;
572 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000573 x = _PyLong_AsScaledDouble(vv, &e);
574 if (x == -1.0 && PyErr_Occurred())
575 return -1.0;
576 if (e > INT_MAX / SHIFT)
577 goto overflow;
578 errno = 0;
579 x = ldexp(x, e * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000580 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000581 goto overflow;
582 return x;
583
584overflow:
585 PyErr_SetString(PyExc_OverflowError,
586 "long int too large to convert to float");
587 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000588}
589
Guido van Rossum78694d91998-09-18 14:14:13 +0000590/* Create a new long (or int) object from a C pointer */
591
592PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000593PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000594{
Tim Peters70128a12001-06-16 08:48:40 +0000595#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000596 return PyInt_FromLong((long)p);
597#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000598
Tim Peters70128a12001-06-16 08:48:40 +0000599#ifndef HAVE_LONG_LONG
600# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
601#endif
602#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
603# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
604#endif
605 /* optimize null pointers */
606 if (p == NULL)
607 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000608 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000609
610#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000611}
612
613/* Get a C pointer from a long object (or an int object in some cases) */
614
615void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000616PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000617{
618 /* This function will allow int or long objects. If vv is neither,
619 then the PyLong_AsLong*() functions will raise the exception:
620 PyExc_SystemError, "bad argument to internal function"
621 */
Tim Peters70128a12001-06-16 08:48:40 +0000622#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000623 long x;
624
Tim Peters70128a12001-06-16 08:48:40 +0000625 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000626 x = PyInt_AS_LONG(vv);
627 else
628 x = PyLong_AsLong(vv);
629#else
Tim Peters70128a12001-06-16 08:48:40 +0000630
631#ifndef HAVE_LONG_LONG
632# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
633#endif
634#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
635# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
636#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000637 LONG_LONG x;
638
Tim Peters70128a12001-06-16 08:48:40 +0000639 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000640 x = PyInt_AS_LONG(vv);
641 else
642 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000643
644#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000645
646 if (x == -1 && PyErr_Occurred())
647 return NULL;
648 return (void *)x;
649}
650
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000651#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000652
653/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
654 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000655 */
656
Tim Peterscf37dfc2001-06-14 18:42:50 +0000657#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000658
659/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000660
661PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000662PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000663{
Tim Petersd1a7da62001-06-13 00:35:57 +0000664 LONG_LONG bytes = ival;
665 int one = 1;
666 return _PyLong_FromByteArray(
667 (unsigned char *)&bytes,
668 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000669}
670
Tim Petersd1a7da62001-06-13 00:35:57 +0000671/* Create a new long int object from a C unsigned LONG_LONG int. */
672
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000673PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000674PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000675{
Tim Petersd1a7da62001-06-13 00:35:57 +0000676 unsigned LONG_LONG bytes = ival;
677 int one = 1;
678 return _PyLong_FromByteArray(
679 (unsigned char *)&bytes,
680 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000681}
682
Guido van Rossum3293b071998-08-25 16:07:15 +0000683/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000684 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000685
Guido van Rossum3293b071998-08-25 16:07:15 +0000686LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000687PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000688{
Tim Petersd1a7da62001-06-13 00:35:57 +0000689 LONG_LONG bytes;
690 int one = 1;
691 int res;
692
Tim Petersd38b1c72001-09-30 05:09:37 +0000693 if (vv == NULL) {
694 PyErr_BadInternalCall();
695 return -1;
696 }
697 if (!PyLong_Check(vv)) {
698 if (PyInt_Check(vv))
699 return (LONG_LONG)PyInt_AsLong(vv);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000700 PyErr_BadInternalCall();
701 return -1;
702 }
703
Tim Petersd1a7da62001-06-13 00:35:57 +0000704 res = _PyLong_AsByteArray(
705 (PyLongObject *)vv, (unsigned char *)&bytes,
706 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000707
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000708 /* Plan 9 can't handle LONG_LONG in ? : expressions */
709 if (res < 0)
Jeremy Hyltonc4ad0bc2002-04-23 20:01:20 +0000710 return (LONG_LONG)-1;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000711 else
712 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000713}
714
Tim Petersd1a7da62001-06-13 00:35:57 +0000715/* Get a C unsigned LONG_LONG int from a long int object.
716 Return -1 and set an error if overflow occurs. */
717
Guido van Rossum3293b071998-08-25 16:07:15 +0000718unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000719PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000720{
Tim Petersd1a7da62001-06-13 00:35:57 +0000721 unsigned LONG_LONG bytes;
722 int one = 1;
723 int res;
724
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000725 if (vv == NULL || !PyLong_Check(vv)) {
726 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000727 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000728 }
729
Tim Petersd1a7da62001-06-13 00:35:57 +0000730 res = _PyLong_AsByteArray(
731 (PyLongObject *)vv, (unsigned char *)&bytes,
732 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000733
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000734 /* Plan 9 can't handle LONG_LONG in ? : expressions */
735 if (res < 0)
736 return (unsigned LONG_LONG)res;
737 else
738 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000739}
Tim Petersd1a7da62001-06-13 00:35:57 +0000740
741#undef IS_LITTLE_ENDIAN
742
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000743#endif /* HAVE_LONG_LONG */
744
Neil Schemenauerba872e22001-01-04 01:46:03 +0000745
746static int
747convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
Tim Peters5af4e6c2002-08-12 02:31:19 +0000748 if (PyLong_Check(v)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000749 *a = (PyLongObject *) v;
750 Py_INCREF(v);
751 }
752 else if (PyInt_Check(v)) {
753 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
754 }
755 else {
756 return 0;
757 }
Tim Peters5af4e6c2002-08-12 02:31:19 +0000758 if (PyLong_Check(w)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000759 *b = (PyLongObject *) w;
760 Py_INCREF(w);
761 }
762 else if (PyInt_Check(w)) {
763 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
764 }
765 else {
766 Py_DECREF(*a);
767 return 0;
768 }
769 return 1;
770}
771
772#define CONVERT_BINOP(v, w, a, b) \
773 if (!convert_binop(v, w, a, b)) { \
774 Py_INCREF(Py_NotImplemented); \
775 return Py_NotImplemented; \
776 }
777
Tim Peters877a2122002-08-12 05:09:36 +0000778/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
779 * is modified in place, by adding y to it. Carries are propagated as far as
780 * x[m-1], and the remaining carry (0 or 1) is returned.
781 */
782static digit
783v_iadd(digit *x, int m, digit *y, int n)
784{
785 int i;
786 digit carry = 0;
787
788 assert(m >= n);
789 for (i = 0; i < n; ++i) {
790 carry += x[i] + y[i];
791 x[i] = carry & MASK;
792 carry >>= SHIFT;
793 assert((carry & 1) == carry);
794 }
795 for (; carry && i < m; ++i) {
796 carry += x[i];
797 x[i] = carry & MASK;
798 carry >>= SHIFT;
799 assert((carry & 1) == carry);
800 }
801 return carry;
802}
803
804/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
805 * is modified in place, by subtracting y from it. Borrows are propagated as
806 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
807 */
808static digit
809v_isub(digit *x, int m, digit *y, int n)
810{
811 int i;
812 digit borrow = 0;
813
814 assert(m >= n);
815 for (i = 0; i < n; ++i) {
816 borrow = x[i] - y[i] - borrow;
817 x[i] = borrow & MASK;
818 borrow >>= SHIFT;
819 borrow &= 1; /* keep only 1 sign bit */
820 }
821 for (; borrow && i < m; ++i) {
822 borrow = x[i] - borrow;
823 x[i] = borrow & MASK;
824 borrow >>= SHIFT;
825 borrow &= 1;
826 }
827 return borrow;
828}
Neil Schemenauerba872e22001-01-04 01:46:03 +0000829
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000830/* Multiply by a single digit, ignoring the sign. */
831
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000832static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000833mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000834{
835 return muladd1(a, n, (digit)0);
836}
837
838/* Multiply by a single digit and add a single digit, ignoring the sign. */
839
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000841muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000842{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000843 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000845 twodigits carry = extra;
846 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000847
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000848 if (z == NULL)
849 return NULL;
850 for (i = 0; i < size_a; ++i) {
851 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000852 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000853 carry >>= SHIFT;
854 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000855 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000856 return long_normalize(z);
857}
858
Tim Peters212e6142001-07-14 12:23:19 +0000859/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
860 in pout, and returning the remainder. pin and pout point at the LSD.
861 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
862 long_format, but that should be done with great care since longs are
863 immutable. */
864
865static digit
866inplace_divrem1(digit *pout, digit *pin, int size, digit n)
867{
868 twodigits rem = 0;
869
870 assert(n > 0 && n <= MASK);
871 pin += size;
872 pout += size;
873 while (--size >= 0) {
874 digit hi;
875 rem = (rem << SHIFT) + *--pin;
876 *--pout = hi = (digit)(rem / n);
877 rem -= hi * n;
878 }
879 return (digit)rem;
880}
881
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000882/* Divide a long integer by a digit, returning both the quotient
883 (as function result) and the remainder (through *prem).
884 The sign of a is ignored; n should not be zero. */
885
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000886static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000887divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000888{
Tim Peters212e6142001-07-14 12:23:19 +0000889 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000890 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000891
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000892 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000894 if (z == NULL)
895 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000896 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000897 return long_normalize(z);
898}
899
900/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000901 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000902 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000903
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000905long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000906{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907 register PyLongObject *a = (PyLongObject *)aa;
908 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000909 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000910 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000911 char *p;
912 int bits;
913 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000914
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915 if (a == NULL || !PyLong_Check(a)) {
916 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000917 return NULL;
918 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000919 assert(base >= 2 && base <= 36);
Tim Peters5af4e6c2002-08-12 02:31:19 +0000920
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000921 /* Compute a rough upper bound for the length of the string */
922 i = base;
923 bits = 0;
924 while (i > 1) {
925 ++bits;
926 i >>= 1;
927 }
Fred Drake121ee271999-12-23 15:41:28 +0000928 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000930 if (str == NULL)
931 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000933 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000934 if (addL)
935 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000936 if (a->ob_size < 0)
937 sign = '-';
Tim Peters5af4e6c2002-08-12 02:31:19 +0000938
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000939 if (a->ob_size == 0) {
940 *--p = '0';
941 }
942 else if ((base & (base - 1)) == 0) {
943 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000944 twodigits accum = 0;
945 int accumbits = 0; /* # of bits in accum */
946 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000947 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000948 while ((i >>= 1) > 1)
949 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000950
951 for (i = 0; i < size_a; ++i) {
952 accum |= a->ob_digit[i] << accumbits;
953 accumbits += SHIFT;
954 assert(accumbits >= basebits);
955 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000956 char cdigit = (char)(accum & (base - 1));
957 cdigit += (cdigit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000958 assert(p > PyString_AS_STRING(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000959 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +0000960 accumbits -= basebits;
961 accum >>= basebits;
962 } while (i < size_a-1 ? accumbits >= basebits :
963 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000964 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000965 }
966 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000967 /* Not 0, and base not a power of 2. Divide repeatedly by
968 base, but for speed use the highest power of base that
969 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000970 int size = size_a;
971 digit *pin = a->ob_digit;
972 PyLongObject *scratch;
973 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000974 digit powbase = base; /* powbase == base ** power */
975 int power = 1;
976 for (;;) {
977 unsigned long newpow = powbase * (unsigned long)base;
978 if (newpow >> SHIFT) /* doesn't fit in a digit */
979 break;
980 powbase = (digit)newpow;
981 ++power;
982 }
Tim Peters212e6142001-07-14 12:23:19 +0000983
984 /* Get a scratch area for repeated division. */
985 scratch = _PyLong_New(size);
986 if (scratch == NULL) {
987 Py_DECREF(str);
988 return NULL;
989 }
990
991 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000992 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000993 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000994 digit rem = inplace_divrem1(scratch->ob_digit,
995 pin, size, powbase);
996 pin = scratch->ob_digit; /* no need to use a again */
997 if (pin[size - 1] == 0)
998 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000999 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +00001000 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001001 Py_DECREF(str);
1002 return NULL;
1003 })
Tim Peters212e6142001-07-14 12:23:19 +00001004
1005 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001006 assert(ntostore > 0);
1007 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001008 digit nextrem = (digit)(rem / base);
1009 char c = (char)(rem - nextrem * base);
1010 assert(p > PyString_AS_STRING(str));
1011 c += (c < 10) ? '0' : 'A'-10;
1012 *--p = c;
1013 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001014 --ntostore;
1015 /* Termination is a bit delicate: must not
1016 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +00001017 remaining quotient and rem are both 0. */
1018 } while (ntostore && (size || rem));
1019 } while (size != 0);
1020 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001021 }
1022
Guido van Rossum2c475421992-08-14 15:13:07 +00001023 if (base == 8) {
1024 if (size_a != 0)
1025 *--p = '0';
1026 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +00001027 else if (base == 16) {
1028 *--p = 'x';
1029 *--p = '0';
1030 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001031 else if (base != 10) {
1032 *--p = '#';
1033 *--p = '0' + base%10;
1034 if (base > 10)
1035 *--p = '0' + base/10;
1036 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001037 if (sign)
1038 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001039 if (p != PyString_AS_STRING(str)) {
1040 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001041 assert(p > q);
1042 do {
1043 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001044 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 _PyString_Resize((PyObject **)&str,
1046 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001047 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001048 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001049}
1050
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001051PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001052PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001053{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001054 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001055 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001057
Guido van Rossum472c04f1996-12-05 21:57:21 +00001058 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001060 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001061 return NULL;
1062 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001063 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001064 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001065 if (*str == '+')
1066 ++str;
1067 else if (*str == '-') {
1068 ++str;
1069 sign = -1;
1070 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001071 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001072 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001073 if (base == 0) {
1074 if (str[0] != '0')
1075 base = 10;
1076 else if (str[1] == 'x' || str[1] == 'X')
1077 base = 16;
1078 else
1079 base = 8;
1080 }
1081 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1082 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001083 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +00001084 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001085 for ( ; z != NULL; ++str) {
1086 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001087 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001088
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001089 if (*str <= '9')
1090 k = *str - '0';
1091 else if (*str >= 'a')
1092 k = *str - 'a' + 10;
1093 else if (*str >= 'A')
1094 k = *str - 'A' + 10;
1095 if (k < 0 || k >= base)
1096 break;
1097 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001098 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001099 z = temp;
1100 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001101 if (z == NULL)
1102 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001103 if (str == start)
1104 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001105 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001106 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001107 if (*str == 'L' || *str == 'l')
1108 str++;
1109 while (*str && isspace(Py_CHARMASK(*str)))
1110 str++;
1111 if (*str != '\0')
1112 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001113 if (pend)
1114 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001115 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001116
1117 onError:
Tim Peters5af4e6c2002-08-12 02:31:19 +00001118 PyErr_Format(PyExc_ValueError,
Guido van Rossum9e896b32000-04-05 20:11:21 +00001119 "invalid literal for long(): %.200s", orig_str);
1120 Py_XDECREF(z);
1121 return NULL;
1122}
1123
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001124#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001125PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001126PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001127{
1128 char buffer[256];
1129
1130 if (length >= sizeof(buffer)) {
1131 PyErr_SetString(PyExc_ValueError,
1132 "long() literal too large to convert");
1133 return NULL;
1134 }
1135 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
1136 return NULL;
1137
1138 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001139}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001140#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001141
Tim Peters9f688bf2000-07-07 15:53:28 +00001142/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001144 (PyLongObject *, PyLongObject *, PyLongObject **);
1145static PyObject *long_pos(PyLongObject *);
1146static int long_divrem(PyLongObject *, PyLongObject *,
1147 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001148
1149/* Long division with remainder, top-level routine */
1150
Guido van Rossume32e0141992-01-19 16:31:05 +00001151static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001152long_divrem(PyLongObject *a, PyLongObject *b,
1153 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001154{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001155 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001156 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001157
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001158 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001159 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001160 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001161 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001162 }
1163 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001164 (size_a == size_b &&
1165 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001166 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001167 *pdiv = _PyLong_New(0);
1168 Py_INCREF(a);
1169 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001170 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001171 }
1172 if (size_b == 1) {
1173 digit rem = 0;
1174 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001175 if (z == NULL)
1176 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001177 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001178 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001179 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001180 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001181 if (z == NULL)
1182 return -1;
1183 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001184 /* Set the signs.
1185 The quotient z has the sign of a*b;
1186 the remainder r has the sign of a,
1187 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001188 if ((a->ob_size < 0) != (b->ob_size < 0))
1189 z->ob_size = -(z->ob_size);
1190 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1191 (*prem)->ob_size = -((*prem)->ob_size);
1192 *pdiv = z;
1193 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001194}
1195
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001196/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001197
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001198static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001199x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001200{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001201 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001202 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 PyLongObject *v = mul1(v1, d);
1204 PyLongObject *w = mul1(w1, d);
1205 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001206 int j, k;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001207
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001208 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001209 Py_XDECREF(v);
1210 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001211 return NULL;
1212 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001213
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001214 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001215 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001216 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001217
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001218 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219 a = _PyLong_New(size_v - size_w + 1);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001220
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001221 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1222 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1223 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001224 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001225 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001226
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001227 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001229 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001230 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001231 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001232 if (vj == w->ob_digit[size_w-1])
1233 q = MASK;
1234 else
1235 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1236 w->ob_digit[size_w-1];
Tim Peters5af4e6c2002-08-12 02:31:19 +00001237
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001238 while (w->ob_digit[size_w-2]*q >
1239 ((
1240 ((twodigits)vj << SHIFT)
1241 + v->ob_digit[j-1]
1242 - q*w->ob_digit[size_w-1]
1243 ) << SHIFT)
1244 + v->ob_digit[j-2])
1245 --q;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001246
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001247 for (i = 0; i < size_w && i+k < size_v; ++i) {
1248 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001249 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 carry += v->ob_digit[i+k] - z
1251 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001252 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001253 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1254 carry, SHIFT);
1255 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001256 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001257
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001258 if (i+k < size_v) {
1259 carry += v->ob_digit[i+k];
1260 v->ob_digit[i+k] = 0;
1261 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001262
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001263 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001264 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001265 else {
1266 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001267 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001268 carry = 0;
1269 for (i = 0; i < size_w && i+k < size_v; ++i) {
1270 carry += v->ob_digit[i+k] + w->ob_digit[i];
1271 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001272 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1273 BASE_TWODIGITS_TYPE,
1274 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001275 }
1276 }
1277 } /* for j, k */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001278
Guido van Rossumc206c761995-01-10 15:23:19 +00001279 if (a == NULL)
1280 *prem = NULL;
1281 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001282 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001283 *prem = divrem1(v, d, &d);
1284 /* d receives the (unused) remainder */
1285 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001286 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001287 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001288 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001289 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290 Py_DECREF(v);
1291 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001292 return a;
1293}
1294
1295/* Methods */
1296
1297static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001298long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001299{
Guido van Rossum9475a232001-10-05 20:51:39 +00001300 v->ob_type->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001301}
1302
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001304long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001305{
Fred Drake121ee271999-12-23 15:41:28 +00001306 return long_format(v, 10, 1);
1307}
1308
1309static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001310long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001311{
1312 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001313}
1314
1315static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001316long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001317{
1318 int sign;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001319
Guido van Rossumc6913e71991-11-19 20:26:46 +00001320 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001321 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001322 sign = 0;
1323 else
1324 sign = a->ob_size - b->ob_size;
1325 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001326 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001327 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001328 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1329 ;
1330 if (i < 0)
1331 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001332 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001333 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001334 if (a->ob_size < 0)
1335 sign = -sign;
1336 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001337 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001338 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001339}
1340
Guido van Rossum9bfef441993-03-29 10:43:31 +00001341static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001342long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001343{
1344 long x;
1345 int i, sign;
1346
1347 /* This is designed so that Python ints and longs with the
1348 same value hash to the same value, otherwise comparisons
1349 of mapping keys will turn out weird */
1350 i = v->ob_size;
1351 sign = 1;
1352 x = 0;
1353 if (i < 0) {
1354 sign = -1;
1355 i = -(i);
1356 }
1357 while (--i >= 0) {
1358 /* Force a 32-bit circular shift */
1359 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1360 x += v->ob_digit[i];
1361 }
1362 x = x * sign;
1363 if (x == -1)
1364 x = -2;
1365 return x;
1366}
1367
1368
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001369/* Add the absolute values of two long integers. */
1370
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001372x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001373{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001374 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001376 int i;
1377 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001378
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001379 /* Ensure a is the larger of the two: */
1380 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001381 { PyLongObject *temp = a; a = b; b = temp; }
1382 { int size_temp = size_a;
1383 size_a = size_b;
1384 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001385 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001386 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001387 if (z == NULL)
1388 return NULL;
1389 for (i = 0; i < size_b; ++i) {
1390 carry += a->ob_digit[i] + b->ob_digit[i];
1391 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001392 carry >>= SHIFT;
1393 }
1394 for (; i < size_a; ++i) {
1395 carry += a->ob_digit[i];
1396 z->ob_digit[i] = carry & MASK;
1397 carry >>= SHIFT;
1398 }
1399 z->ob_digit[i] = carry;
1400 return long_normalize(z);
1401}
1402
1403/* Subtract the absolute values of two integers. */
1404
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001406x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001407{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001408 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001409 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001410 int i;
1411 int sign = 1;
1412 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001413
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001414 /* Ensure a is the larger of the two: */
1415 if (size_a < size_b) {
1416 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417 { PyLongObject *temp = a; a = b; b = temp; }
1418 { int size_temp = size_a;
1419 size_a = size_b;
1420 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001421 }
1422 else if (size_a == size_b) {
1423 /* Find highest digit where a and b differ: */
1424 i = size_a;
1425 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1426 ;
1427 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001428 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001429 if (a->ob_digit[i] < b->ob_digit[i]) {
1430 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001431 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001432 }
1433 size_a = size_b = i+1;
1434 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001435 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001436 if (z == NULL)
1437 return NULL;
1438 for (i = 0; i < size_b; ++i) {
1439 /* The following assumes unsigned arithmetic
1440 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001441 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001442 z->ob_digit[i] = borrow & MASK;
1443 borrow >>= SHIFT;
1444 borrow &= 1; /* Keep only one sign bit */
1445 }
1446 for (; i < size_a; ++i) {
1447 borrow = a->ob_digit[i] - borrow;
1448 z->ob_digit[i] = borrow & MASK;
1449 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001450 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001451 }
1452 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001453 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001454 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001455 return long_normalize(z);
1456}
1457
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001459long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001460{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001461 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001462
Neil Schemenauerba872e22001-01-04 01:46:03 +00001463 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1464
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001465 if (a->ob_size < 0) {
1466 if (b->ob_size < 0) {
1467 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001468 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001469 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001470 }
1471 else
1472 z = x_sub(b, a);
1473 }
1474 else {
1475 if (b->ob_size < 0)
1476 z = x_sub(a, b);
1477 else
1478 z = x_add(a, b);
1479 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001480 Py_DECREF(a);
1481 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001482 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001483}
1484
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001485static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001486long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001487{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001488 PyLongObject *a, *b, *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001489
Neil Schemenauerba872e22001-01-04 01:46:03 +00001490 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1491
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001492 if (a->ob_size < 0) {
1493 if (b->ob_size < 0)
1494 z = x_sub(a, b);
1495 else
1496 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001497 if (z != NULL && z->ob_size != 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 }
1500 else {
1501 if (b->ob_size < 0)
1502 z = x_add(a, b);
1503 else
1504 z = x_sub(a, b);
1505 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001506 Py_DECREF(a);
1507 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001508 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001509}
1510
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001511static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001512long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001513{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001514 /* sequence * long */
1515 long n = PyLong_AsLong((PyObject *) w);
1516 if (n == -1 && PyErr_Occurred())
1517 return NULL;
1518 else
1519 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1520}
1521
Tim Peters5af4e6c2002-08-12 02:31:19 +00001522/* Grade school multiplication, ignoring the signs.
1523 * Returns the absolute value of the product, or NULL if error.
1524 */
1525static PyLongObject *
1526x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001527{
Tim Peters5af4e6c2002-08-12 02:31:19 +00001528 PyLongObject *z;
1529 int size_a = ABS(a->ob_size);
1530 int size_b = ABS(b->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001531 int i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001532
Tim Peters5af4e6c2002-08-12 02:31:19 +00001533 z = _PyLong_New(size_a + size_b);
1534 if (z == NULL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001535 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001536
1537 memset(z->ob_digit, 0, z->ob_size * sizeof(digit));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001538 for (i = 0; i < size_a; ++i) {
1539 twodigits carry = 0;
1540 twodigits f = a->ob_digit[i];
1541 int j;
Tim Peters115c8882002-08-12 18:25:43 +00001542 digit *pz = z->ob_digit + i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001543
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001544 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001545 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001546 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001547 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001548 for (j = 0; j < size_b; ++j) {
Tim Peters115c8882002-08-12 18:25:43 +00001549 carry += *pz + b->ob_digit[j] * f;
1550 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001551 carry >>= SHIFT;
1552 }
1553 for (; carry != 0; ++j) {
1554 assert(i+j < z->ob_size);
Tim Peters115c8882002-08-12 18:25:43 +00001555 carry += *pz;
1556 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001557 carry >>= SHIFT;
1558 }
1559 }
Tim Peters44121a62002-08-12 06:17:58 +00001560 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001561}
1562
1563/* A helper for Karatsuba multiplication (k_mul).
1564 Takes a long "n" and an integer "size" representing the place to
1565 split, and sets low and high such that abs(n) == (high << size) + low,
1566 viewing the shift as being by digits. The sign bit is ignored, and
1567 the return values are >= 0.
1568 Returns 0 on success, -1 on failure.
1569*/
1570static int
1571kmul_split(PyLongObject *n, int size, PyLongObject **high, PyLongObject **low)
1572{
1573 PyLongObject *hi, *lo;
1574 int size_lo, size_hi;
1575 const int size_n = ABS(n->ob_size);
1576
1577 size_lo = MIN(size_n, size);
1578 size_hi = size_n - size_lo;
1579
1580 if ((hi = _PyLong_New(size_hi)) == NULL)
1581 return -1;
1582 if ((lo = _PyLong_New(size_lo)) == NULL) {
1583 Py_DECREF(hi);
1584 return -1;
1585 }
1586
1587 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
1588 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
1589
1590 *high = long_normalize(hi);
1591 *low = long_normalize(lo);
1592 return 0;
1593}
1594
Tim Peters60004642002-08-12 22:01:34 +00001595static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
1596
Tim Peters5af4e6c2002-08-12 02:31:19 +00001597/* Karatsuba multiplication. Ignores the input signs, and returns the
1598 * absolute value of the product (or NULL if error).
1599 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
1600 */
1601static PyLongObject *
1602k_mul(PyLongObject *a, PyLongObject *b)
1603{
Tim Peters738eda72002-08-12 15:08:20 +00001604 int asize = ABS(a->ob_size);
1605 int bsize = ABS(b->ob_size);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001606 PyLongObject *ah = NULL;
1607 PyLongObject *al = NULL;
1608 PyLongObject *bh = NULL;
1609 PyLongObject *bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001610 PyLongObject *ret = NULL;
Tim Peters738eda72002-08-12 15:08:20 +00001611 PyLongObject *t1, *t2, *t3;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001612 int shift; /* the number of digits we split off */
1613 int i;
Tim Peters738eda72002-08-12 15:08:20 +00001614
Tim Peters5af4e6c2002-08-12 02:31:19 +00001615 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
1616 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
1617 * Then the original product is
Tim Peters18c15b92002-08-12 02:43:58 +00001618 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
Tim Peters5af4e6c2002-08-12 02:31:19 +00001619 * By picking X to be a power of 2, "*X" is just shifting, and it's
1620 * been reduced to 3 multiplies on numbers half the size.
1621 */
1622
Tim Petersfc07e562002-08-12 02:54:10 +00001623 /* We want to split based on the larger number; fiddle so that b
Tim Peters5af4e6c2002-08-12 02:31:19 +00001624 * is largest.
1625 */
Tim Peters738eda72002-08-12 15:08:20 +00001626 if (asize > bsize) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001627 t1 = a;
1628 a = b;
1629 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00001630
1631 i = asize;
1632 asize = bsize;
1633 bsize = i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001634 }
1635
1636 /* Use gradeschool math when either number is too small. */
Tim Peters738eda72002-08-12 15:08:20 +00001637 if (asize <= KARATSUBA_CUTOFF) {
Tim Peters738eda72002-08-12 15:08:20 +00001638 if (asize == 0)
Tim Peters44121a62002-08-12 06:17:58 +00001639 return _PyLong_New(0);
1640 else
1641 return x_mul(a, b);
1642 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001643
Tim Peters60004642002-08-12 22:01:34 +00001644 /* If a is small compared to b, splitting on b gives a degenerate
1645 * case with ah==0, and Karatsuba may be (even much) less efficient
1646 * than "grade school" then. However, we can still win, by viewing
1647 * b as a string of "big digits", each of width a->ob_size. That
1648 * leads to a sequence of balanced calls to k_mul.
1649 */
1650 if (2 * asize <= bsize)
1651 return k_lopsided_mul(a, b);
1652
Tim Petersd6974a52002-08-13 20:37:51 +00001653 /* Split a & b into hi & lo pieces. */
Tim Peters738eda72002-08-12 15:08:20 +00001654 shift = bsize >> 1;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001655 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
Tim Petersd6974a52002-08-13 20:37:51 +00001656 assert(ah->ob_size > 0); /* the split isn't degenerate */
1657
Tim Peters5af4e6c2002-08-12 02:31:19 +00001658 if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
1659
Tim Petersd64c1de2002-08-12 17:36:03 +00001660 /* The plan:
1661 * 1. Allocate result space (asize + bsize digits: that's always
1662 * enough).
1663 * 2. Compute ah*bh, and copy into result at 2*shift.
1664 * 3. Compute al*bl, and copy into result at 0. Note that this
1665 * can't overlap with #2.
1666 * 4. Subtract al*bl from the result, starting at shift. This may
1667 * underflow (borrow out of the high digit), but we don't care:
1668 * we're effectively doing unsigned arithmetic mod
1669 * BASE**(sizea + sizeb), and so long as the *final* result fits,
1670 * borrows and carries out of the high digit can be ignored.
1671 * 5. Subtract ah*bh from the result, starting at shift.
1672 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
1673 * at shift.
1674 */
1675
1676 /* 1. Allocate result space. */
Tim Peters70b041b2002-08-12 19:38:01 +00001677 ret = _PyLong_New(asize + bsize);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001678 if (ret == NULL) goto fail;
1679#ifdef Py_DEBUG
1680 /* Fill with trash, to catch reference to uninitialized digits. */
1681 memset(ret->ob_digit, 0xDF, ret->ob_size * sizeof(digit));
1682#endif
Tim Peters44121a62002-08-12 06:17:58 +00001683
Tim Petersd64c1de2002-08-12 17:36:03 +00001684 /* 2. t1 <- ah*bh, and copy into high digits of result. */
Tim Peters738eda72002-08-12 15:08:20 +00001685 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
1686 assert(t1->ob_size >= 0);
1687 assert(2*shift + t1->ob_size <= ret->ob_size);
1688 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
1689 t1->ob_size * sizeof(digit));
1690
1691 /* Zero-out the digits higher than the ah*bh copy. */
1692 i = ret->ob_size - 2*shift - t1->ob_size;
Tim Peters44121a62002-08-12 06:17:58 +00001693 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001694 memset(ret->ob_digit + 2*shift + t1->ob_size, 0,
Tim Peters44121a62002-08-12 06:17:58 +00001695 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001696
Tim Petersd64c1de2002-08-12 17:36:03 +00001697 /* 3. t2 <- al*bl, and copy into the low digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001698 if ((t2 = k_mul(al, bl)) == NULL) {
1699 Py_DECREF(t1);
1700 goto fail;
1701 }
1702 assert(t2->ob_size >= 0);
1703 assert(t2->ob_size <= 2*shift); /* no overlap with high digits */
1704 memcpy(ret->ob_digit, t2->ob_digit, t2->ob_size * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001705
1706 /* Zero out remaining digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001707 i = 2*shift - t2->ob_size; /* number of uninitialized digits */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001708 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001709 memset(ret->ob_digit + t2->ob_size, 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001710
Tim Petersd64c1de2002-08-12 17:36:03 +00001711 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
1712 * because it's fresher in cache.
1713 */
Tim Peters738eda72002-08-12 15:08:20 +00001714 i = ret->ob_size - shift; /* # digits after shift */
Tim Petersd64c1de2002-08-12 17:36:03 +00001715 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, t2->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001716 Py_DECREF(t2);
1717
Tim Petersd64c1de2002-08-12 17:36:03 +00001718 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, t1->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001719 Py_DECREF(t1);
1720
Tim Petersd64c1de2002-08-12 17:36:03 +00001721 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001722 if ((t1 = x_add(ah, al)) == NULL) goto fail;
1723 Py_DECREF(ah);
1724 Py_DECREF(al);
1725 ah = al = NULL;
1726
1727 if ((t2 = x_add(bh, bl)) == NULL) {
1728 Py_DECREF(t1);
1729 goto fail;
1730 }
1731 Py_DECREF(bh);
1732 Py_DECREF(bl);
1733 bh = bl = NULL;
1734
Tim Peters738eda72002-08-12 15:08:20 +00001735 t3 = k_mul(t1, t2);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001736 Py_DECREF(t1);
1737 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00001738 if (t3 == NULL) goto fail;
Tim Peters547607c2002-08-12 19:43:49 +00001739 assert(t3->ob_size >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001740
Tim Petersd6974a52002-08-13 20:37:51 +00001741 /* Add t3. It's not obvious why we can't run out of room here.
1742 * See the (*) comment after this function.
Tim Petersd8b21732002-08-12 19:30:26 +00001743 */
Tim Petersd64c1de2002-08-12 17:36:03 +00001744 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, t3->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001745 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001746
Tim Peters5af4e6c2002-08-12 02:31:19 +00001747 return long_normalize(ret);
1748
1749 fail:
1750 Py_XDECREF(ret);
1751 Py_XDECREF(ah);
1752 Py_XDECREF(al);
1753 Py_XDECREF(bh);
1754 Py_XDECREF(bl);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001755 return NULL;
1756}
1757
Tim Petersd6974a52002-08-13 20:37:51 +00001758/* (*) Why adding t3 can't "run out of room" above.
1759
Tim Petersab86c2b2002-08-15 20:06:00 +00001760Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
1761to start with:
Tim Petersd6974a52002-08-13 20:37:51 +00001762
Tim Petersab86c2b2002-08-15 20:06:00 +000017631. For any integer i, i = c(i/2) + f(i/2). In particular,
1764 bsize = c(bsize/2) + f(bsize/2).
17652. shift = f(bsize/2)
17663. asize <= bsize
17674. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
1768 routine, so asize > bsize/2 >= f(bsize/2) in this routine.
Tim Petersd6974a52002-08-13 20:37:51 +00001769
Tim Petersab86c2b2002-08-15 20:06:00 +00001770We allocated asize + bsize result digits, and add t3 into them at an offset
1771of shift. This leaves asize+bsize-shift allocated digit positions for t3
1772to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
1773asize + c(bsize/2) available digit positions.
Tim Petersd6974a52002-08-13 20:37:51 +00001774
Tim Petersab86c2b2002-08-15 20:06:00 +00001775bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
1776at most c(bsize/2) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001777
Tim Petersab86c2b2002-08-15 20:06:00 +00001778If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
1779digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
1780most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001781
Tim Petersab86c2b2002-08-15 20:06:00 +00001782The product (ah+al)*(bh+bl) therefore has at most
Tim Petersd6974a52002-08-13 20:37:51 +00001783
Tim Petersab86c2b2002-08-15 20:06:00 +00001784 c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
Tim Petersd6974a52002-08-13 20:37:51 +00001785
Tim Petersab86c2b2002-08-15 20:06:00 +00001786and we have asize + c(bsize/2) available digit positions. We need to show
1787this is always enough. An instance of c(bsize/2) cancels out in both, so
1788the question reduces to whether asize digits is enough to hold
1789(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
1790then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
1791asize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
1792digit is enough to hold 2 bits. This is so since SHIFT=15 >= 2. If
1793asize == bsize, then we're asking whether bsize digits is enough to hold
Tim Peterse417de02002-08-15 20:10:45 +00001794c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
1795is enough to hold 2 bits. This is so if bsize >= 2, which holds because
1796bsize >= KARATSUBA_CUTOFF >= 2.
Tim Peters8e966ee2002-08-14 16:36:23 +00001797
Tim Peters48d52c02002-08-14 17:07:32 +00001798Note that since there's always enough room for (ah+al)*(bh+bl), and that's
1799clearly >= each of ah*bh and al*bl, there's always enough room to subtract
1800ah*bh and al*bl too.
Tim Petersd6974a52002-08-13 20:37:51 +00001801*/
1802
Tim Peters60004642002-08-12 22:01:34 +00001803/* b has at least twice the digits of a, and a is big enough that Karatsuba
1804 * would pay off *if* the inputs had balanced sizes. View b as a sequence
1805 * of slices, each with a->ob_size digits, and multiply the slices by a,
1806 * one at a time. This gives k_mul balanced inputs to work with, and is
1807 * also cache-friendly (we compute one double-width slice of the result
1808 * at a time, then move on, never bactracking except for the helpful
1809 * single-width slice overlap between successive partial sums).
1810 */
1811static PyLongObject *
1812k_lopsided_mul(PyLongObject *a, PyLongObject *b)
1813{
1814 const int asize = ABS(a->ob_size);
1815 int bsize = ABS(b->ob_size);
1816 int nbdone; /* # of b digits already multiplied */
1817 PyLongObject *ret;
1818 PyLongObject *bslice = NULL;
1819
1820 assert(asize > KARATSUBA_CUTOFF);
1821 assert(2 * asize <= bsize);
1822
1823 /* Allocate result space, and zero it out. */
1824 ret = _PyLong_New(asize + bsize);
1825 if (ret == NULL)
1826 return NULL;
1827 memset(ret->ob_digit, 0, ret->ob_size * sizeof(digit));
1828
1829 /* Successive slices of b are copied into bslice. */
Tim Peters12034032002-08-12 22:10:00 +00001830 bslice = _PyLong_New(asize);
Tim Peters60004642002-08-12 22:01:34 +00001831 if (bslice == NULL)
1832 goto fail;
1833
1834 nbdone = 0;
1835 while (bsize > 0) {
1836 PyLongObject *product;
1837 const int nbtouse = MIN(bsize, asize);
1838
1839 /* Multiply the next slice of b by a. */
1840 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
1841 nbtouse * sizeof(digit));
1842 bslice->ob_size = nbtouse;
1843 product = k_mul(a, bslice);
1844 if (product == NULL)
1845 goto fail;
1846
1847 /* Add into result. */
1848 (void)v_iadd(ret->ob_digit + nbdone, ret->ob_size - nbdone,
1849 product->ob_digit, product->ob_size);
1850 Py_DECREF(product);
1851
1852 bsize -= nbtouse;
1853 nbdone += nbtouse;
1854 }
1855
1856 Py_DECREF(bslice);
1857 return long_normalize(ret);
1858
1859 fail:
1860 Py_DECREF(ret);
1861 Py_XDECREF(bslice);
1862 return NULL;
1863}
Tim Peters5af4e6c2002-08-12 02:31:19 +00001864
1865static PyObject *
1866long_mul(PyLongObject *v, PyLongObject *w)
1867{
1868 PyLongObject *a, *b, *z;
1869
1870 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
1871 if (!PyLong_Check(v) &&
1872 v->ob_type->tp_as_sequence &&
1873 v->ob_type->tp_as_sequence->sq_repeat)
1874 return long_repeat((PyObject *)v, w);
1875 if (!PyLong_Check(w) &&
1876 w->ob_type->tp_as_sequence &&
1877 w->ob_type->tp_as_sequence->sq_repeat)
1878 return long_repeat((PyObject *)w, v);
1879 Py_INCREF(Py_NotImplemented);
1880 return Py_NotImplemented;
1881 }
1882
Tim Petersd64c1de2002-08-12 17:36:03 +00001883 z = k_mul(a, b);
Tim Peters9973d742002-08-15 19:41:06 +00001884 /* Negate if exactly one of the inputs is negative. */
1885 if (((a->ob_size ^ b->ob_size) < 0) && z)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001886 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001887 Py_DECREF(a);
1888 Py_DECREF(b);
Tim Peters9973d742002-08-15 19:41:06 +00001889 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001890}
1891
Guido van Rossume32e0141992-01-19 16:31:05 +00001892/* The / and % operators are now defined in terms of divmod().
1893 The expression a mod b has the value a - b*floor(a/b).
1894 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001895 |a| by |b|, with the sign of a. This is also expressed
1896 as a - b*trunc(a/b), if trunc truncates towards zero.
1897 Some examples:
1898 a b a rem b a mod b
1899 13 10 3 3
1900 -13 10 -3 7
1901 13 -10 3 -7
1902 -13 -10 -3 -3
1903 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001904 have different signs. We then subtract one from the 'div'
1905 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001906
Guido van Rossume32e0141992-01-19 16:31:05 +00001907static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00001908l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00001909 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001910{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001911 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001912
Guido van Rossume32e0141992-01-19 16:31:05 +00001913 if (long_divrem(v, w, &div, &mod) < 0)
1914 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001915 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1916 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001917 PyLongObject *temp;
1918 PyLongObject *one;
1919 temp = (PyLongObject *) long_add(mod, w);
1920 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001921 mod = temp;
1922 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001923 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001924 return -1;
1925 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001926 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001927 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001928 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1929 Py_DECREF(mod);
1930 Py_DECREF(div);
1931 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001932 return -1;
1933 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001934 Py_DECREF(one);
1935 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001936 div = temp;
1937 }
1938 *pdiv = div;
1939 *pmod = mod;
1940 return 0;
1941}
1942
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001943static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001944long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001945{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001946 PyLongObject *a, *b, *div, *mod;
1947
1948 CONVERT_BINOP(v, w, &a, &b);
1949
1950 if (l_divmod(a, b, &div, &mod) < 0) {
1951 Py_DECREF(a);
1952 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001953 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001954 }
1955 Py_DECREF(a);
1956 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001957 Py_DECREF(mod);
1958 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001959}
1960
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001961static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001962long_classic_div(PyObject *v, PyObject *w)
1963{
1964 PyLongObject *a, *b, *div, *mod;
1965
1966 CONVERT_BINOP(v, w, &a, &b);
1967
1968 if (Py_DivisionWarningFlag &&
1969 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1970 div = NULL;
1971 else if (l_divmod(a, b, &div, &mod) < 0)
1972 div = NULL;
1973 else
1974 Py_DECREF(mod);
1975
1976 Py_DECREF(a);
1977 Py_DECREF(b);
1978 return (PyObject *)div;
1979}
1980
1981static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00001982long_true_divide(PyObject *v, PyObject *w)
1983{
Tim Peterse2a60002001-09-04 06:17:36 +00001984 PyLongObject *a, *b;
1985 double ad, bd;
Tim Peters6f97e492001-11-04 23:09:40 +00001986 int aexp, bexp, failed;
Tim Peterse2a60002001-09-04 06:17:36 +00001987
1988 CONVERT_BINOP(v, w, &a, &b);
1989 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
1990 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00001991 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
1992 Py_DECREF(a);
1993 Py_DECREF(b);
1994 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00001995 return NULL;
1996
1997 if (bd == 0.0) {
1998 PyErr_SetString(PyExc_ZeroDivisionError,
1999 "long division or modulo by zero");
2000 return NULL;
2001 }
2002
2003 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
2004 ad /= bd; /* overflow/underflow impossible here */
2005 aexp -= bexp;
2006 if (aexp > INT_MAX / SHIFT)
2007 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00002008 else if (aexp < -(INT_MAX / SHIFT))
2009 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002010 errno = 0;
2011 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00002012 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002013 goto overflow;
2014 return PyFloat_FromDouble(ad);
2015
2016overflow:
2017 PyErr_SetString(PyExc_OverflowError,
2018 "long/long too large for a float");
2019 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002020
Tim Peters20dab9f2001-09-04 05:31:47 +00002021}
2022
2023static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002024long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002025{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002026 PyLongObject *a, *b, *div, *mod;
2027
2028 CONVERT_BINOP(v, w, &a, &b);
2029
2030 if (l_divmod(a, b, &div, &mod) < 0) {
2031 Py_DECREF(a);
2032 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00002033 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002034 }
2035 Py_DECREF(a);
2036 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002037 Py_DECREF(div);
2038 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002039}
2040
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002041static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002042long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002043{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002044 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002045 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002046
2047 CONVERT_BINOP(v, w, &a, &b);
2048
2049 if (l_divmod(a, b, &div, &mod) < 0) {
2050 Py_DECREF(a);
2051 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002052 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002053 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002054 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002055 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002056 PyTuple_SetItem(z, 0, (PyObject *) div);
2057 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002058 }
2059 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002060 Py_DECREF(div);
2061 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002062 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002063 Py_DECREF(a);
2064 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002065 return z;
2066}
2067
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002068static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002069long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002070{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002071 PyLongObject *a, *b;
2072 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002073 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002074 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002075
2076 CONVERT_BINOP(v, w, &a, &b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002077 if (PyLong_Check(x) || Py_None == x) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002078 c = x;
2079 Py_INCREF(x);
2080 }
2081 else if (PyInt_Check(x)) {
2082 c = PyLong_FromLong(PyInt_AS_LONG(x));
2083 }
2084 else {
2085 Py_DECREF(a);
2086 Py_DECREF(b);
2087 Py_INCREF(Py_NotImplemented);
2088 return Py_NotImplemented;
2089 }
Tim Peters4c483c42001-09-05 06:24:58 +00002090
2091 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
2092 PyErr_SetString(PyExc_ValueError,
2093 "pow() 3rd argument cannot be 0");
2094 z = NULL;
2095 goto error;
2096 }
2097
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002098 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002099 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002100 Py_DECREF(a);
2101 Py_DECREF(b);
2102 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00002103 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00002104 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
2105 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00002106 return NULL;
2107 }
2108 /* Return a float. This works because we know that
2109 this calls float_pow() which converts its
2110 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002111 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002112 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002113 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002114 for (i = 0; i < size_b; ++i) {
2115 digit bi = b->ob_digit[i];
2116 int j;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002117
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002118 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002119 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002120
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002121 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002122 temp = (PyLongObject *)long_mul(z, a);
2123 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002124 if (c!=Py_None && temp!=NULL) {
2125 if (l_divmod(temp,(PyLongObject *)c,
2126 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002127 Py_DECREF(temp);
2128 z = NULL;
2129 goto error;
2130 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002131 Py_XDECREF(div);
2132 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002133 temp = mod;
2134 }
2135 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002136 if (z == NULL)
2137 break;
2138 }
2139 bi >>= 1;
2140 if (bi == 0 && i+1 == size_b)
2141 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002142 temp = (PyLongObject *)long_mul(a, a);
2143 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002144 if (c!=Py_None && temp!=NULL) {
2145 if (l_divmod(temp, (PyLongObject *)c, &div,
2146 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002147 Py_DECREF(temp);
2148 z = NULL;
2149 goto error;
2150 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002151 Py_XDECREF(div);
2152 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002153 temp = mod;
2154 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002155 a = temp;
2156 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002157 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002158 z = NULL;
2159 break;
2160 }
2161 }
Guido van Rossumc206c761995-01-10 15:23:19 +00002162 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002163 break;
2164 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002165 if (c!=Py_None && z!=NULL) {
2166 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002167 Py_DECREF(z);
2168 z = NULL;
2169 }
2170 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002171 Py_XDECREF(div);
2172 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002173 z = mod;
2174 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002175 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002176 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00002177 Py_XDECREF(a);
2178 Py_DECREF(b);
2179 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002180 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002181}
2182
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002183static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002184long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002185{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002186 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002187 PyLongObject *x;
2188 PyLongObject *w;
2189 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002190 if (w == NULL)
2191 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002192 x = (PyLongObject *) long_add(v, w);
2193 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002194 if (x == NULL)
2195 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00002196 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002197 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002198}
2199
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002200static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002201long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002202{
Tim Peters69c2de32001-09-11 22:31:33 +00002203 if (PyLong_CheckExact(v)) {
2204 Py_INCREF(v);
2205 return (PyObject *)v;
2206 }
2207 else
2208 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002209}
2210
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002211static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002212long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002213{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002214 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002215 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002216 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002217 Py_INCREF(v);
2218 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002219 }
Tim Peters69c2de32001-09-11 22:31:33 +00002220 z = (PyLongObject *)_PyLong_Copy(v);
2221 if (z != NULL)
2222 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002223 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002224}
2225
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002226static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002227long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002228{
2229 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002230 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00002231 else
2232 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002233}
2234
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002235static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002236long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002237{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002238 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002239}
2240
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002241static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002242long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002243{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002244 PyLongObject *a, *b;
2245 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002246 long shiftby;
2247 int newsize, wordshift, loshift, hishift, i, j;
2248 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002249
Neil Schemenauerba872e22001-01-04 01:46:03 +00002250 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2251
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002252 if (a->ob_size < 0) {
2253 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002254 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002255 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002256 if (a1 == NULL)
2257 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002258 a2 = (PyLongObject *) long_rshift(a1, b);
2259 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002260 if (a2 == NULL)
2261 goto rshift_error;
2262 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002263 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002264 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002265 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002266
Neil Schemenauerba872e22001-01-04 01:46:03 +00002267 shiftby = PyLong_AsLong((PyObject *)b);
2268 if (shiftby == -1L && PyErr_Occurred())
2269 goto rshift_error;
2270 if (shiftby < 0) {
2271 PyErr_SetString(PyExc_ValueError,
2272 "negative shift count");
2273 goto rshift_error;
2274 }
2275 wordshift = shiftby / SHIFT;
2276 newsize = ABS(a->ob_size) - wordshift;
2277 if (newsize <= 0) {
2278 z = _PyLong_New(0);
2279 Py_DECREF(a);
2280 Py_DECREF(b);
2281 return (PyObject *)z;
2282 }
2283 loshift = shiftby % SHIFT;
2284 hishift = SHIFT - loshift;
2285 lomask = ((digit)1 << hishift) - 1;
2286 himask = MASK ^ lomask;
2287 z = _PyLong_New(newsize);
2288 if (z == NULL)
2289 goto rshift_error;
2290 if (a->ob_size < 0)
2291 z->ob_size = -(z->ob_size);
2292 for (i = 0, j = wordshift; i < newsize; i++, j++) {
2293 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
2294 if (i+1 < newsize)
2295 z->ob_digit[i] |=
2296 (a->ob_digit[j+1] << hishift) & himask;
2297 }
2298 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002299 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002300rshift_error:
2301 Py_DECREF(a);
2302 Py_DECREF(b);
2303 return (PyObject *) z;
2304
Guido van Rossumc6913e71991-11-19 20:26:46 +00002305}
2306
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002307static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002308long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002309{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002310 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002311 PyLongObject *a, *b;
2312 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002313 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002314 int oldsize, newsize, wordshift, remshift, i, j;
2315 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002316
Neil Schemenauerba872e22001-01-04 01:46:03 +00002317 CONVERT_BINOP(v, w, &a, &b);
2318
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002319 shiftby = PyLong_AsLong((PyObject *)b);
2320 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00002321 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002322 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002323 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002324 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002325 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002326 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002327 PyErr_SetString(PyExc_ValueError,
2328 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002329 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002330 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002331 /* wordshift, remshift = divmod(shiftby, SHIFT) */
2332 wordshift = (int)shiftby / SHIFT;
2333 remshift = (int)shiftby - wordshift * SHIFT;
2334
2335 oldsize = ABS(a->ob_size);
2336 newsize = oldsize + wordshift;
2337 if (remshift)
2338 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002339 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002340 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002341 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002342 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002343 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002344 for (i = 0; i < wordshift; i++)
2345 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002346 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002347 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
2348 accum |= a->ob_digit[j] << remshift;
2349 z->ob_digit[i] = (digit)(accum & MASK);
2350 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002351 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002352 if (remshift)
2353 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002354 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002355 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002356 z = long_normalize(z);
2357lshift_error:
2358 Py_DECREF(a);
2359 Py_DECREF(b);
2360 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002361}
2362
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002363
2364/* Bitwise and/xor/or operations */
2365
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002366static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002367long_bitwise(PyLongObject *a,
2368 int op, /* '&', '|', '^' */
2369 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002370{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002371 digit maska, maskb; /* 0 or MASK */
2372 int negz;
2373 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002374 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002375 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002376 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002377 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002378
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002379 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002380 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002381 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002382 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002383 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002384 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002385 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002386 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002387 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002388 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002389 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002390 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002391 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002392 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002393 maskb = 0;
2394 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002395
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002396 negz = 0;
2397 switch (op) {
2398 case '^':
2399 if (maska != maskb) {
2400 maska ^= MASK;
2401 negz = -1;
2402 }
2403 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002404 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002405 if (maska && maskb) {
2406 op = '|';
2407 maska ^= MASK;
2408 maskb ^= MASK;
2409 negz = -1;
2410 }
2411 break;
2412 case '|':
2413 if (maska || maskb) {
2414 op = '&';
2415 maska ^= MASK;
2416 maskb ^= MASK;
2417 negz = -1;
2418 }
2419 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002420 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002421
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002422 /* JRH: The original logic here was to allocate the result value (z)
2423 as the longer of the two operands. However, there are some cases
2424 where the result is guaranteed to be shorter than that: AND of two
2425 positives, OR of two negatives: use the shorter number. AND with
2426 mixed signs: use the positive number. OR with mixed signs: use the
2427 negative number. After the transformations above, op will be '&'
2428 iff one of these cases applies, and mask will be non-0 for operands
2429 whose length should be ignored.
2430 */
2431
2432 size_a = a->ob_size;
2433 size_b = b->ob_size;
2434 size_z = op == '&'
2435 ? (maska
2436 ? size_b
2437 : (maskb ? size_a : MIN(size_a, size_b)))
2438 : MAX(size_a, size_b);
2439 z = _PyLong_New(size_z);
2440 if (a == NULL || b == NULL || z == NULL) {
2441 Py_XDECREF(a);
2442 Py_XDECREF(b);
2443 Py_XDECREF(z);
2444 return NULL;
2445 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002446
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002447 for (i = 0; i < size_z; ++i) {
2448 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2449 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2450 switch (op) {
2451 case '&': z->ob_digit[i] = diga & digb; break;
2452 case '|': z->ob_digit[i] = diga | digb; break;
2453 case '^': z->ob_digit[i] = diga ^ digb; break;
2454 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002455 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002456
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002457 Py_DECREF(a);
2458 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002459 z = long_normalize(z);
2460 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002461 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002462 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002463 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002464 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002465}
2466
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002467static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002468long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002469{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002470 PyLongObject *a, *b;
2471 PyObject *c;
2472 CONVERT_BINOP(v, w, &a, &b);
2473 c = long_bitwise(a, '&', b);
2474 Py_DECREF(a);
2475 Py_DECREF(b);
2476 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002477}
2478
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002479static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002480long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002481{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002482 PyLongObject *a, *b;
2483 PyObject *c;
2484 CONVERT_BINOP(v, w, &a, &b);
2485 c = long_bitwise(a, '^', b);
2486 Py_DECREF(a);
2487 Py_DECREF(b);
2488 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002489}
2490
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002491static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002492long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002493{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002494 PyLongObject *a, *b;
2495 PyObject *c;
2496 CONVERT_BINOP(v, w, &a, &b);
2497 c = long_bitwise(a, '|', b);
2498 Py_DECREF(a);
2499 Py_DECREF(b);
2500 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002501}
2502
Guido van Rossum234f9421993-06-17 12:35:49 +00002503static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002504long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002505{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002506 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002507 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002508 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002509 return 0;
2510 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002511 else if (PyLong_Check(*pw)) {
2512 Py_INCREF(*pv);
2513 Py_INCREF(*pw);
2514 return 0;
2515 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002516 return 1; /* Can't do it */
2517}
2518
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002519static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002520long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002521{
2522 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002523 x = PyLong_AsLong(v);
2524 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002525 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002526 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002527}
2528
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002529static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002530long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002531{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002532 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002533 return v;
2534}
2535
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002536static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002537long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002538{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002539 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002540 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002541 if (result == -1.0 && PyErr_Occurred())
2542 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002543 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002544}
2545
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002546static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002547long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002548{
Fred Drake121ee271999-12-23 15:41:28 +00002549 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002550}
2551
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002552static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002553long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002554{
Fred Drake121ee271999-12-23 15:41:28 +00002555 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002556}
Jeremy Hylton938ace62002-07-17 16:30:39 +00002557
2558static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00002559long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002560
Tim Peters6d6c1a32001-08-02 04:15:00 +00002561static PyObject *
2562long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2563{
2564 PyObject *x = NULL;
2565 int base = -909; /* unlikely! */
2566 static char *kwlist[] = {"x", "base", 0};
2567
Guido van Rossumbef14172001-08-29 15:47:46 +00002568 if (type != &PyLong_Type)
2569 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002570 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2571 &x, &base))
2572 return NULL;
2573 if (x == NULL)
2574 return PyLong_FromLong(0L);
2575 if (base == -909)
2576 return PyNumber_Long(x);
2577 else if (PyString_Check(x))
2578 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002579#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002580 else if (PyUnicode_Check(x))
2581 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2582 PyUnicode_GET_SIZE(x),
2583 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002584#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002585 else {
2586 PyErr_SetString(PyExc_TypeError,
2587 "long() can't convert non-string with explicit base");
2588 return NULL;
2589 }
2590}
2591
Guido van Rossumbef14172001-08-29 15:47:46 +00002592/* Wimpy, slow approach to tp_new calls for subtypes of long:
2593 first create a regular long from whatever arguments we got,
2594 then allocate a subtype instance and initialize it from
2595 the regular long. The regular long is then thrown away.
2596*/
2597static PyObject *
2598long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2599{
2600 PyLongObject *tmp, *new;
2601 int i, n;
2602
2603 assert(PyType_IsSubtype(type, &PyLong_Type));
2604 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2605 if (tmp == NULL)
2606 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002607 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002608 n = tmp->ob_size;
2609 if (n < 0)
2610 n = -n;
2611 new = (PyLongObject *)type->tp_alloc(type, n);
2612 if (new == NULL)
2613 return NULL;
2614 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002615 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002616 for (i = 0; i < n; i++)
2617 new->ob_digit[i] = tmp->ob_digit[i];
2618 Py_DECREF(tmp);
2619 return (PyObject *)new;
2620}
2621
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002622PyDoc_STRVAR(long_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002623"long(x[, base]) -> integer\n\
2624\n\
2625Convert a string or number to a long integer, if possible. A floating\n\
2626point argument will be truncated towards zero (this does not include a\n\
2627string representation of a floating point number!) When converting a\n\
2628string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002629converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002630
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002631static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002632 (binaryfunc) long_add, /*nb_add*/
2633 (binaryfunc) long_sub, /*nb_subtract*/
2634 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002635 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002636 (binaryfunc) long_mod, /*nb_remainder*/
2637 (binaryfunc) long_divmod, /*nb_divmod*/
2638 (ternaryfunc) long_pow, /*nb_power*/
2639 (unaryfunc) long_neg, /*nb_negative*/
2640 (unaryfunc) long_pos, /*tp_positive*/
2641 (unaryfunc) long_abs, /*tp_absolute*/
2642 (inquiry) long_nonzero, /*tp_nonzero*/
2643 (unaryfunc) long_invert, /*nb_invert*/
2644 (binaryfunc) long_lshift, /*nb_lshift*/
2645 (binaryfunc) long_rshift, /*nb_rshift*/
2646 (binaryfunc) long_and, /*nb_and*/
2647 (binaryfunc) long_xor, /*nb_xor*/
2648 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002649 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002650 (unaryfunc) long_int, /*nb_int*/
2651 (unaryfunc) long_long, /*nb_long*/
2652 (unaryfunc) long_float, /*nb_float*/
2653 (unaryfunc) long_oct, /*nb_oct*/
2654 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002655 0, /* nb_inplace_add */
2656 0, /* nb_inplace_subtract */
2657 0, /* nb_inplace_multiply */
2658 0, /* nb_inplace_divide */
2659 0, /* nb_inplace_remainder */
2660 0, /* nb_inplace_power */
2661 0, /* nb_inplace_lshift */
2662 0, /* nb_inplace_rshift */
2663 0, /* nb_inplace_and */
2664 0, /* nb_inplace_xor */
2665 0, /* nb_inplace_or */
2666 (binaryfunc)long_div, /* nb_floor_divide */
2667 long_true_divide, /* nb_true_divide */
2668 0, /* nb_inplace_floor_divide */
2669 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002670};
2671
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002672PyTypeObject PyLong_Type = {
2673 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002674 0, /* ob_size */
2675 "long", /* tp_name */
2676 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2677 sizeof(digit), /* tp_itemsize */
2678 (destructor)long_dealloc, /* tp_dealloc */
2679 0, /* tp_print */
2680 0, /* tp_getattr */
2681 0, /* tp_setattr */
2682 (cmpfunc)long_compare, /* tp_compare */
2683 (reprfunc)long_repr, /* tp_repr */
2684 &long_as_number, /* tp_as_number */
2685 0, /* tp_as_sequence */
2686 0, /* tp_as_mapping */
2687 (hashfunc)long_hash, /* tp_hash */
2688 0, /* tp_call */
2689 (reprfunc)long_str, /* tp_str */
2690 PyObject_GenericGetAttr, /* tp_getattro */
2691 0, /* tp_setattro */
2692 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002693 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2694 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002695 long_doc, /* tp_doc */
2696 0, /* tp_traverse */
2697 0, /* tp_clear */
2698 0, /* tp_richcompare */
2699 0, /* tp_weaklistoffset */
2700 0, /* tp_iter */
2701 0, /* tp_iternext */
2702 0, /* tp_methods */
2703 0, /* tp_members */
2704 0, /* tp_getset */
2705 0, /* tp_base */
2706 0, /* tp_dict */
2707 0, /* tp_descr_get */
2708 0, /* tp_descr_set */
2709 0, /* tp_dictoffset */
2710 0, /* tp_init */
2711 0, /* tp_alloc */
2712 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00002713 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002714};