blob: 3cc6f138e18d734839b3d716c69d1793bae26dbb [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001
2/* Long (arbitrary precision) integer object implementation */
3
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004/* XXX The functional organization of this file is terrible */
5
Guido van Rossumc0b618a1997-05-02 03:12:38 +00006#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +00007#include "longintrepr.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00009#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000010
Tim Peters5af4e6c2002-08-12 02:31:19 +000011/* For long multiplication, use the O(N**2) school algorithm unless
12 * both operands contain more than KARATSUBA_CUTOFF digits (this
13 * being an internal Python long digit, in base BASE).
14 */
15#define KARATSUBA_CUTOFF 35
16
Guido van Rossume32e0141992-01-19 16:31:05 +000017#define ABS(x) ((x) < 0 ? -(x) : (x))
18
Tim Peters5af4e6c2002-08-12 02:31:19 +000019#undef MIN
20#undef MAX
21#define MAX(x, y) ((x) < (y) ? (y) : (x))
22#define MIN(x, y) ((x) > (y) ? (y) : (x))
23
Guido van Rossume32e0141992-01-19 16:31:05 +000024/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000025static PyLongObject *long_normalize(PyLongObject *);
26static PyLongObject *mul1(PyLongObject *, wdigit);
27static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
Tim Peters212e6142001-07-14 12:23:19 +000028static PyLongObject *divrem1(PyLongObject *, digit, digit *);
Tim Peters9f688bf2000-07-07 15:53:28 +000029static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000030
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000031static int ticker; /* XXX Could be shared with ceval? */
32
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000034 if (--ticker < 0) { \
35 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000036 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000037 }
38
Guido van Rossumedcc38a1991-05-05 20:09:44 +000039/* Normalize (remove leading zeros from) a long int object.
40 Doesn't attempt to free the storage--in most cases, due to the nature
41 of the algorithms used, this could save at most be one word anyway. */
42
Guido van Rossumc0b618a1997-05-02 03:12:38 +000043static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000044long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000045{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000046 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000047 register int i = j;
Tim Peters5af4e6c2002-08-12 02:31:19 +000048
Guido van Rossumedcc38a1991-05-05 20:09:44 +000049 while (i > 0 && v->ob_digit[i-1] == 0)
50 --i;
51 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000052 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000053 return v;
54}
55
56/* Allocate a new long int object with size digits.
57 Return NULL and set exception if we run out of memory. */
58
Guido van Rossumc0b618a1997-05-02 03:12:38 +000059PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000060_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000061{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000063}
64
Tim Peters64b5ce32001-09-10 20:52:51 +000065PyObject *
66_PyLong_Copy(PyLongObject *src)
67{
68 PyLongObject *result;
69 int i;
70
71 assert(src != NULL);
72 i = src->ob_size;
73 if (i < 0)
74 i = -(i);
75 result = _PyLong_New(i);
76 if (result != NULL) {
Tim Peters5329cdb2002-03-02 04:18:04 +000077 result->ob_size = src->ob_size;
Tim Peters64b5ce32001-09-10 20:52:51 +000078 while (--i >= 0)
79 result->ob_digit[i] = src->ob_digit[i];
80 }
81 return (PyObject *)result;
82}
83
Guido van Rossumedcc38a1991-05-05 20:09:44 +000084/* Create a new long int object from a C long int */
85
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000087PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000088{
Tim Petersce9de2f2001-06-14 04:56:19 +000089 PyLongObject *v;
90 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
91 int ndigits = 0;
92 int negative = 0;
93
94 if (ival < 0) {
95 ival = -ival;
96 negative = 1;
97 }
98
99 /* Count the number of Python digits.
100 We used to pick 5 ("big enough for anything"), but that's a
101 waste of time and space given that 5*15 = 75 bits are rarely
102 needed. */
103 t = (unsigned long)ival;
104 while (t) {
105 ++ndigits;
106 t >>= SHIFT;
107 }
108 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000109 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000110 digit *p = v->ob_digit;
111 v->ob_size = negative ? -ndigits : ndigits;
112 t = (unsigned long)ival;
113 while (t) {
114 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000115 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000116 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000117 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000119}
120
Guido van Rossum53756b11997-01-03 17:14:46 +0000121/* Create a new long int object from a C unsigned long int */
122
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000124PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +0000125{
Tim Petersce9de2f2001-06-14 04:56:19 +0000126 PyLongObject *v;
127 unsigned long t;
128 int ndigits = 0;
129
130 /* Count the number of Python digits. */
131 t = (unsigned long)ival;
132 while (t) {
133 ++ndigits;
134 t >>= SHIFT;
135 }
136 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000137 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000138 digit *p = v->ob_digit;
139 v->ob_size = ndigits;
140 while (ival) {
141 *p++ = (digit)(ival & MASK);
142 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000143 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000144 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000145 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000146}
147
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000148/* Create a new long int object from a C double */
149
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000152{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000153 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000154 double frac;
155 int i, ndig, expo, neg;
156 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000157 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000158 PyErr_SetString(PyExc_OverflowError,
159 "cannot convert float infinity to long");
160 return NULL;
161 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000162 if (dval < 0.0) {
163 neg = 1;
164 dval = -dval;
165 }
166 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
167 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000169 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000171 if (v == NULL)
172 return NULL;
173 frac = ldexp(frac, (expo-1) % SHIFT + 1);
174 for (i = ndig; --i >= 0; ) {
175 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000176 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000177 frac = frac - (double)bits;
178 frac = ldexp(frac, SHIFT);
179 }
180 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000181 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000183}
184
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000185/* Get a C long int from a long int object.
186 Returns -1 and sets an error condition if overflow occurs. */
187
188long
Tim Peters9f688bf2000-07-07 15:53:28 +0000189PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000190{
Guido van Rossumf7531811998-05-26 14:33:37 +0000191 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000193 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000194 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000195
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 if (vv == NULL || !PyLong_Check(vv)) {
Guido van Rossum7e35d572001-09-15 03:14:32 +0000197 if (vv != NULL && PyInt_Check(vv))
198 return PyInt_AsLong(vv);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000199 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000200 return -1;
201 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000202 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000203 i = v->ob_size;
204 sign = 1;
205 x = 0;
206 if (i < 0) {
207 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000208 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000209 }
210 while (--i >= 0) {
211 prev = x;
212 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000213 if ((x >> SHIFT) != prev)
214 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000215 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000216 /* Haven't lost any bits, but if the sign bit is set we're in
217 * trouble *unless* this is the min negative number. So,
218 * trouble iff sign bit set && (positive || some bit set other
219 * than the sign bit).
220 */
221 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
222 goto overflow;
223 return (long)x * sign;
224
225 overflow:
226 PyErr_SetString(PyExc_OverflowError,
Skip Montanarobafedec2001-09-13 19:05:30 +0000227 "long int too large to convert to int");
Guido van Rossumf7531811998-05-26 14:33:37 +0000228 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000229}
230
Guido van Rossum53756b11997-01-03 17:14:46 +0000231/* Get a C long int from a long int object.
232 Returns -1 and sets an error condition if overflow occurs. */
233
234unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000235PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000236{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000238 unsigned long x, prev;
239 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000240
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241 if (vv == NULL || !PyLong_Check(vv)) {
242 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000243 return (unsigned long) -1;
244 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000245 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000246 i = v->ob_size;
247 x = 0;
248 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000249 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000250 "can't convert negative value to unsigned long");
251 return (unsigned long) -1;
252 }
253 while (--i >= 0) {
254 prev = x;
255 x = (x << SHIFT) + v->ob_digit[i];
256 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000257 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000258 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000259 return (unsigned long) -1;
260 }
261 }
262 return x;
263}
264
Tim Peters2a9b3672001-06-11 21:23:58 +0000265PyObject *
266_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
267 int little_endian, int is_signed)
268{
269 const unsigned char* pstartbyte;/* LSB of bytes */
270 int incr; /* direction to move pstartbyte */
271 const unsigned char* pendbyte; /* MSB of bytes */
272 size_t numsignificantbytes; /* number of bytes that matter */
273 size_t ndigits; /* number of Python long digits */
274 PyLongObject* v; /* result */
275 int idigit = 0; /* next free index in v->ob_digit */
276
277 if (n == 0)
278 return PyLong_FromLong(0L);
279
280 if (little_endian) {
281 pstartbyte = bytes;
282 pendbyte = bytes + n - 1;
283 incr = 1;
284 }
285 else {
286 pstartbyte = bytes + n - 1;
287 pendbyte = bytes;
288 incr = -1;
289 }
290
291 if (is_signed)
292 is_signed = *pendbyte >= 0x80;
293
294 /* Compute numsignificantbytes. This consists of finding the most
295 significant byte. Leading 0 bytes are insignficant if the number
296 is positive, and leading 0xff bytes if negative. */
297 {
298 size_t i;
299 const unsigned char* p = pendbyte;
300 const int pincr = -incr; /* search MSB to LSB */
301 const unsigned char insignficant = is_signed ? 0xff : 0x00;
302
303 for (i = 0; i < n; ++i, p += pincr) {
304 if (*p != insignficant)
305 break;
306 }
307 numsignificantbytes = n - i;
308 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
309 actually has 2 significant bytes. OTOH, 0xff0001 ==
310 -0x00ffff, so we wouldn't *need* to bump it there; but we
311 do for 0xffff = -0x0001. To be safe without bothering to
312 check every case, bump it regardless. */
313 if (is_signed && numsignificantbytes < n)
314 ++numsignificantbytes;
315 }
316
317 /* How many Python long digits do we need? We have
318 8*numsignificantbytes bits, and each Python long digit has SHIFT
319 bits, so it's the ceiling of the quotient. */
320 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
321 if (ndigits > (size_t)INT_MAX)
322 return PyErr_NoMemory();
323 v = _PyLong_New((int)ndigits);
324 if (v == NULL)
325 return NULL;
326
327 /* Copy the bits over. The tricky parts are computing 2's-comp on
328 the fly for signed numbers, and dealing with the mismatch between
329 8-bit bytes and (probably) 15-bit Python digits.*/
330 {
331 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000332 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000333 twodigits accum = 0; /* sliding register */
334 unsigned int accumbits = 0; /* number of bits in accum */
335 const unsigned char* p = pstartbyte;
336
337 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000338 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000339 /* Compute correction for 2's comp, if needed. */
340 if (is_signed) {
341 thisbyte = (0xff ^ thisbyte) + carry;
342 carry = thisbyte >> 8;
343 thisbyte &= 0xff;
344 }
345 /* Because we're going LSB to MSB, thisbyte is
346 more significant than what's already in accum,
347 so needs to be prepended to accum. */
348 accum |= thisbyte << accumbits;
349 accumbits += 8;
350 if (accumbits >= SHIFT) {
351 /* There's enough to fill a Python digit. */
352 assert(idigit < (int)ndigits);
353 v->ob_digit[idigit] = (digit)(accum & MASK);
354 ++idigit;
355 accum >>= SHIFT;
356 accumbits -= SHIFT;
357 assert(accumbits < SHIFT);
358 }
359 }
360 assert(accumbits < SHIFT);
361 if (accumbits) {
362 assert(idigit < (int)ndigits);
363 v->ob_digit[idigit] = (digit)accum;
364 ++idigit;
365 }
366 }
367
368 v->ob_size = is_signed ? -idigit : idigit;
369 return (PyObject *)long_normalize(v);
370}
371
372int
373_PyLong_AsByteArray(PyLongObject* v,
374 unsigned char* bytes, size_t n,
375 int little_endian, int is_signed)
376{
377 int i; /* index into v->ob_digit */
378 int ndigits; /* |v->ob_size| */
379 twodigits accum; /* sliding register */
380 unsigned int accumbits; /* # bits in accum */
381 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
382 twodigits carry; /* for computing 2's-comp */
383 size_t j; /* # bytes filled */
384 unsigned char* p; /* pointer to next byte in bytes */
385 int pincr; /* direction to move p */
386
387 assert(v != NULL && PyLong_Check(v));
388
389 if (v->ob_size < 0) {
390 ndigits = -(v->ob_size);
391 if (!is_signed) {
392 PyErr_SetString(PyExc_TypeError,
393 "can't convert negative long to unsigned");
394 return -1;
395 }
396 do_twos_comp = 1;
397 }
398 else {
399 ndigits = v->ob_size;
400 do_twos_comp = 0;
401 }
402
403 if (little_endian) {
404 p = bytes;
405 pincr = 1;
406 }
407 else {
408 p = bytes + n - 1;
409 pincr = -1;
410 }
411
Tim Peters898cf852001-06-13 20:50:08 +0000412 /* Copy over all the Python digits.
413 It's crucial that every Python digit except for the MSD contribute
414 exactly SHIFT bits to the total, so first assert that the long is
415 normalized. */
416 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000417 j = 0;
418 accum = 0;
419 accumbits = 0;
420 carry = do_twos_comp ? 1 : 0;
421 for (i = 0; i < ndigits; ++i) {
422 twodigits thisdigit = v->ob_digit[i];
423 if (do_twos_comp) {
424 thisdigit = (thisdigit ^ MASK) + carry;
425 carry = thisdigit >> SHIFT;
426 thisdigit &= MASK;
427 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000428 /* Because we're going LSB to MSB, thisdigit is more
429 significant than what's already in accum, so needs to be
430 prepended to accum. */
431 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000432 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000433
Tim Petersede05092001-06-14 08:53:38 +0000434 /* The most-significant digit may be (probably is) at least
435 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000436 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000437 /* Count # of sign bits -- they needn't be stored,
438 * although for signed conversion we need later to
439 * make sure at least one sign bit gets stored.
440 * First shift conceptual sign bit to real sign bit.
441 */
442 stwodigits s = (stwodigits)(thisdigit <<
443 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000444 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000445 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000446 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000447 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000448 }
Tim Petersede05092001-06-14 08:53:38 +0000449 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000450 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000451
Tim Peters2a9b3672001-06-11 21:23:58 +0000452 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000453 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000454 if (j >= n)
455 goto Overflow;
456 ++j;
457 *p = (unsigned char)(accum & 0xff);
458 p += pincr;
459 accumbits -= 8;
460 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000461 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000462 }
463
464 /* Store the straggler (if any). */
465 assert(accumbits < 8);
466 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000467 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000468 if (j >= n)
469 goto Overflow;
470 ++j;
471 if (do_twos_comp) {
472 /* Fill leading bits of the byte with sign bits
473 (appropriately pretending that the long had an
474 infinite supply of sign bits). */
475 accum |= (~(twodigits)0) << accumbits;
476 }
477 *p = (unsigned char)(accum & 0xff);
478 p += pincr;
479 }
Tim Peters05607ad2001-06-13 21:01:27 +0000480 else if (j == n && n > 0 && is_signed) {
481 /* The main loop filled the byte array exactly, so the code
482 just above didn't get to ensure there's a sign bit, and the
483 loop below wouldn't add one either. Make sure a sign bit
484 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000485 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000486 int sign_bit_set = msb >= 0x80;
487 assert(accumbits == 0);
488 if (sign_bit_set == do_twos_comp)
489 return 0;
490 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000491 goto Overflow;
492 }
Tim Peters05607ad2001-06-13 21:01:27 +0000493
494 /* Fill remaining bytes with copies of the sign bit. */
495 {
496 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
497 for ( ; j < n; ++j, p += pincr)
498 *p = signbyte;
499 }
500
Tim Peters2a9b3672001-06-11 21:23:58 +0000501 return 0;
502
503Overflow:
504 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
505 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000506
Tim Peters2a9b3672001-06-11 21:23:58 +0000507}
508
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000509double
510_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
511{
512/* NBITS_WANTED should be > the number of bits in a double's precision,
513 but small enough so that 2**NBITS_WANTED is within the normal double
514 range. nbitsneeded is set to 1 less than that because the most-significant
515 Python digit contains at least 1 significant bit, but we don't want to
516 bother counting them (catering to the worst case cheaply).
517
518 57 is one more than VAX-D double precision; I (Tim) don't know of a double
519 format with more precision than that; it's 1 larger so that we add in at
520 least one round bit to stand in for the ignored least-significant bits.
521*/
522#define NBITS_WANTED 57
523 PyLongObject *v;
524 double x;
525 const double multiplier = (double)(1L << SHIFT);
526 int i, sign;
527 int nbitsneeded;
528
529 if (vv == NULL || !PyLong_Check(vv)) {
530 PyErr_BadInternalCall();
531 return -1;
532 }
533 v = (PyLongObject *)vv;
534 i = v->ob_size;
535 sign = 1;
536 if (i < 0) {
537 sign = -1;
538 i = -(i);
539 }
540 else if (i == 0) {
541 *exponent = 0;
542 return 0.0;
543 }
544 --i;
545 x = (double)v->ob_digit[i];
546 nbitsneeded = NBITS_WANTED - 1;
547 /* Invariant: i Python digits remain unaccounted for. */
548 while (i > 0 && nbitsneeded > 0) {
549 --i;
550 x = x * multiplier + (double)v->ob_digit[i];
551 nbitsneeded -= SHIFT;
552 }
553 /* There are i digits we didn't shift in. Pretending they're all
554 zeroes, the true value is x * 2**(i*SHIFT). */
555 *exponent = i;
556 assert(x > 0.0);
557 return x * sign;
558#undef NBITS_WANTED
559}
560
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000561/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000562
563double
Tim Peters9f688bf2000-07-07 15:53:28 +0000564PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000565{
Tim Peters9fffa3e2001-09-04 05:14:19 +0000566 int e;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000567 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000568
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 if (vv == NULL || !PyLong_Check(vv)) {
570 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000571 return -1;
572 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000573 x = _PyLong_AsScaledDouble(vv, &e);
574 if (x == -1.0 && PyErr_Occurred())
575 return -1.0;
576 if (e > INT_MAX / SHIFT)
577 goto overflow;
578 errno = 0;
579 x = ldexp(x, e * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000580 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000581 goto overflow;
582 return x;
583
584overflow:
585 PyErr_SetString(PyExc_OverflowError,
586 "long int too large to convert to float");
587 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000588}
589
Guido van Rossum78694d91998-09-18 14:14:13 +0000590/* Create a new long (or int) object from a C pointer */
591
592PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000593PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000594{
Tim Peters70128a12001-06-16 08:48:40 +0000595#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000596 return PyInt_FromLong((long)p);
597#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000598
Tim Peters70128a12001-06-16 08:48:40 +0000599#ifndef HAVE_LONG_LONG
600# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
601#endif
602#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
603# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
604#endif
605 /* optimize null pointers */
606 if (p == NULL)
607 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000608 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000609
610#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000611}
612
613/* Get a C pointer from a long object (or an int object in some cases) */
614
615void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000616PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000617{
618 /* This function will allow int or long objects. If vv is neither,
619 then the PyLong_AsLong*() functions will raise the exception:
620 PyExc_SystemError, "bad argument to internal function"
621 */
Tim Peters70128a12001-06-16 08:48:40 +0000622#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000623 long x;
624
Tim Peters70128a12001-06-16 08:48:40 +0000625 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000626 x = PyInt_AS_LONG(vv);
627 else
628 x = PyLong_AsLong(vv);
629#else
Tim Peters70128a12001-06-16 08:48:40 +0000630
631#ifndef HAVE_LONG_LONG
632# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
633#endif
634#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
635# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
636#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000637 LONG_LONG x;
638
Tim Peters70128a12001-06-16 08:48:40 +0000639 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000640 x = PyInt_AS_LONG(vv);
641 else
642 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000643
644#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000645
646 if (x == -1 && PyErr_Occurred())
647 return NULL;
648 return (void *)x;
649}
650
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000651#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000652
653/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
654 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000655 */
656
Tim Peterscf37dfc2001-06-14 18:42:50 +0000657#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000658
659/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000660
661PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000662PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000663{
Tim Petersd1a7da62001-06-13 00:35:57 +0000664 LONG_LONG bytes = ival;
665 int one = 1;
666 return _PyLong_FromByteArray(
667 (unsigned char *)&bytes,
668 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000669}
670
Tim Petersd1a7da62001-06-13 00:35:57 +0000671/* Create a new long int object from a C unsigned LONG_LONG int. */
672
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000673PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000674PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000675{
Tim Petersd1a7da62001-06-13 00:35:57 +0000676 unsigned LONG_LONG bytes = ival;
677 int one = 1;
678 return _PyLong_FromByteArray(
679 (unsigned char *)&bytes,
680 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000681}
682
Guido van Rossum3293b071998-08-25 16:07:15 +0000683/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000684 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000685
Guido van Rossum3293b071998-08-25 16:07:15 +0000686LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000687PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000688{
Tim Petersd1a7da62001-06-13 00:35:57 +0000689 LONG_LONG bytes;
690 int one = 1;
691 int res;
692
Tim Petersd38b1c72001-09-30 05:09:37 +0000693 if (vv == NULL) {
694 PyErr_BadInternalCall();
695 return -1;
696 }
697 if (!PyLong_Check(vv)) {
698 if (PyInt_Check(vv))
699 return (LONG_LONG)PyInt_AsLong(vv);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000700 PyErr_BadInternalCall();
701 return -1;
702 }
703
Tim Petersd1a7da62001-06-13 00:35:57 +0000704 res = _PyLong_AsByteArray(
705 (PyLongObject *)vv, (unsigned char *)&bytes,
706 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000707
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000708 /* Plan 9 can't handle LONG_LONG in ? : expressions */
709 if (res < 0)
Jeremy Hyltonc4ad0bc2002-04-23 20:01:20 +0000710 return (LONG_LONG)-1;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000711 else
712 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000713}
714
Tim Petersd1a7da62001-06-13 00:35:57 +0000715/* Get a C unsigned LONG_LONG int from a long int object.
716 Return -1 and set an error if overflow occurs. */
717
Guido van Rossum3293b071998-08-25 16:07:15 +0000718unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000719PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000720{
Tim Petersd1a7da62001-06-13 00:35:57 +0000721 unsigned LONG_LONG bytes;
722 int one = 1;
723 int res;
724
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000725 if (vv == NULL || !PyLong_Check(vv)) {
726 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000727 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000728 }
729
Tim Petersd1a7da62001-06-13 00:35:57 +0000730 res = _PyLong_AsByteArray(
731 (PyLongObject *)vv, (unsigned char *)&bytes,
732 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000733
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000734 /* Plan 9 can't handle LONG_LONG in ? : expressions */
735 if (res < 0)
736 return (unsigned LONG_LONG)res;
737 else
738 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000739}
Tim Petersd1a7da62001-06-13 00:35:57 +0000740
741#undef IS_LITTLE_ENDIAN
742
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000743#endif /* HAVE_LONG_LONG */
744
Neil Schemenauerba872e22001-01-04 01:46:03 +0000745
746static int
747convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
Tim Peters5af4e6c2002-08-12 02:31:19 +0000748 if (PyLong_Check(v)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000749 *a = (PyLongObject *) v;
750 Py_INCREF(v);
751 }
752 else if (PyInt_Check(v)) {
753 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
754 }
755 else {
756 return 0;
757 }
Tim Peters5af4e6c2002-08-12 02:31:19 +0000758 if (PyLong_Check(w)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000759 *b = (PyLongObject *) w;
760 Py_INCREF(w);
761 }
762 else if (PyInt_Check(w)) {
763 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
764 }
765 else {
766 Py_DECREF(*a);
767 return 0;
768 }
769 return 1;
770}
771
772#define CONVERT_BINOP(v, w, a, b) \
773 if (!convert_binop(v, w, a, b)) { \
774 Py_INCREF(Py_NotImplemented); \
775 return Py_NotImplemented; \
776 }
777
Tim Peters877a2122002-08-12 05:09:36 +0000778/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
779 * is modified in place, by adding y to it. Carries are propagated as far as
780 * x[m-1], and the remaining carry (0 or 1) is returned.
781 */
782static digit
783v_iadd(digit *x, int m, digit *y, int n)
784{
785 int i;
786 digit carry = 0;
787
788 assert(m >= n);
789 for (i = 0; i < n; ++i) {
790 carry += x[i] + y[i];
791 x[i] = carry & MASK;
792 carry >>= SHIFT;
793 assert((carry & 1) == carry);
794 }
795 for (; carry && i < m; ++i) {
796 carry += x[i];
797 x[i] = carry & MASK;
798 carry >>= SHIFT;
799 assert((carry & 1) == carry);
800 }
801 return carry;
802}
803
804/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
805 * is modified in place, by subtracting y from it. Borrows are propagated as
806 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
807 */
808static digit
809v_isub(digit *x, int m, digit *y, int n)
810{
811 int i;
812 digit borrow = 0;
813
814 assert(m >= n);
815 for (i = 0; i < n; ++i) {
816 borrow = x[i] - y[i] - borrow;
817 x[i] = borrow & MASK;
818 borrow >>= SHIFT;
819 borrow &= 1; /* keep only 1 sign bit */
820 }
821 for (; borrow && i < m; ++i) {
822 borrow = x[i] - borrow;
823 x[i] = borrow & MASK;
824 borrow >>= SHIFT;
825 borrow &= 1;
826 }
827 return borrow;
828}
Neil Schemenauerba872e22001-01-04 01:46:03 +0000829
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000830/* Multiply by a single digit, ignoring the sign. */
831
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000832static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000833mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000834{
835 return muladd1(a, n, (digit)0);
836}
837
838/* Multiply by a single digit and add a single digit, ignoring the sign. */
839
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000841muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000842{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000843 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000845 twodigits carry = extra;
846 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000847
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000848 if (z == NULL)
849 return NULL;
850 for (i = 0; i < size_a; ++i) {
851 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000852 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000853 carry >>= SHIFT;
854 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000855 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000856 return long_normalize(z);
857}
858
Tim Peters212e6142001-07-14 12:23:19 +0000859/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
860 in pout, and returning the remainder. pin and pout point at the LSD.
861 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
862 long_format, but that should be done with great care since longs are
863 immutable. */
864
865static digit
866inplace_divrem1(digit *pout, digit *pin, int size, digit n)
867{
868 twodigits rem = 0;
869
870 assert(n > 0 && n <= MASK);
871 pin += size;
872 pout += size;
873 while (--size >= 0) {
874 digit hi;
875 rem = (rem << SHIFT) + *--pin;
876 *--pout = hi = (digit)(rem / n);
877 rem -= hi * n;
878 }
879 return (digit)rem;
880}
881
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000882/* Divide a long integer by a digit, returning both the quotient
883 (as function result) and the remainder (through *prem).
884 The sign of a is ignored; n should not be zero. */
885
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000886static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000887divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000888{
Tim Peters212e6142001-07-14 12:23:19 +0000889 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000890 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000891
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000892 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000894 if (z == NULL)
895 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000896 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000897 return long_normalize(z);
898}
899
900/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000901 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000902 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000903
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000905long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000906{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907 register PyLongObject *a = (PyLongObject *)aa;
908 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000909 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000910 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000911 char *p;
912 int bits;
913 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000914
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915 if (a == NULL || !PyLong_Check(a)) {
916 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000917 return NULL;
918 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000919 assert(base >= 2 && base <= 36);
Tim Peters5af4e6c2002-08-12 02:31:19 +0000920
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000921 /* Compute a rough upper bound for the length of the string */
922 i = base;
923 bits = 0;
924 while (i > 1) {
925 ++bits;
926 i >>= 1;
927 }
Fred Drake121ee271999-12-23 15:41:28 +0000928 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000930 if (str == NULL)
931 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000933 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000934 if (addL)
935 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000936 if (a->ob_size < 0)
937 sign = '-';
Tim Peters5af4e6c2002-08-12 02:31:19 +0000938
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000939 if (a->ob_size == 0) {
940 *--p = '0';
941 }
942 else if ((base & (base - 1)) == 0) {
943 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000944 twodigits accum = 0;
945 int accumbits = 0; /* # of bits in accum */
946 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000947 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000948 while ((i >>= 1) > 1)
949 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000950
951 for (i = 0; i < size_a; ++i) {
952 accum |= a->ob_digit[i] << accumbits;
953 accumbits += SHIFT;
954 assert(accumbits >= basebits);
955 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000956 char cdigit = (char)(accum & (base - 1));
957 cdigit += (cdigit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000958 assert(p > PyString_AS_STRING(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000959 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +0000960 accumbits -= basebits;
961 accum >>= basebits;
962 } while (i < size_a-1 ? accumbits >= basebits :
963 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000964 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000965 }
966 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000967 /* Not 0, and base not a power of 2. Divide repeatedly by
968 base, but for speed use the highest power of base that
969 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000970 int size = size_a;
971 digit *pin = a->ob_digit;
972 PyLongObject *scratch;
973 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000974 digit powbase = base; /* powbase == base ** power */
975 int power = 1;
976 for (;;) {
977 unsigned long newpow = powbase * (unsigned long)base;
978 if (newpow >> SHIFT) /* doesn't fit in a digit */
979 break;
980 powbase = (digit)newpow;
981 ++power;
982 }
Tim Peters212e6142001-07-14 12:23:19 +0000983
984 /* Get a scratch area for repeated division. */
985 scratch = _PyLong_New(size);
986 if (scratch == NULL) {
987 Py_DECREF(str);
988 return NULL;
989 }
990
991 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000992 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000993 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000994 digit rem = inplace_divrem1(scratch->ob_digit,
995 pin, size, powbase);
996 pin = scratch->ob_digit; /* no need to use a again */
997 if (pin[size - 1] == 0)
998 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000999 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +00001000 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001001 Py_DECREF(str);
1002 return NULL;
1003 })
Tim Peters212e6142001-07-14 12:23:19 +00001004
1005 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001006 assert(ntostore > 0);
1007 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001008 digit nextrem = (digit)(rem / base);
1009 char c = (char)(rem - nextrem * base);
1010 assert(p > PyString_AS_STRING(str));
1011 c += (c < 10) ? '0' : 'A'-10;
1012 *--p = c;
1013 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001014 --ntostore;
1015 /* Termination is a bit delicate: must not
1016 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +00001017 remaining quotient and rem are both 0. */
1018 } while (ntostore && (size || rem));
1019 } while (size != 0);
1020 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001021 }
1022
Guido van Rossum2c475421992-08-14 15:13:07 +00001023 if (base == 8) {
1024 if (size_a != 0)
1025 *--p = '0';
1026 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +00001027 else if (base == 16) {
1028 *--p = 'x';
1029 *--p = '0';
1030 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001031 else if (base != 10) {
1032 *--p = '#';
1033 *--p = '0' + base%10;
1034 if (base > 10)
1035 *--p = '0' + base/10;
1036 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001037 if (sign)
1038 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001039 if (p != PyString_AS_STRING(str)) {
1040 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001041 assert(p > q);
1042 do {
1043 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001044 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 _PyString_Resize((PyObject **)&str,
1046 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001047 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001048 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001049}
1050
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001051PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001052PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001053{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001054 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001055 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001057
Guido van Rossum472c04f1996-12-05 21:57:21 +00001058 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001060 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001061 return NULL;
1062 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001063 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001064 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001065 if (*str == '+')
1066 ++str;
1067 else if (*str == '-') {
1068 ++str;
1069 sign = -1;
1070 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001071 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001072 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001073 if (base == 0) {
1074 if (str[0] != '0')
1075 base = 10;
1076 else if (str[1] == 'x' || str[1] == 'X')
1077 base = 16;
1078 else
1079 base = 8;
1080 }
1081 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1082 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001083 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +00001084 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001085 for ( ; z != NULL; ++str) {
1086 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001087 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001088
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001089 if (*str <= '9')
1090 k = *str - '0';
1091 else if (*str >= 'a')
1092 k = *str - 'a' + 10;
1093 else if (*str >= 'A')
1094 k = *str - 'A' + 10;
1095 if (k < 0 || k >= base)
1096 break;
1097 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001098 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001099 z = temp;
1100 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001101 if (z == NULL)
1102 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001103 if (str == start)
1104 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001105 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001106 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001107 if (*str == 'L' || *str == 'l')
1108 str++;
1109 while (*str && isspace(Py_CHARMASK(*str)))
1110 str++;
1111 if (*str != '\0')
1112 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001113 if (pend)
1114 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001115 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001116
1117 onError:
Tim Peters5af4e6c2002-08-12 02:31:19 +00001118 PyErr_Format(PyExc_ValueError,
Guido van Rossum9e896b32000-04-05 20:11:21 +00001119 "invalid literal for long(): %.200s", orig_str);
1120 Py_XDECREF(z);
1121 return NULL;
1122}
1123
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001124#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001125PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001126PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001127{
1128 char buffer[256];
1129
1130 if (length >= sizeof(buffer)) {
1131 PyErr_SetString(PyExc_ValueError,
1132 "long() literal too large to convert");
1133 return NULL;
1134 }
1135 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
1136 return NULL;
1137
1138 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001139}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001140#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001141
Tim Peters9f688bf2000-07-07 15:53:28 +00001142/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001144 (PyLongObject *, PyLongObject *, PyLongObject **);
1145static PyObject *long_pos(PyLongObject *);
1146static int long_divrem(PyLongObject *, PyLongObject *,
1147 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001148
1149/* Long division with remainder, top-level routine */
1150
Guido van Rossume32e0141992-01-19 16:31:05 +00001151static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001152long_divrem(PyLongObject *a, PyLongObject *b,
1153 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001154{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001155 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001156 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001157
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001158 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001159 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001160 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001161 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001162 }
1163 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001164 (size_a == size_b &&
1165 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001166 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001167 *pdiv = _PyLong_New(0);
1168 Py_INCREF(a);
1169 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001170 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001171 }
1172 if (size_b == 1) {
1173 digit rem = 0;
1174 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001175 if (z == NULL)
1176 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001177 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001178 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001179 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001180 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001181 if (z == NULL)
1182 return -1;
1183 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001184 /* Set the signs.
1185 The quotient z has the sign of a*b;
1186 the remainder r has the sign of a,
1187 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001188 if ((a->ob_size < 0) != (b->ob_size < 0))
1189 z->ob_size = -(z->ob_size);
1190 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1191 (*prem)->ob_size = -((*prem)->ob_size);
1192 *pdiv = z;
1193 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001194}
1195
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001196/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001197
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001198static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001199x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001200{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001201 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001202 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 PyLongObject *v = mul1(v1, d);
1204 PyLongObject *w = mul1(w1, d);
1205 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001206 int j, k;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001207
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001208 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001209 Py_XDECREF(v);
1210 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001211 return NULL;
1212 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001213
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001214 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001215 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001216 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001217
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001218 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219 a = _PyLong_New(size_v - size_w + 1);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001220
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001221 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1222 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1223 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001224 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001225 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001226
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001227 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001229 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001230 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001231 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001232 if (vj == w->ob_digit[size_w-1])
1233 q = MASK;
1234 else
1235 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1236 w->ob_digit[size_w-1];
Tim Peters5af4e6c2002-08-12 02:31:19 +00001237
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001238 while (w->ob_digit[size_w-2]*q >
1239 ((
1240 ((twodigits)vj << SHIFT)
1241 + v->ob_digit[j-1]
1242 - q*w->ob_digit[size_w-1]
1243 ) << SHIFT)
1244 + v->ob_digit[j-2])
1245 --q;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001246
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001247 for (i = 0; i < size_w && i+k < size_v; ++i) {
1248 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001249 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 carry += v->ob_digit[i+k] - z
1251 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001252 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001253 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1254 carry, SHIFT);
1255 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001256 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001257
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001258 if (i+k < size_v) {
1259 carry += v->ob_digit[i+k];
1260 v->ob_digit[i+k] = 0;
1261 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001262
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001263 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001264 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001265 else {
1266 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001267 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001268 carry = 0;
1269 for (i = 0; i < size_w && i+k < size_v; ++i) {
1270 carry += v->ob_digit[i+k] + w->ob_digit[i];
1271 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001272 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1273 BASE_TWODIGITS_TYPE,
1274 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001275 }
1276 }
1277 } /* for j, k */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001278
Guido van Rossumc206c761995-01-10 15:23:19 +00001279 if (a == NULL)
1280 *prem = NULL;
1281 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001282 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001283 *prem = divrem1(v, d, &d);
1284 /* d receives the (unused) remainder */
1285 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001286 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001287 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001288 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001289 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290 Py_DECREF(v);
1291 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001292 return a;
1293}
1294
1295/* Methods */
1296
1297static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001298long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001299{
Guido van Rossum9475a232001-10-05 20:51:39 +00001300 v->ob_type->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001301}
1302
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001304long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001305{
Fred Drake121ee271999-12-23 15:41:28 +00001306 return long_format(v, 10, 1);
1307}
1308
1309static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001310long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001311{
1312 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001313}
1314
1315static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001316long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001317{
1318 int sign;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001319
Guido van Rossumc6913e71991-11-19 20:26:46 +00001320 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001321 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001322 sign = 0;
1323 else
1324 sign = a->ob_size - b->ob_size;
1325 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001326 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001327 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001328 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1329 ;
1330 if (i < 0)
1331 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001332 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001333 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001334 if (a->ob_size < 0)
1335 sign = -sign;
1336 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001337 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001338 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001339}
1340
Guido van Rossum9bfef441993-03-29 10:43:31 +00001341static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001342long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001343{
1344 long x;
1345 int i, sign;
1346
1347 /* This is designed so that Python ints and longs with the
1348 same value hash to the same value, otherwise comparisons
1349 of mapping keys will turn out weird */
1350 i = v->ob_size;
1351 sign = 1;
1352 x = 0;
1353 if (i < 0) {
1354 sign = -1;
1355 i = -(i);
1356 }
1357 while (--i >= 0) {
1358 /* Force a 32-bit circular shift */
1359 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1360 x += v->ob_digit[i];
1361 }
1362 x = x * sign;
1363 if (x == -1)
1364 x = -2;
1365 return x;
1366}
1367
1368
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001369/* Add the absolute values of two long integers. */
1370
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001372x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001373{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001374 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001376 int i;
1377 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001378
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001379 /* Ensure a is the larger of the two: */
1380 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001381 { PyLongObject *temp = a; a = b; b = temp; }
1382 { int size_temp = size_a;
1383 size_a = size_b;
1384 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001385 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001386 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001387 if (z == NULL)
1388 return NULL;
1389 for (i = 0; i < size_b; ++i) {
1390 carry += a->ob_digit[i] + b->ob_digit[i];
1391 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001392 carry >>= SHIFT;
1393 }
1394 for (; i < size_a; ++i) {
1395 carry += a->ob_digit[i];
1396 z->ob_digit[i] = carry & MASK;
1397 carry >>= SHIFT;
1398 }
1399 z->ob_digit[i] = carry;
1400 return long_normalize(z);
1401}
1402
1403/* Subtract the absolute values of two integers. */
1404
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001406x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001407{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001408 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001409 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001410 int i;
1411 int sign = 1;
1412 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001413
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001414 /* Ensure a is the larger of the two: */
1415 if (size_a < size_b) {
1416 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417 { PyLongObject *temp = a; a = b; b = temp; }
1418 { int size_temp = size_a;
1419 size_a = size_b;
1420 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001421 }
1422 else if (size_a == size_b) {
1423 /* Find highest digit where a and b differ: */
1424 i = size_a;
1425 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1426 ;
1427 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001428 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001429 if (a->ob_digit[i] < b->ob_digit[i]) {
1430 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001431 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001432 }
1433 size_a = size_b = i+1;
1434 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001435 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001436 if (z == NULL)
1437 return NULL;
1438 for (i = 0; i < size_b; ++i) {
1439 /* The following assumes unsigned arithmetic
1440 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001441 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001442 z->ob_digit[i] = borrow & MASK;
1443 borrow >>= SHIFT;
1444 borrow &= 1; /* Keep only one sign bit */
1445 }
1446 for (; i < size_a; ++i) {
1447 borrow = a->ob_digit[i] - borrow;
1448 z->ob_digit[i] = borrow & MASK;
1449 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001450 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001451 }
1452 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001453 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001454 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001455 return long_normalize(z);
1456}
1457
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001459long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001460{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001461 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001462
Neil Schemenauerba872e22001-01-04 01:46:03 +00001463 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1464
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001465 if (a->ob_size < 0) {
1466 if (b->ob_size < 0) {
1467 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001468 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001469 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001470 }
1471 else
1472 z = x_sub(b, a);
1473 }
1474 else {
1475 if (b->ob_size < 0)
1476 z = x_sub(a, b);
1477 else
1478 z = x_add(a, b);
1479 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001480 Py_DECREF(a);
1481 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001482 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001483}
1484
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001485static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001486long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001487{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001488 PyLongObject *a, *b, *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001489
Neil Schemenauerba872e22001-01-04 01:46:03 +00001490 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1491
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001492 if (a->ob_size < 0) {
1493 if (b->ob_size < 0)
1494 z = x_sub(a, b);
1495 else
1496 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001497 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001498 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001499 }
1500 else {
1501 if (b->ob_size < 0)
1502 z = x_add(a, b);
1503 else
1504 z = x_sub(a, b);
1505 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001506 Py_DECREF(a);
1507 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001508 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001509}
1510
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001511static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001512long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001513{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001514 /* sequence * long */
1515 long n = PyLong_AsLong((PyObject *) w);
1516 if (n == -1 && PyErr_Occurred())
1517 return NULL;
1518 else
1519 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1520}
1521
Tim Peters5af4e6c2002-08-12 02:31:19 +00001522/* Grade school multiplication, ignoring the signs.
1523 * Returns the absolute value of the product, or NULL if error.
1524 */
1525static PyLongObject *
1526x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001527{
Tim Peters5af4e6c2002-08-12 02:31:19 +00001528 PyLongObject *z;
1529 int size_a = ABS(a->ob_size);
1530 int size_b = ABS(b->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001531 int i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001532
Tim Peters5af4e6c2002-08-12 02:31:19 +00001533 z = _PyLong_New(size_a + size_b);
1534 if (z == NULL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001535 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001536
1537 memset(z->ob_digit, 0, z->ob_size * sizeof(digit));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001538 for (i = 0; i < size_a; ++i) {
1539 twodigits carry = 0;
1540 twodigits f = a->ob_digit[i];
1541 int j;
Tim Peters115c8882002-08-12 18:25:43 +00001542 digit *pz = z->ob_digit + i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001543
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001544 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001545 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001546 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001547 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001548 for (j = 0; j < size_b; ++j) {
Tim Peters115c8882002-08-12 18:25:43 +00001549 carry += *pz + b->ob_digit[j] * f;
1550 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001551 carry >>= SHIFT;
1552 }
1553 for (; carry != 0; ++j) {
1554 assert(i+j < z->ob_size);
Tim Peters115c8882002-08-12 18:25:43 +00001555 carry += *pz;
1556 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001557 carry >>= SHIFT;
1558 }
1559 }
Tim Peters44121a62002-08-12 06:17:58 +00001560 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001561}
1562
1563/* A helper for Karatsuba multiplication (k_mul).
1564 Takes a long "n" and an integer "size" representing the place to
1565 split, and sets low and high such that abs(n) == (high << size) + low,
1566 viewing the shift as being by digits. The sign bit is ignored, and
1567 the return values are >= 0.
1568 Returns 0 on success, -1 on failure.
1569*/
1570static int
1571kmul_split(PyLongObject *n, int size, PyLongObject **high, PyLongObject **low)
1572{
1573 PyLongObject *hi, *lo;
1574 int size_lo, size_hi;
1575 const int size_n = ABS(n->ob_size);
1576
1577 size_lo = MIN(size_n, size);
1578 size_hi = size_n - size_lo;
1579
1580 if ((hi = _PyLong_New(size_hi)) == NULL)
1581 return -1;
1582 if ((lo = _PyLong_New(size_lo)) == NULL) {
1583 Py_DECREF(hi);
1584 return -1;
1585 }
1586
1587 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
1588 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
1589
1590 *high = long_normalize(hi);
1591 *low = long_normalize(lo);
1592 return 0;
1593}
1594
Tim Peters60004642002-08-12 22:01:34 +00001595static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
1596
Tim Peters5af4e6c2002-08-12 02:31:19 +00001597/* Karatsuba multiplication. Ignores the input signs, and returns the
1598 * absolute value of the product (or NULL if error).
1599 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
1600 */
1601static PyLongObject *
1602k_mul(PyLongObject *a, PyLongObject *b)
1603{
Tim Peters738eda72002-08-12 15:08:20 +00001604 int asize = ABS(a->ob_size);
1605 int bsize = ABS(b->ob_size);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001606 PyLongObject *ah = NULL;
1607 PyLongObject *al = NULL;
1608 PyLongObject *bh = NULL;
1609 PyLongObject *bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001610 PyLongObject *ret = NULL;
Tim Peters738eda72002-08-12 15:08:20 +00001611 PyLongObject *t1, *t2, *t3;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001612 int shift; /* the number of digits we split off */
1613 int i;
Tim Peters738eda72002-08-12 15:08:20 +00001614
Tim Peters5af4e6c2002-08-12 02:31:19 +00001615 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
1616 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
1617 * Then the original product is
Tim Peters18c15b92002-08-12 02:43:58 +00001618 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
Tim Peters5af4e6c2002-08-12 02:31:19 +00001619 * By picking X to be a power of 2, "*X" is just shifting, and it's
1620 * been reduced to 3 multiplies on numbers half the size.
1621 */
1622
Tim Petersfc07e562002-08-12 02:54:10 +00001623 /* We want to split based on the larger number; fiddle so that b
Tim Peters5af4e6c2002-08-12 02:31:19 +00001624 * is largest.
1625 */
Tim Peters738eda72002-08-12 15:08:20 +00001626 if (asize > bsize) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001627 t1 = a;
1628 a = b;
1629 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00001630
1631 i = asize;
1632 asize = bsize;
1633 bsize = i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001634 }
1635
1636 /* Use gradeschool math when either number is too small. */
Tim Peters738eda72002-08-12 15:08:20 +00001637 if (asize <= KARATSUBA_CUTOFF) {
Tim Peters738eda72002-08-12 15:08:20 +00001638 if (asize == 0)
Tim Peters44121a62002-08-12 06:17:58 +00001639 return _PyLong_New(0);
1640 else
1641 return x_mul(a, b);
1642 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001643
Tim Peters60004642002-08-12 22:01:34 +00001644 /* If a is small compared to b, splitting on b gives a degenerate
1645 * case with ah==0, and Karatsuba may be (even much) less efficient
1646 * than "grade school" then. However, we can still win, by viewing
1647 * b as a string of "big digits", each of width a->ob_size. That
1648 * leads to a sequence of balanced calls to k_mul.
1649 */
1650 if (2 * asize <= bsize)
1651 return k_lopsided_mul(a, b);
1652
Tim Peters738eda72002-08-12 15:08:20 +00001653 shift = bsize >> 1;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001654 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
1655 if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
1656
Tim Petersd64c1de2002-08-12 17:36:03 +00001657 /* The plan:
1658 * 1. Allocate result space (asize + bsize digits: that's always
1659 * enough).
1660 * 2. Compute ah*bh, and copy into result at 2*shift.
1661 * 3. Compute al*bl, and copy into result at 0. Note that this
1662 * can't overlap with #2.
1663 * 4. Subtract al*bl from the result, starting at shift. This may
1664 * underflow (borrow out of the high digit), but we don't care:
1665 * we're effectively doing unsigned arithmetic mod
1666 * BASE**(sizea + sizeb), and so long as the *final* result fits,
1667 * borrows and carries out of the high digit can be ignored.
1668 * 5. Subtract ah*bh from the result, starting at shift.
1669 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
1670 * at shift.
1671 */
1672
1673 /* 1. Allocate result space. */
Tim Peters70b041b2002-08-12 19:38:01 +00001674 ret = _PyLong_New(asize + bsize);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001675 if (ret == NULL) goto fail;
1676#ifdef Py_DEBUG
1677 /* Fill with trash, to catch reference to uninitialized digits. */
1678 memset(ret->ob_digit, 0xDF, ret->ob_size * sizeof(digit));
1679#endif
Tim Peters44121a62002-08-12 06:17:58 +00001680
Tim Petersd64c1de2002-08-12 17:36:03 +00001681 /* 2. t1 <- ah*bh, and copy into high digits of result. */
Tim Peters738eda72002-08-12 15:08:20 +00001682 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
1683 assert(t1->ob_size >= 0);
1684 assert(2*shift + t1->ob_size <= ret->ob_size);
1685 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
1686 t1->ob_size * sizeof(digit));
1687
1688 /* Zero-out the digits higher than the ah*bh copy. */
1689 i = ret->ob_size - 2*shift - t1->ob_size;
Tim Peters44121a62002-08-12 06:17:58 +00001690 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001691 memset(ret->ob_digit + 2*shift + t1->ob_size, 0,
Tim Peters44121a62002-08-12 06:17:58 +00001692 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001693
Tim Petersd64c1de2002-08-12 17:36:03 +00001694 /* 3. t2 <- al*bl, and copy into the low digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001695 if ((t2 = k_mul(al, bl)) == NULL) {
1696 Py_DECREF(t1);
1697 goto fail;
1698 }
1699 assert(t2->ob_size >= 0);
1700 assert(t2->ob_size <= 2*shift); /* no overlap with high digits */
1701 memcpy(ret->ob_digit, t2->ob_digit, t2->ob_size * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001702
1703 /* Zero out remaining digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001704 i = 2*shift - t2->ob_size; /* number of uninitialized digits */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001705 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001706 memset(ret->ob_digit + t2->ob_size, 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001707
Tim Petersd64c1de2002-08-12 17:36:03 +00001708 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
1709 * because it's fresher in cache.
1710 */
Tim Peters738eda72002-08-12 15:08:20 +00001711 i = ret->ob_size - shift; /* # digits after shift */
Tim Petersd64c1de2002-08-12 17:36:03 +00001712 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, t2->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001713 Py_DECREF(t2);
1714
Tim Petersd64c1de2002-08-12 17:36:03 +00001715 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, t1->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001716 Py_DECREF(t1);
1717
Tim Petersd64c1de2002-08-12 17:36:03 +00001718 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001719 if ((t1 = x_add(ah, al)) == NULL) goto fail;
1720 Py_DECREF(ah);
1721 Py_DECREF(al);
1722 ah = al = NULL;
1723
1724 if ((t2 = x_add(bh, bl)) == NULL) {
1725 Py_DECREF(t1);
1726 goto fail;
1727 }
1728 Py_DECREF(bh);
1729 Py_DECREF(bl);
1730 bh = bl = NULL;
1731
Tim Peters738eda72002-08-12 15:08:20 +00001732 t3 = k_mul(t1, t2);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001733 Py_DECREF(t1);
1734 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00001735 if (t3 == NULL) goto fail;
Tim Peters547607c2002-08-12 19:43:49 +00001736 assert(t3->ob_size >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001737
Tim Petersd8b21732002-08-12 19:30:26 +00001738 /* Add t3. Caution: t3 can spill one bit beyond the allocated
1739 * result space; it's t3-al*bl-ah*bh that always fits. We have
Tim Peters547607c2002-08-12 19:43:49 +00001740 * to arrange to ignore the high bit.
Tim Petersd8b21732002-08-12 19:30:26 +00001741 */
1742 if (t3->ob_size > i) {
1743 assert(t3->ob_size == i+1); /* just one digit over */
1744 assert(t3->ob_digit[t3->ob_size - 1] == 1); /* & just one bit */
1745 --t3->ob_size; /* ignore the overflow bit */
1746 }
Tim Petersd64c1de2002-08-12 17:36:03 +00001747 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, t3->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001748 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001749
Tim Peters5af4e6c2002-08-12 02:31:19 +00001750 return long_normalize(ret);
1751
1752 fail:
1753 Py_XDECREF(ret);
1754 Py_XDECREF(ah);
1755 Py_XDECREF(al);
1756 Py_XDECREF(bh);
1757 Py_XDECREF(bl);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001758 return NULL;
1759}
1760
Tim Peters60004642002-08-12 22:01:34 +00001761/* b has at least twice the digits of a, and a is big enough that Karatsuba
1762 * would pay off *if* the inputs had balanced sizes. View b as a sequence
1763 * of slices, each with a->ob_size digits, and multiply the slices by a,
1764 * one at a time. This gives k_mul balanced inputs to work with, and is
1765 * also cache-friendly (we compute one double-width slice of the result
1766 * at a time, then move on, never bactracking except for the helpful
1767 * single-width slice overlap between successive partial sums).
1768 */
1769static PyLongObject *
1770k_lopsided_mul(PyLongObject *a, PyLongObject *b)
1771{
1772 const int asize = ABS(a->ob_size);
1773 int bsize = ABS(b->ob_size);
1774 int nbdone; /* # of b digits already multiplied */
1775 PyLongObject *ret;
1776 PyLongObject *bslice = NULL;
1777
1778 assert(asize > KARATSUBA_CUTOFF);
1779 assert(2 * asize <= bsize);
1780
1781 /* Allocate result space, and zero it out. */
1782 ret = _PyLong_New(asize + bsize);
1783 if (ret == NULL)
1784 return NULL;
1785 memset(ret->ob_digit, 0, ret->ob_size * sizeof(digit));
1786
1787 /* Successive slices of b are copied into bslice. */
1788 bslice = _PyLong_New(bsize);
1789 if (bslice == NULL)
1790 goto fail;
1791
1792 nbdone = 0;
1793 while (bsize > 0) {
1794 PyLongObject *product;
1795 const int nbtouse = MIN(bsize, asize);
1796
1797 /* Multiply the next slice of b by a. */
1798 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
1799 nbtouse * sizeof(digit));
1800 bslice->ob_size = nbtouse;
1801 product = k_mul(a, bslice);
1802 if (product == NULL)
1803 goto fail;
1804
1805 /* Add into result. */
1806 (void)v_iadd(ret->ob_digit + nbdone, ret->ob_size - nbdone,
1807 product->ob_digit, product->ob_size);
1808 Py_DECREF(product);
1809
1810 bsize -= nbtouse;
1811 nbdone += nbtouse;
1812 }
1813
1814 Py_DECREF(bslice);
1815 return long_normalize(ret);
1816
1817 fail:
1818 Py_DECREF(ret);
1819 Py_XDECREF(bslice);
1820 return NULL;
1821}
Tim Peters5af4e6c2002-08-12 02:31:19 +00001822
1823static PyObject *
1824long_mul(PyLongObject *v, PyLongObject *w)
1825{
1826 PyLongObject *a, *b, *z;
1827
1828 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
1829 if (!PyLong_Check(v) &&
1830 v->ob_type->tp_as_sequence &&
1831 v->ob_type->tp_as_sequence->sq_repeat)
1832 return long_repeat((PyObject *)v, w);
1833 if (!PyLong_Check(w) &&
1834 w->ob_type->tp_as_sequence &&
1835 w->ob_type->tp_as_sequence->sq_repeat)
1836 return long_repeat((PyObject *)w, v);
1837 Py_INCREF(Py_NotImplemented);
1838 return Py_NotImplemented;
1839 }
1840
Tim Petersd64c1de2002-08-12 17:36:03 +00001841 z = k_mul(a, b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001842 if(z == NULL) {
1843 Py_DECREF(a);
1844 Py_DECREF(b);
1845 return NULL;
1846 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001847 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001848 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001849 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001850 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001851 Py_DECREF(a);
1852 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001853 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001854}
1855
Guido van Rossume32e0141992-01-19 16:31:05 +00001856/* The / and % operators are now defined in terms of divmod().
1857 The expression a mod b has the value a - b*floor(a/b).
1858 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001859 |a| by |b|, with the sign of a. This is also expressed
1860 as a - b*trunc(a/b), if trunc truncates towards zero.
1861 Some examples:
1862 a b a rem b a mod b
1863 13 10 3 3
1864 -13 10 -3 7
1865 13 -10 3 -7
1866 -13 -10 -3 -3
1867 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001868 have different signs. We then subtract one from the 'div'
1869 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001870
Guido van Rossume32e0141992-01-19 16:31:05 +00001871static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00001872l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00001873 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001874{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001875 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001876
Guido van Rossume32e0141992-01-19 16:31:05 +00001877 if (long_divrem(v, w, &div, &mod) < 0)
1878 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001879 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1880 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001881 PyLongObject *temp;
1882 PyLongObject *one;
1883 temp = (PyLongObject *) long_add(mod, w);
1884 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001885 mod = temp;
1886 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001887 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001888 return -1;
1889 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001890 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001891 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001892 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1893 Py_DECREF(mod);
1894 Py_DECREF(div);
1895 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001896 return -1;
1897 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001898 Py_DECREF(one);
1899 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001900 div = temp;
1901 }
1902 *pdiv = div;
1903 *pmod = mod;
1904 return 0;
1905}
1906
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001907static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001908long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001909{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001910 PyLongObject *a, *b, *div, *mod;
1911
1912 CONVERT_BINOP(v, w, &a, &b);
1913
1914 if (l_divmod(a, b, &div, &mod) < 0) {
1915 Py_DECREF(a);
1916 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001917 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001918 }
1919 Py_DECREF(a);
1920 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001921 Py_DECREF(mod);
1922 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001923}
1924
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001925static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001926long_classic_div(PyObject *v, PyObject *w)
1927{
1928 PyLongObject *a, *b, *div, *mod;
1929
1930 CONVERT_BINOP(v, w, &a, &b);
1931
1932 if (Py_DivisionWarningFlag &&
1933 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1934 div = NULL;
1935 else if (l_divmod(a, b, &div, &mod) < 0)
1936 div = NULL;
1937 else
1938 Py_DECREF(mod);
1939
1940 Py_DECREF(a);
1941 Py_DECREF(b);
1942 return (PyObject *)div;
1943}
1944
1945static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00001946long_true_divide(PyObject *v, PyObject *w)
1947{
Tim Peterse2a60002001-09-04 06:17:36 +00001948 PyLongObject *a, *b;
1949 double ad, bd;
Tim Peters6f97e492001-11-04 23:09:40 +00001950 int aexp, bexp, failed;
Tim Peterse2a60002001-09-04 06:17:36 +00001951
1952 CONVERT_BINOP(v, w, &a, &b);
1953 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
1954 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00001955 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
1956 Py_DECREF(a);
1957 Py_DECREF(b);
1958 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00001959 return NULL;
1960
1961 if (bd == 0.0) {
1962 PyErr_SetString(PyExc_ZeroDivisionError,
1963 "long division or modulo by zero");
1964 return NULL;
1965 }
1966
1967 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
1968 ad /= bd; /* overflow/underflow impossible here */
1969 aexp -= bexp;
1970 if (aexp > INT_MAX / SHIFT)
1971 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00001972 else if (aexp < -(INT_MAX / SHIFT))
1973 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00001974 errno = 0;
1975 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00001976 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00001977 goto overflow;
1978 return PyFloat_FromDouble(ad);
1979
1980overflow:
1981 PyErr_SetString(PyExc_OverflowError,
1982 "long/long too large for a float");
1983 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001984
Tim Peters20dab9f2001-09-04 05:31:47 +00001985}
1986
1987static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001988long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001989{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001990 PyLongObject *a, *b, *div, *mod;
1991
1992 CONVERT_BINOP(v, w, &a, &b);
1993
1994 if (l_divmod(a, b, &div, &mod) < 0) {
1995 Py_DECREF(a);
1996 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001997 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001998 }
1999 Py_DECREF(a);
2000 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002001 Py_DECREF(div);
2002 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002003}
2004
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002005static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002006long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002007{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002008 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002009 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002010
2011 CONVERT_BINOP(v, w, &a, &b);
2012
2013 if (l_divmod(a, b, &div, &mod) < 0) {
2014 Py_DECREF(a);
2015 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002016 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002017 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002018 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002019 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002020 PyTuple_SetItem(z, 0, (PyObject *) div);
2021 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002022 }
2023 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002024 Py_DECREF(div);
2025 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002026 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002027 Py_DECREF(a);
2028 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002029 return z;
2030}
2031
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002032static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002033long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002034{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002035 PyLongObject *a, *b;
2036 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002037 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002038 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002039
2040 CONVERT_BINOP(v, w, &a, &b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002041 if (PyLong_Check(x) || Py_None == x) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002042 c = x;
2043 Py_INCREF(x);
2044 }
2045 else if (PyInt_Check(x)) {
2046 c = PyLong_FromLong(PyInt_AS_LONG(x));
2047 }
2048 else {
2049 Py_DECREF(a);
2050 Py_DECREF(b);
2051 Py_INCREF(Py_NotImplemented);
2052 return Py_NotImplemented;
2053 }
Tim Peters4c483c42001-09-05 06:24:58 +00002054
2055 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
2056 PyErr_SetString(PyExc_ValueError,
2057 "pow() 3rd argument cannot be 0");
2058 z = NULL;
2059 goto error;
2060 }
2061
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002062 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002063 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002064 Py_DECREF(a);
2065 Py_DECREF(b);
2066 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00002067 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00002068 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
2069 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00002070 return NULL;
2071 }
2072 /* Return a float. This works because we know that
2073 this calls float_pow() which converts its
2074 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002075 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002076 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002077 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002078 for (i = 0; i < size_b; ++i) {
2079 digit bi = b->ob_digit[i];
2080 int j;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002081
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002082 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002083 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002084
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002085 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002086 temp = (PyLongObject *)long_mul(z, a);
2087 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002088 if (c!=Py_None && temp!=NULL) {
2089 if (l_divmod(temp,(PyLongObject *)c,
2090 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002091 Py_DECREF(temp);
2092 z = NULL;
2093 goto error;
2094 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002095 Py_XDECREF(div);
2096 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002097 temp = mod;
2098 }
2099 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002100 if (z == NULL)
2101 break;
2102 }
2103 bi >>= 1;
2104 if (bi == 0 && i+1 == size_b)
2105 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002106 temp = (PyLongObject *)long_mul(a, a);
2107 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002108 if (c!=Py_None && temp!=NULL) {
2109 if (l_divmod(temp, (PyLongObject *)c, &div,
2110 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002111 Py_DECREF(temp);
2112 z = NULL;
2113 goto error;
2114 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002115 Py_XDECREF(div);
2116 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002117 temp = mod;
2118 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002119 a = temp;
2120 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002121 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002122 z = NULL;
2123 break;
2124 }
2125 }
Guido van Rossumc206c761995-01-10 15:23:19 +00002126 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002127 break;
2128 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002129 if (c!=Py_None && z!=NULL) {
2130 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002131 Py_DECREF(z);
2132 z = NULL;
2133 }
2134 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002135 Py_XDECREF(div);
2136 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002137 z = mod;
2138 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002139 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002140 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00002141 Py_XDECREF(a);
2142 Py_DECREF(b);
2143 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002144 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002145}
2146
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002147static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002148long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002149{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002150 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002151 PyLongObject *x;
2152 PyLongObject *w;
2153 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002154 if (w == NULL)
2155 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002156 x = (PyLongObject *) long_add(v, w);
2157 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002158 if (x == NULL)
2159 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00002160 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002161 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002162}
2163
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002164static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002165long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002166{
Tim Peters69c2de32001-09-11 22:31:33 +00002167 if (PyLong_CheckExact(v)) {
2168 Py_INCREF(v);
2169 return (PyObject *)v;
2170 }
2171 else
2172 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002173}
2174
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002175static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002176long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002177{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002178 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002179 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002180 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002181 Py_INCREF(v);
2182 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002183 }
Tim Peters69c2de32001-09-11 22:31:33 +00002184 z = (PyLongObject *)_PyLong_Copy(v);
2185 if (z != NULL)
2186 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002187 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002188}
2189
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002190static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002191long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002192{
2193 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002194 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00002195 else
2196 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002197}
2198
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002199static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002200long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002201{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002202 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002203}
2204
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002205static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002206long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002207{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002208 PyLongObject *a, *b;
2209 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002210 long shiftby;
2211 int newsize, wordshift, loshift, hishift, i, j;
2212 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002213
Neil Schemenauerba872e22001-01-04 01:46:03 +00002214 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2215
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002216 if (a->ob_size < 0) {
2217 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002218 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002219 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002220 if (a1 == NULL)
2221 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002222 a2 = (PyLongObject *) long_rshift(a1, b);
2223 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002224 if (a2 == NULL)
2225 goto rshift_error;
2226 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002227 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002228 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002229 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002230
Neil Schemenauerba872e22001-01-04 01:46:03 +00002231 shiftby = PyLong_AsLong((PyObject *)b);
2232 if (shiftby == -1L && PyErr_Occurred())
2233 goto rshift_error;
2234 if (shiftby < 0) {
2235 PyErr_SetString(PyExc_ValueError,
2236 "negative shift count");
2237 goto rshift_error;
2238 }
2239 wordshift = shiftby / SHIFT;
2240 newsize = ABS(a->ob_size) - wordshift;
2241 if (newsize <= 0) {
2242 z = _PyLong_New(0);
2243 Py_DECREF(a);
2244 Py_DECREF(b);
2245 return (PyObject *)z;
2246 }
2247 loshift = shiftby % SHIFT;
2248 hishift = SHIFT - loshift;
2249 lomask = ((digit)1 << hishift) - 1;
2250 himask = MASK ^ lomask;
2251 z = _PyLong_New(newsize);
2252 if (z == NULL)
2253 goto rshift_error;
2254 if (a->ob_size < 0)
2255 z->ob_size = -(z->ob_size);
2256 for (i = 0, j = wordshift; i < newsize; i++, j++) {
2257 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
2258 if (i+1 < newsize)
2259 z->ob_digit[i] |=
2260 (a->ob_digit[j+1] << hishift) & himask;
2261 }
2262 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002263 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002264rshift_error:
2265 Py_DECREF(a);
2266 Py_DECREF(b);
2267 return (PyObject *) z;
2268
Guido van Rossumc6913e71991-11-19 20:26:46 +00002269}
2270
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002271static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002272long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002273{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002274 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002275 PyLongObject *a, *b;
2276 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002277 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002278 int oldsize, newsize, wordshift, remshift, i, j;
2279 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002280
Neil Schemenauerba872e22001-01-04 01:46:03 +00002281 CONVERT_BINOP(v, w, &a, &b);
2282
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002283 shiftby = PyLong_AsLong((PyObject *)b);
2284 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00002285 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002286 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002287 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002288 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002289 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002290 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002291 PyErr_SetString(PyExc_ValueError,
2292 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002293 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002294 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002295 /* wordshift, remshift = divmod(shiftby, SHIFT) */
2296 wordshift = (int)shiftby / SHIFT;
2297 remshift = (int)shiftby - wordshift * SHIFT;
2298
2299 oldsize = ABS(a->ob_size);
2300 newsize = oldsize + wordshift;
2301 if (remshift)
2302 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002303 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002304 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002305 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002306 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002307 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002308 for (i = 0; i < wordshift; i++)
2309 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002310 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002311 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
2312 accum |= a->ob_digit[j] << remshift;
2313 z->ob_digit[i] = (digit)(accum & MASK);
2314 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002315 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002316 if (remshift)
2317 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002318 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002319 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002320 z = long_normalize(z);
2321lshift_error:
2322 Py_DECREF(a);
2323 Py_DECREF(b);
2324 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002325}
2326
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002327
2328/* Bitwise and/xor/or operations */
2329
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002330static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002331long_bitwise(PyLongObject *a,
2332 int op, /* '&', '|', '^' */
2333 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002334{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002335 digit maska, maskb; /* 0 or MASK */
2336 int negz;
2337 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002338 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002339 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002340 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002341 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002342
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002343 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002344 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002345 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002346 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002347 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002348 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002349 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002350 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002351 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002352 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002353 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002354 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002355 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002356 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002357 maskb = 0;
2358 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002359
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002360 negz = 0;
2361 switch (op) {
2362 case '^':
2363 if (maska != maskb) {
2364 maska ^= MASK;
2365 negz = -1;
2366 }
2367 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002368 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002369 if (maska && maskb) {
2370 op = '|';
2371 maska ^= MASK;
2372 maskb ^= MASK;
2373 negz = -1;
2374 }
2375 break;
2376 case '|':
2377 if (maska || maskb) {
2378 op = '&';
2379 maska ^= MASK;
2380 maskb ^= MASK;
2381 negz = -1;
2382 }
2383 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002384 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002385
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002386 /* JRH: The original logic here was to allocate the result value (z)
2387 as the longer of the two operands. However, there are some cases
2388 where the result is guaranteed to be shorter than that: AND of two
2389 positives, OR of two negatives: use the shorter number. AND with
2390 mixed signs: use the positive number. OR with mixed signs: use the
2391 negative number. After the transformations above, op will be '&'
2392 iff one of these cases applies, and mask will be non-0 for operands
2393 whose length should be ignored.
2394 */
2395
2396 size_a = a->ob_size;
2397 size_b = b->ob_size;
2398 size_z = op == '&'
2399 ? (maska
2400 ? size_b
2401 : (maskb ? size_a : MIN(size_a, size_b)))
2402 : MAX(size_a, size_b);
2403 z = _PyLong_New(size_z);
2404 if (a == NULL || b == NULL || z == NULL) {
2405 Py_XDECREF(a);
2406 Py_XDECREF(b);
2407 Py_XDECREF(z);
2408 return NULL;
2409 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002410
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002411 for (i = 0; i < size_z; ++i) {
2412 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2413 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2414 switch (op) {
2415 case '&': z->ob_digit[i] = diga & digb; break;
2416 case '|': z->ob_digit[i] = diga | digb; break;
2417 case '^': z->ob_digit[i] = diga ^ digb; break;
2418 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002419 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002420
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002421 Py_DECREF(a);
2422 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002423 z = long_normalize(z);
2424 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002425 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002426 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002427 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002428 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002429}
2430
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002431static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002432long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002433{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002434 PyLongObject *a, *b;
2435 PyObject *c;
2436 CONVERT_BINOP(v, w, &a, &b);
2437 c = long_bitwise(a, '&', b);
2438 Py_DECREF(a);
2439 Py_DECREF(b);
2440 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002441}
2442
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002443static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002444long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002445{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002446 PyLongObject *a, *b;
2447 PyObject *c;
2448 CONVERT_BINOP(v, w, &a, &b);
2449 c = long_bitwise(a, '^', b);
2450 Py_DECREF(a);
2451 Py_DECREF(b);
2452 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002453}
2454
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002455static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002456long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002457{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002458 PyLongObject *a, *b;
2459 PyObject *c;
2460 CONVERT_BINOP(v, w, &a, &b);
2461 c = long_bitwise(a, '|', b);
2462 Py_DECREF(a);
2463 Py_DECREF(b);
2464 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002465}
2466
Guido van Rossum234f9421993-06-17 12:35:49 +00002467static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002468long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002469{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002470 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002471 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002472 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002473 return 0;
2474 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002475 else if (PyLong_Check(*pw)) {
2476 Py_INCREF(*pv);
2477 Py_INCREF(*pw);
2478 return 0;
2479 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002480 return 1; /* Can't do it */
2481}
2482
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002483static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002484long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002485{
2486 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002487 x = PyLong_AsLong(v);
2488 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002489 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002490 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002491}
2492
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002493static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002494long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002495{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002496 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002497 return v;
2498}
2499
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002500static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002501long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002502{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002503 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002504 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002505 if (result == -1.0 && PyErr_Occurred())
2506 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002507 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002508}
2509
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002510static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002511long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002512{
Fred Drake121ee271999-12-23 15:41:28 +00002513 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002514}
2515
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002516static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002517long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002518{
Fred Drake121ee271999-12-23 15:41:28 +00002519 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002520}
Jeremy Hylton938ace62002-07-17 16:30:39 +00002521
2522static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00002523long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002524
Tim Peters6d6c1a32001-08-02 04:15:00 +00002525static PyObject *
2526long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2527{
2528 PyObject *x = NULL;
2529 int base = -909; /* unlikely! */
2530 static char *kwlist[] = {"x", "base", 0};
2531
Guido van Rossumbef14172001-08-29 15:47:46 +00002532 if (type != &PyLong_Type)
2533 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002534 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2535 &x, &base))
2536 return NULL;
2537 if (x == NULL)
2538 return PyLong_FromLong(0L);
2539 if (base == -909)
2540 return PyNumber_Long(x);
2541 else if (PyString_Check(x))
2542 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002543#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002544 else if (PyUnicode_Check(x))
2545 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2546 PyUnicode_GET_SIZE(x),
2547 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002548#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002549 else {
2550 PyErr_SetString(PyExc_TypeError,
2551 "long() can't convert non-string with explicit base");
2552 return NULL;
2553 }
2554}
2555
Guido van Rossumbef14172001-08-29 15:47:46 +00002556/* Wimpy, slow approach to tp_new calls for subtypes of long:
2557 first create a regular long from whatever arguments we got,
2558 then allocate a subtype instance and initialize it from
2559 the regular long. The regular long is then thrown away.
2560*/
2561static PyObject *
2562long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2563{
2564 PyLongObject *tmp, *new;
2565 int i, n;
2566
2567 assert(PyType_IsSubtype(type, &PyLong_Type));
2568 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2569 if (tmp == NULL)
2570 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002571 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002572 n = tmp->ob_size;
2573 if (n < 0)
2574 n = -n;
2575 new = (PyLongObject *)type->tp_alloc(type, n);
2576 if (new == NULL)
2577 return NULL;
2578 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002579 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002580 for (i = 0; i < n; i++)
2581 new->ob_digit[i] = tmp->ob_digit[i];
2582 Py_DECREF(tmp);
2583 return (PyObject *)new;
2584}
2585
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002586PyDoc_STRVAR(long_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002587"long(x[, base]) -> integer\n\
2588\n\
2589Convert a string or number to a long integer, if possible. A floating\n\
2590point argument will be truncated towards zero (this does not include a\n\
2591string representation of a floating point number!) When converting a\n\
2592string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002593converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002594
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002595static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002596 (binaryfunc) long_add, /*nb_add*/
2597 (binaryfunc) long_sub, /*nb_subtract*/
2598 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002599 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002600 (binaryfunc) long_mod, /*nb_remainder*/
2601 (binaryfunc) long_divmod, /*nb_divmod*/
2602 (ternaryfunc) long_pow, /*nb_power*/
2603 (unaryfunc) long_neg, /*nb_negative*/
2604 (unaryfunc) long_pos, /*tp_positive*/
2605 (unaryfunc) long_abs, /*tp_absolute*/
2606 (inquiry) long_nonzero, /*tp_nonzero*/
2607 (unaryfunc) long_invert, /*nb_invert*/
2608 (binaryfunc) long_lshift, /*nb_lshift*/
2609 (binaryfunc) long_rshift, /*nb_rshift*/
2610 (binaryfunc) long_and, /*nb_and*/
2611 (binaryfunc) long_xor, /*nb_xor*/
2612 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002613 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002614 (unaryfunc) long_int, /*nb_int*/
2615 (unaryfunc) long_long, /*nb_long*/
2616 (unaryfunc) long_float, /*nb_float*/
2617 (unaryfunc) long_oct, /*nb_oct*/
2618 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002619 0, /* nb_inplace_add */
2620 0, /* nb_inplace_subtract */
2621 0, /* nb_inplace_multiply */
2622 0, /* nb_inplace_divide */
2623 0, /* nb_inplace_remainder */
2624 0, /* nb_inplace_power */
2625 0, /* nb_inplace_lshift */
2626 0, /* nb_inplace_rshift */
2627 0, /* nb_inplace_and */
2628 0, /* nb_inplace_xor */
2629 0, /* nb_inplace_or */
2630 (binaryfunc)long_div, /* nb_floor_divide */
2631 long_true_divide, /* nb_true_divide */
2632 0, /* nb_inplace_floor_divide */
2633 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002634};
2635
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002636PyTypeObject PyLong_Type = {
2637 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002638 0, /* ob_size */
2639 "long", /* tp_name */
2640 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2641 sizeof(digit), /* tp_itemsize */
2642 (destructor)long_dealloc, /* tp_dealloc */
2643 0, /* tp_print */
2644 0, /* tp_getattr */
2645 0, /* tp_setattr */
2646 (cmpfunc)long_compare, /* tp_compare */
2647 (reprfunc)long_repr, /* tp_repr */
2648 &long_as_number, /* tp_as_number */
2649 0, /* tp_as_sequence */
2650 0, /* tp_as_mapping */
2651 (hashfunc)long_hash, /* tp_hash */
2652 0, /* tp_call */
2653 (reprfunc)long_str, /* tp_str */
2654 PyObject_GenericGetAttr, /* tp_getattro */
2655 0, /* tp_setattro */
2656 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002657 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2658 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002659 long_doc, /* tp_doc */
2660 0, /* tp_traverse */
2661 0, /* tp_clear */
2662 0, /* tp_richcompare */
2663 0, /* tp_weaklistoffset */
2664 0, /* tp_iter */
2665 0, /* tp_iternext */
2666 0, /* tp_methods */
2667 0, /* tp_members */
2668 0, /* tp_getset */
2669 0, /* tp_base */
2670 0, /* tp_dict */
2671 0, /* tp_descr_get */
2672 0, /* tp_descr_set */
2673 0, /* tp_dictoffset */
2674 0, /* tp_init */
2675 0, /* tp_alloc */
2676 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00002677 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002678};