blob: 858be504ea3f0d1e17582e1ea69e108f3a893546 [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
1760We allocated space for asize + bsize result digits. We're adding t3 at an
1761offset of shift digits, so there are asize + bsize - shift allocated digits
1762remaining. Because degenerate shifts of "a" were weeded out, asize is at
1763least shift + 1. If bsize is odd then bsize == 2*shift + 1, else bsize ==
17642*shift. Therefore there are at least shift+1 + 2*shift - shift =
1765
17662*shift+1 allocated digits remaining when bsize is even, or at least
17672*shift+2 allocated digits remaining when bsize is odd.
1768
1769Now in bh+bl, if bsize is even bh has at most shift digits, while if bsize
1770is odd bh has at most shift+1 digits. The sum bh+bl has at most
1771
1772shift digits plus 1 bit when bsize is even
1773shift+1 digits plus 1 bit when bsize is odd
1774
1775The same is true of ah+al, so (ah+al)(bh+bl) has at most
1776
17772*shift digits + 2 bits when bsize is even
17782*shift+2 digits + 2 bits when bsize is odd
1779
1780If bsize is even, we have at most 2*shift digits + 2 bits to fit into at
1781least 2*shift+1 digits. Since a digit has SHIFT bits, and SHIFT >= 2,
1782there's always enough room to fit the 2 bits into the "spare" digit.
1783
1784If bsize is odd, we have at most 2*shift+2 digits + 2 bits to fit into at
1785least 2*shift+2 digits, and there's not obviously enough room for the
1786extra two bits. We need a sharper analysis in this case. The major
1787laziness was in the "the same is true of ah+al" clause: ah+al can't actually
1788have shift+1 digits + 1 bit unless bsize is odd and asize == bsize. In that
Tim Peterscba6e962002-08-13 20:42:00 +00001789case, we actually have (2*shift+1)*2 - shift = 3*shift+2 allocated digits
1790remaining, and that's obviously plenty to hold 2*shift+2 digits + 2 bits.
Tim Petersd6974a52002-08-13 20:37:51 +00001791Else (bsize is odd and asize < bsize) ah and al each have at most shift digits,
1792so ah+al has at most shift digits + 1 bit, and (ah+al)*(bh+bl) has at most
Tim Peterscba6e962002-08-13 20:42:00 +000017932*shift+1 digits + 2 bits, and again 2*shift+2 digits is enough to hold it.
Tim Petersd6974a52002-08-13 20:37:51 +00001794*/
1795
Tim Peters60004642002-08-12 22:01:34 +00001796/* b has at least twice the digits of a, and a is big enough that Karatsuba
1797 * would pay off *if* the inputs had balanced sizes. View b as a sequence
1798 * of slices, each with a->ob_size digits, and multiply the slices by a,
1799 * one at a time. This gives k_mul balanced inputs to work with, and is
1800 * also cache-friendly (we compute one double-width slice of the result
1801 * at a time, then move on, never bactracking except for the helpful
1802 * single-width slice overlap between successive partial sums).
1803 */
1804static PyLongObject *
1805k_lopsided_mul(PyLongObject *a, PyLongObject *b)
1806{
1807 const int asize = ABS(a->ob_size);
1808 int bsize = ABS(b->ob_size);
1809 int nbdone; /* # of b digits already multiplied */
1810 PyLongObject *ret;
1811 PyLongObject *bslice = NULL;
1812
1813 assert(asize > KARATSUBA_CUTOFF);
1814 assert(2 * asize <= bsize);
1815
1816 /* Allocate result space, and zero it out. */
1817 ret = _PyLong_New(asize + bsize);
1818 if (ret == NULL)
1819 return NULL;
1820 memset(ret->ob_digit, 0, ret->ob_size * sizeof(digit));
1821
1822 /* Successive slices of b are copied into bslice. */
Tim Peters12034032002-08-12 22:10:00 +00001823 bslice = _PyLong_New(asize);
Tim Peters60004642002-08-12 22:01:34 +00001824 if (bslice == NULL)
1825 goto fail;
1826
1827 nbdone = 0;
1828 while (bsize > 0) {
1829 PyLongObject *product;
1830 const int nbtouse = MIN(bsize, asize);
1831
1832 /* Multiply the next slice of b by a. */
1833 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
1834 nbtouse * sizeof(digit));
1835 bslice->ob_size = nbtouse;
1836 product = k_mul(a, bslice);
1837 if (product == NULL)
1838 goto fail;
1839
1840 /* Add into result. */
1841 (void)v_iadd(ret->ob_digit + nbdone, ret->ob_size - nbdone,
1842 product->ob_digit, product->ob_size);
1843 Py_DECREF(product);
1844
1845 bsize -= nbtouse;
1846 nbdone += nbtouse;
1847 }
1848
1849 Py_DECREF(bslice);
1850 return long_normalize(ret);
1851
1852 fail:
1853 Py_DECREF(ret);
1854 Py_XDECREF(bslice);
1855 return NULL;
1856}
Tim Peters5af4e6c2002-08-12 02:31:19 +00001857
1858static PyObject *
1859long_mul(PyLongObject *v, PyLongObject *w)
1860{
1861 PyLongObject *a, *b, *z;
1862
1863 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
1864 if (!PyLong_Check(v) &&
1865 v->ob_type->tp_as_sequence &&
1866 v->ob_type->tp_as_sequence->sq_repeat)
1867 return long_repeat((PyObject *)v, w);
1868 if (!PyLong_Check(w) &&
1869 w->ob_type->tp_as_sequence &&
1870 w->ob_type->tp_as_sequence->sq_repeat)
1871 return long_repeat((PyObject *)w, v);
1872 Py_INCREF(Py_NotImplemented);
1873 return Py_NotImplemented;
1874 }
1875
Tim Petersd64c1de2002-08-12 17:36:03 +00001876 z = k_mul(a, b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001877 if(z == NULL) {
1878 Py_DECREF(a);
1879 Py_DECREF(b);
1880 return NULL;
1881 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001882 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001883 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001884 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001885 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001886 Py_DECREF(a);
1887 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001888 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001889}
1890
Guido van Rossume32e0141992-01-19 16:31:05 +00001891/* The / and % operators are now defined in terms of divmod().
1892 The expression a mod b has the value a - b*floor(a/b).
1893 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001894 |a| by |b|, with the sign of a. This is also expressed
1895 as a - b*trunc(a/b), if trunc truncates towards zero.
1896 Some examples:
1897 a b a rem b a mod b
1898 13 10 3 3
1899 -13 10 -3 7
1900 13 -10 3 -7
1901 -13 -10 -3 -3
1902 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001903 have different signs. We then subtract one from the 'div'
1904 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001905
Guido van Rossume32e0141992-01-19 16:31:05 +00001906static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00001907l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00001908 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001909{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001910 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001911
Guido van Rossume32e0141992-01-19 16:31:05 +00001912 if (long_divrem(v, w, &div, &mod) < 0)
1913 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001914 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1915 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001916 PyLongObject *temp;
1917 PyLongObject *one;
1918 temp = (PyLongObject *) long_add(mod, w);
1919 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001920 mod = temp;
1921 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001922 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001923 return -1;
1924 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001925 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001926 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001927 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1928 Py_DECREF(mod);
1929 Py_DECREF(div);
1930 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001931 return -1;
1932 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001933 Py_DECREF(one);
1934 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001935 div = temp;
1936 }
1937 *pdiv = div;
1938 *pmod = mod;
1939 return 0;
1940}
1941
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001942static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001943long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001944{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001945 PyLongObject *a, *b, *div, *mod;
1946
1947 CONVERT_BINOP(v, w, &a, &b);
1948
1949 if (l_divmod(a, b, &div, &mod) < 0) {
1950 Py_DECREF(a);
1951 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001952 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001953 }
1954 Py_DECREF(a);
1955 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001956 Py_DECREF(mod);
1957 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001958}
1959
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001960static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001961long_classic_div(PyObject *v, PyObject *w)
1962{
1963 PyLongObject *a, *b, *div, *mod;
1964
1965 CONVERT_BINOP(v, w, &a, &b);
1966
1967 if (Py_DivisionWarningFlag &&
1968 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1969 div = NULL;
1970 else if (l_divmod(a, b, &div, &mod) < 0)
1971 div = NULL;
1972 else
1973 Py_DECREF(mod);
1974
1975 Py_DECREF(a);
1976 Py_DECREF(b);
1977 return (PyObject *)div;
1978}
1979
1980static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00001981long_true_divide(PyObject *v, PyObject *w)
1982{
Tim Peterse2a60002001-09-04 06:17:36 +00001983 PyLongObject *a, *b;
1984 double ad, bd;
Tim Peters6f97e492001-11-04 23:09:40 +00001985 int aexp, bexp, failed;
Tim Peterse2a60002001-09-04 06:17:36 +00001986
1987 CONVERT_BINOP(v, w, &a, &b);
1988 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
1989 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00001990 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
1991 Py_DECREF(a);
1992 Py_DECREF(b);
1993 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00001994 return NULL;
1995
1996 if (bd == 0.0) {
1997 PyErr_SetString(PyExc_ZeroDivisionError,
1998 "long division or modulo by zero");
1999 return NULL;
2000 }
2001
2002 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
2003 ad /= bd; /* overflow/underflow impossible here */
2004 aexp -= bexp;
2005 if (aexp > INT_MAX / SHIFT)
2006 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00002007 else if (aexp < -(INT_MAX / SHIFT))
2008 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002009 errno = 0;
2010 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00002011 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002012 goto overflow;
2013 return PyFloat_FromDouble(ad);
2014
2015overflow:
2016 PyErr_SetString(PyExc_OverflowError,
2017 "long/long too large for a float");
2018 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002019
Tim Peters20dab9f2001-09-04 05:31:47 +00002020}
2021
2022static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002023long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002024{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002025 PyLongObject *a, *b, *div, *mod;
2026
2027 CONVERT_BINOP(v, w, &a, &b);
2028
2029 if (l_divmod(a, b, &div, &mod) < 0) {
2030 Py_DECREF(a);
2031 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00002032 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002033 }
2034 Py_DECREF(a);
2035 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002036 Py_DECREF(div);
2037 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002038}
2039
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002040static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002041long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002042{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002043 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002044 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002045
2046 CONVERT_BINOP(v, w, &a, &b);
2047
2048 if (l_divmod(a, b, &div, &mod) < 0) {
2049 Py_DECREF(a);
2050 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002051 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002052 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002053 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002054 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002055 PyTuple_SetItem(z, 0, (PyObject *) div);
2056 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002057 }
2058 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002059 Py_DECREF(div);
2060 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002061 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002062 Py_DECREF(a);
2063 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002064 return z;
2065}
2066
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002067static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002068long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002069{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002070 PyLongObject *a, *b;
2071 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002072 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002073 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002074
2075 CONVERT_BINOP(v, w, &a, &b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002076 if (PyLong_Check(x) || Py_None == x) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002077 c = x;
2078 Py_INCREF(x);
2079 }
2080 else if (PyInt_Check(x)) {
2081 c = PyLong_FromLong(PyInt_AS_LONG(x));
2082 }
2083 else {
2084 Py_DECREF(a);
2085 Py_DECREF(b);
2086 Py_INCREF(Py_NotImplemented);
2087 return Py_NotImplemented;
2088 }
Tim Peters4c483c42001-09-05 06:24:58 +00002089
2090 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
2091 PyErr_SetString(PyExc_ValueError,
2092 "pow() 3rd argument cannot be 0");
2093 z = NULL;
2094 goto error;
2095 }
2096
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002097 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002098 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002099 Py_DECREF(a);
2100 Py_DECREF(b);
2101 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00002102 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00002103 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
2104 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00002105 return NULL;
2106 }
2107 /* Return a float. This works because we know that
2108 this calls float_pow() which converts its
2109 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002110 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002111 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002112 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002113 for (i = 0; i < size_b; ++i) {
2114 digit bi = b->ob_digit[i];
2115 int j;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002116
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002117 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002118 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002119
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002120 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002121 temp = (PyLongObject *)long_mul(z, a);
2122 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002123 if (c!=Py_None && temp!=NULL) {
2124 if (l_divmod(temp,(PyLongObject *)c,
2125 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002126 Py_DECREF(temp);
2127 z = NULL;
2128 goto error;
2129 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002130 Py_XDECREF(div);
2131 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002132 temp = mod;
2133 }
2134 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002135 if (z == NULL)
2136 break;
2137 }
2138 bi >>= 1;
2139 if (bi == 0 && i+1 == size_b)
2140 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002141 temp = (PyLongObject *)long_mul(a, a);
2142 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002143 if (c!=Py_None && temp!=NULL) {
2144 if (l_divmod(temp, (PyLongObject *)c, &div,
2145 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002146 Py_DECREF(temp);
2147 z = NULL;
2148 goto error;
2149 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002150 Py_XDECREF(div);
2151 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002152 temp = mod;
2153 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002154 a = temp;
2155 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002156 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002157 z = NULL;
2158 break;
2159 }
2160 }
Guido van Rossumc206c761995-01-10 15:23:19 +00002161 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002162 break;
2163 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002164 if (c!=Py_None && z!=NULL) {
2165 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002166 Py_DECREF(z);
2167 z = NULL;
2168 }
2169 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002170 Py_XDECREF(div);
2171 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002172 z = mod;
2173 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002174 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002175 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00002176 Py_XDECREF(a);
2177 Py_DECREF(b);
2178 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002179 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002180}
2181
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002182static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002183long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002184{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002185 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002186 PyLongObject *x;
2187 PyLongObject *w;
2188 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002189 if (w == NULL)
2190 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002191 x = (PyLongObject *) long_add(v, w);
2192 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002193 if (x == NULL)
2194 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00002195 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002196 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002197}
2198
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002199static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002200long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002201{
Tim Peters69c2de32001-09-11 22:31:33 +00002202 if (PyLong_CheckExact(v)) {
2203 Py_INCREF(v);
2204 return (PyObject *)v;
2205 }
2206 else
2207 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002208}
2209
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002210static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002211long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002212{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002213 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002214 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002215 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002216 Py_INCREF(v);
2217 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002218 }
Tim Peters69c2de32001-09-11 22:31:33 +00002219 z = (PyLongObject *)_PyLong_Copy(v);
2220 if (z != NULL)
2221 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002222 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002223}
2224
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002225static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002226long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002227{
2228 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002229 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00002230 else
2231 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002232}
2233
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002234static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002235long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002236{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002237 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002238}
2239
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002240static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002241long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002242{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002243 PyLongObject *a, *b;
2244 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002245 long shiftby;
2246 int newsize, wordshift, loshift, hishift, i, j;
2247 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002248
Neil Schemenauerba872e22001-01-04 01:46:03 +00002249 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2250
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002251 if (a->ob_size < 0) {
2252 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002253 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002254 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002255 if (a1 == NULL)
2256 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002257 a2 = (PyLongObject *) long_rshift(a1, b);
2258 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002259 if (a2 == NULL)
2260 goto rshift_error;
2261 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002262 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002263 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002264 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002265
Neil Schemenauerba872e22001-01-04 01:46:03 +00002266 shiftby = PyLong_AsLong((PyObject *)b);
2267 if (shiftby == -1L && PyErr_Occurred())
2268 goto rshift_error;
2269 if (shiftby < 0) {
2270 PyErr_SetString(PyExc_ValueError,
2271 "negative shift count");
2272 goto rshift_error;
2273 }
2274 wordshift = shiftby / SHIFT;
2275 newsize = ABS(a->ob_size) - wordshift;
2276 if (newsize <= 0) {
2277 z = _PyLong_New(0);
2278 Py_DECREF(a);
2279 Py_DECREF(b);
2280 return (PyObject *)z;
2281 }
2282 loshift = shiftby % SHIFT;
2283 hishift = SHIFT - loshift;
2284 lomask = ((digit)1 << hishift) - 1;
2285 himask = MASK ^ lomask;
2286 z = _PyLong_New(newsize);
2287 if (z == NULL)
2288 goto rshift_error;
2289 if (a->ob_size < 0)
2290 z->ob_size = -(z->ob_size);
2291 for (i = 0, j = wordshift; i < newsize; i++, j++) {
2292 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
2293 if (i+1 < newsize)
2294 z->ob_digit[i] |=
2295 (a->ob_digit[j+1] << hishift) & himask;
2296 }
2297 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002298 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002299rshift_error:
2300 Py_DECREF(a);
2301 Py_DECREF(b);
2302 return (PyObject *) z;
2303
Guido van Rossumc6913e71991-11-19 20:26:46 +00002304}
2305
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002306static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002307long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002308{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002309 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002310 PyLongObject *a, *b;
2311 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002312 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002313 int oldsize, newsize, wordshift, remshift, i, j;
2314 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002315
Neil Schemenauerba872e22001-01-04 01:46:03 +00002316 CONVERT_BINOP(v, w, &a, &b);
2317
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002318 shiftby = PyLong_AsLong((PyObject *)b);
2319 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00002320 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002321 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002322 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002323 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002324 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002325 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002326 PyErr_SetString(PyExc_ValueError,
2327 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002328 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002329 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002330 /* wordshift, remshift = divmod(shiftby, SHIFT) */
2331 wordshift = (int)shiftby / SHIFT;
2332 remshift = (int)shiftby - wordshift * SHIFT;
2333
2334 oldsize = ABS(a->ob_size);
2335 newsize = oldsize + wordshift;
2336 if (remshift)
2337 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002338 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002339 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002340 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002341 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002342 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002343 for (i = 0; i < wordshift; i++)
2344 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002345 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002346 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
2347 accum |= a->ob_digit[j] << remshift;
2348 z->ob_digit[i] = (digit)(accum & MASK);
2349 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002350 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002351 if (remshift)
2352 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002353 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002354 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002355 z = long_normalize(z);
2356lshift_error:
2357 Py_DECREF(a);
2358 Py_DECREF(b);
2359 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002360}
2361
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002362
2363/* Bitwise and/xor/or operations */
2364
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002365static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002366long_bitwise(PyLongObject *a,
2367 int op, /* '&', '|', '^' */
2368 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002369{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002370 digit maska, maskb; /* 0 or MASK */
2371 int negz;
2372 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002373 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002374 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002375 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002376 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002377
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002378 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002379 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002380 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002381 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002382 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002383 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002384 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002385 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002386 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002387 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002388 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002389 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002390 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002391 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002392 maskb = 0;
2393 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002394
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002395 negz = 0;
2396 switch (op) {
2397 case '^':
2398 if (maska != maskb) {
2399 maska ^= MASK;
2400 negz = -1;
2401 }
2402 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002403 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002404 if (maska && maskb) {
2405 op = '|';
2406 maska ^= MASK;
2407 maskb ^= MASK;
2408 negz = -1;
2409 }
2410 break;
2411 case '|':
2412 if (maska || maskb) {
2413 op = '&';
2414 maska ^= MASK;
2415 maskb ^= MASK;
2416 negz = -1;
2417 }
2418 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002419 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002420
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002421 /* JRH: The original logic here was to allocate the result value (z)
2422 as the longer of the two operands. However, there are some cases
2423 where the result is guaranteed to be shorter than that: AND of two
2424 positives, OR of two negatives: use the shorter number. AND with
2425 mixed signs: use the positive number. OR with mixed signs: use the
2426 negative number. After the transformations above, op will be '&'
2427 iff one of these cases applies, and mask will be non-0 for operands
2428 whose length should be ignored.
2429 */
2430
2431 size_a = a->ob_size;
2432 size_b = b->ob_size;
2433 size_z = op == '&'
2434 ? (maska
2435 ? size_b
2436 : (maskb ? size_a : MIN(size_a, size_b)))
2437 : MAX(size_a, size_b);
2438 z = _PyLong_New(size_z);
2439 if (a == NULL || b == NULL || z == NULL) {
2440 Py_XDECREF(a);
2441 Py_XDECREF(b);
2442 Py_XDECREF(z);
2443 return NULL;
2444 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002445
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002446 for (i = 0; i < size_z; ++i) {
2447 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2448 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2449 switch (op) {
2450 case '&': z->ob_digit[i] = diga & digb; break;
2451 case '|': z->ob_digit[i] = diga | digb; break;
2452 case '^': z->ob_digit[i] = diga ^ digb; break;
2453 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002454 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002455
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002456 Py_DECREF(a);
2457 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002458 z = long_normalize(z);
2459 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002460 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002461 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002462 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002463 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002464}
2465
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002466static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002467long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002468{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002469 PyLongObject *a, *b;
2470 PyObject *c;
2471 CONVERT_BINOP(v, w, &a, &b);
2472 c = long_bitwise(a, '&', b);
2473 Py_DECREF(a);
2474 Py_DECREF(b);
2475 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002476}
2477
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002478static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002479long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002480{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002481 PyLongObject *a, *b;
2482 PyObject *c;
2483 CONVERT_BINOP(v, w, &a, &b);
2484 c = long_bitwise(a, '^', b);
2485 Py_DECREF(a);
2486 Py_DECREF(b);
2487 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002488}
2489
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002490static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002491long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002492{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002493 PyLongObject *a, *b;
2494 PyObject *c;
2495 CONVERT_BINOP(v, w, &a, &b);
2496 c = long_bitwise(a, '|', b);
2497 Py_DECREF(a);
2498 Py_DECREF(b);
2499 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002500}
2501
Guido van Rossum234f9421993-06-17 12:35:49 +00002502static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002503long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002504{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002505 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002506 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002507 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002508 return 0;
2509 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002510 else if (PyLong_Check(*pw)) {
2511 Py_INCREF(*pv);
2512 Py_INCREF(*pw);
2513 return 0;
2514 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002515 return 1; /* Can't do it */
2516}
2517
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002518static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002519long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002520{
2521 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002522 x = PyLong_AsLong(v);
2523 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002524 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002525 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002526}
2527
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002528static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002529long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002530{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002531 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002532 return v;
2533}
2534
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002535static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002536long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002537{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002538 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002539 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002540 if (result == -1.0 && PyErr_Occurred())
2541 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002542 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002543}
2544
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002545static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002546long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002547{
Fred Drake121ee271999-12-23 15:41:28 +00002548 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002549}
2550
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002551static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002552long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002553{
Fred Drake121ee271999-12-23 15:41:28 +00002554 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002555}
Jeremy Hylton938ace62002-07-17 16:30:39 +00002556
2557static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00002558long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002559
Tim Peters6d6c1a32001-08-02 04:15:00 +00002560static PyObject *
2561long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2562{
2563 PyObject *x = NULL;
2564 int base = -909; /* unlikely! */
2565 static char *kwlist[] = {"x", "base", 0};
2566
Guido van Rossumbef14172001-08-29 15:47:46 +00002567 if (type != &PyLong_Type)
2568 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002569 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2570 &x, &base))
2571 return NULL;
2572 if (x == NULL)
2573 return PyLong_FromLong(0L);
2574 if (base == -909)
2575 return PyNumber_Long(x);
2576 else if (PyString_Check(x))
2577 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002578#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002579 else if (PyUnicode_Check(x))
2580 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2581 PyUnicode_GET_SIZE(x),
2582 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002583#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002584 else {
2585 PyErr_SetString(PyExc_TypeError,
2586 "long() can't convert non-string with explicit base");
2587 return NULL;
2588 }
2589}
2590
Guido van Rossumbef14172001-08-29 15:47:46 +00002591/* Wimpy, slow approach to tp_new calls for subtypes of long:
2592 first create a regular long from whatever arguments we got,
2593 then allocate a subtype instance and initialize it from
2594 the regular long. The regular long is then thrown away.
2595*/
2596static PyObject *
2597long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2598{
2599 PyLongObject *tmp, *new;
2600 int i, n;
2601
2602 assert(PyType_IsSubtype(type, &PyLong_Type));
2603 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2604 if (tmp == NULL)
2605 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002606 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002607 n = tmp->ob_size;
2608 if (n < 0)
2609 n = -n;
2610 new = (PyLongObject *)type->tp_alloc(type, n);
2611 if (new == NULL)
2612 return NULL;
2613 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002614 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002615 for (i = 0; i < n; i++)
2616 new->ob_digit[i] = tmp->ob_digit[i];
2617 Py_DECREF(tmp);
2618 return (PyObject *)new;
2619}
2620
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002621PyDoc_STRVAR(long_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002622"long(x[, base]) -> integer\n\
2623\n\
2624Convert a string or number to a long integer, if possible. A floating\n\
2625point argument will be truncated towards zero (this does not include a\n\
2626string representation of a floating point number!) When converting a\n\
2627string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002628converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002629
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002630static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002631 (binaryfunc) long_add, /*nb_add*/
2632 (binaryfunc) long_sub, /*nb_subtract*/
2633 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002634 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002635 (binaryfunc) long_mod, /*nb_remainder*/
2636 (binaryfunc) long_divmod, /*nb_divmod*/
2637 (ternaryfunc) long_pow, /*nb_power*/
2638 (unaryfunc) long_neg, /*nb_negative*/
2639 (unaryfunc) long_pos, /*tp_positive*/
2640 (unaryfunc) long_abs, /*tp_absolute*/
2641 (inquiry) long_nonzero, /*tp_nonzero*/
2642 (unaryfunc) long_invert, /*nb_invert*/
2643 (binaryfunc) long_lshift, /*nb_lshift*/
2644 (binaryfunc) long_rshift, /*nb_rshift*/
2645 (binaryfunc) long_and, /*nb_and*/
2646 (binaryfunc) long_xor, /*nb_xor*/
2647 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002648 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002649 (unaryfunc) long_int, /*nb_int*/
2650 (unaryfunc) long_long, /*nb_long*/
2651 (unaryfunc) long_float, /*nb_float*/
2652 (unaryfunc) long_oct, /*nb_oct*/
2653 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002654 0, /* nb_inplace_add */
2655 0, /* nb_inplace_subtract */
2656 0, /* nb_inplace_multiply */
2657 0, /* nb_inplace_divide */
2658 0, /* nb_inplace_remainder */
2659 0, /* nb_inplace_power */
2660 0, /* nb_inplace_lshift */
2661 0, /* nb_inplace_rshift */
2662 0, /* nb_inplace_and */
2663 0, /* nb_inplace_xor */
2664 0, /* nb_inplace_or */
2665 (binaryfunc)long_div, /* nb_floor_divide */
2666 long_true_divide, /* nb_true_divide */
2667 0, /* nb_inplace_floor_divide */
2668 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002669};
2670
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002671PyTypeObject PyLong_Type = {
2672 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002673 0, /* ob_size */
2674 "long", /* tp_name */
2675 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2676 sizeof(digit), /* tp_itemsize */
2677 (destructor)long_dealloc, /* tp_dealloc */
2678 0, /* tp_print */
2679 0, /* tp_getattr */
2680 0, /* tp_setattr */
2681 (cmpfunc)long_compare, /* tp_compare */
2682 (reprfunc)long_repr, /* tp_repr */
2683 &long_as_number, /* tp_as_number */
2684 0, /* tp_as_sequence */
2685 0, /* tp_as_mapping */
2686 (hashfunc)long_hash, /* tp_hash */
2687 0, /* tp_call */
2688 (reprfunc)long_str, /* tp_str */
2689 PyObject_GenericGetAttr, /* tp_getattro */
2690 0, /* tp_setattro */
2691 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002692 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2693 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002694 long_doc, /* tp_doc */
2695 0, /* tp_traverse */
2696 0, /* tp_clear */
2697 0, /* tp_richcompare */
2698 0, /* tp_weaklistoffset */
2699 0, /* tp_iter */
2700 0, /* tp_iternext */
2701 0, /* tp_methods */
2702 0, /* tp_members */
2703 0, /* tp_getset */
2704 0, /* tp_base */
2705 0, /* tp_dict */
2706 0, /* tp_descr_get */
2707 0, /* tp_descr_set */
2708 0, /* tp_dictoffset */
2709 0, /* tp_init */
2710 0, /* tp_alloc */
2711 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00002712 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002713};