blob: 1c4a343cf7ca7c3b8becdbdbfe42fde2e2129c83 [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 Peters8e966ee2002-08-14 16:36:23 +00001794
1795Note that the "lazy" analysis is enough to show that there's always enough
1796room to subtract al*bl and ah*bh. al and bl each have no more than shift
1797digits, so al*bl has no more than 2*shift, so there's at least one digit
1798to spare in the remaining allocated digits. The same is true for ah*bh when
1799bsize is even. When bsize is odd, ah*bh has at most 2*shift+2 digits, and
1800there are at least that many remaining allocated digits when bsize is odd.
Tim Petersd6974a52002-08-13 20:37:51 +00001801*/
1802
Tim Peters60004642002-08-12 22:01:34 +00001803/* b has at least twice the digits of a, and a is big enough that Karatsuba
1804 * would pay off *if* the inputs had balanced sizes. View b as a sequence
1805 * of slices, each with a->ob_size digits, and multiply the slices by a,
1806 * one at a time. This gives k_mul balanced inputs to work with, and is
1807 * also cache-friendly (we compute one double-width slice of the result
1808 * at a time, then move on, never bactracking except for the helpful
1809 * single-width slice overlap between successive partial sums).
1810 */
1811static PyLongObject *
1812k_lopsided_mul(PyLongObject *a, PyLongObject *b)
1813{
1814 const int asize = ABS(a->ob_size);
1815 int bsize = ABS(b->ob_size);
1816 int nbdone; /* # of b digits already multiplied */
1817 PyLongObject *ret;
1818 PyLongObject *bslice = NULL;
1819
1820 assert(asize > KARATSUBA_CUTOFF);
1821 assert(2 * asize <= bsize);
1822
1823 /* Allocate result space, and zero it out. */
1824 ret = _PyLong_New(asize + bsize);
1825 if (ret == NULL)
1826 return NULL;
1827 memset(ret->ob_digit, 0, ret->ob_size * sizeof(digit));
1828
1829 /* Successive slices of b are copied into bslice. */
Tim Peters12034032002-08-12 22:10:00 +00001830 bslice = _PyLong_New(asize);
Tim Peters60004642002-08-12 22:01:34 +00001831 if (bslice == NULL)
1832 goto fail;
1833
1834 nbdone = 0;
1835 while (bsize > 0) {
1836 PyLongObject *product;
1837 const int nbtouse = MIN(bsize, asize);
1838
1839 /* Multiply the next slice of b by a. */
1840 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
1841 nbtouse * sizeof(digit));
1842 bslice->ob_size = nbtouse;
1843 product = k_mul(a, bslice);
1844 if (product == NULL)
1845 goto fail;
1846
1847 /* Add into result. */
1848 (void)v_iadd(ret->ob_digit + nbdone, ret->ob_size - nbdone,
1849 product->ob_digit, product->ob_size);
1850 Py_DECREF(product);
1851
1852 bsize -= nbtouse;
1853 nbdone += nbtouse;
1854 }
1855
1856 Py_DECREF(bslice);
1857 return long_normalize(ret);
1858
1859 fail:
1860 Py_DECREF(ret);
1861 Py_XDECREF(bslice);
1862 return NULL;
1863}
Tim Peters5af4e6c2002-08-12 02:31:19 +00001864
1865static PyObject *
1866long_mul(PyLongObject *v, PyLongObject *w)
1867{
1868 PyLongObject *a, *b, *z;
1869
1870 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
1871 if (!PyLong_Check(v) &&
1872 v->ob_type->tp_as_sequence &&
1873 v->ob_type->tp_as_sequence->sq_repeat)
1874 return long_repeat((PyObject *)v, w);
1875 if (!PyLong_Check(w) &&
1876 w->ob_type->tp_as_sequence &&
1877 w->ob_type->tp_as_sequence->sq_repeat)
1878 return long_repeat((PyObject *)w, v);
1879 Py_INCREF(Py_NotImplemented);
1880 return Py_NotImplemented;
1881 }
1882
Tim Petersd64c1de2002-08-12 17:36:03 +00001883 z = k_mul(a, b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001884 if(z == NULL) {
1885 Py_DECREF(a);
1886 Py_DECREF(b);
1887 return NULL;
1888 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001889 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001890 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001891 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001892 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001893 Py_DECREF(a);
1894 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001895 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001896}
1897
Guido van Rossume32e0141992-01-19 16:31:05 +00001898/* The / and % operators are now defined in terms of divmod().
1899 The expression a mod b has the value a - b*floor(a/b).
1900 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001901 |a| by |b|, with the sign of a. This is also expressed
1902 as a - b*trunc(a/b), if trunc truncates towards zero.
1903 Some examples:
1904 a b a rem b a mod b
1905 13 10 3 3
1906 -13 10 -3 7
1907 13 -10 3 -7
1908 -13 -10 -3 -3
1909 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001910 have different signs. We then subtract one from the 'div'
1911 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001912
Guido van Rossume32e0141992-01-19 16:31:05 +00001913static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00001914l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00001915 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001916{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001917 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001918
Guido van Rossume32e0141992-01-19 16:31:05 +00001919 if (long_divrem(v, w, &div, &mod) < 0)
1920 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001921 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1922 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001923 PyLongObject *temp;
1924 PyLongObject *one;
1925 temp = (PyLongObject *) long_add(mod, w);
1926 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001927 mod = temp;
1928 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001929 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001930 return -1;
1931 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001932 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001933 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001934 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1935 Py_DECREF(mod);
1936 Py_DECREF(div);
1937 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001938 return -1;
1939 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001940 Py_DECREF(one);
1941 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001942 div = temp;
1943 }
1944 *pdiv = div;
1945 *pmod = mod;
1946 return 0;
1947}
1948
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001949static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001950long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001951{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001952 PyLongObject *a, *b, *div, *mod;
1953
1954 CONVERT_BINOP(v, w, &a, &b);
1955
1956 if (l_divmod(a, b, &div, &mod) < 0) {
1957 Py_DECREF(a);
1958 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001959 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001960 }
1961 Py_DECREF(a);
1962 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001963 Py_DECREF(mod);
1964 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001965}
1966
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001967static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001968long_classic_div(PyObject *v, PyObject *w)
1969{
1970 PyLongObject *a, *b, *div, *mod;
1971
1972 CONVERT_BINOP(v, w, &a, &b);
1973
1974 if (Py_DivisionWarningFlag &&
1975 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1976 div = NULL;
1977 else if (l_divmod(a, b, &div, &mod) < 0)
1978 div = NULL;
1979 else
1980 Py_DECREF(mod);
1981
1982 Py_DECREF(a);
1983 Py_DECREF(b);
1984 return (PyObject *)div;
1985}
1986
1987static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00001988long_true_divide(PyObject *v, PyObject *w)
1989{
Tim Peterse2a60002001-09-04 06:17:36 +00001990 PyLongObject *a, *b;
1991 double ad, bd;
Tim Peters6f97e492001-11-04 23:09:40 +00001992 int aexp, bexp, failed;
Tim Peterse2a60002001-09-04 06:17:36 +00001993
1994 CONVERT_BINOP(v, w, &a, &b);
1995 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
1996 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00001997 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
1998 Py_DECREF(a);
1999 Py_DECREF(b);
2000 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00002001 return NULL;
2002
2003 if (bd == 0.0) {
2004 PyErr_SetString(PyExc_ZeroDivisionError,
2005 "long division or modulo by zero");
2006 return NULL;
2007 }
2008
2009 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
2010 ad /= bd; /* overflow/underflow impossible here */
2011 aexp -= bexp;
2012 if (aexp > INT_MAX / SHIFT)
2013 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00002014 else if (aexp < -(INT_MAX / SHIFT))
2015 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002016 errno = 0;
2017 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00002018 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002019 goto overflow;
2020 return PyFloat_FromDouble(ad);
2021
2022overflow:
2023 PyErr_SetString(PyExc_OverflowError,
2024 "long/long too large for a float");
2025 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002026
Tim Peters20dab9f2001-09-04 05:31:47 +00002027}
2028
2029static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002030long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002031{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002032 PyLongObject *a, *b, *div, *mod;
2033
2034 CONVERT_BINOP(v, w, &a, &b);
2035
2036 if (l_divmod(a, b, &div, &mod) < 0) {
2037 Py_DECREF(a);
2038 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00002039 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002040 }
2041 Py_DECREF(a);
2042 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002043 Py_DECREF(div);
2044 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002045}
2046
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002047static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002048long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002049{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002050 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002051 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002052
2053 CONVERT_BINOP(v, w, &a, &b);
2054
2055 if (l_divmod(a, b, &div, &mod) < 0) {
2056 Py_DECREF(a);
2057 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002058 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002059 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002060 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002061 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002062 PyTuple_SetItem(z, 0, (PyObject *) div);
2063 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002064 }
2065 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002066 Py_DECREF(div);
2067 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002068 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002069 Py_DECREF(a);
2070 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002071 return z;
2072}
2073
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002074static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002075long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002076{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002077 PyLongObject *a, *b;
2078 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002079 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002080 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002081
2082 CONVERT_BINOP(v, w, &a, &b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002083 if (PyLong_Check(x) || Py_None == x) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002084 c = x;
2085 Py_INCREF(x);
2086 }
2087 else if (PyInt_Check(x)) {
2088 c = PyLong_FromLong(PyInt_AS_LONG(x));
2089 }
2090 else {
2091 Py_DECREF(a);
2092 Py_DECREF(b);
2093 Py_INCREF(Py_NotImplemented);
2094 return Py_NotImplemented;
2095 }
Tim Peters4c483c42001-09-05 06:24:58 +00002096
2097 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
2098 PyErr_SetString(PyExc_ValueError,
2099 "pow() 3rd argument cannot be 0");
2100 z = NULL;
2101 goto error;
2102 }
2103
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002104 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002105 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002106 Py_DECREF(a);
2107 Py_DECREF(b);
2108 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00002109 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00002110 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
2111 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00002112 return NULL;
2113 }
2114 /* Return a float. This works because we know that
2115 this calls float_pow() which converts its
2116 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002117 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002118 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002119 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002120 for (i = 0; i < size_b; ++i) {
2121 digit bi = b->ob_digit[i];
2122 int j;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002123
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002124 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002125 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002126
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002127 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002128 temp = (PyLongObject *)long_mul(z, a);
2129 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002130 if (c!=Py_None && temp!=NULL) {
2131 if (l_divmod(temp,(PyLongObject *)c,
2132 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002133 Py_DECREF(temp);
2134 z = NULL;
2135 goto error;
2136 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002137 Py_XDECREF(div);
2138 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002139 temp = mod;
2140 }
2141 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002142 if (z == NULL)
2143 break;
2144 }
2145 bi >>= 1;
2146 if (bi == 0 && i+1 == size_b)
2147 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002148 temp = (PyLongObject *)long_mul(a, a);
2149 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002150 if (c!=Py_None && temp!=NULL) {
2151 if (l_divmod(temp, (PyLongObject *)c, &div,
2152 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002153 Py_DECREF(temp);
2154 z = NULL;
2155 goto error;
2156 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002157 Py_XDECREF(div);
2158 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002159 temp = mod;
2160 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002161 a = temp;
2162 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002163 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002164 z = NULL;
2165 break;
2166 }
2167 }
Guido van Rossumc206c761995-01-10 15:23:19 +00002168 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002169 break;
2170 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002171 if (c!=Py_None && z!=NULL) {
2172 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002173 Py_DECREF(z);
2174 z = NULL;
2175 }
2176 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002177 Py_XDECREF(div);
2178 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002179 z = mod;
2180 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002181 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002182 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00002183 Py_XDECREF(a);
2184 Py_DECREF(b);
2185 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002186 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002187}
2188
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002189static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002190long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002191{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002192 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002193 PyLongObject *x;
2194 PyLongObject *w;
2195 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002196 if (w == NULL)
2197 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002198 x = (PyLongObject *) long_add(v, w);
2199 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002200 if (x == NULL)
2201 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00002202 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002203 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002204}
2205
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002206static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002207long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002208{
Tim Peters69c2de32001-09-11 22:31:33 +00002209 if (PyLong_CheckExact(v)) {
2210 Py_INCREF(v);
2211 return (PyObject *)v;
2212 }
2213 else
2214 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002215}
2216
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002217static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002218long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002219{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002220 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002221 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002222 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002223 Py_INCREF(v);
2224 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002225 }
Tim Peters69c2de32001-09-11 22:31:33 +00002226 z = (PyLongObject *)_PyLong_Copy(v);
2227 if (z != NULL)
2228 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002229 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002230}
2231
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002232static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002233long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002234{
2235 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002236 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00002237 else
2238 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002239}
2240
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002241static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002242long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002243{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002244 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002245}
2246
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002247static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002248long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002249{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002250 PyLongObject *a, *b;
2251 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002252 long shiftby;
2253 int newsize, wordshift, loshift, hishift, i, j;
2254 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002255
Neil Schemenauerba872e22001-01-04 01:46:03 +00002256 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2257
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002258 if (a->ob_size < 0) {
2259 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002260 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002261 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002262 if (a1 == NULL)
2263 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002264 a2 = (PyLongObject *) long_rshift(a1, b);
2265 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002266 if (a2 == NULL)
2267 goto rshift_error;
2268 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002269 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002270 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002271 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002272
Neil Schemenauerba872e22001-01-04 01:46:03 +00002273 shiftby = PyLong_AsLong((PyObject *)b);
2274 if (shiftby == -1L && PyErr_Occurred())
2275 goto rshift_error;
2276 if (shiftby < 0) {
2277 PyErr_SetString(PyExc_ValueError,
2278 "negative shift count");
2279 goto rshift_error;
2280 }
2281 wordshift = shiftby / SHIFT;
2282 newsize = ABS(a->ob_size) - wordshift;
2283 if (newsize <= 0) {
2284 z = _PyLong_New(0);
2285 Py_DECREF(a);
2286 Py_DECREF(b);
2287 return (PyObject *)z;
2288 }
2289 loshift = shiftby % SHIFT;
2290 hishift = SHIFT - loshift;
2291 lomask = ((digit)1 << hishift) - 1;
2292 himask = MASK ^ lomask;
2293 z = _PyLong_New(newsize);
2294 if (z == NULL)
2295 goto rshift_error;
2296 if (a->ob_size < 0)
2297 z->ob_size = -(z->ob_size);
2298 for (i = 0, j = wordshift; i < newsize; i++, j++) {
2299 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
2300 if (i+1 < newsize)
2301 z->ob_digit[i] |=
2302 (a->ob_digit[j+1] << hishift) & himask;
2303 }
2304 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002305 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002306rshift_error:
2307 Py_DECREF(a);
2308 Py_DECREF(b);
2309 return (PyObject *) z;
2310
Guido van Rossumc6913e71991-11-19 20:26:46 +00002311}
2312
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002313static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002314long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002315{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002316 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002317 PyLongObject *a, *b;
2318 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002319 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002320 int oldsize, newsize, wordshift, remshift, i, j;
2321 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002322
Neil Schemenauerba872e22001-01-04 01:46:03 +00002323 CONVERT_BINOP(v, w, &a, &b);
2324
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002325 shiftby = PyLong_AsLong((PyObject *)b);
2326 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00002327 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002328 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002329 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002330 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002331 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002332 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002333 PyErr_SetString(PyExc_ValueError,
2334 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002335 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002336 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002337 /* wordshift, remshift = divmod(shiftby, SHIFT) */
2338 wordshift = (int)shiftby / SHIFT;
2339 remshift = (int)shiftby - wordshift * SHIFT;
2340
2341 oldsize = ABS(a->ob_size);
2342 newsize = oldsize + wordshift;
2343 if (remshift)
2344 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002345 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002346 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002347 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002348 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002349 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002350 for (i = 0; i < wordshift; i++)
2351 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002352 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002353 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
2354 accum |= a->ob_digit[j] << remshift;
2355 z->ob_digit[i] = (digit)(accum & MASK);
2356 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002357 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002358 if (remshift)
2359 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002360 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002361 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002362 z = long_normalize(z);
2363lshift_error:
2364 Py_DECREF(a);
2365 Py_DECREF(b);
2366 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002367}
2368
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002369
2370/* Bitwise and/xor/or operations */
2371
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002372static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002373long_bitwise(PyLongObject *a,
2374 int op, /* '&', '|', '^' */
2375 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002376{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002377 digit maska, maskb; /* 0 or MASK */
2378 int negz;
2379 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002380 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002381 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002382 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002383 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002384
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002385 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002386 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002387 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002388 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002389 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002390 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002391 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002392 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002393 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002394 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002395 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002396 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002397 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002398 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002399 maskb = 0;
2400 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002401
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002402 negz = 0;
2403 switch (op) {
2404 case '^':
2405 if (maska != maskb) {
2406 maska ^= MASK;
2407 negz = -1;
2408 }
2409 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002410 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002411 if (maska && maskb) {
2412 op = '|';
2413 maska ^= MASK;
2414 maskb ^= MASK;
2415 negz = -1;
2416 }
2417 break;
2418 case '|':
2419 if (maska || maskb) {
2420 op = '&';
2421 maska ^= MASK;
2422 maskb ^= MASK;
2423 negz = -1;
2424 }
2425 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002426 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002427
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002428 /* JRH: The original logic here was to allocate the result value (z)
2429 as the longer of the two operands. However, there are some cases
2430 where the result is guaranteed to be shorter than that: AND of two
2431 positives, OR of two negatives: use the shorter number. AND with
2432 mixed signs: use the positive number. OR with mixed signs: use the
2433 negative number. After the transformations above, op will be '&'
2434 iff one of these cases applies, and mask will be non-0 for operands
2435 whose length should be ignored.
2436 */
2437
2438 size_a = a->ob_size;
2439 size_b = b->ob_size;
2440 size_z = op == '&'
2441 ? (maska
2442 ? size_b
2443 : (maskb ? size_a : MIN(size_a, size_b)))
2444 : MAX(size_a, size_b);
2445 z = _PyLong_New(size_z);
2446 if (a == NULL || b == NULL || z == NULL) {
2447 Py_XDECREF(a);
2448 Py_XDECREF(b);
2449 Py_XDECREF(z);
2450 return NULL;
2451 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002452
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002453 for (i = 0; i < size_z; ++i) {
2454 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2455 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2456 switch (op) {
2457 case '&': z->ob_digit[i] = diga & digb; break;
2458 case '|': z->ob_digit[i] = diga | digb; break;
2459 case '^': z->ob_digit[i] = diga ^ digb; break;
2460 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002461 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002462
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002463 Py_DECREF(a);
2464 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002465 z = long_normalize(z);
2466 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002467 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002468 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002469 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002470 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002471}
2472
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002473static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002474long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002475{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002476 PyLongObject *a, *b;
2477 PyObject *c;
2478 CONVERT_BINOP(v, w, &a, &b);
2479 c = long_bitwise(a, '&', b);
2480 Py_DECREF(a);
2481 Py_DECREF(b);
2482 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002483}
2484
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002485static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002486long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002487{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002488 PyLongObject *a, *b;
2489 PyObject *c;
2490 CONVERT_BINOP(v, w, &a, &b);
2491 c = long_bitwise(a, '^', b);
2492 Py_DECREF(a);
2493 Py_DECREF(b);
2494 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002495}
2496
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002497static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002498long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002499{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002500 PyLongObject *a, *b;
2501 PyObject *c;
2502 CONVERT_BINOP(v, w, &a, &b);
2503 c = long_bitwise(a, '|', b);
2504 Py_DECREF(a);
2505 Py_DECREF(b);
2506 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002507}
2508
Guido van Rossum234f9421993-06-17 12:35:49 +00002509static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002510long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002511{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002512 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002513 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002514 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002515 return 0;
2516 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002517 else if (PyLong_Check(*pw)) {
2518 Py_INCREF(*pv);
2519 Py_INCREF(*pw);
2520 return 0;
2521 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002522 return 1; /* Can't do it */
2523}
2524
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002525static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002526long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002527{
2528 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002529 x = PyLong_AsLong(v);
2530 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002531 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002532 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002533}
2534
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002535static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002536long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002537{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002538 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002539 return v;
2540}
2541
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002542static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002543long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002544{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002545 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002546 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002547 if (result == -1.0 && PyErr_Occurred())
2548 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002549 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002550}
2551
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002552static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002553long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002554{
Fred Drake121ee271999-12-23 15:41:28 +00002555 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002556}
2557
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002558static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002559long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002560{
Fred Drake121ee271999-12-23 15:41:28 +00002561 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002562}
Jeremy Hylton938ace62002-07-17 16:30:39 +00002563
2564static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00002565long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002566
Tim Peters6d6c1a32001-08-02 04:15:00 +00002567static PyObject *
2568long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2569{
2570 PyObject *x = NULL;
2571 int base = -909; /* unlikely! */
2572 static char *kwlist[] = {"x", "base", 0};
2573
Guido van Rossumbef14172001-08-29 15:47:46 +00002574 if (type != &PyLong_Type)
2575 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002576 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2577 &x, &base))
2578 return NULL;
2579 if (x == NULL)
2580 return PyLong_FromLong(0L);
2581 if (base == -909)
2582 return PyNumber_Long(x);
2583 else if (PyString_Check(x))
2584 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002585#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002586 else if (PyUnicode_Check(x))
2587 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2588 PyUnicode_GET_SIZE(x),
2589 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002590#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002591 else {
2592 PyErr_SetString(PyExc_TypeError,
2593 "long() can't convert non-string with explicit base");
2594 return NULL;
2595 }
2596}
2597
Guido van Rossumbef14172001-08-29 15:47:46 +00002598/* Wimpy, slow approach to tp_new calls for subtypes of long:
2599 first create a regular long from whatever arguments we got,
2600 then allocate a subtype instance and initialize it from
2601 the regular long. The regular long is then thrown away.
2602*/
2603static PyObject *
2604long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2605{
2606 PyLongObject *tmp, *new;
2607 int i, n;
2608
2609 assert(PyType_IsSubtype(type, &PyLong_Type));
2610 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2611 if (tmp == NULL)
2612 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002613 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002614 n = tmp->ob_size;
2615 if (n < 0)
2616 n = -n;
2617 new = (PyLongObject *)type->tp_alloc(type, n);
2618 if (new == NULL)
2619 return NULL;
2620 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002621 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002622 for (i = 0; i < n; i++)
2623 new->ob_digit[i] = tmp->ob_digit[i];
2624 Py_DECREF(tmp);
2625 return (PyObject *)new;
2626}
2627
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002628PyDoc_STRVAR(long_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002629"long(x[, base]) -> integer\n\
2630\n\
2631Convert a string or number to a long integer, if possible. A floating\n\
2632point argument will be truncated towards zero (this does not include a\n\
2633string representation of a floating point number!) When converting a\n\
2634string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002635converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002636
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002637static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002638 (binaryfunc) long_add, /*nb_add*/
2639 (binaryfunc) long_sub, /*nb_subtract*/
2640 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002641 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002642 (binaryfunc) long_mod, /*nb_remainder*/
2643 (binaryfunc) long_divmod, /*nb_divmod*/
2644 (ternaryfunc) long_pow, /*nb_power*/
2645 (unaryfunc) long_neg, /*nb_negative*/
2646 (unaryfunc) long_pos, /*tp_positive*/
2647 (unaryfunc) long_abs, /*tp_absolute*/
2648 (inquiry) long_nonzero, /*tp_nonzero*/
2649 (unaryfunc) long_invert, /*nb_invert*/
2650 (binaryfunc) long_lshift, /*nb_lshift*/
2651 (binaryfunc) long_rshift, /*nb_rshift*/
2652 (binaryfunc) long_and, /*nb_and*/
2653 (binaryfunc) long_xor, /*nb_xor*/
2654 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002655 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002656 (unaryfunc) long_int, /*nb_int*/
2657 (unaryfunc) long_long, /*nb_long*/
2658 (unaryfunc) long_float, /*nb_float*/
2659 (unaryfunc) long_oct, /*nb_oct*/
2660 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002661 0, /* nb_inplace_add */
2662 0, /* nb_inplace_subtract */
2663 0, /* nb_inplace_multiply */
2664 0, /* nb_inplace_divide */
2665 0, /* nb_inplace_remainder */
2666 0, /* nb_inplace_power */
2667 0, /* nb_inplace_lshift */
2668 0, /* nb_inplace_rshift */
2669 0, /* nb_inplace_and */
2670 0, /* nb_inplace_xor */
2671 0, /* nb_inplace_or */
2672 (binaryfunc)long_div, /* nb_floor_divide */
2673 long_true_divide, /* nb_true_divide */
2674 0, /* nb_inplace_floor_divide */
2675 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002676};
2677
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002678PyTypeObject PyLong_Type = {
2679 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002680 0, /* ob_size */
2681 "long", /* tp_name */
2682 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2683 sizeof(digit), /* tp_itemsize */
2684 (destructor)long_dealloc, /* tp_dealloc */
2685 0, /* tp_print */
2686 0, /* tp_getattr */
2687 0, /* tp_setattr */
2688 (cmpfunc)long_compare, /* tp_compare */
2689 (reprfunc)long_repr, /* tp_repr */
2690 &long_as_number, /* tp_as_number */
2691 0, /* tp_as_sequence */
2692 0, /* tp_as_mapping */
2693 (hashfunc)long_hash, /* tp_hash */
2694 0, /* tp_call */
2695 (reprfunc)long_str, /* tp_str */
2696 PyObject_GenericGetAttr, /* tp_getattro */
2697 0, /* tp_setattro */
2698 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002699 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2700 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002701 long_doc, /* tp_doc */
2702 0, /* tp_traverse */
2703 0, /* tp_clear */
2704 0, /* tp_richcompare */
2705 0, /* tp_weaklistoffset */
2706 0, /* tp_iter */
2707 0, /* tp_iternext */
2708 0, /* tp_methods */
2709 0, /* tp_members */
2710 0, /* tp_getset */
2711 0, /* tp_base */
2712 0, /* tp_dict */
2713 0, /* tp_descr_get */
2714 0, /* tp_descr_set */
2715 0, /* tp_dictoffset */
2716 0, /* tp_init */
2717 0, /* tp_alloc */
2718 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00002719 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002720};