blob: 35d121120d0e90bf978cb15c8660332fa6ede22f [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001
2/* Long (arbitrary precision) integer object implementation */
3
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004/* XXX The functional organization of this file is terrible */
5
Guido van Rossumc0b618a1997-05-02 03:12:38 +00006#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +00007#include "longintrepr.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00009#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000010
Tim Peters5af4e6c2002-08-12 02:31:19 +000011/* For long multiplication, use the O(N**2) school algorithm unless
12 * both operands contain more than KARATSUBA_CUTOFF digits (this
13 * being an internal Python long digit, in base BASE).
14 */
15#define KARATSUBA_CUTOFF 35
16
Guido van Rossume32e0141992-01-19 16:31:05 +000017#define ABS(x) ((x) < 0 ? -(x) : (x))
18
Tim Peters5af4e6c2002-08-12 02:31:19 +000019#undef MIN
20#undef MAX
21#define MAX(x, y) ((x) < (y) ? (y) : (x))
22#define MIN(x, y) ((x) > (y) ? (y) : (x))
23
Guido van Rossume32e0141992-01-19 16:31:05 +000024/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000025static PyLongObject *long_normalize(PyLongObject *);
26static PyLongObject *mul1(PyLongObject *, wdigit);
27static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
Tim Peters212e6142001-07-14 12:23:19 +000028static PyLongObject *divrem1(PyLongObject *, digit, digit *);
Tim Peters9f688bf2000-07-07 15:53:28 +000029static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000030
Guido van Rossumc0b618a1997-05-02 03:12:38 +000031#define SIGCHECK(PyTryBlock) \
Skip Montanarod581d772002-09-03 20:10:45 +000032 if (--_Py_Ticker < 0) { \
33 _Py_Ticker = _Py_CheckInterval; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000035 }
36
Guido van Rossumedcc38a1991-05-05 20:09:44 +000037/* Normalize (remove leading zeros from) a long int object.
38 Doesn't attempt to free the storage--in most cases, due to the nature
39 of the algorithms used, this could save at most be one word anyway. */
40
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000042long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000043{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000044 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000045 register int i = j;
Tim Peters5af4e6c2002-08-12 02:31:19 +000046
Guido van Rossumedcc38a1991-05-05 20:09:44 +000047 while (i > 0 && v->ob_digit[i-1] == 0)
48 --i;
49 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000050 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000051 return v;
52}
53
54/* Allocate a new long int object with size digits.
55 Return NULL and set exception if we run out of memory. */
56
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000058_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000059{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000060 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000061}
62
Tim Peters64b5ce32001-09-10 20:52:51 +000063PyObject *
64_PyLong_Copy(PyLongObject *src)
65{
66 PyLongObject *result;
67 int i;
68
69 assert(src != NULL);
70 i = src->ob_size;
71 if (i < 0)
72 i = -(i);
73 result = _PyLong_New(i);
74 if (result != NULL) {
Tim Peters5329cdb2002-03-02 04:18:04 +000075 result->ob_size = src->ob_size;
Tim Peters64b5ce32001-09-10 20:52:51 +000076 while (--i >= 0)
77 result->ob_digit[i] = src->ob_digit[i];
78 }
79 return (PyObject *)result;
80}
81
Guido van Rossumedcc38a1991-05-05 20:09:44 +000082/* Create a new long int object from a C long int */
83
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000085PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086{
Tim Petersce9de2f2001-06-14 04:56:19 +000087 PyLongObject *v;
88 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
89 int ndigits = 0;
90 int negative = 0;
91
92 if (ival < 0) {
93 ival = -ival;
94 negative = 1;
95 }
96
97 /* Count the number of Python digits.
98 We used to pick 5 ("big enough for anything"), but that's a
99 waste of time and space given that 5*15 = 75 bits are rarely
100 needed. */
101 t = (unsigned long)ival;
102 while (t) {
103 ++ndigits;
104 t >>= SHIFT;
105 }
106 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000107 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000108 digit *p = v->ob_digit;
109 v->ob_size = negative ? -ndigits : ndigits;
110 t = (unsigned long)ival;
111 while (t) {
112 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000113 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000114 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000115 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000117}
118
Guido van Rossum53756b11997-01-03 17:14:46 +0000119/* Create a new long int object from a C unsigned long int */
120
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000122PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +0000123{
Tim Petersce9de2f2001-06-14 04:56:19 +0000124 PyLongObject *v;
125 unsigned long t;
126 int ndigits = 0;
127
128 /* Count the number of Python digits. */
129 t = (unsigned long)ival;
130 while (t) {
131 ++ndigits;
132 t >>= SHIFT;
133 }
134 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000135 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000136 digit *p = v->ob_digit;
137 v->ob_size = ndigits;
138 while (ival) {
139 *p++ = (digit)(ival & MASK);
140 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000141 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000142 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000144}
145
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000146/* Create a new long int object from a C double */
147
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000150{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000152 double frac;
153 int i, ndig, expo, neg;
154 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000155 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000156 PyErr_SetString(PyExc_OverflowError,
157 "cannot convert float infinity to long");
158 return NULL;
159 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000160 if (dval < 0.0) {
161 neg = 1;
162 dval = -dval;
163 }
164 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
165 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000166 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000167 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000169 if (v == NULL)
170 return NULL;
171 frac = ldexp(frac, (expo-1) % SHIFT + 1);
172 for (i = ndig; --i >= 0; ) {
173 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000174 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000175 frac = frac - (double)bits;
176 frac = ldexp(frac, SHIFT);
177 }
178 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000179 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000180 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000181}
182
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000183/* Get a C long int from a long int object.
184 Returns -1 and sets an error condition if overflow occurs. */
185
186long
Tim Peters9f688bf2000-07-07 15:53:28 +0000187PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000188{
Guido van Rossumf7531811998-05-26 14:33:37 +0000189 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000191 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000192 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000193
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 if (vv == NULL || !PyLong_Check(vv)) {
Guido van Rossum7e35d572001-09-15 03:14:32 +0000195 if (vv != NULL && PyInt_Check(vv))
196 return PyInt_AsLong(vv);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000198 return -1;
199 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000201 i = v->ob_size;
202 sign = 1;
203 x = 0;
204 if (i < 0) {
205 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000206 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000207 }
208 while (--i >= 0) {
209 prev = x;
210 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000211 if ((x >> SHIFT) != prev)
212 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000213 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000214 /* Haven't lost any bits, but if the sign bit is set we're in
215 * trouble *unless* this is the min negative number. So,
216 * trouble iff sign bit set && (positive || some bit set other
217 * than the sign bit).
218 */
219 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
220 goto overflow;
221 return (long)x * sign;
222
223 overflow:
224 PyErr_SetString(PyExc_OverflowError,
Skip Montanarobafedec2001-09-13 19:05:30 +0000225 "long int too large to convert to int");
Guido van Rossumf7531811998-05-26 14:33:37 +0000226 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000227}
228
Guido van Rossumd8c80482002-08-13 00:24:58 +0000229/* Get a C unsigned long int from a long int object.
Guido van Rossum53756b11997-01-03 17:14:46 +0000230 Returns -1 and sets an error condition if overflow occurs. */
231
232unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000233PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000234{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000236 unsigned long x, prev;
237 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000238
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239 if (vv == NULL || !PyLong_Check(vv)) {
240 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000241 return (unsigned long) -1;
242 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000244 i = v->ob_size;
245 x = 0;
246 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000247 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000248 "can't convert negative value to unsigned long");
249 return (unsigned long) -1;
250 }
251 while (--i >= 0) {
252 prev = x;
253 x = (x << SHIFT) + v->ob_digit[i];
254 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000255 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000256 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000257 return (unsigned long) -1;
258 }
259 }
260 return x;
261}
262
Tim Peters2a9b3672001-06-11 21:23:58 +0000263PyObject *
264_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
265 int little_endian, int is_signed)
266{
267 const unsigned char* pstartbyte;/* LSB of bytes */
268 int incr; /* direction to move pstartbyte */
269 const unsigned char* pendbyte; /* MSB of bytes */
270 size_t numsignificantbytes; /* number of bytes that matter */
271 size_t ndigits; /* number of Python long digits */
272 PyLongObject* v; /* result */
273 int idigit = 0; /* next free index in v->ob_digit */
274
275 if (n == 0)
276 return PyLong_FromLong(0L);
277
278 if (little_endian) {
279 pstartbyte = bytes;
280 pendbyte = bytes + n - 1;
281 incr = 1;
282 }
283 else {
284 pstartbyte = bytes + n - 1;
285 pendbyte = bytes;
286 incr = -1;
287 }
288
289 if (is_signed)
290 is_signed = *pendbyte >= 0x80;
291
292 /* Compute numsignificantbytes. This consists of finding the most
293 significant byte. Leading 0 bytes are insignficant if the number
294 is positive, and leading 0xff bytes if negative. */
295 {
296 size_t i;
297 const unsigned char* p = pendbyte;
298 const int pincr = -incr; /* search MSB to LSB */
299 const unsigned char insignficant = is_signed ? 0xff : 0x00;
300
301 for (i = 0; i < n; ++i, p += pincr) {
302 if (*p != insignficant)
303 break;
304 }
305 numsignificantbytes = n - i;
306 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
307 actually has 2 significant bytes. OTOH, 0xff0001 ==
308 -0x00ffff, so we wouldn't *need* to bump it there; but we
309 do for 0xffff = -0x0001. To be safe without bothering to
310 check every case, bump it regardless. */
311 if (is_signed && numsignificantbytes < n)
312 ++numsignificantbytes;
313 }
314
315 /* How many Python long digits do we need? We have
316 8*numsignificantbytes bits, and each Python long digit has SHIFT
317 bits, so it's the ceiling of the quotient. */
318 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
319 if (ndigits > (size_t)INT_MAX)
320 return PyErr_NoMemory();
321 v = _PyLong_New((int)ndigits);
322 if (v == NULL)
323 return NULL;
324
325 /* Copy the bits over. The tricky parts are computing 2's-comp on
326 the fly for signed numbers, and dealing with the mismatch between
327 8-bit bytes and (probably) 15-bit Python digits.*/
328 {
329 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000330 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000331 twodigits accum = 0; /* sliding register */
332 unsigned int accumbits = 0; /* number of bits in accum */
333 const unsigned char* p = pstartbyte;
334
335 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000336 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000337 /* Compute correction for 2's comp, if needed. */
338 if (is_signed) {
339 thisbyte = (0xff ^ thisbyte) + carry;
340 carry = thisbyte >> 8;
341 thisbyte &= 0xff;
342 }
343 /* Because we're going LSB to MSB, thisbyte is
344 more significant than what's already in accum,
345 so needs to be prepended to accum. */
346 accum |= thisbyte << accumbits;
347 accumbits += 8;
348 if (accumbits >= SHIFT) {
349 /* There's enough to fill a Python digit. */
350 assert(idigit < (int)ndigits);
351 v->ob_digit[idigit] = (digit)(accum & MASK);
352 ++idigit;
353 accum >>= SHIFT;
354 accumbits -= SHIFT;
355 assert(accumbits < SHIFT);
356 }
357 }
358 assert(accumbits < SHIFT);
359 if (accumbits) {
360 assert(idigit < (int)ndigits);
361 v->ob_digit[idigit] = (digit)accum;
362 ++idigit;
363 }
364 }
365
366 v->ob_size = is_signed ? -idigit : idigit;
367 return (PyObject *)long_normalize(v);
368}
369
370int
371_PyLong_AsByteArray(PyLongObject* v,
372 unsigned char* bytes, size_t n,
373 int little_endian, int is_signed)
374{
375 int i; /* index into v->ob_digit */
376 int ndigits; /* |v->ob_size| */
377 twodigits accum; /* sliding register */
378 unsigned int accumbits; /* # bits in accum */
379 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
380 twodigits carry; /* for computing 2's-comp */
381 size_t j; /* # bytes filled */
382 unsigned char* p; /* pointer to next byte in bytes */
383 int pincr; /* direction to move p */
384
385 assert(v != NULL && PyLong_Check(v));
386
387 if (v->ob_size < 0) {
388 ndigits = -(v->ob_size);
389 if (!is_signed) {
390 PyErr_SetString(PyExc_TypeError,
391 "can't convert negative long to unsigned");
392 return -1;
393 }
394 do_twos_comp = 1;
395 }
396 else {
397 ndigits = v->ob_size;
398 do_twos_comp = 0;
399 }
400
401 if (little_endian) {
402 p = bytes;
403 pincr = 1;
404 }
405 else {
406 p = bytes + n - 1;
407 pincr = -1;
408 }
409
Tim Peters898cf852001-06-13 20:50:08 +0000410 /* Copy over all the Python digits.
411 It's crucial that every Python digit except for the MSD contribute
412 exactly SHIFT bits to the total, so first assert that the long is
413 normalized. */
414 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000415 j = 0;
416 accum = 0;
417 accumbits = 0;
418 carry = do_twos_comp ? 1 : 0;
419 for (i = 0; i < ndigits; ++i) {
420 twodigits thisdigit = v->ob_digit[i];
421 if (do_twos_comp) {
422 thisdigit = (thisdigit ^ MASK) + carry;
423 carry = thisdigit >> SHIFT;
424 thisdigit &= MASK;
425 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000426 /* Because we're going LSB to MSB, thisdigit is more
427 significant than what's already in accum, so needs to be
428 prepended to accum. */
429 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000430 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000431
Tim Petersede05092001-06-14 08:53:38 +0000432 /* The most-significant digit may be (probably is) at least
433 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000434 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000435 /* Count # of sign bits -- they needn't be stored,
436 * although for signed conversion we need later to
437 * make sure at least one sign bit gets stored.
438 * First shift conceptual sign bit to real sign bit.
439 */
440 stwodigits s = (stwodigits)(thisdigit <<
441 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000442 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000443 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000444 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000445 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000446 }
Tim Petersede05092001-06-14 08:53:38 +0000447 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000448 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000449
Tim Peters2a9b3672001-06-11 21:23:58 +0000450 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000451 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000452 if (j >= n)
453 goto Overflow;
454 ++j;
455 *p = (unsigned char)(accum & 0xff);
456 p += pincr;
457 accumbits -= 8;
458 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000459 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000460 }
461
462 /* Store the straggler (if any). */
463 assert(accumbits < 8);
464 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000465 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000466 if (j >= n)
467 goto Overflow;
468 ++j;
469 if (do_twos_comp) {
470 /* Fill leading bits of the byte with sign bits
471 (appropriately pretending that the long had an
472 infinite supply of sign bits). */
473 accum |= (~(twodigits)0) << accumbits;
474 }
475 *p = (unsigned char)(accum & 0xff);
476 p += pincr;
477 }
Tim Peters05607ad2001-06-13 21:01:27 +0000478 else if (j == n && n > 0 && is_signed) {
479 /* The main loop filled the byte array exactly, so the code
480 just above didn't get to ensure there's a sign bit, and the
481 loop below wouldn't add one either. Make sure a sign bit
482 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000483 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000484 int sign_bit_set = msb >= 0x80;
485 assert(accumbits == 0);
486 if (sign_bit_set == do_twos_comp)
487 return 0;
488 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000489 goto Overflow;
490 }
Tim Peters05607ad2001-06-13 21:01:27 +0000491
492 /* Fill remaining bytes with copies of the sign bit. */
493 {
494 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
495 for ( ; j < n; ++j, p += pincr)
496 *p = signbyte;
497 }
498
Tim Peters2a9b3672001-06-11 21:23:58 +0000499 return 0;
500
501Overflow:
502 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
503 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000504
Tim Peters2a9b3672001-06-11 21:23:58 +0000505}
506
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000507double
508_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
509{
510/* NBITS_WANTED should be > the number of bits in a double's precision,
511 but small enough so that 2**NBITS_WANTED is within the normal double
512 range. nbitsneeded is set to 1 less than that because the most-significant
513 Python digit contains at least 1 significant bit, but we don't want to
514 bother counting them (catering to the worst case cheaply).
515
516 57 is one more than VAX-D double precision; I (Tim) don't know of a double
517 format with more precision than that; it's 1 larger so that we add in at
518 least one round bit to stand in for the ignored least-significant bits.
519*/
520#define NBITS_WANTED 57
521 PyLongObject *v;
522 double x;
523 const double multiplier = (double)(1L << SHIFT);
524 int i, sign;
525 int nbitsneeded;
526
527 if (vv == NULL || !PyLong_Check(vv)) {
528 PyErr_BadInternalCall();
529 return -1;
530 }
531 v = (PyLongObject *)vv;
532 i = v->ob_size;
533 sign = 1;
534 if (i < 0) {
535 sign = -1;
536 i = -(i);
537 }
538 else if (i == 0) {
539 *exponent = 0;
540 return 0.0;
541 }
542 --i;
543 x = (double)v->ob_digit[i];
544 nbitsneeded = NBITS_WANTED - 1;
545 /* Invariant: i Python digits remain unaccounted for. */
546 while (i > 0 && nbitsneeded > 0) {
547 --i;
548 x = x * multiplier + (double)v->ob_digit[i];
549 nbitsneeded -= SHIFT;
550 }
551 /* There are i digits we didn't shift in. Pretending they're all
552 zeroes, the true value is x * 2**(i*SHIFT). */
553 *exponent = i;
554 assert(x > 0.0);
555 return x * sign;
556#undef NBITS_WANTED
557}
558
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000559/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000560
561double
Tim Peters9f688bf2000-07-07 15:53:28 +0000562PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000563{
Tim Peters9fffa3e2001-09-04 05:14:19 +0000564 int e;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000565 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000566
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 if (vv == NULL || !PyLong_Check(vv)) {
568 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000569 return -1;
570 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000571 x = _PyLong_AsScaledDouble(vv, &e);
572 if (x == -1.0 && PyErr_Occurred())
573 return -1.0;
574 if (e > INT_MAX / SHIFT)
575 goto overflow;
576 errno = 0;
577 x = ldexp(x, e * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000578 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000579 goto overflow;
580 return x;
581
582overflow:
583 PyErr_SetString(PyExc_OverflowError,
584 "long int too large to convert to float");
585 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000586}
587
Guido van Rossum78694d91998-09-18 14:14:13 +0000588/* Create a new long (or int) object from a C pointer */
589
590PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000591PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000592{
Tim Peters70128a12001-06-16 08:48:40 +0000593#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000594 return PyInt_FromLong((long)p);
595#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000596
Tim Peters70128a12001-06-16 08:48:40 +0000597#ifndef HAVE_LONG_LONG
598# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
599#endif
600#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
601# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
602#endif
603 /* optimize null pointers */
604 if (p == NULL)
605 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000606 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000607
608#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000609}
610
611/* Get a C pointer from a long object (or an int object in some cases) */
612
613void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000614PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000615{
616 /* This function will allow int or long objects. If vv is neither,
617 then the PyLong_AsLong*() functions will raise the exception:
618 PyExc_SystemError, "bad argument to internal function"
619 */
Tim Peters70128a12001-06-16 08:48:40 +0000620#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000621 long x;
622
Tim Peters70128a12001-06-16 08:48:40 +0000623 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000624 x = PyInt_AS_LONG(vv);
625 else
626 x = PyLong_AsLong(vv);
627#else
Tim Peters70128a12001-06-16 08:48:40 +0000628
629#ifndef HAVE_LONG_LONG
630# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
631#endif
632#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
633# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
634#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000635 LONG_LONG x;
636
Tim Peters70128a12001-06-16 08:48:40 +0000637 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000638 x = PyInt_AS_LONG(vv);
639 else
640 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000641
642#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000643
644 if (x == -1 && PyErr_Occurred())
645 return NULL;
646 return (void *)x;
647}
648
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000649#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000650
651/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
652 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000653 */
654
Tim Peterscf37dfc2001-06-14 18:42:50 +0000655#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000656
657/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000658
659PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000660PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000661{
Tim Petersd1a7da62001-06-13 00:35:57 +0000662 LONG_LONG bytes = ival;
663 int one = 1;
664 return _PyLong_FromByteArray(
665 (unsigned char *)&bytes,
666 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000667}
668
Tim Petersd1a7da62001-06-13 00:35:57 +0000669/* Create a new long int object from a C unsigned LONG_LONG int. */
670
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000671PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000672PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000673{
Tim Petersd1a7da62001-06-13 00:35:57 +0000674 unsigned LONG_LONG bytes = ival;
675 int one = 1;
676 return _PyLong_FromByteArray(
677 (unsigned char *)&bytes,
678 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000679}
680
Guido van Rossum3293b071998-08-25 16:07:15 +0000681/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000682 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000683
Guido van Rossum3293b071998-08-25 16:07:15 +0000684LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000685PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000686{
Tim Petersd1a7da62001-06-13 00:35:57 +0000687 LONG_LONG bytes;
688 int one = 1;
689 int res;
690
Tim Petersd38b1c72001-09-30 05:09:37 +0000691 if (vv == NULL) {
692 PyErr_BadInternalCall();
693 return -1;
694 }
695 if (!PyLong_Check(vv)) {
696 if (PyInt_Check(vv))
697 return (LONG_LONG)PyInt_AsLong(vv);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000698 PyErr_BadInternalCall();
699 return -1;
700 }
701
Tim Petersd1a7da62001-06-13 00:35:57 +0000702 res = _PyLong_AsByteArray(
703 (PyLongObject *)vv, (unsigned char *)&bytes,
704 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000705
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000706 /* Plan 9 can't handle LONG_LONG in ? : expressions */
707 if (res < 0)
Jeremy Hyltonc4ad0bc2002-04-23 20:01:20 +0000708 return (LONG_LONG)-1;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000709 else
710 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000711}
712
Tim Petersd1a7da62001-06-13 00:35:57 +0000713/* Get a C unsigned LONG_LONG int from a long int object.
714 Return -1 and set an error if overflow occurs. */
715
Guido van Rossum3293b071998-08-25 16:07:15 +0000716unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000717PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000718{
Tim Petersd1a7da62001-06-13 00:35:57 +0000719 unsigned LONG_LONG bytes;
720 int one = 1;
721 int res;
722
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000723 if (vv == NULL || !PyLong_Check(vv)) {
724 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000725 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000726 }
727
Tim Petersd1a7da62001-06-13 00:35:57 +0000728 res = _PyLong_AsByteArray(
729 (PyLongObject *)vv, (unsigned char *)&bytes,
730 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000731
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000732 /* Plan 9 can't handle LONG_LONG in ? : expressions */
733 if (res < 0)
734 return (unsigned LONG_LONG)res;
735 else
736 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000737}
Tim Petersd1a7da62001-06-13 00:35:57 +0000738
739#undef IS_LITTLE_ENDIAN
740
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000741#endif /* HAVE_LONG_LONG */
742
Neil Schemenauerba872e22001-01-04 01:46:03 +0000743
744static int
745convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
Tim Peters5af4e6c2002-08-12 02:31:19 +0000746 if (PyLong_Check(v)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000747 *a = (PyLongObject *) v;
748 Py_INCREF(v);
749 }
750 else if (PyInt_Check(v)) {
751 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
752 }
753 else {
754 return 0;
755 }
Tim Peters5af4e6c2002-08-12 02:31:19 +0000756 if (PyLong_Check(w)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000757 *b = (PyLongObject *) w;
758 Py_INCREF(w);
759 }
760 else if (PyInt_Check(w)) {
761 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
762 }
763 else {
764 Py_DECREF(*a);
765 return 0;
766 }
767 return 1;
768}
769
770#define CONVERT_BINOP(v, w, a, b) \
771 if (!convert_binop(v, w, a, b)) { \
772 Py_INCREF(Py_NotImplemented); \
773 return Py_NotImplemented; \
774 }
775
Tim Peters877a2122002-08-12 05:09:36 +0000776/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
777 * is modified in place, by adding y to it. Carries are propagated as far as
778 * x[m-1], and the remaining carry (0 or 1) is returned.
779 */
780static digit
781v_iadd(digit *x, int m, digit *y, int n)
782{
783 int i;
784 digit carry = 0;
785
786 assert(m >= n);
787 for (i = 0; i < n; ++i) {
788 carry += x[i] + y[i];
789 x[i] = carry & MASK;
790 carry >>= SHIFT;
791 assert((carry & 1) == carry);
792 }
793 for (; carry && i < m; ++i) {
794 carry += x[i];
795 x[i] = carry & MASK;
796 carry >>= SHIFT;
797 assert((carry & 1) == carry);
798 }
799 return carry;
800}
801
802/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
803 * is modified in place, by subtracting y from it. Borrows are propagated as
804 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
805 */
806static digit
807v_isub(digit *x, int m, digit *y, int n)
808{
809 int i;
810 digit borrow = 0;
811
812 assert(m >= n);
813 for (i = 0; i < n; ++i) {
814 borrow = x[i] - y[i] - borrow;
815 x[i] = borrow & MASK;
816 borrow >>= SHIFT;
817 borrow &= 1; /* keep only 1 sign bit */
818 }
819 for (; borrow && i < m; ++i) {
820 borrow = x[i] - borrow;
821 x[i] = borrow & MASK;
822 borrow >>= SHIFT;
823 borrow &= 1;
824 }
825 return borrow;
826}
Neil Schemenauerba872e22001-01-04 01:46:03 +0000827
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000828/* Multiply by a single digit, ignoring the sign. */
829
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000831mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000832{
833 return muladd1(a, n, (digit)0);
834}
835
836/* Multiply by a single digit and add a single digit, ignoring the sign. */
837
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000838static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000839muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000840{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000841 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000842 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000843 twodigits carry = extra;
844 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000845
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000846 if (z == NULL)
847 return NULL;
848 for (i = 0; i < size_a; ++i) {
849 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000850 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000851 carry >>= SHIFT;
852 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000853 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000854 return long_normalize(z);
855}
856
Tim Peters212e6142001-07-14 12:23:19 +0000857/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
858 in pout, and returning the remainder. pin and pout point at the LSD.
859 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
860 long_format, but that should be done with great care since longs are
861 immutable. */
862
863static digit
864inplace_divrem1(digit *pout, digit *pin, int size, digit n)
865{
866 twodigits rem = 0;
867
868 assert(n > 0 && n <= MASK);
869 pin += size;
870 pout += size;
871 while (--size >= 0) {
872 digit hi;
873 rem = (rem << SHIFT) + *--pin;
874 *--pout = hi = (digit)(rem / n);
875 rem -= hi * n;
876 }
877 return (digit)rem;
878}
879
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000880/* Divide a long integer by a digit, returning both the quotient
881 (as function result) and the remainder (through *prem).
882 The sign of a is ignored; n should not be zero. */
883
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000885divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000886{
Tim Peters212e6142001-07-14 12:23:19 +0000887 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000889
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000890 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000892 if (z == NULL)
893 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000894 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000895 return long_normalize(z);
896}
897
898/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000899 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000900 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000901
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000903long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000904{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000905 register PyLongObject *a = (PyLongObject *)aa;
906 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000907 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000908 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000909 char *p;
910 int bits;
911 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000912
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000913 if (a == NULL || !PyLong_Check(a)) {
914 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000915 return NULL;
916 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000917 assert(base >= 2 && base <= 36);
Tim Peters5af4e6c2002-08-12 02:31:19 +0000918
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000919 /* Compute a rough upper bound for the length of the string */
920 i = base;
921 bits = 0;
922 while (i > 1) {
923 ++bits;
924 i >>= 1;
925 }
Fred Drake121ee271999-12-23 15:41:28 +0000926 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000928 if (str == NULL)
929 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000931 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000932 if (addL)
933 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000934 if (a->ob_size < 0)
935 sign = '-';
Tim Peters5af4e6c2002-08-12 02:31:19 +0000936
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000937 if (a->ob_size == 0) {
938 *--p = '0';
939 }
940 else if ((base & (base - 1)) == 0) {
941 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000942 twodigits accum = 0;
943 int accumbits = 0; /* # of bits in accum */
944 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000945 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000946 while ((i >>= 1) > 1)
947 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000948
949 for (i = 0; i < size_a; ++i) {
Tim Peters0d2d87d2002-08-20 19:00:22 +0000950 accum |= (twodigits)a->ob_digit[i] << accumbits;
Tim Peters586b2e32001-07-15 09:11:14 +0000951 accumbits += SHIFT;
952 assert(accumbits >= basebits);
953 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000954 char cdigit = (char)(accum & (base - 1));
955 cdigit += (cdigit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000956 assert(p > PyString_AS_STRING(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000957 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +0000958 accumbits -= basebits;
959 accum >>= basebits;
960 } while (i < size_a-1 ? accumbits >= basebits :
961 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000962 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000963 }
964 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000965 /* Not 0, and base not a power of 2. Divide repeatedly by
966 base, but for speed use the highest power of base that
967 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000968 int size = size_a;
969 digit *pin = a->ob_digit;
970 PyLongObject *scratch;
971 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000972 digit powbase = base; /* powbase == base ** power */
973 int power = 1;
974 for (;;) {
975 unsigned long newpow = powbase * (unsigned long)base;
976 if (newpow >> SHIFT) /* doesn't fit in a digit */
977 break;
978 powbase = (digit)newpow;
979 ++power;
980 }
Tim Peters212e6142001-07-14 12:23:19 +0000981
982 /* Get a scratch area for repeated division. */
983 scratch = _PyLong_New(size);
984 if (scratch == NULL) {
985 Py_DECREF(str);
986 return NULL;
987 }
988
989 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000990 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000991 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000992 digit rem = inplace_divrem1(scratch->ob_digit,
993 pin, size, powbase);
994 pin = scratch->ob_digit; /* no need to use a again */
995 if (pin[size - 1] == 0)
996 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000997 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +0000998 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000999 Py_DECREF(str);
1000 return NULL;
1001 })
Tim Peters212e6142001-07-14 12:23:19 +00001002
1003 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001004 assert(ntostore > 0);
1005 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001006 digit nextrem = (digit)(rem / base);
1007 char c = (char)(rem - nextrem * base);
1008 assert(p > PyString_AS_STRING(str));
1009 c += (c < 10) ? '0' : 'A'-10;
1010 *--p = c;
1011 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001012 --ntostore;
1013 /* Termination is a bit delicate: must not
1014 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +00001015 remaining quotient and rem are both 0. */
1016 } while (ntostore && (size || rem));
1017 } while (size != 0);
1018 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001019 }
1020
Guido van Rossum2c475421992-08-14 15:13:07 +00001021 if (base == 8) {
1022 if (size_a != 0)
1023 *--p = '0';
1024 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +00001025 else if (base == 16) {
1026 *--p = 'x';
1027 *--p = '0';
1028 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001029 else if (base != 10) {
1030 *--p = '#';
1031 *--p = '0' + base%10;
1032 if (base > 10)
1033 *--p = '0' + base/10;
1034 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001035 if (sign)
1036 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001037 if (p != PyString_AS_STRING(str)) {
1038 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001039 assert(p > q);
1040 do {
1041 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001042 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001043 _PyString_Resize((PyObject **)&str,
1044 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001045 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001047}
1048
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001049PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001050PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001051{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001052 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001053 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001054 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001055
Guido van Rossum472c04f1996-12-05 21:57:21 +00001056 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001057 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001058 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001059 return NULL;
1060 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001061 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001062 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001063 if (*str == '+')
1064 ++str;
1065 else if (*str == '-') {
1066 ++str;
1067 sign = -1;
1068 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001069 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001070 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001071 if (base == 0) {
1072 if (str[0] != '0')
1073 base = 10;
1074 else if (str[1] == 'x' || str[1] == 'X')
1075 base = 16;
1076 else
1077 base = 8;
1078 }
1079 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1080 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +00001082 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001083 for ( ; z != NULL; ++str) {
1084 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001086
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001087 if (*str <= '9')
1088 k = *str - '0';
1089 else if (*str >= 'a')
1090 k = *str - 'a' + 10;
1091 else if (*str >= 'A')
1092 k = *str - 'A' + 10;
1093 if (k < 0 || k >= base)
1094 break;
1095 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001096 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001097 z = temp;
1098 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001099 if (z == NULL)
1100 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001101 if (str == start)
1102 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001103 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001104 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001105 if (*str == 'L' || *str == 'l')
1106 str++;
1107 while (*str && isspace(Py_CHARMASK(*str)))
1108 str++;
1109 if (*str != '\0')
1110 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001111 if (pend)
1112 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001113 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001114
1115 onError:
Tim Peters5af4e6c2002-08-12 02:31:19 +00001116 PyErr_Format(PyExc_ValueError,
Guido van Rossum9e896b32000-04-05 20:11:21 +00001117 "invalid literal for long(): %.200s", orig_str);
1118 Py_XDECREF(z);
1119 return NULL;
1120}
1121
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001122#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001123PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001124PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001125{
1126 char buffer[256];
1127
1128 if (length >= sizeof(buffer)) {
1129 PyErr_SetString(PyExc_ValueError,
1130 "long() literal too large to convert");
1131 return NULL;
1132 }
1133 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
1134 return NULL;
1135
1136 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001137}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001138#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001139
Tim Peters9f688bf2000-07-07 15:53:28 +00001140/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001142 (PyLongObject *, PyLongObject *, PyLongObject **);
1143static PyObject *long_pos(PyLongObject *);
1144static int long_divrem(PyLongObject *, PyLongObject *,
1145 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001146
1147/* Long division with remainder, top-level routine */
1148
Guido van Rossume32e0141992-01-19 16:31:05 +00001149static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001150long_divrem(PyLongObject *a, PyLongObject *b,
1151 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001152{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001153 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001154 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001155
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001156 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001157 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001158 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001159 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001160 }
1161 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001162 (size_a == size_b &&
1163 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001164 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001165 *pdiv = _PyLong_New(0);
1166 Py_INCREF(a);
1167 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001168 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001169 }
1170 if (size_b == 1) {
1171 digit rem = 0;
1172 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001173 if (z == NULL)
1174 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001175 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001176 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001177 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001178 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001179 if (z == NULL)
1180 return -1;
1181 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001182 /* Set the signs.
1183 The quotient z has the sign of a*b;
1184 the remainder r has the sign of a,
1185 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001186 if ((a->ob_size < 0) != (b->ob_size < 0))
1187 z->ob_size = -(z->ob_size);
1188 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1189 (*prem)->ob_size = -((*prem)->ob_size);
1190 *pdiv = z;
1191 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001192}
1193
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001194/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001195
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001196static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001197x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001198{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001199 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001200 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001201 PyLongObject *v = mul1(v1, d);
1202 PyLongObject *w = mul1(w1, d);
1203 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001204 int j, k;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001205
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001206 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001207 Py_XDECREF(v);
1208 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001209 return NULL;
1210 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001211
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001212 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001213 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001214 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001215
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001216 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001217 a = _PyLong_New(size_v - size_w + 1);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001218
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001219 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1220 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1221 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001222 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001223 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001224
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001225 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001226 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001227 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001228 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001229 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001230 if (vj == w->ob_digit[size_w-1])
1231 q = MASK;
1232 else
1233 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1234 w->ob_digit[size_w-1];
Tim Peters5af4e6c2002-08-12 02:31:19 +00001235
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001236 while (w->ob_digit[size_w-2]*q >
1237 ((
1238 ((twodigits)vj << SHIFT)
1239 + v->ob_digit[j-1]
1240 - q*w->ob_digit[size_w-1]
1241 ) << SHIFT)
1242 + v->ob_digit[j-2])
1243 --q;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001244
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001245 for (i = 0; i < size_w && i+k < size_v; ++i) {
1246 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001247 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 carry += v->ob_digit[i+k] - z
1249 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001250 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001251 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1252 carry, SHIFT);
1253 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001254 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001255
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001256 if (i+k < size_v) {
1257 carry += v->ob_digit[i+k];
1258 v->ob_digit[i+k] = 0;
1259 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001260
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001261 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001262 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001263 else {
1264 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001265 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001266 carry = 0;
1267 for (i = 0; i < size_w && i+k < size_v; ++i) {
1268 carry += v->ob_digit[i+k] + w->ob_digit[i];
1269 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001270 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1271 BASE_TWODIGITS_TYPE,
1272 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001273 }
1274 }
1275 } /* for j, k */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001276
Guido van Rossumc206c761995-01-10 15:23:19 +00001277 if (a == NULL)
1278 *prem = NULL;
1279 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001280 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001281 *prem = divrem1(v, d, &d);
1282 /* d receives the (unused) remainder */
1283 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001285 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001286 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001287 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001288 Py_DECREF(v);
1289 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001290 return a;
1291}
1292
1293/* Methods */
1294
1295static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001296long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001297{
Guido van Rossum9475a232001-10-05 20:51:39 +00001298 v->ob_type->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001299}
1300
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001301static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001302long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001303{
Fred Drake121ee271999-12-23 15:41:28 +00001304 return long_format(v, 10, 1);
1305}
1306
1307static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001308long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001309{
1310 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001311}
1312
1313static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001314long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001315{
1316 int sign;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001317
Guido van Rossumc6913e71991-11-19 20:26:46 +00001318 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001319 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001320 sign = 0;
1321 else
1322 sign = a->ob_size - b->ob_size;
1323 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001324 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001325 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001326 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1327 ;
1328 if (i < 0)
1329 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001330 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001331 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001332 if (a->ob_size < 0)
1333 sign = -sign;
1334 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001335 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001336 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001337}
1338
Guido van Rossum9bfef441993-03-29 10:43:31 +00001339static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001340long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001341{
1342 long x;
1343 int i, sign;
1344
1345 /* This is designed so that Python ints and longs with the
1346 same value hash to the same value, otherwise comparisons
1347 of mapping keys will turn out weird */
1348 i = v->ob_size;
1349 sign = 1;
1350 x = 0;
1351 if (i < 0) {
1352 sign = -1;
1353 i = -(i);
1354 }
1355 while (--i >= 0) {
1356 /* Force a 32-bit circular shift */
1357 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1358 x += v->ob_digit[i];
1359 }
1360 x = x * sign;
1361 if (x == -1)
1362 x = -2;
1363 return x;
1364}
1365
1366
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001367/* Add the absolute values of two long integers. */
1368
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001370x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001371{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001372 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001374 int i;
1375 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001376
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001377 /* Ensure a is the larger of the two: */
1378 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001379 { PyLongObject *temp = a; a = b; b = temp; }
1380 { int size_temp = size_a;
1381 size_a = size_b;
1382 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001383 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001384 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001385 if (z == NULL)
1386 return NULL;
1387 for (i = 0; i < size_b; ++i) {
1388 carry += a->ob_digit[i] + b->ob_digit[i];
1389 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001390 carry >>= SHIFT;
1391 }
1392 for (; i < size_a; ++i) {
1393 carry += a->ob_digit[i];
1394 z->ob_digit[i] = carry & MASK;
1395 carry >>= SHIFT;
1396 }
1397 z->ob_digit[i] = carry;
1398 return long_normalize(z);
1399}
1400
1401/* Subtract the absolute values of two integers. */
1402
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001403static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001404x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001405{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001406 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001407 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001408 int i;
1409 int sign = 1;
1410 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001411
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001412 /* Ensure a is the larger of the two: */
1413 if (size_a < size_b) {
1414 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415 { PyLongObject *temp = a; a = b; b = temp; }
1416 { int size_temp = size_a;
1417 size_a = size_b;
1418 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001419 }
1420 else if (size_a == size_b) {
1421 /* Find highest digit where a and b differ: */
1422 i = size_a;
1423 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1424 ;
1425 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001426 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001427 if (a->ob_digit[i] < b->ob_digit[i]) {
1428 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001429 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001430 }
1431 size_a = size_b = i+1;
1432 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001434 if (z == NULL)
1435 return NULL;
1436 for (i = 0; i < size_b; ++i) {
1437 /* The following assumes unsigned arithmetic
1438 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001439 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001440 z->ob_digit[i] = borrow & MASK;
1441 borrow >>= SHIFT;
1442 borrow &= 1; /* Keep only one sign bit */
1443 }
1444 for (; i < size_a; ++i) {
1445 borrow = a->ob_digit[i] - borrow;
1446 z->ob_digit[i] = borrow & MASK;
1447 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001448 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001449 }
1450 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001451 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001452 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001453 return long_normalize(z);
1454}
1455
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001456static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001457long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001458{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001459 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001460
Neil Schemenauerba872e22001-01-04 01:46:03 +00001461 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1462
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001463 if (a->ob_size < 0) {
1464 if (b->ob_size < 0) {
1465 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001466 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001467 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001468 }
1469 else
1470 z = x_sub(b, a);
1471 }
1472 else {
1473 if (b->ob_size < 0)
1474 z = x_sub(a, b);
1475 else
1476 z = x_add(a, b);
1477 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001478 Py_DECREF(a);
1479 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001480 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001481}
1482
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001483static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001484long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001485{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001486 PyLongObject *a, *b, *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001487
Neil Schemenauerba872e22001-01-04 01:46:03 +00001488 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1489
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001490 if (a->ob_size < 0) {
1491 if (b->ob_size < 0)
1492 z = x_sub(a, b);
1493 else
1494 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001495 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001496 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001497 }
1498 else {
1499 if (b->ob_size < 0)
1500 z = x_add(a, b);
1501 else
1502 z = x_sub(a, b);
1503 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001504 Py_DECREF(a);
1505 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001506 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001507}
1508
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001510long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001511{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001512 /* sequence * long */
1513 long n = PyLong_AsLong((PyObject *) w);
1514 if (n == -1 && PyErr_Occurred())
1515 return NULL;
1516 else
1517 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1518}
1519
Tim Peters5af4e6c2002-08-12 02:31:19 +00001520/* Grade school multiplication, ignoring the signs.
1521 * Returns the absolute value of the product, or NULL if error.
1522 */
1523static PyLongObject *
1524x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001525{
Tim Peters5af4e6c2002-08-12 02:31:19 +00001526 PyLongObject *z;
1527 int size_a = ABS(a->ob_size);
1528 int size_b = ABS(b->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001529 int i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001530
Tim Peters5af4e6c2002-08-12 02:31:19 +00001531 z = _PyLong_New(size_a + size_b);
1532 if (z == NULL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001533 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001534
1535 memset(z->ob_digit, 0, z->ob_size * sizeof(digit));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001536 for (i = 0; i < size_a; ++i) {
1537 twodigits carry = 0;
1538 twodigits f = a->ob_digit[i];
1539 int j;
Tim Peters115c8882002-08-12 18:25:43 +00001540 digit *pz = z->ob_digit + i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001541
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001542 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001544 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001545 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001546 for (j = 0; j < size_b; ++j) {
Tim Peters115c8882002-08-12 18:25:43 +00001547 carry += *pz + b->ob_digit[j] * f;
1548 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001549 carry >>= SHIFT;
1550 }
1551 for (; carry != 0; ++j) {
1552 assert(i+j < z->ob_size);
Tim Peters115c8882002-08-12 18:25:43 +00001553 carry += *pz;
1554 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001555 carry >>= SHIFT;
1556 }
1557 }
Tim Peters44121a62002-08-12 06:17:58 +00001558 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001559}
1560
1561/* A helper for Karatsuba multiplication (k_mul).
1562 Takes a long "n" and an integer "size" representing the place to
1563 split, and sets low and high such that abs(n) == (high << size) + low,
1564 viewing the shift as being by digits. The sign bit is ignored, and
1565 the return values are >= 0.
1566 Returns 0 on success, -1 on failure.
1567*/
1568static int
1569kmul_split(PyLongObject *n, int size, PyLongObject **high, PyLongObject **low)
1570{
1571 PyLongObject *hi, *lo;
1572 int size_lo, size_hi;
1573 const int size_n = ABS(n->ob_size);
1574
1575 size_lo = MIN(size_n, size);
1576 size_hi = size_n - size_lo;
1577
1578 if ((hi = _PyLong_New(size_hi)) == NULL)
1579 return -1;
1580 if ((lo = _PyLong_New(size_lo)) == NULL) {
1581 Py_DECREF(hi);
1582 return -1;
1583 }
1584
1585 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
1586 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
1587
1588 *high = long_normalize(hi);
1589 *low = long_normalize(lo);
1590 return 0;
1591}
1592
Tim Peters60004642002-08-12 22:01:34 +00001593static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
1594
Tim Peters5af4e6c2002-08-12 02:31:19 +00001595/* Karatsuba multiplication. Ignores the input signs, and returns the
1596 * absolute value of the product (or NULL if error).
1597 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
1598 */
1599static PyLongObject *
1600k_mul(PyLongObject *a, PyLongObject *b)
1601{
Tim Peters738eda72002-08-12 15:08:20 +00001602 int asize = ABS(a->ob_size);
1603 int bsize = ABS(b->ob_size);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001604 PyLongObject *ah = NULL;
1605 PyLongObject *al = NULL;
1606 PyLongObject *bh = NULL;
1607 PyLongObject *bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001608 PyLongObject *ret = NULL;
Tim Peters738eda72002-08-12 15:08:20 +00001609 PyLongObject *t1, *t2, *t3;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001610 int shift; /* the number of digits we split off */
1611 int i;
Tim Peters738eda72002-08-12 15:08:20 +00001612
Tim Peters5af4e6c2002-08-12 02:31:19 +00001613 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
1614 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
1615 * Then the original product is
Tim Peters18c15b92002-08-12 02:43:58 +00001616 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
Tim Peters5af4e6c2002-08-12 02:31:19 +00001617 * By picking X to be a power of 2, "*X" is just shifting, and it's
1618 * been reduced to 3 multiplies on numbers half the size.
1619 */
1620
Tim Petersfc07e562002-08-12 02:54:10 +00001621 /* We want to split based on the larger number; fiddle so that b
Tim Peters5af4e6c2002-08-12 02:31:19 +00001622 * is largest.
1623 */
Tim Peters738eda72002-08-12 15:08:20 +00001624 if (asize > bsize) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001625 t1 = a;
1626 a = b;
1627 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00001628
1629 i = asize;
1630 asize = bsize;
1631 bsize = i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001632 }
1633
1634 /* Use gradeschool math when either number is too small. */
Tim Peters738eda72002-08-12 15:08:20 +00001635 if (asize <= KARATSUBA_CUTOFF) {
Tim Peters738eda72002-08-12 15:08:20 +00001636 if (asize == 0)
Tim Peters44121a62002-08-12 06:17:58 +00001637 return _PyLong_New(0);
1638 else
1639 return x_mul(a, b);
1640 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001641
Tim Peters60004642002-08-12 22:01:34 +00001642 /* If a is small compared to b, splitting on b gives a degenerate
1643 * case with ah==0, and Karatsuba may be (even much) less efficient
1644 * than "grade school" then. However, we can still win, by viewing
1645 * b as a string of "big digits", each of width a->ob_size. That
1646 * leads to a sequence of balanced calls to k_mul.
1647 */
1648 if (2 * asize <= bsize)
1649 return k_lopsided_mul(a, b);
1650
Tim Petersd6974a52002-08-13 20:37:51 +00001651 /* Split a & b into hi & lo pieces. */
Tim Peters738eda72002-08-12 15:08:20 +00001652 shift = bsize >> 1;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001653 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
Tim Petersd6974a52002-08-13 20:37:51 +00001654 assert(ah->ob_size > 0); /* the split isn't degenerate */
1655
Tim Peters5af4e6c2002-08-12 02:31:19 +00001656 if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
1657
Tim Petersd64c1de2002-08-12 17:36:03 +00001658 /* The plan:
1659 * 1. Allocate result space (asize + bsize digits: that's always
1660 * enough).
1661 * 2. Compute ah*bh, and copy into result at 2*shift.
1662 * 3. Compute al*bl, and copy into result at 0. Note that this
1663 * can't overlap with #2.
1664 * 4. Subtract al*bl from the result, starting at shift. This may
1665 * underflow (borrow out of the high digit), but we don't care:
1666 * we're effectively doing unsigned arithmetic mod
1667 * BASE**(sizea + sizeb), and so long as the *final* result fits,
1668 * borrows and carries out of the high digit can be ignored.
1669 * 5. Subtract ah*bh from the result, starting at shift.
1670 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
1671 * at shift.
1672 */
1673
1674 /* 1. Allocate result space. */
Tim Peters70b041b2002-08-12 19:38:01 +00001675 ret = _PyLong_New(asize + bsize);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001676 if (ret == NULL) goto fail;
1677#ifdef Py_DEBUG
1678 /* Fill with trash, to catch reference to uninitialized digits. */
1679 memset(ret->ob_digit, 0xDF, ret->ob_size * sizeof(digit));
1680#endif
Tim Peters44121a62002-08-12 06:17:58 +00001681
Tim Petersd64c1de2002-08-12 17:36:03 +00001682 /* 2. t1 <- ah*bh, and copy into high digits of result. */
Tim Peters738eda72002-08-12 15:08:20 +00001683 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
1684 assert(t1->ob_size >= 0);
1685 assert(2*shift + t1->ob_size <= ret->ob_size);
1686 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
1687 t1->ob_size * sizeof(digit));
1688
1689 /* Zero-out the digits higher than the ah*bh copy. */
1690 i = ret->ob_size - 2*shift - t1->ob_size;
Tim Peters44121a62002-08-12 06:17:58 +00001691 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001692 memset(ret->ob_digit + 2*shift + t1->ob_size, 0,
Tim Peters44121a62002-08-12 06:17:58 +00001693 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001694
Tim Petersd64c1de2002-08-12 17:36:03 +00001695 /* 3. t2 <- al*bl, and copy into the low digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001696 if ((t2 = k_mul(al, bl)) == NULL) {
1697 Py_DECREF(t1);
1698 goto fail;
1699 }
1700 assert(t2->ob_size >= 0);
1701 assert(t2->ob_size <= 2*shift); /* no overlap with high digits */
1702 memcpy(ret->ob_digit, t2->ob_digit, t2->ob_size * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001703
1704 /* Zero out remaining digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001705 i = 2*shift - t2->ob_size; /* number of uninitialized digits */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001706 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001707 memset(ret->ob_digit + t2->ob_size, 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001708
Tim Petersd64c1de2002-08-12 17:36:03 +00001709 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
1710 * because it's fresher in cache.
1711 */
Tim Peters738eda72002-08-12 15:08:20 +00001712 i = ret->ob_size - shift; /* # digits after shift */
Tim Petersd64c1de2002-08-12 17:36:03 +00001713 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, t2->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001714 Py_DECREF(t2);
1715
Tim Petersd64c1de2002-08-12 17:36:03 +00001716 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, t1->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001717 Py_DECREF(t1);
1718
Tim Petersd64c1de2002-08-12 17:36:03 +00001719 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001720 if ((t1 = x_add(ah, al)) == NULL) goto fail;
1721 Py_DECREF(ah);
1722 Py_DECREF(al);
1723 ah = al = NULL;
1724
1725 if ((t2 = x_add(bh, bl)) == NULL) {
1726 Py_DECREF(t1);
1727 goto fail;
1728 }
1729 Py_DECREF(bh);
1730 Py_DECREF(bl);
1731 bh = bl = NULL;
1732
Tim Peters738eda72002-08-12 15:08:20 +00001733 t3 = k_mul(t1, t2);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001734 Py_DECREF(t1);
1735 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00001736 if (t3 == NULL) goto fail;
Tim Peters547607c2002-08-12 19:43:49 +00001737 assert(t3->ob_size >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001738
Tim Petersd6974a52002-08-13 20:37:51 +00001739 /* Add t3. It's not obvious why we can't run out of room here.
1740 * See the (*) comment after this function.
Tim Petersd8b21732002-08-12 19:30:26 +00001741 */
Tim Petersd64c1de2002-08-12 17:36:03 +00001742 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, t3->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001743 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001744
Tim Peters5af4e6c2002-08-12 02:31:19 +00001745 return long_normalize(ret);
1746
1747 fail:
1748 Py_XDECREF(ret);
1749 Py_XDECREF(ah);
1750 Py_XDECREF(al);
1751 Py_XDECREF(bh);
1752 Py_XDECREF(bl);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001753 return NULL;
1754}
1755
Tim Petersd6974a52002-08-13 20:37:51 +00001756/* (*) Why adding t3 can't "run out of room" above.
1757
Tim Petersab86c2b2002-08-15 20:06:00 +00001758Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
1759to start with:
Tim Petersd6974a52002-08-13 20:37:51 +00001760
Tim Petersab86c2b2002-08-15 20:06:00 +000017611. For any integer i, i = c(i/2) + f(i/2). In particular,
1762 bsize = c(bsize/2) + f(bsize/2).
17632. shift = f(bsize/2)
17643. asize <= bsize
17654. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
1766 routine, so asize > bsize/2 >= f(bsize/2) in this routine.
Tim Petersd6974a52002-08-13 20:37:51 +00001767
Tim Petersab86c2b2002-08-15 20:06:00 +00001768We allocated asize + bsize result digits, and add t3 into them at an offset
1769of shift. This leaves asize+bsize-shift allocated digit positions for t3
1770to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
1771asize + c(bsize/2) available digit positions.
Tim Petersd6974a52002-08-13 20:37:51 +00001772
Tim Petersab86c2b2002-08-15 20:06:00 +00001773bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
1774at most c(bsize/2) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001775
Tim Petersab86c2b2002-08-15 20:06:00 +00001776If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
1777digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
1778most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001779
Tim Petersab86c2b2002-08-15 20:06:00 +00001780The product (ah+al)*(bh+bl) therefore has at most
Tim Petersd6974a52002-08-13 20:37:51 +00001781
Tim Petersab86c2b2002-08-15 20:06:00 +00001782 c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
Tim Petersd6974a52002-08-13 20:37:51 +00001783
Tim Petersab86c2b2002-08-15 20:06:00 +00001784and we have asize + c(bsize/2) available digit positions. We need to show
1785this is always enough. An instance of c(bsize/2) cancels out in both, so
1786the question reduces to whether asize digits is enough to hold
1787(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
1788then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
1789asize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
1790digit is enough to hold 2 bits. This is so since SHIFT=15 >= 2. If
1791asize == bsize, then we're asking whether bsize digits is enough to hold
Tim Peterse417de02002-08-15 20:10:45 +00001792c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
1793is enough to hold 2 bits. This is so if bsize >= 2, which holds because
1794bsize >= KARATSUBA_CUTOFF >= 2.
Tim Peters8e966ee2002-08-14 16:36:23 +00001795
Tim Peters48d52c02002-08-14 17:07:32 +00001796Note that since there's always enough room for (ah+al)*(bh+bl), and that's
1797clearly >= each of ah*bh and al*bl, there's always enough room to subtract
1798ah*bh and al*bl too.
Tim Petersd6974a52002-08-13 20:37:51 +00001799*/
1800
Tim Peters60004642002-08-12 22:01:34 +00001801/* b has at least twice the digits of a, and a is big enough that Karatsuba
1802 * would pay off *if* the inputs had balanced sizes. View b as a sequence
1803 * of slices, each with a->ob_size digits, and multiply the slices by a,
1804 * one at a time. This gives k_mul balanced inputs to work with, and is
1805 * also cache-friendly (we compute one double-width slice of the result
1806 * at a time, then move on, never bactracking except for the helpful
1807 * single-width slice overlap between successive partial sums).
1808 */
1809static PyLongObject *
1810k_lopsided_mul(PyLongObject *a, PyLongObject *b)
1811{
1812 const int asize = ABS(a->ob_size);
1813 int bsize = ABS(b->ob_size);
1814 int nbdone; /* # of b digits already multiplied */
1815 PyLongObject *ret;
1816 PyLongObject *bslice = NULL;
1817
1818 assert(asize > KARATSUBA_CUTOFF);
1819 assert(2 * asize <= bsize);
1820
1821 /* Allocate result space, and zero it out. */
1822 ret = _PyLong_New(asize + bsize);
1823 if (ret == NULL)
1824 return NULL;
1825 memset(ret->ob_digit, 0, ret->ob_size * sizeof(digit));
1826
1827 /* Successive slices of b are copied into bslice. */
Tim Peters12034032002-08-12 22:10:00 +00001828 bslice = _PyLong_New(asize);
Tim Peters60004642002-08-12 22:01:34 +00001829 if (bslice == NULL)
1830 goto fail;
1831
1832 nbdone = 0;
1833 while (bsize > 0) {
1834 PyLongObject *product;
1835 const int nbtouse = MIN(bsize, asize);
1836
1837 /* Multiply the next slice of b by a. */
1838 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
1839 nbtouse * sizeof(digit));
1840 bslice->ob_size = nbtouse;
1841 product = k_mul(a, bslice);
1842 if (product == NULL)
1843 goto fail;
1844
1845 /* Add into result. */
1846 (void)v_iadd(ret->ob_digit + nbdone, ret->ob_size - nbdone,
1847 product->ob_digit, product->ob_size);
1848 Py_DECREF(product);
1849
1850 bsize -= nbtouse;
1851 nbdone += nbtouse;
1852 }
1853
1854 Py_DECREF(bslice);
1855 return long_normalize(ret);
1856
1857 fail:
1858 Py_DECREF(ret);
1859 Py_XDECREF(bslice);
1860 return NULL;
1861}
Tim Peters5af4e6c2002-08-12 02:31:19 +00001862
1863static PyObject *
1864long_mul(PyLongObject *v, PyLongObject *w)
1865{
1866 PyLongObject *a, *b, *z;
1867
1868 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
1869 if (!PyLong_Check(v) &&
1870 v->ob_type->tp_as_sequence &&
1871 v->ob_type->tp_as_sequence->sq_repeat)
1872 return long_repeat((PyObject *)v, w);
1873 if (!PyLong_Check(w) &&
1874 w->ob_type->tp_as_sequence &&
1875 w->ob_type->tp_as_sequence->sq_repeat)
1876 return long_repeat((PyObject *)w, v);
1877 Py_INCREF(Py_NotImplemented);
1878 return Py_NotImplemented;
1879 }
1880
Tim Petersd64c1de2002-08-12 17:36:03 +00001881 z = k_mul(a, b);
Tim Peters9973d742002-08-15 19:41:06 +00001882 /* Negate if exactly one of the inputs is negative. */
1883 if (((a->ob_size ^ b->ob_size) < 0) && z)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001884 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001885 Py_DECREF(a);
1886 Py_DECREF(b);
Tim Peters9973d742002-08-15 19:41:06 +00001887 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001888}
1889
Guido van Rossume32e0141992-01-19 16:31:05 +00001890/* The / and % operators are now defined in terms of divmod().
1891 The expression a mod b has the value a - b*floor(a/b).
1892 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001893 |a| by |b|, with the sign of a. This is also expressed
1894 as a - b*trunc(a/b), if trunc truncates towards zero.
1895 Some examples:
1896 a b a rem b a mod b
1897 13 10 3 3
1898 -13 10 -3 7
1899 13 -10 3 -7
1900 -13 -10 -3 -3
1901 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001902 have different signs. We then subtract one from the 'div'
1903 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001904
Guido van Rossume32e0141992-01-19 16:31:05 +00001905static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00001906l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00001907 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001908{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001909 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001910
Guido van Rossume32e0141992-01-19 16:31:05 +00001911 if (long_divrem(v, w, &div, &mod) < 0)
1912 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001913 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1914 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001915 PyLongObject *temp;
1916 PyLongObject *one;
1917 temp = (PyLongObject *) long_add(mod, w);
1918 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001919 mod = temp;
1920 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001921 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001922 return -1;
1923 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001924 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001925 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001926 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1927 Py_DECREF(mod);
1928 Py_DECREF(div);
1929 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001930 return -1;
1931 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001932 Py_DECREF(one);
1933 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001934 div = temp;
1935 }
1936 *pdiv = div;
1937 *pmod = mod;
1938 return 0;
1939}
1940
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001941static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001942long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001943{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001944 PyLongObject *a, *b, *div, *mod;
1945
1946 CONVERT_BINOP(v, w, &a, &b);
1947
1948 if (l_divmod(a, b, &div, &mod) < 0) {
1949 Py_DECREF(a);
1950 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001951 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001952 }
1953 Py_DECREF(a);
1954 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001955 Py_DECREF(mod);
1956 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001957}
1958
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001959static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001960long_classic_div(PyObject *v, PyObject *w)
1961{
1962 PyLongObject *a, *b, *div, *mod;
1963
1964 CONVERT_BINOP(v, w, &a, &b);
1965
1966 if (Py_DivisionWarningFlag &&
1967 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1968 div = NULL;
1969 else if (l_divmod(a, b, &div, &mod) < 0)
1970 div = NULL;
1971 else
1972 Py_DECREF(mod);
1973
1974 Py_DECREF(a);
1975 Py_DECREF(b);
1976 return (PyObject *)div;
1977}
1978
1979static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00001980long_true_divide(PyObject *v, PyObject *w)
1981{
Tim Peterse2a60002001-09-04 06:17:36 +00001982 PyLongObject *a, *b;
1983 double ad, bd;
Tim Peters6f97e492001-11-04 23:09:40 +00001984 int aexp, bexp, failed;
Tim Peterse2a60002001-09-04 06:17:36 +00001985
1986 CONVERT_BINOP(v, w, &a, &b);
1987 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
1988 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00001989 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
1990 Py_DECREF(a);
1991 Py_DECREF(b);
1992 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00001993 return NULL;
1994
1995 if (bd == 0.0) {
1996 PyErr_SetString(PyExc_ZeroDivisionError,
1997 "long division or modulo by zero");
1998 return NULL;
1999 }
2000
2001 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
2002 ad /= bd; /* overflow/underflow impossible here */
2003 aexp -= bexp;
2004 if (aexp > INT_MAX / SHIFT)
2005 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00002006 else if (aexp < -(INT_MAX / SHIFT))
2007 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002008 errno = 0;
2009 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00002010 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002011 goto overflow;
2012 return PyFloat_FromDouble(ad);
2013
2014overflow:
2015 PyErr_SetString(PyExc_OverflowError,
2016 "long/long too large for a float");
2017 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002018
Tim Peters20dab9f2001-09-04 05:31:47 +00002019}
2020
2021static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002022long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002023{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002024 PyLongObject *a, *b, *div, *mod;
2025
2026 CONVERT_BINOP(v, w, &a, &b);
2027
2028 if (l_divmod(a, b, &div, &mod) < 0) {
2029 Py_DECREF(a);
2030 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00002031 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002032 }
2033 Py_DECREF(a);
2034 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002035 Py_DECREF(div);
2036 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002037}
2038
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002039static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002040long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002041{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002042 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002043 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002044
2045 CONVERT_BINOP(v, w, &a, &b);
2046
2047 if (l_divmod(a, b, &div, &mod) < 0) {
2048 Py_DECREF(a);
2049 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002050 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002051 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002052 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002053 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002054 PyTuple_SetItem(z, 0, (PyObject *) div);
2055 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002056 }
2057 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002058 Py_DECREF(div);
2059 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002060 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002061 Py_DECREF(a);
2062 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002063 return z;
2064}
2065
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002066static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002067long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002068{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002069 PyLongObject *a, *b;
2070 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002071 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002072 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002073
2074 CONVERT_BINOP(v, w, &a, &b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002075 if (PyLong_Check(x) || Py_None == x) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002076 c = x;
2077 Py_INCREF(x);
2078 }
2079 else if (PyInt_Check(x)) {
2080 c = PyLong_FromLong(PyInt_AS_LONG(x));
2081 }
2082 else {
2083 Py_DECREF(a);
2084 Py_DECREF(b);
2085 Py_INCREF(Py_NotImplemented);
2086 return Py_NotImplemented;
2087 }
Tim Peters4c483c42001-09-05 06:24:58 +00002088
2089 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
2090 PyErr_SetString(PyExc_ValueError,
2091 "pow() 3rd argument cannot be 0");
2092 z = NULL;
2093 goto error;
2094 }
2095
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002096 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002097 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002098 Py_DECREF(a);
2099 Py_DECREF(b);
2100 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00002101 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00002102 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
2103 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00002104 return NULL;
2105 }
2106 /* Return a float. This works because we know that
2107 this calls float_pow() which converts its
2108 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002109 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002110 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002111 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002112 for (i = 0; i < size_b; ++i) {
2113 digit bi = b->ob_digit[i];
2114 int j;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002115
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002116 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002117 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002118
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002119 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002120 temp = (PyLongObject *)long_mul(z, a);
2121 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002122 if (c!=Py_None && temp!=NULL) {
2123 if (l_divmod(temp,(PyLongObject *)c,
2124 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002125 Py_DECREF(temp);
2126 z = NULL;
2127 goto error;
2128 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002129 Py_XDECREF(div);
2130 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002131 temp = mod;
2132 }
2133 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002134 if (z == NULL)
2135 break;
2136 }
2137 bi >>= 1;
2138 if (bi == 0 && i+1 == size_b)
2139 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002140 temp = (PyLongObject *)long_mul(a, a);
2141 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002142 if (c!=Py_None && temp!=NULL) {
2143 if (l_divmod(temp, (PyLongObject *)c, &div,
2144 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002145 Py_DECREF(temp);
2146 z = NULL;
2147 goto error;
2148 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002149 Py_XDECREF(div);
2150 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002151 temp = mod;
2152 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002153 a = temp;
2154 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002155 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002156 z = NULL;
2157 break;
2158 }
2159 }
Guido van Rossumc206c761995-01-10 15:23:19 +00002160 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002161 break;
2162 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002163 if (c!=Py_None && z!=NULL) {
2164 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002165 Py_DECREF(z);
2166 z = NULL;
2167 }
2168 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002169 Py_XDECREF(div);
2170 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002171 z = mod;
2172 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002173 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002174 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00002175 Py_XDECREF(a);
2176 Py_DECREF(b);
2177 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002178 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002179}
2180
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002181static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002182long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002183{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002184 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002185 PyLongObject *x;
2186 PyLongObject *w;
2187 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002188 if (w == NULL)
2189 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002190 x = (PyLongObject *) long_add(v, w);
2191 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002192 if (x == NULL)
2193 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00002194 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002195 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002196}
2197
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002198static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002199long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002200{
Tim Peters69c2de32001-09-11 22:31:33 +00002201 if (PyLong_CheckExact(v)) {
2202 Py_INCREF(v);
2203 return (PyObject *)v;
2204 }
2205 else
2206 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002207}
2208
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002209static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002210long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002211{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002212 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002213 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002214 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002215 Py_INCREF(v);
2216 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002217 }
Tim Peters69c2de32001-09-11 22:31:33 +00002218 z = (PyLongObject *)_PyLong_Copy(v);
2219 if (z != NULL)
2220 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002221 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002222}
2223
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002224static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002225long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002226{
2227 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002228 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00002229 else
2230 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002231}
2232
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002233static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002234long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002235{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002236 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002237}
2238
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002239static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002240long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002241{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002242 PyLongObject *a, *b;
2243 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002244 long shiftby;
2245 int newsize, wordshift, loshift, hishift, i, j;
2246 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002247
Neil Schemenauerba872e22001-01-04 01:46:03 +00002248 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2249
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002250 if (a->ob_size < 0) {
2251 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002252 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002253 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002254 if (a1 == NULL)
2255 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002256 a2 = (PyLongObject *) long_rshift(a1, b);
2257 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002258 if (a2 == NULL)
2259 goto rshift_error;
2260 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002261 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002262 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002263 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002264
Neil Schemenauerba872e22001-01-04 01:46:03 +00002265 shiftby = PyLong_AsLong((PyObject *)b);
2266 if (shiftby == -1L && PyErr_Occurred())
2267 goto rshift_error;
2268 if (shiftby < 0) {
2269 PyErr_SetString(PyExc_ValueError,
2270 "negative shift count");
2271 goto rshift_error;
2272 }
2273 wordshift = shiftby / SHIFT;
2274 newsize = ABS(a->ob_size) - wordshift;
2275 if (newsize <= 0) {
2276 z = _PyLong_New(0);
2277 Py_DECREF(a);
2278 Py_DECREF(b);
2279 return (PyObject *)z;
2280 }
2281 loshift = shiftby % SHIFT;
2282 hishift = SHIFT - loshift;
2283 lomask = ((digit)1 << hishift) - 1;
2284 himask = MASK ^ lomask;
2285 z = _PyLong_New(newsize);
2286 if (z == NULL)
2287 goto rshift_error;
2288 if (a->ob_size < 0)
2289 z->ob_size = -(z->ob_size);
2290 for (i = 0, j = wordshift; i < newsize; i++, j++) {
2291 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
2292 if (i+1 < newsize)
2293 z->ob_digit[i] |=
2294 (a->ob_digit[j+1] << hishift) & himask;
2295 }
2296 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002297 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002298rshift_error:
2299 Py_DECREF(a);
2300 Py_DECREF(b);
2301 return (PyObject *) z;
2302
Guido van Rossumc6913e71991-11-19 20:26:46 +00002303}
2304
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002305static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002306long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002307{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002308 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002309 PyLongObject *a, *b;
2310 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002311 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002312 int oldsize, newsize, wordshift, remshift, i, j;
2313 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002314
Neil Schemenauerba872e22001-01-04 01:46:03 +00002315 CONVERT_BINOP(v, w, &a, &b);
2316
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002317 shiftby = PyLong_AsLong((PyObject *)b);
2318 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00002319 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002320 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002321 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002322 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002323 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002324 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002325 PyErr_SetString(PyExc_ValueError,
2326 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002327 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002328 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002329 /* wordshift, remshift = divmod(shiftby, SHIFT) */
2330 wordshift = (int)shiftby / SHIFT;
2331 remshift = (int)shiftby - wordshift * SHIFT;
2332
2333 oldsize = ABS(a->ob_size);
2334 newsize = oldsize + wordshift;
2335 if (remshift)
2336 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002337 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002338 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002339 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002340 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002341 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002342 for (i = 0; i < wordshift; i++)
2343 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002344 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002345 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00002346 accum |= (twodigits)a->ob_digit[j] << remshift;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002347 z->ob_digit[i] = (digit)(accum & MASK);
2348 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002349 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002350 if (remshift)
2351 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002352 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002353 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002354 z = long_normalize(z);
2355lshift_error:
2356 Py_DECREF(a);
2357 Py_DECREF(b);
2358 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002359}
2360
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002361
2362/* Bitwise and/xor/or operations */
2363
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002364static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002365long_bitwise(PyLongObject *a,
2366 int op, /* '&', '|', '^' */
2367 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002368{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002369 digit maska, maskb; /* 0 or MASK */
2370 int negz;
2371 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002372 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002373 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002374 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002375 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002376
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002377 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002378 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002379 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002380 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002381 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002382 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002383 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002384 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002385 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002386 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002387 maskb = 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(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002391 maskb = 0;
2392 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002393
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002394 negz = 0;
2395 switch (op) {
2396 case '^':
2397 if (maska != maskb) {
2398 maska ^= MASK;
2399 negz = -1;
2400 }
2401 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002402 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002403 if (maska && maskb) {
2404 op = '|';
2405 maska ^= MASK;
2406 maskb ^= MASK;
2407 negz = -1;
2408 }
2409 break;
2410 case '|':
2411 if (maska || maskb) {
2412 op = '&';
2413 maska ^= MASK;
2414 maskb ^= MASK;
2415 negz = -1;
2416 }
2417 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002418 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002419
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002420 /* JRH: The original logic here was to allocate the result value (z)
2421 as the longer of the two operands. However, there are some cases
2422 where the result is guaranteed to be shorter than that: AND of two
2423 positives, OR of two negatives: use the shorter number. AND with
2424 mixed signs: use the positive number. OR with mixed signs: use the
2425 negative number. After the transformations above, op will be '&'
2426 iff one of these cases applies, and mask will be non-0 for operands
2427 whose length should be ignored.
2428 */
2429
2430 size_a = a->ob_size;
2431 size_b = b->ob_size;
2432 size_z = op == '&'
2433 ? (maska
2434 ? size_b
2435 : (maskb ? size_a : MIN(size_a, size_b)))
2436 : MAX(size_a, size_b);
2437 z = _PyLong_New(size_z);
2438 if (a == NULL || b == NULL || z == NULL) {
2439 Py_XDECREF(a);
2440 Py_XDECREF(b);
2441 Py_XDECREF(z);
2442 return NULL;
2443 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002444
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002445 for (i = 0; i < size_z; ++i) {
2446 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2447 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2448 switch (op) {
2449 case '&': z->ob_digit[i] = diga & digb; break;
2450 case '|': z->ob_digit[i] = diga | digb; break;
2451 case '^': z->ob_digit[i] = diga ^ digb; break;
2452 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002453 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002454
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002455 Py_DECREF(a);
2456 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002457 z = long_normalize(z);
2458 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002459 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002460 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002461 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002462 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002463}
2464
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002465static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002466long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002467{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002468 PyLongObject *a, *b;
2469 PyObject *c;
2470 CONVERT_BINOP(v, w, &a, &b);
2471 c = long_bitwise(a, '&', b);
2472 Py_DECREF(a);
2473 Py_DECREF(b);
2474 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002475}
2476
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002477static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002478long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002479{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002480 PyLongObject *a, *b;
2481 PyObject *c;
2482 CONVERT_BINOP(v, w, &a, &b);
2483 c = long_bitwise(a, '^', b);
2484 Py_DECREF(a);
2485 Py_DECREF(b);
2486 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002487}
2488
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002489static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002490long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002491{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002492 PyLongObject *a, *b;
2493 PyObject *c;
2494 CONVERT_BINOP(v, w, &a, &b);
2495 c = long_bitwise(a, '|', b);
2496 Py_DECREF(a);
2497 Py_DECREF(b);
2498 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002499}
2500
Guido van Rossum234f9421993-06-17 12:35:49 +00002501static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002502long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002503{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002504 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002505 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002506 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002507 return 0;
2508 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002509 else if (PyLong_Check(*pw)) {
2510 Py_INCREF(*pv);
2511 Py_INCREF(*pw);
2512 return 0;
2513 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002514 return 1; /* Can't do it */
2515}
2516
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002517static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002518long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002519{
2520 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002521 x = PyLong_AsLong(v);
2522 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002523 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002524 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002525}
2526
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002527static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002528long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002529{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002530 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002531 return v;
2532}
2533
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002534static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002535long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002536{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002537 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002538 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002539 if (result == -1.0 && PyErr_Occurred())
2540 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002541 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002542}
2543
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002544static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002545long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002546{
Fred Drake121ee271999-12-23 15:41:28 +00002547 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002548}
2549
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002550static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002551long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002552{
Fred Drake121ee271999-12-23 15:41:28 +00002553 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002554}
Jeremy Hylton938ace62002-07-17 16:30:39 +00002555
2556static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00002557long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002558
Tim Peters6d6c1a32001-08-02 04:15:00 +00002559static PyObject *
2560long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2561{
2562 PyObject *x = NULL;
2563 int base = -909; /* unlikely! */
2564 static char *kwlist[] = {"x", "base", 0};
2565
Guido van Rossumbef14172001-08-29 15:47:46 +00002566 if (type != &PyLong_Type)
2567 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002568 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2569 &x, &base))
2570 return NULL;
2571 if (x == NULL)
2572 return PyLong_FromLong(0L);
2573 if (base == -909)
2574 return PyNumber_Long(x);
2575 else if (PyString_Check(x))
2576 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002577#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002578 else if (PyUnicode_Check(x))
2579 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2580 PyUnicode_GET_SIZE(x),
2581 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002582#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002583 else {
2584 PyErr_SetString(PyExc_TypeError,
2585 "long() can't convert non-string with explicit base");
2586 return NULL;
2587 }
2588}
2589
Guido van Rossumbef14172001-08-29 15:47:46 +00002590/* Wimpy, slow approach to tp_new calls for subtypes of long:
2591 first create a regular long from whatever arguments we got,
2592 then allocate a subtype instance and initialize it from
2593 the regular long. The regular long is then thrown away.
2594*/
2595static PyObject *
2596long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2597{
2598 PyLongObject *tmp, *new;
2599 int i, n;
2600
2601 assert(PyType_IsSubtype(type, &PyLong_Type));
2602 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2603 if (tmp == NULL)
2604 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002605 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002606 n = tmp->ob_size;
2607 if (n < 0)
2608 n = -n;
2609 new = (PyLongObject *)type->tp_alloc(type, n);
2610 if (new == NULL)
2611 return NULL;
2612 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002613 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002614 for (i = 0; i < n; i++)
2615 new->ob_digit[i] = tmp->ob_digit[i];
2616 Py_DECREF(tmp);
2617 return (PyObject *)new;
2618}
2619
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002620PyDoc_STRVAR(long_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002621"long(x[, base]) -> integer\n\
2622\n\
2623Convert a string or number to a long integer, if possible. A floating\n\
2624point argument will be truncated towards zero (this does not include a\n\
2625string representation of a floating point number!) When converting a\n\
2626string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002627converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002628
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002629static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002630 (binaryfunc) long_add, /*nb_add*/
2631 (binaryfunc) long_sub, /*nb_subtract*/
2632 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002633 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002634 (binaryfunc) long_mod, /*nb_remainder*/
2635 (binaryfunc) long_divmod, /*nb_divmod*/
2636 (ternaryfunc) long_pow, /*nb_power*/
2637 (unaryfunc) long_neg, /*nb_negative*/
2638 (unaryfunc) long_pos, /*tp_positive*/
2639 (unaryfunc) long_abs, /*tp_absolute*/
2640 (inquiry) long_nonzero, /*tp_nonzero*/
2641 (unaryfunc) long_invert, /*nb_invert*/
2642 (binaryfunc) long_lshift, /*nb_lshift*/
2643 (binaryfunc) long_rshift, /*nb_rshift*/
2644 (binaryfunc) long_and, /*nb_and*/
2645 (binaryfunc) long_xor, /*nb_xor*/
2646 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002647 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002648 (unaryfunc) long_int, /*nb_int*/
2649 (unaryfunc) long_long, /*nb_long*/
2650 (unaryfunc) long_float, /*nb_float*/
2651 (unaryfunc) long_oct, /*nb_oct*/
2652 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002653 0, /* nb_inplace_add */
2654 0, /* nb_inplace_subtract */
2655 0, /* nb_inplace_multiply */
2656 0, /* nb_inplace_divide */
2657 0, /* nb_inplace_remainder */
2658 0, /* nb_inplace_power */
2659 0, /* nb_inplace_lshift */
2660 0, /* nb_inplace_rshift */
2661 0, /* nb_inplace_and */
2662 0, /* nb_inplace_xor */
2663 0, /* nb_inplace_or */
2664 (binaryfunc)long_div, /* nb_floor_divide */
2665 long_true_divide, /* nb_true_divide */
2666 0, /* nb_inplace_floor_divide */
2667 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002668};
2669
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002670PyTypeObject PyLong_Type = {
2671 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002672 0, /* ob_size */
2673 "long", /* tp_name */
2674 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2675 sizeof(digit), /* tp_itemsize */
2676 (destructor)long_dealloc, /* tp_dealloc */
2677 0, /* tp_print */
2678 0, /* tp_getattr */
2679 0, /* tp_setattr */
2680 (cmpfunc)long_compare, /* tp_compare */
2681 (reprfunc)long_repr, /* tp_repr */
2682 &long_as_number, /* tp_as_number */
2683 0, /* tp_as_sequence */
2684 0, /* tp_as_mapping */
2685 (hashfunc)long_hash, /* tp_hash */
2686 0, /* tp_call */
2687 (reprfunc)long_str, /* tp_str */
2688 PyObject_GenericGetAttr, /* tp_getattro */
2689 0, /* tp_setattro */
2690 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002691 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2692 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002693 long_doc, /* tp_doc */
2694 0, /* tp_traverse */
2695 0, /* tp_clear */
2696 0, /* tp_richcompare */
2697 0, /* tp_weaklistoffset */
2698 0, /* tp_iter */
2699 0, /* tp_iternext */
2700 0, /* tp_methods */
2701 0, /* tp_members */
2702 0, /* tp_getset */
2703 0, /* tp_base */
2704 0, /* tp_dict */
2705 0, /* tp_descr_get */
2706 0, /* tp_descr_set */
2707 0, /* tp_dictoffset */
2708 0, /* tp_init */
2709 0, /* tp_alloc */
2710 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00002711 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002712};