blob: cbc9f68ca535c8b1455459bfafedbddea8ce05c1 [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
Guido van Rossume32e0141992-01-19 16:31:05 +000011#define ABS(x) ((x) < 0 ? -(x) : (x))
12
13/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000014static PyLongObject *long_normalize(PyLongObject *);
15static PyLongObject *mul1(PyLongObject *, wdigit);
16static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
Tim Peters212e6142001-07-14 12:23:19 +000017static PyLongObject *divrem1(PyLongObject *, digit, digit *);
Tim Peters9f688bf2000-07-07 15:53:28 +000018static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000019
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000020static int ticker; /* XXX Could be shared with ceval? */
21
Guido van Rossumc0b618a1997-05-02 03:12:38 +000022#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000023 if (--ticker < 0) { \
24 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000025 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000026 }
27
Guido van Rossumedcc38a1991-05-05 20:09:44 +000028/* Normalize (remove leading zeros from) a long int object.
29 Doesn't attempt to free the storage--in most cases, due to the nature
30 of the algorithms used, this could save at most be one word anyway. */
31
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000033long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000034{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000035 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000036 register int i = j;
37
38 while (i > 0 && v->ob_digit[i-1] == 0)
39 --i;
40 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000041 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000042 return v;
43}
44
45/* Allocate a new long int object with size digits.
46 Return NULL and set exception if we run out of memory. */
47
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000049_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000050{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000052}
53
Tim Peters64b5ce32001-09-10 20:52:51 +000054PyObject *
55_PyLong_Copy(PyLongObject *src)
56{
57 PyLongObject *result;
58 int i;
59
60 assert(src != NULL);
61 i = src->ob_size;
62 if (i < 0)
63 i = -(i);
64 result = _PyLong_New(i);
65 if (result != NULL) {
Tim Peters5329cdb2002-03-02 04:18:04 +000066 result->ob_size = src->ob_size;
Tim Peters64b5ce32001-09-10 20:52:51 +000067 while (--i >= 0)
68 result->ob_digit[i] = src->ob_digit[i];
69 }
70 return (PyObject *)result;
71}
72
Guido van Rossumedcc38a1991-05-05 20:09:44 +000073/* Create a new long int object from a C long int */
74
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000076PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000077{
Tim Petersce9de2f2001-06-14 04:56:19 +000078 PyLongObject *v;
79 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
80 int ndigits = 0;
81 int negative = 0;
82
83 if (ival < 0) {
84 ival = -ival;
85 negative = 1;
86 }
87
88 /* Count the number of Python digits.
89 We used to pick 5 ("big enough for anything"), but that's a
90 waste of time and space given that 5*15 = 75 bits are rarely
91 needed. */
92 t = (unsigned long)ival;
93 while (t) {
94 ++ndigits;
95 t >>= SHIFT;
96 }
97 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000098 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +000099 digit *p = v->ob_digit;
100 v->ob_size = negative ? -ndigits : ndigits;
101 t = (unsigned long)ival;
102 while (t) {
103 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000104 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000105 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000106 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000107 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000108}
109
Guido van Rossum53756b11997-01-03 17:14:46 +0000110/* Create a new long int object from a C unsigned long int */
111
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000113PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +0000114{
Tim Petersce9de2f2001-06-14 04:56:19 +0000115 PyLongObject *v;
116 unsigned long t;
117 int ndigits = 0;
118
119 /* Count the number of Python digits. */
120 t = (unsigned long)ival;
121 while (t) {
122 ++ndigits;
123 t >>= SHIFT;
124 }
125 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000126 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000127 digit *p = v->ob_digit;
128 v->ob_size = ndigits;
129 while (ival) {
130 *p++ = (digit)(ival & MASK);
131 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000132 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000133 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000135}
136
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000137/* Create a new long int object from a C double */
138
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000141{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000143 double frac;
144 int i, ndig, expo, neg;
145 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000146 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000147 PyErr_SetString(PyExc_OverflowError,
148 "cannot convert float infinity to long");
149 return NULL;
150 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000151 if (dval < 0.0) {
152 neg = 1;
153 dval = -dval;
154 }
155 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
156 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000158 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000160 if (v == NULL)
161 return NULL;
162 frac = ldexp(frac, (expo-1) % SHIFT + 1);
163 for (i = ndig; --i >= 0; ) {
164 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000165 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000166 frac = frac - (double)bits;
167 frac = ldexp(frac, SHIFT);
168 }
169 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000170 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000172}
173
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000174/* Get a C long int from a long int object.
175 Returns -1 and sets an error condition if overflow occurs. */
176
177long
Tim Peters9f688bf2000-07-07 15:53:28 +0000178PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000179{
Guido van Rossumf7531811998-05-26 14:33:37 +0000180 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000182 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000183 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000184
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 if (vv == NULL || !PyLong_Check(vv)) {
Guido van Rossum7e35d572001-09-15 03:14:32 +0000186 if (vv != NULL && PyInt_Check(vv))
187 return PyInt_AsLong(vv);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000189 return -1;
190 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000192 i = v->ob_size;
193 sign = 1;
194 x = 0;
195 if (i < 0) {
196 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000197 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000198 }
199 while (--i >= 0) {
200 prev = x;
201 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000202 if ((x >> SHIFT) != prev)
203 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000204 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000205 /* Haven't lost any bits, but if the sign bit is set we're in
206 * trouble *unless* this is the min negative number. So,
207 * trouble iff sign bit set && (positive || some bit set other
208 * than the sign bit).
209 */
210 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
211 goto overflow;
212 return (long)x * sign;
213
214 overflow:
215 PyErr_SetString(PyExc_OverflowError,
Skip Montanarobafedec2001-09-13 19:05:30 +0000216 "long int too large to convert to int");
Guido van Rossumf7531811998-05-26 14:33:37 +0000217 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000218}
219
Guido van Rossum53756b11997-01-03 17:14:46 +0000220/* Get a C long int from a long int object.
221 Returns -1 and sets an error condition if overflow occurs. */
222
223unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000224PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000225{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000227 unsigned long x, prev;
228 int i;
229
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 if (vv == NULL || !PyLong_Check(vv)) {
231 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000232 return (unsigned long) -1;
233 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000235 i = v->ob_size;
236 x = 0;
237 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000238 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000239 "can't convert negative value to unsigned long");
240 return (unsigned long) -1;
241 }
242 while (--i >= 0) {
243 prev = x;
244 x = (x << SHIFT) + v->ob_digit[i];
245 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000247 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000248 return (unsigned long) -1;
249 }
250 }
251 return x;
252}
253
Tim Peters2a9b3672001-06-11 21:23:58 +0000254PyObject *
255_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
256 int little_endian, int is_signed)
257{
258 const unsigned char* pstartbyte;/* LSB of bytes */
259 int incr; /* direction to move pstartbyte */
260 const unsigned char* pendbyte; /* MSB of bytes */
261 size_t numsignificantbytes; /* number of bytes that matter */
262 size_t ndigits; /* number of Python long digits */
263 PyLongObject* v; /* result */
264 int idigit = 0; /* next free index in v->ob_digit */
265
266 if (n == 0)
267 return PyLong_FromLong(0L);
268
269 if (little_endian) {
270 pstartbyte = bytes;
271 pendbyte = bytes + n - 1;
272 incr = 1;
273 }
274 else {
275 pstartbyte = bytes + n - 1;
276 pendbyte = bytes;
277 incr = -1;
278 }
279
280 if (is_signed)
281 is_signed = *pendbyte >= 0x80;
282
283 /* Compute numsignificantbytes. This consists of finding the most
284 significant byte. Leading 0 bytes are insignficant if the number
285 is positive, and leading 0xff bytes if negative. */
286 {
287 size_t i;
288 const unsigned char* p = pendbyte;
289 const int pincr = -incr; /* search MSB to LSB */
290 const unsigned char insignficant = is_signed ? 0xff : 0x00;
291
292 for (i = 0; i < n; ++i, p += pincr) {
293 if (*p != insignficant)
294 break;
295 }
296 numsignificantbytes = n - i;
297 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
298 actually has 2 significant bytes. OTOH, 0xff0001 ==
299 -0x00ffff, so we wouldn't *need* to bump it there; but we
300 do for 0xffff = -0x0001. To be safe without bothering to
301 check every case, bump it regardless. */
302 if (is_signed && numsignificantbytes < n)
303 ++numsignificantbytes;
304 }
305
306 /* How many Python long digits do we need? We have
307 8*numsignificantbytes bits, and each Python long digit has SHIFT
308 bits, so it's the ceiling of the quotient. */
309 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
310 if (ndigits > (size_t)INT_MAX)
311 return PyErr_NoMemory();
312 v = _PyLong_New((int)ndigits);
313 if (v == NULL)
314 return NULL;
315
316 /* Copy the bits over. The tricky parts are computing 2's-comp on
317 the fly for signed numbers, and dealing with the mismatch between
318 8-bit bytes and (probably) 15-bit Python digits.*/
319 {
320 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000321 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000322 twodigits accum = 0; /* sliding register */
323 unsigned int accumbits = 0; /* number of bits in accum */
324 const unsigned char* p = pstartbyte;
325
326 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000327 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000328 /* Compute correction for 2's comp, if needed. */
329 if (is_signed) {
330 thisbyte = (0xff ^ thisbyte) + carry;
331 carry = thisbyte >> 8;
332 thisbyte &= 0xff;
333 }
334 /* Because we're going LSB to MSB, thisbyte is
335 more significant than what's already in accum,
336 so needs to be prepended to accum. */
337 accum |= thisbyte << accumbits;
338 accumbits += 8;
339 if (accumbits >= SHIFT) {
340 /* There's enough to fill a Python digit. */
341 assert(idigit < (int)ndigits);
342 v->ob_digit[idigit] = (digit)(accum & MASK);
343 ++idigit;
344 accum >>= SHIFT;
345 accumbits -= SHIFT;
346 assert(accumbits < SHIFT);
347 }
348 }
349 assert(accumbits < SHIFT);
350 if (accumbits) {
351 assert(idigit < (int)ndigits);
352 v->ob_digit[idigit] = (digit)accum;
353 ++idigit;
354 }
355 }
356
357 v->ob_size = is_signed ? -idigit : idigit;
358 return (PyObject *)long_normalize(v);
359}
360
361int
362_PyLong_AsByteArray(PyLongObject* v,
363 unsigned char* bytes, size_t n,
364 int little_endian, int is_signed)
365{
366 int i; /* index into v->ob_digit */
367 int ndigits; /* |v->ob_size| */
368 twodigits accum; /* sliding register */
369 unsigned int accumbits; /* # bits in accum */
370 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
371 twodigits carry; /* for computing 2's-comp */
372 size_t j; /* # bytes filled */
373 unsigned char* p; /* pointer to next byte in bytes */
374 int pincr; /* direction to move p */
375
376 assert(v != NULL && PyLong_Check(v));
377
378 if (v->ob_size < 0) {
379 ndigits = -(v->ob_size);
380 if (!is_signed) {
381 PyErr_SetString(PyExc_TypeError,
382 "can't convert negative long to unsigned");
383 return -1;
384 }
385 do_twos_comp = 1;
386 }
387 else {
388 ndigits = v->ob_size;
389 do_twos_comp = 0;
390 }
391
392 if (little_endian) {
393 p = bytes;
394 pincr = 1;
395 }
396 else {
397 p = bytes + n - 1;
398 pincr = -1;
399 }
400
Tim Peters898cf852001-06-13 20:50:08 +0000401 /* Copy over all the Python digits.
402 It's crucial that every Python digit except for the MSD contribute
403 exactly SHIFT bits to the total, so first assert that the long is
404 normalized. */
405 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000406 j = 0;
407 accum = 0;
408 accumbits = 0;
409 carry = do_twos_comp ? 1 : 0;
410 for (i = 0; i < ndigits; ++i) {
411 twodigits thisdigit = v->ob_digit[i];
412 if (do_twos_comp) {
413 thisdigit = (thisdigit ^ MASK) + carry;
414 carry = thisdigit >> SHIFT;
415 thisdigit &= MASK;
416 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000417 /* Because we're going LSB to MSB, thisdigit is more
418 significant than what's already in accum, so needs to be
419 prepended to accum. */
420 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000421 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000422
Tim Petersede05092001-06-14 08:53:38 +0000423 /* The most-significant digit may be (probably is) at least
424 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000425 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000426 /* Count # of sign bits -- they needn't be stored,
427 * although for signed conversion we need later to
428 * make sure at least one sign bit gets stored.
429 * First shift conceptual sign bit to real sign bit.
430 */
431 stwodigits s = (stwodigits)(thisdigit <<
432 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000433 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000434 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000435 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000436 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000437 }
Tim Petersede05092001-06-14 08:53:38 +0000438 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000439 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000440
Tim Peters2a9b3672001-06-11 21:23:58 +0000441 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000442 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000443 if (j >= n)
444 goto Overflow;
445 ++j;
446 *p = (unsigned char)(accum & 0xff);
447 p += pincr;
448 accumbits -= 8;
449 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000450 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000451 }
452
453 /* Store the straggler (if any). */
454 assert(accumbits < 8);
455 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000456 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000457 if (j >= n)
458 goto Overflow;
459 ++j;
460 if (do_twos_comp) {
461 /* Fill leading bits of the byte with sign bits
462 (appropriately pretending that the long had an
463 infinite supply of sign bits). */
464 accum |= (~(twodigits)0) << accumbits;
465 }
466 *p = (unsigned char)(accum & 0xff);
467 p += pincr;
468 }
Tim Peters05607ad2001-06-13 21:01:27 +0000469 else if (j == n && n > 0 && is_signed) {
470 /* The main loop filled the byte array exactly, so the code
471 just above didn't get to ensure there's a sign bit, and the
472 loop below wouldn't add one either. Make sure a sign bit
473 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000474 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000475 int sign_bit_set = msb >= 0x80;
476 assert(accumbits == 0);
477 if (sign_bit_set == do_twos_comp)
478 return 0;
479 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000480 goto Overflow;
481 }
Tim Peters05607ad2001-06-13 21:01:27 +0000482
483 /* Fill remaining bytes with copies of the sign bit. */
484 {
485 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
486 for ( ; j < n; ++j, p += pincr)
487 *p = signbyte;
488 }
489
Tim Peters2a9b3672001-06-11 21:23:58 +0000490 return 0;
491
492Overflow:
493 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
494 return -1;
495
496}
497
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000498double
499_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
500{
501/* NBITS_WANTED should be > the number of bits in a double's precision,
502 but small enough so that 2**NBITS_WANTED is within the normal double
503 range. nbitsneeded is set to 1 less than that because the most-significant
504 Python digit contains at least 1 significant bit, but we don't want to
505 bother counting them (catering to the worst case cheaply).
506
507 57 is one more than VAX-D double precision; I (Tim) don't know of a double
508 format with more precision than that; it's 1 larger so that we add in at
509 least one round bit to stand in for the ignored least-significant bits.
510*/
511#define NBITS_WANTED 57
512 PyLongObject *v;
513 double x;
514 const double multiplier = (double)(1L << SHIFT);
515 int i, sign;
516 int nbitsneeded;
517
518 if (vv == NULL || !PyLong_Check(vv)) {
519 PyErr_BadInternalCall();
520 return -1;
521 }
522 v = (PyLongObject *)vv;
523 i = v->ob_size;
524 sign = 1;
525 if (i < 0) {
526 sign = -1;
527 i = -(i);
528 }
529 else if (i == 0) {
530 *exponent = 0;
531 return 0.0;
532 }
533 --i;
534 x = (double)v->ob_digit[i];
535 nbitsneeded = NBITS_WANTED - 1;
536 /* Invariant: i Python digits remain unaccounted for. */
537 while (i > 0 && nbitsneeded > 0) {
538 --i;
539 x = x * multiplier + (double)v->ob_digit[i];
540 nbitsneeded -= SHIFT;
541 }
542 /* There are i digits we didn't shift in. Pretending they're all
543 zeroes, the true value is x * 2**(i*SHIFT). */
544 *exponent = i;
545 assert(x > 0.0);
546 return x * sign;
547#undef NBITS_WANTED
548}
549
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000550/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000551
552double
Tim Peters9f688bf2000-07-07 15:53:28 +0000553PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000554{
Tim Peters9fffa3e2001-09-04 05:14:19 +0000555 int e;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000556 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000557
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 if (vv == NULL || !PyLong_Check(vv)) {
559 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000560 return -1;
561 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000562 x = _PyLong_AsScaledDouble(vv, &e);
563 if (x == -1.0 && PyErr_Occurred())
564 return -1.0;
565 if (e > INT_MAX / SHIFT)
566 goto overflow;
567 errno = 0;
568 x = ldexp(x, e * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000569 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000570 goto overflow;
571 return x;
572
573overflow:
574 PyErr_SetString(PyExc_OverflowError,
575 "long int too large to convert to float");
576 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000577}
578
Guido van Rossum78694d91998-09-18 14:14:13 +0000579/* Create a new long (or int) object from a C pointer */
580
581PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000582PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000583{
Tim Peters70128a12001-06-16 08:48:40 +0000584#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000585 return PyInt_FromLong((long)p);
586#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000587
Tim Peters70128a12001-06-16 08:48:40 +0000588#ifndef HAVE_LONG_LONG
589# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
590#endif
591#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
592# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
593#endif
594 /* optimize null pointers */
595 if (p == NULL)
596 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000597 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000598
599#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000600}
601
602/* Get a C pointer from a long object (or an int object in some cases) */
603
604void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000605PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000606{
607 /* This function will allow int or long objects. If vv is neither,
608 then the PyLong_AsLong*() functions will raise the exception:
609 PyExc_SystemError, "bad argument to internal function"
610 */
Tim Peters70128a12001-06-16 08:48:40 +0000611#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000612 long x;
613
Tim Peters70128a12001-06-16 08:48:40 +0000614 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000615 x = PyInt_AS_LONG(vv);
616 else
617 x = PyLong_AsLong(vv);
618#else
Tim Peters70128a12001-06-16 08:48:40 +0000619
620#ifndef HAVE_LONG_LONG
621# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
622#endif
623#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
624# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
625#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000626 LONG_LONG x;
627
Tim Peters70128a12001-06-16 08:48:40 +0000628 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000629 x = PyInt_AS_LONG(vv);
630 else
631 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000632
633#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000634
635 if (x == -1 && PyErr_Occurred())
636 return NULL;
637 return (void *)x;
638}
639
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000640#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000641
642/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
643 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000644 */
645
Tim Peterscf37dfc2001-06-14 18:42:50 +0000646#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000647
648/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000649
650PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000651PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000652{
Tim Petersd1a7da62001-06-13 00:35:57 +0000653 LONG_LONG bytes = ival;
654 int one = 1;
655 return _PyLong_FromByteArray(
656 (unsigned char *)&bytes,
657 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000658}
659
Tim Petersd1a7da62001-06-13 00:35:57 +0000660/* Create a new long int object from a C unsigned LONG_LONG int. */
661
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000662PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000663PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000664{
Tim Petersd1a7da62001-06-13 00:35:57 +0000665 unsigned LONG_LONG bytes = ival;
666 int one = 1;
667 return _PyLong_FromByteArray(
668 (unsigned char *)&bytes,
669 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000670}
671
Guido van Rossum3293b071998-08-25 16:07:15 +0000672/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000673 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000674
Guido van Rossum3293b071998-08-25 16:07:15 +0000675LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000676PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000677{
Tim Petersd1a7da62001-06-13 00:35:57 +0000678 LONG_LONG bytes;
679 int one = 1;
680 int res;
681
Tim Petersd38b1c72001-09-30 05:09:37 +0000682 if (vv == NULL) {
683 PyErr_BadInternalCall();
684 return -1;
685 }
686 if (!PyLong_Check(vv)) {
687 if (PyInt_Check(vv))
688 return (LONG_LONG)PyInt_AsLong(vv);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000689 PyErr_BadInternalCall();
690 return -1;
691 }
692
Tim Petersd1a7da62001-06-13 00:35:57 +0000693 res = _PyLong_AsByteArray(
694 (PyLongObject *)vv, (unsigned char *)&bytes,
695 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000696
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000697 /* Plan 9 can't handle LONG_LONG in ? : expressions */
698 if (res < 0)
Jeremy Hyltonc4ad0bc2002-04-23 20:01:20 +0000699 return (LONG_LONG)-1;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000700 else
701 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000702}
703
Tim Petersd1a7da62001-06-13 00:35:57 +0000704/* Get a C unsigned LONG_LONG int from a long int object.
705 Return -1 and set an error if overflow occurs. */
706
Guido van Rossum3293b071998-08-25 16:07:15 +0000707unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000708PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000709{
Tim Petersd1a7da62001-06-13 00:35:57 +0000710 unsigned LONG_LONG bytes;
711 int one = 1;
712 int res;
713
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000714 if (vv == NULL || !PyLong_Check(vv)) {
715 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000716 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000717 }
718
Tim Petersd1a7da62001-06-13 00:35:57 +0000719 res = _PyLong_AsByteArray(
720 (PyLongObject *)vv, (unsigned char *)&bytes,
721 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000722
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000723 /* Plan 9 can't handle LONG_LONG in ? : expressions */
724 if (res < 0)
725 return (unsigned LONG_LONG)res;
726 else
727 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000728}
Tim Petersd1a7da62001-06-13 00:35:57 +0000729
730#undef IS_LITTLE_ENDIAN
731
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000732#endif /* HAVE_LONG_LONG */
733
Neil Schemenauerba872e22001-01-04 01:46:03 +0000734
735static int
736convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
737 if (PyLong_Check(v)) {
738 *a = (PyLongObject *) v;
739 Py_INCREF(v);
740 }
741 else if (PyInt_Check(v)) {
742 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
743 }
744 else {
745 return 0;
746 }
747 if (PyLong_Check(w)) {
748 *b = (PyLongObject *) w;
749 Py_INCREF(w);
750 }
751 else if (PyInt_Check(w)) {
752 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
753 }
754 else {
755 Py_DECREF(*a);
756 return 0;
757 }
758 return 1;
759}
760
761#define CONVERT_BINOP(v, w, a, b) \
762 if (!convert_binop(v, w, a, b)) { \
763 Py_INCREF(Py_NotImplemented); \
764 return Py_NotImplemented; \
765 }
766
767
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000768/* Multiply by a single digit, ignoring the sign. */
769
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000771mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000772{
773 return muladd1(a, n, (digit)0);
774}
775
776/* Multiply by a single digit and add a single digit, ignoring the sign. */
777
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000779muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000780{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000781 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000783 twodigits carry = extra;
784 int i;
785
786 if (z == NULL)
787 return NULL;
788 for (i = 0; i < size_a; ++i) {
789 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000790 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000791 carry >>= SHIFT;
792 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000793 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000794 return long_normalize(z);
795}
796
Tim Peters212e6142001-07-14 12:23:19 +0000797/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
798 in pout, and returning the remainder. pin and pout point at the LSD.
799 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
800 long_format, but that should be done with great care since longs are
801 immutable. */
802
803static digit
804inplace_divrem1(digit *pout, digit *pin, int size, digit n)
805{
806 twodigits rem = 0;
807
808 assert(n > 0 && n <= MASK);
809 pin += size;
810 pout += size;
811 while (--size >= 0) {
812 digit hi;
813 rem = (rem << SHIFT) + *--pin;
814 *--pout = hi = (digit)(rem / n);
815 rem -= hi * n;
816 }
817 return (digit)rem;
818}
819
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000820/* Divide a long integer by a digit, returning both the quotient
821 (as function result) and the remainder (through *prem).
822 The sign of a is ignored; n should not be zero. */
823
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000824static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000825divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000826{
Tim Peters212e6142001-07-14 12:23:19 +0000827 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000828 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000829
830 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000832 if (z == NULL)
833 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000834 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000835 return long_normalize(z);
836}
837
838/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000839 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000840 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000841
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000842static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000843long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000844{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000845 register PyLongObject *a = (PyLongObject *)aa;
846 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000847 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000848 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000849 char *p;
850 int bits;
851 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000852
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 if (a == NULL || !PyLong_Check(a)) {
854 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000855 return NULL;
856 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000857 assert(base >= 2 && base <= 36);
858
859 /* Compute a rough upper bound for the length of the string */
860 i = base;
861 bits = 0;
862 while (i > 1) {
863 ++bits;
864 i >>= 1;
865 }
Fred Drake121ee271999-12-23 15:41:28 +0000866 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000867 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000868 if (str == NULL)
869 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000871 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000872 if (addL)
873 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000874 if (a->ob_size < 0)
875 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000876
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000877 if (a->ob_size == 0) {
878 *--p = '0';
879 }
880 else if ((base & (base - 1)) == 0) {
881 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000882 twodigits accum = 0;
883 int accumbits = 0; /* # of bits in accum */
884 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000885 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000886 while ((i >>= 1) > 1)
887 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000888
889 for (i = 0; i < size_a; ++i) {
890 accum |= a->ob_digit[i] << accumbits;
891 accumbits += SHIFT;
892 assert(accumbits >= basebits);
893 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000894 char cdigit = (char)(accum & (base - 1));
895 cdigit += (cdigit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000896 assert(p > PyString_AS_STRING(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000897 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +0000898 accumbits -= basebits;
899 accum >>= basebits;
900 } while (i < size_a-1 ? accumbits >= basebits :
901 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000902 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000903 }
904 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000905 /* Not 0, and base not a power of 2. Divide repeatedly by
906 base, but for speed use the highest power of base that
907 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000908 int size = size_a;
909 digit *pin = a->ob_digit;
910 PyLongObject *scratch;
911 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000912 digit powbase = base; /* powbase == base ** power */
913 int power = 1;
914 for (;;) {
915 unsigned long newpow = powbase * (unsigned long)base;
916 if (newpow >> SHIFT) /* doesn't fit in a digit */
917 break;
918 powbase = (digit)newpow;
919 ++power;
920 }
Tim Peters212e6142001-07-14 12:23:19 +0000921
922 /* Get a scratch area for repeated division. */
923 scratch = _PyLong_New(size);
924 if (scratch == NULL) {
925 Py_DECREF(str);
926 return NULL;
927 }
928
929 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000930 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000931 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000932 digit rem = inplace_divrem1(scratch->ob_digit,
933 pin, size, powbase);
934 pin = scratch->ob_digit; /* no need to use a again */
935 if (pin[size - 1] == 0)
936 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000937 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +0000938 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000939 Py_DECREF(str);
940 return NULL;
941 })
Tim Peters212e6142001-07-14 12:23:19 +0000942
943 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000944 assert(ntostore > 0);
945 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000946 digit nextrem = (digit)(rem / base);
947 char c = (char)(rem - nextrem * base);
948 assert(p > PyString_AS_STRING(str));
949 c += (c < 10) ? '0' : 'A'-10;
950 *--p = c;
951 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000952 --ntostore;
953 /* Termination is a bit delicate: must not
954 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +0000955 remaining quotient and rem are both 0. */
956 } while (ntostore && (size || rem));
957 } while (size != 0);
958 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000959 }
960
Guido van Rossum2c475421992-08-14 15:13:07 +0000961 if (base == 8) {
962 if (size_a != 0)
963 *--p = '0';
964 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000965 else if (base == 16) {
966 *--p = 'x';
967 *--p = '0';
968 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000969 else if (base != 10) {
970 *--p = '#';
971 *--p = '0' + base%10;
972 if (base > 10)
973 *--p = '0' + base/10;
974 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000975 if (sign)
976 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 if (p != PyString_AS_STRING(str)) {
978 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000979 assert(p > q);
980 do {
981 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000982 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000983 _PyString_Resize((PyObject **)&str,
984 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000985 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000986 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000987}
988
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000990PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000991{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000992 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000993 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000995
Guido van Rossum472c04f1996-12-05 21:57:21 +0000996 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000998 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000999 return NULL;
1000 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001001 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001002 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001003 if (*str == '+')
1004 ++str;
1005 else if (*str == '-') {
1006 ++str;
1007 sign = -1;
1008 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001009 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001010 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001011 if (base == 0) {
1012 if (str[0] != '0')
1013 base = 10;
1014 else if (str[1] == 'x' || str[1] == 'X')
1015 base = 16;
1016 else
1017 base = 8;
1018 }
1019 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1020 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +00001022 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001023 for ( ; z != NULL; ++str) {
1024 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001026
1027 if (*str <= '9')
1028 k = *str - '0';
1029 else if (*str >= 'a')
1030 k = *str - 'a' + 10;
1031 else if (*str >= 'A')
1032 k = *str - 'A' + 10;
1033 if (k < 0 || k >= base)
1034 break;
1035 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001037 z = temp;
1038 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001039 if (z == NULL)
1040 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001041 if (str == start)
1042 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001043 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001044 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001045 if (*str == 'L' || *str == 'l')
1046 str++;
1047 while (*str && isspace(Py_CHARMASK(*str)))
1048 str++;
1049 if (*str != '\0')
1050 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001051 if (pend)
1052 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001054
1055 onError:
1056 PyErr_Format(PyExc_ValueError,
1057 "invalid literal for long(): %.200s", orig_str);
1058 Py_XDECREF(z);
1059 return NULL;
1060}
1061
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001062#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001063PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001064PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001065{
1066 char buffer[256];
1067
1068 if (length >= sizeof(buffer)) {
1069 PyErr_SetString(PyExc_ValueError,
1070 "long() literal too large to convert");
1071 return NULL;
1072 }
1073 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
1074 return NULL;
1075
1076 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001077}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001078#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001079
Tim Peters9f688bf2000-07-07 15:53:28 +00001080/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001082 (PyLongObject *, PyLongObject *, PyLongObject **);
1083static PyObject *long_pos(PyLongObject *);
1084static int long_divrem(PyLongObject *, PyLongObject *,
1085 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001086
1087/* Long division with remainder, top-level routine */
1088
Guido van Rossume32e0141992-01-19 16:31:05 +00001089static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001090long_divrem(PyLongObject *a, PyLongObject *b,
1091 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001092{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001093 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001094 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001095
1096 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001097 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001098 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001099 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001100 }
1101 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001102 (size_a == size_b &&
1103 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001104 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001105 *pdiv = _PyLong_New(0);
1106 Py_INCREF(a);
1107 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001108 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001109 }
1110 if (size_b == 1) {
1111 digit rem = 0;
1112 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001113 if (z == NULL)
1114 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001115 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001116 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001117 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001118 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001119 if (z == NULL)
1120 return -1;
1121 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001122 /* Set the signs.
1123 The quotient z has the sign of a*b;
1124 the remainder r has the sign of a,
1125 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001126 if ((a->ob_size < 0) != (b->ob_size < 0))
1127 z->ob_size = -(z->ob_size);
1128 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1129 (*prem)->ob_size = -((*prem)->ob_size);
1130 *pdiv = z;
1131 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001132}
1133
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001134/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001135
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001136static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001137x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001138{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001139 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001140 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141 PyLongObject *v = mul1(v1, d);
1142 PyLongObject *w = mul1(w1, d);
1143 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001144 int j, k;
1145
1146 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001147 Py_XDECREF(v);
1148 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001149 return NULL;
1150 }
1151
1152 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001153 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001154 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001155
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001156 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001157 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001158
1159 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1160 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1161 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001162 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001163 int i;
1164
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001165 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001166 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001167 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001168 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001169 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001170 if (vj == w->ob_digit[size_w-1])
1171 q = MASK;
1172 else
1173 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1174 w->ob_digit[size_w-1];
1175
1176 while (w->ob_digit[size_w-2]*q >
1177 ((
1178 ((twodigits)vj << SHIFT)
1179 + v->ob_digit[j-1]
1180 - q*w->ob_digit[size_w-1]
1181 ) << SHIFT)
1182 + v->ob_digit[j-2])
1183 --q;
1184
1185 for (i = 0; i < size_w && i+k < size_v; ++i) {
1186 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001187 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001188 carry += v->ob_digit[i+k] - z
1189 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001190 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001191 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1192 carry, SHIFT);
1193 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001194 }
1195
1196 if (i+k < size_v) {
1197 carry += v->ob_digit[i+k];
1198 v->ob_digit[i+k] = 0;
1199 }
1200
1201 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001202 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001203 else {
1204 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001205 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001206 carry = 0;
1207 for (i = 0; i < size_w && i+k < size_v; ++i) {
1208 carry += v->ob_digit[i+k] + w->ob_digit[i];
1209 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001210 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1211 BASE_TWODIGITS_TYPE,
1212 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001213 }
1214 }
1215 } /* for j, k */
1216
Guido van Rossumc206c761995-01-10 15:23:19 +00001217 if (a == NULL)
1218 *prem = NULL;
1219 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001220 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001221 *prem = divrem1(v, d, &d);
1222 /* d receives the (unused) remainder */
1223 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001224 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001225 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001226 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001227 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228 Py_DECREF(v);
1229 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001230 return a;
1231}
1232
1233/* Methods */
1234
1235static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001236long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001237{
Guido van Rossum9475a232001-10-05 20:51:39 +00001238 v->ob_type->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001239}
1240
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001241static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001242long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001243{
Fred Drake121ee271999-12-23 15:41:28 +00001244 return long_format(v, 10, 1);
1245}
1246
1247static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001248long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001249{
1250 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001251}
1252
1253static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001254long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001255{
1256 int sign;
1257
Guido van Rossumc6913e71991-11-19 20:26:46 +00001258 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001259 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001260 sign = 0;
1261 else
1262 sign = a->ob_size - b->ob_size;
1263 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001264 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001265 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001266 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1267 ;
1268 if (i < 0)
1269 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001270 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001271 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001272 if (a->ob_size < 0)
1273 sign = -sign;
1274 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001275 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001276 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001277}
1278
Guido van Rossum9bfef441993-03-29 10:43:31 +00001279static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001280long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001281{
1282 long x;
1283 int i, sign;
1284
1285 /* This is designed so that Python ints and longs with the
1286 same value hash to the same value, otherwise comparisons
1287 of mapping keys will turn out weird */
1288 i = v->ob_size;
1289 sign = 1;
1290 x = 0;
1291 if (i < 0) {
1292 sign = -1;
1293 i = -(i);
1294 }
1295 while (--i >= 0) {
1296 /* Force a 32-bit circular shift */
1297 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1298 x += v->ob_digit[i];
1299 }
1300 x = x * sign;
1301 if (x == -1)
1302 x = -2;
1303 return x;
1304}
1305
1306
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001307/* Add the absolute values of two long integers. */
1308
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001309static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001310x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001311{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001312 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001313 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001314 int i;
1315 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001316
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001317 /* Ensure a is the larger of the two: */
1318 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 { PyLongObject *temp = a; a = b; b = temp; }
1320 { int size_temp = size_a;
1321 size_a = size_b;
1322 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001323 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001324 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001325 if (z == NULL)
1326 return NULL;
1327 for (i = 0; i < size_b; ++i) {
1328 carry += a->ob_digit[i] + b->ob_digit[i];
1329 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001330 carry >>= SHIFT;
1331 }
1332 for (; i < size_a; ++i) {
1333 carry += a->ob_digit[i];
1334 z->ob_digit[i] = carry & MASK;
1335 carry >>= SHIFT;
1336 }
1337 z->ob_digit[i] = carry;
1338 return long_normalize(z);
1339}
1340
1341/* Subtract the absolute values of two integers. */
1342
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001343static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001344x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001345{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001346 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001348 int i;
1349 int sign = 1;
1350 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001351
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001352 /* Ensure a is the larger of the two: */
1353 if (size_a < size_b) {
1354 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001355 { PyLongObject *temp = a; a = b; b = temp; }
1356 { int size_temp = size_a;
1357 size_a = size_b;
1358 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001359 }
1360 else if (size_a == size_b) {
1361 /* Find highest digit where a and b differ: */
1362 i = size_a;
1363 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1364 ;
1365 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001366 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001367 if (a->ob_digit[i] < b->ob_digit[i]) {
1368 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001370 }
1371 size_a = size_b = i+1;
1372 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001374 if (z == NULL)
1375 return NULL;
1376 for (i = 0; i < size_b; ++i) {
1377 /* The following assumes unsigned arithmetic
1378 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001379 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001380 z->ob_digit[i] = borrow & MASK;
1381 borrow >>= SHIFT;
1382 borrow &= 1; /* Keep only one sign bit */
1383 }
1384 for (; i < size_a; ++i) {
1385 borrow = a->ob_digit[i] - borrow;
1386 z->ob_digit[i] = borrow & MASK;
1387 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001388 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001389 }
1390 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001391 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001392 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001393 return long_normalize(z);
1394}
1395
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001396static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001397long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001398{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001399 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001400
Neil Schemenauerba872e22001-01-04 01:46:03 +00001401 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1402
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001403 if (a->ob_size < 0) {
1404 if (b->ob_size < 0) {
1405 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001406 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001407 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001408 }
1409 else
1410 z = x_sub(b, a);
1411 }
1412 else {
1413 if (b->ob_size < 0)
1414 z = x_sub(a, b);
1415 else
1416 z = x_add(a, b);
1417 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001418 Py_DECREF(a);
1419 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001420 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001421}
1422
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001423static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001424long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001425{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001426 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001427
Neil Schemenauerba872e22001-01-04 01:46:03 +00001428 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1429
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001430 if (a->ob_size < 0) {
1431 if (b->ob_size < 0)
1432 z = x_sub(a, b);
1433 else
1434 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001435 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001436 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001437 }
1438 else {
1439 if (b->ob_size < 0)
1440 z = x_add(a, b);
1441 else
1442 z = x_sub(a, b);
1443 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001444 Py_DECREF(a);
1445 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001447}
1448
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001449static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001450long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001451{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001452 /* sequence * long */
1453 long n = PyLong_AsLong((PyObject *) w);
1454 if (n == -1 && PyErr_Occurred())
1455 return NULL;
1456 else
1457 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1458}
1459
1460static PyObject *
1461long_mul(PyLongObject *v, PyLongObject *w)
1462{
1463 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001464 int size_a;
1465 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001466 int i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001467
Guido van Rossum7e35d572001-09-15 03:14:32 +00001468 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
1469 if (!PyLong_Check(v) &&
1470 v->ob_type->tp_as_sequence &&
1471 v->ob_type->tp_as_sequence->sq_repeat)
1472 return long_repeat((PyObject *)v, w);
1473 if (!PyLong_Check(w) &&
1474 w->ob_type->tp_as_sequence &&
1475 w->ob_type->tp_as_sequence->sq_repeat)
1476 return long_repeat((PyObject *)w, v);
1477 Py_INCREF(Py_NotImplemented);
1478 return Py_NotImplemented;
1479 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001480
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001481 size_a = ABS(a->ob_size);
1482 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001483 if (size_a > size_b) {
1484 /* we are faster with the small object on the left */
1485 int hold_sa = size_a;
1486 PyLongObject *hold_a = a;
1487 size_a = size_b;
1488 size_b = hold_sa;
1489 a = b;
1490 b = hold_a;
1491 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001492 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001493 if (z == NULL) {
1494 Py_DECREF(a);
1495 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001496 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001497 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001498 for (i = 0; i < z->ob_size; ++i)
1499 z->ob_digit[i] = 0;
1500 for (i = 0; i < size_a; ++i) {
1501 twodigits carry = 0;
1502 twodigits f = a->ob_digit[i];
1503 int j;
1504
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001505 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001506 Py_DECREF(a);
1507 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001508 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001509 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001510 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001511 for (j = 0; j < size_b; ++j) {
1512 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001513 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001514 carry >>= SHIFT;
1515 }
1516 for (; carry != 0; ++j) {
1517 assert(i+j < z->ob_size);
1518 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001519 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001520 carry >>= SHIFT;
1521 }
1522 }
1523 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001524 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001525 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001526 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001527 Py_DECREF(a);
1528 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001529 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001530}
1531
Guido van Rossume32e0141992-01-19 16:31:05 +00001532/* The / and % operators are now defined in terms of divmod().
1533 The expression a mod b has the value a - b*floor(a/b).
1534 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001535 |a| by |b|, with the sign of a. This is also expressed
1536 as a - b*trunc(a/b), if trunc truncates towards zero.
1537 Some examples:
1538 a b a rem b a mod b
1539 13 10 3 3
1540 -13 10 -3 7
1541 13 -10 3 -7
1542 -13 -10 -3 -3
1543 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001544 have different signs. We then subtract one from the 'div'
1545 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001546
Guido van Rossume32e0141992-01-19 16:31:05 +00001547static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001548l_divmod(PyLongObject *v, PyLongObject *w,
1549 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001550{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001551 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001552
1553 if (long_divrem(v, w, &div, &mod) < 0)
1554 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001555 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1556 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001557 PyLongObject *temp;
1558 PyLongObject *one;
1559 temp = (PyLongObject *) long_add(mod, w);
1560 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001561 mod = temp;
1562 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001563 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001564 return -1;
1565 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001566 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001567 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1569 Py_DECREF(mod);
1570 Py_DECREF(div);
1571 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001572 return -1;
1573 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574 Py_DECREF(one);
1575 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001576 div = temp;
1577 }
1578 *pdiv = div;
1579 *pmod = mod;
1580 return 0;
1581}
1582
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001583static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001584long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001585{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001586 PyLongObject *a, *b, *div, *mod;
1587
1588 CONVERT_BINOP(v, w, &a, &b);
1589
1590 if (l_divmod(a, b, &div, &mod) < 0) {
1591 Py_DECREF(a);
1592 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001593 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001594 }
1595 Py_DECREF(a);
1596 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001597 Py_DECREF(mod);
1598 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001599}
1600
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001601static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001602long_classic_div(PyObject *v, PyObject *w)
1603{
1604 PyLongObject *a, *b, *div, *mod;
1605
1606 CONVERT_BINOP(v, w, &a, &b);
1607
1608 if (Py_DivisionWarningFlag &&
1609 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1610 div = NULL;
1611 else if (l_divmod(a, b, &div, &mod) < 0)
1612 div = NULL;
1613 else
1614 Py_DECREF(mod);
1615
1616 Py_DECREF(a);
1617 Py_DECREF(b);
1618 return (PyObject *)div;
1619}
1620
1621static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00001622long_true_divide(PyObject *v, PyObject *w)
1623{
Tim Peterse2a60002001-09-04 06:17:36 +00001624 PyLongObject *a, *b;
1625 double ad, bd;
Tim Peters6f97e492001-11-04 23:09:40 +00001626 int aexp, bexp, failed;
Tim Peterse2a60002001-09-04 06:17:36 +00001627
1628 CONVERT_BINOP(v, w, &a, &b);
1629 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
1630 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00001631 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
1632 Py_DECREF(a);
1633 Py_DECREF(b);
1634 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00001635 return NULL;
1636
1637 if (bd == 0.0) {
1638 PyErr_SetString(PyExc_ZeroDivisionError,
1639 "long division or modulo by zero");
1640 return NULL;
1641 }
1642
1643 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
1644 ad /= bd; /* overflow/underflow impossible here */
1645 aexp -= bexp;
1646 if (aexp > INT_MAX / SHIFT)
1647 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00001648 else if (aexp < -(INT_MAX / SHIFT))
1649 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00001650 errno = 0;
1651 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00001652 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00001653 goto overflow;
1654 return PyFloat_FromDouble(ad);
1655
1656overflow:
1657 PyErr_SetString(PyExc_OverflowError,
1658 "long/long too large for a float");
1659 return NULL;
1660
Tim Peters20dab9f2001-09-04 05:31:47 +00001661}
1662
1663static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001664long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001665{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001666 PyLongObject *a, *b, *div, *mod;
1667
1668 CONVERT_BINOP(v, w, &a, &b);
1669
1670 if (l_divmod(a, b, &div, &mod) < 0) {
1671 Py_DECREF(a);
1672 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001673 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001674 }
1675 Py_DECREF(a);
1676 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001677 Py_DECREF(div);
1678 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001679}
1680
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001681static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001682long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001683{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001684 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001685 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001686
1687 CONVERT_BINOP(v, w, &a, &b);
1688
1689 if (l_divmod(a, b, &div, &mod) < 0) {
1690 Py_DECREF(a);
1691 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001692 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001693 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001694 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001695 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001696 PyTuple_SetItem(z, 0, (PyObject *) div);
1697 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001698 }
1699 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001700 Py_DECREF(div);
1701 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001702 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001703 Py_DECREF(a);
1704 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001705 return z;
1706}
1707
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001708static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001709long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001710{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001711 PyLongObject *a, *b;
1712 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001713 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001714 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001715
1716 CONVERT_BINOP(v, w, &a, &b);
1717 if (PyLong_Check(x) || Py_None == x) {
1718 c = x;
1719 Py_INCREF(x);
1720 }
1721 else if (PyInt_Check(x)) {
1722 c = PyLong_FromLong(PyInt_AS_LONG(x));
1723 }
1724 else {
1725 Py_DECREF(a);
1726 Py_DECREF(b);
1727 Py_INCREF(Py_NotImplemented);
1728 return Py_NotImplemented;
1729 }
Tim Peters4c483c42001-09-05 06:24:58 +00001730
1731 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
1732 PyErr_SetString(PyExc_ValueError,
1733 "pow() 3rd argument cannot be 0");
1734 z = NULL;
1735 goto error;
1736 }
1737
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001738 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001739 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001740 Py_DECREF(a);
1741 Py_DECREF(b);
1742 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00001743 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00001744 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
1745 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00001746 return NULL;
1747 }
1748 /* Return a float. This works because we know that
1749 this calls float_pow() which converts its
1750 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001751 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001752 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001753 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001754 for (i = 0; i < size_b; ++i) {
1755 digit bi = b->ob_digit[i];
1756 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001757
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001758 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001759 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001760
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001761 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001762 temp = (PyLongObject *)long_mul(z, a);
1763 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001764 if (c!=Py_None && temp!=NULL) {
1765 if (l_divmod(temp,(PyLongObject *)c,
1766 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001767 Py_DECREF(temp);
1768 z = NULL;
1769 goto error;
1770 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001771 Py_XDECREF(div);
1772 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001773 temp = mod;
1774 }
1775 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001776 if (z == NULL)
1777 break;
1778 }
1779 bi >>= 1;
1780 if (bi == 0 && i+1 == size_b)
1781 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001782 temp = (PyLongObject *)long_mul(a, a);
1783 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001784 if (c!=Py_None && temp!=NULL) {
1785 if (l_divmod(temp, (PyLongObject *)c, &div,
1786 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001787 Py_DECREF(temp);
1788 z = NULL;
1789 goto error;
1790 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001791 Py_XDECREF(div);
1792 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001793 temp = mod;
1794 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001795 a = temp;
1796 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001797 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001798 z = NULL;
1799 break;
1800 }
1801 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001802 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001803 break;
1804 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001805 if (c!=Py_None && z!=NULL) {
1806 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001807 Py_DECREF(z);
1808 z = NULL;
1809 }
1810 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001811 Py_XDECREF(div);
1812 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001813 z = mod;
1814 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001815 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001816 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001817 Py_XDECREF(a);
1818 Py_DECREF(b);
1819 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001820 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001821}
1822
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001823static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001824long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001825{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001826 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001827 PyLongObject *x;
1828 PyLongObject *w;
1829 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001830 if (w == NULL)
1831 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001832 x = (PyLongObject *) long_add(v, w);
1833 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001834 if (x == NULL)
1835 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00001836 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001837 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001838}
1839
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001840static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001841long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001842{
Tim Peters69c2de32001-09-11 22:31:33 +00001843 if (PyLong_CheckExact(v)) {
1844 Py_INCREF(v);
1845 return (PyObject *)v;
1846 }
1847 else
1848 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001849}
1850
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001851static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001852long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001853{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001854 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001855 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001856 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001857 Py_INCREF(v);
1858 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001859 }
Tim Peters69c2de32001-09-11 22:31:33 +00001860 z = (PyLongObject *)_PyLong_Copy(v);
1861 if (z != NULL)
1862 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001863 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001864}
1865
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001866static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001867long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001868{
1869 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001870 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00001871 else
1872 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001873}
1874
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001875static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001876long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001877{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001878 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001879}
1880
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001881static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001882long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001883{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001884 PyLongObject *a, *b;
1885 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001886 long shiftby;
1887 int newsize, wordshift, loshift, hishift, i, j;
1888 digit lomask, himask;
1889
Neil Schemenauerba872e22001-01-04 01:46:03 +00001890 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1891
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001892 if (a->ob_size < 0) {
1893 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001894 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001895 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001896 if (a1 == NULL)
1897 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001898 a2 = (PyLongObject *) long_rshift(a1, b);
1899 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001900 if (a2 == NULL)
1901 goto rshift_error;
1902 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001903 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001904 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001905 else {
1906
1907 shiftby = PyLong_AsLong((PyObject *)b);
1908 if (shiftby == -1L && PyErr_Occurred())
1909 goto rshift_error;
1910 if (shiftby < 0) {
1911 PyErr_SetString(PyExc_ValueError,
1912 "negative shift count");
1913 goto rshift_error;
1914 }
1915 wordshift = shiftby / SHIFT;
1916 newsize = ABS(a->ob_size) - wordshift;
1917 if (newsize <= 0) {
1918 z = _PyLong_New(0);
1919 Py_DECREF(a);
1920 Py_DECREF(b);
1921 return (PyObject *)z;
1922 }
1923 loshift = shiftby % SHIFT;
1924 hishift = SHIFT - loshift;
1925 lomask = ((digit)1 << hishift) - 1;
1926 himask = MASK ^ lomask;
1927 z = _PyLong_New(newsize);
1928 if (z == NULL)
1929 goto rshift_error;
1930 if (a->ob_size < 0)
1931 z->ob_size = -(z->ob_size);
1932 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1933 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1934 if (i+1 < newsize)
1935 z->ob_digit[i] |=
1936 (a->ob_digit[j+1] << hishift) & himask;
1937 }
1938 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001939 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001940rshift_error:
1941 Py_DECREF(a);
1942 Py_DECREF(b);
1943 return (PyObject *) z;
1944
Guido van Rossumc6913e71991-11-19 20:26:46 +00001945}
1946
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001947static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001948long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001949{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001950 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001951 PyLongObject *a, *b;
1952 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001953 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001954 int oldsize, newsize, wordshift, remshift, i, j;
1955 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001956
Neil Schemenauerba872e22001-01-04 01:46:03 +00001957 CONVERT_BINOP(v, w, &a, &b);
1958
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001959 shiftby = PyLong_AsLong((PyObject *)b);
1960 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001961 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001962 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001963 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001964 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001965 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001966 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001967 PyErr_SetString(PyExc_ValueError,
1968 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001969 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001970 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001971 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1972 wordshift = (int)shiftby / SHIFT;
1973 remshift = (int)shiftby - wordshift * SHIFT;
1974
1975 oldsize = ABS(a->ob_size);
1976 newsize = oldsize + wordshift;
1977 if (remshift)
1978 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001979 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001980 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001981 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001982 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001983 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001984 for (i = 0; i < wordshift; i++)
1985 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001986 accum = 0;
1987 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1988 accum |= a->ob_digit[j] << remshift;
1989 z->ob_digit[i] = (digit)(accum & MASK);
1990 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001991 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001992 if (remshift)
1993 z->ob_digit[newsize-1] = (digit)accum;
1994 else
1995 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001996 z = long_normalize(z);
1997lshift_error:
1998 Py_DECREF(a);
1999 Py_DECREF(b);
2000 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002001}
2002
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002003
2004/* Bitwise and/xor/or operations */
2005
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002006#define MAX(x, y) ((x) < (y) ? (y) : (x))
2007#define MIN(x, y) ((x) > (y) ? (y) : (x))
2008
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002009static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002010long_bitwise(PyLongObject *a,
2011 int op, /* '&', '|', '^' */
2012 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002013{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002014 digit maska, maskb; /* 0 or MASK */
2015 int negz;
2016 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002017 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002018 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002019 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002020 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002021
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002022 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002023 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002024 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002025 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002026 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002027 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002028 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002029 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002030 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002031 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002032 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002033 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002034 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002035 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002036 maskb = 0;
2037 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00002038
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002039 negz = 0;
2040 switch (op) {
2041 case '^':
2042 if (maska != maskb) {
2043 maska ^= MASK;
2044 negz = -1;
2045 }
2046 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002047 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002048 if (maska && maskb) {
2049 op = '|';
2050 maska ^= MASK;
2051 maskb ^= MASK;
2052 negz = -1;
2053 }
2054 break;
2055 case '|':
2056 if (maska || maskb) {
2057 op = '&';
2058 maska ^= MASK;
2059 maskb ^= MASK;
2060 negz = -1;
2061 }
2062 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002063 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002064
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002065 /* JRH: The original logic here was to allocate the result value (z)
2066 as the longer of the two operands. However, there are some cases
2067 where the result is guaranteed to be shorter than that: AND of two
2068 positives, OR of two negatives: use the shorter number. AND with
2069 mixed signs: use the positive number. OR with mixed signs: use the
2070 negative number. After the transformations above, op will be '&'
2071 iff one of these cases applies, and mask will be non-0 for operands
2072 whose length should be ignored.
2073 */
2074
2075 size_a = a->ob_size;
2076 size_b = b->ob_size;
2077 size_z = op == '&'
2078 ? (maska
2079 ? size_b
2080 : (maskb ? size_a : MIN(size_a, size_b)))
2081 : MAX(size_a, size_b);
2082 z = _PyLong_New(size_z);
2083 if (a == NULL || b == NULL || z == NULL) {
2084 Py_XDECREF(a);
2085 Py_XDECREF(b);
2086 Py_XDECREF(z);
2087 return NULL;
2088 }
2089
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002090 for (i = 0; i < size_z; ++i) {
2091 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2092 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2093 switch (op) {
2094 case '&': z->ob_digit[i] = diga & digb; break;
2095 case '|': z->ob_digit[i] = diga | digb; break;
2096 case '^': z->ob_digit[i] = diga ^ digb; break;
2097 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002098 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002099
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002100 Py_DECREF(a);
2101 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002102 z = long_normalize(z);
2103 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002104 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002105 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002106 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002107 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002108}
2109
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002110static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002111long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002112{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002113 PyLongObject *a, *b;
2114 PyObject *c;
2115 CONVERT_BINOP(v, w, &a, &b);
2116 c = long_bitwise(a, '&', b);
2117 Py_DECREF(a);
2118 Py_DECREF(b);
2119 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002120}
2121
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002122static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002123long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002124{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002125 PyLongObject *a, *b;
2126 PyObject *c;
2127 CONVERT_BINOP(v, w, &a, &b);
2128 c = long_bitwise(a, '^', b);
2129 Py_DECREF(a);
2130 Py_DECREF(b);
2131 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002132}
2133
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002134static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002135long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002136{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002137 PyLongObject *a, *b;
2138 PyObject *c;
2139 CONVERT_BINOP(v, w, &a, &b);
2140 c = long_bitwise(a, '|', b);
2141 Py_DECREF(a);
2142 Py_DECREF(b);
2143 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002144}
2145
Guido van Rossum234f9421993-06-17 12:35:49 +00002146static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002147long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002148{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002149 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002150 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002151 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002152 return 0;
2153 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002154 else if (PyLong_Check(*pw)) {
2155 Py_INCREF(*pv);
2156 Py_INCREF(*pw);
2157 return 0;
2158 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002159 return 1; /* Can't do it */
2160}
2161
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002162static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002163long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002164{
2165 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002166 x = PyLong_AsLong(v);
2167 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002168 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002169 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002170}
2171
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002172static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002173long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002174{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002175 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002176 return v;
2177}
2178
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002179static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002180long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002181{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002182 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002183 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002184 if (result == -1.0 && PyErr_Occurred())
2185 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002186 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002187}
2188
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002189static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002190long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002191{
Fred Drake121ee271999-12-23 15:41:28 +00002192 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002193}
2194
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002195static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002196long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002197{
Fred Drake121ee271999-12-23 15:41:28 +00002198 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002199}
Guido van Rossumbef14172001-08-29 15:47:46 +00002200staticforward PyObject *
2201long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002202
Tim Peters6d6c1a32001-08-02 04:15:00 +00002203static PyObject *
2204long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2205{
2206 PyObject *x = NULL;
2207 int base = -909; /* unlikely! */
2208 static char *kwlist[] = {"x", "base", 0};
2209
Guido van Rossumbef14172001-08-29 15:47:46 +00002210 if (type != &PyLong_Type)
2211 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002212 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2213 &x, &base))
2214 return NULL;
2215 if (x == NULL)
2216 return PyLong_FromLong(0L);
2217 if (base == -909)
2218 return PyNumber_Long(x);
2219 else if (PyString_Check(x))
2220 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002221#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002222 else if (PyUnicode_Check(x))
2223 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2224 PyUnicode_GET_SIZE(x),
2225 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002226#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002227 else {
2228 PyErr_SetString(PyExc_TypeError,
2229 "long() can't convert non-string with explicit base");
2230 return NULL;
2231 }
2232}
2233
Guido van Rossumbef14172001-08-29 15:47:46 +00002234/* Wimpy, slow approach to tp_new calls for subtypes of long:
2235 first create a regular long from whatever arguments we got,
2236 then allocate a subtype instance and initialize it from
2237 the regular long. The regular long is then thrown away.
2238*/
2239static PyObject *
2240long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2241{
2242 PyLongObject *tmp, *new;
2243 int i, n;
2244
2245 assert(PyType_IsSubtype(type, &PyLong_Type));
2246 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2247 if (tmp == NULL)
2248 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002249 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002250 n = tmp->ob_size;
2251 if (n < 0)
2252 n = -n;
2253 new = (PyLongObject *)type->tp_alloc(type, n);
2254 if (new == NULL)
2255 return NULL;
2256 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002257 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002258 for (i = 0; i < n; i++)
2259 new->ob_digit[i] = tmp->ob_digit[i];
2260 Py_DECREF(tmp);
2261 return (PyObject *)new;
2262}
2263
Tim Peters6d6c1a32001-08-02 04:15:00 +00002264static char long_doc[] =
2265"long(x[, base]) -> integer\n\
2266\n\
2267Convert a string or number to a long integer, if possible. A floating\n\
2268point argument will be truncated towards zero (this does not include a\n\
2269string representation of a floating point number!) When converting a\n\
2270string, use the optional base. It is an error to supply a base when\n\
2271converting a non-string.";
2272
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002273static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002274 (binaryfunc) long_add, /*nb_add*/
2275 (binaryfunc) long_sub, /*nb_subtract*/
2276 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002277 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002278 (binaryfunc) long_mod, /*nb_remainder*/
2279 (binaryfunc) long_divmod, /*nb_divmod*/
2280 (ternaryfunc) long_pow, /*nb_power*/
2281 (unaryfunc) long_neg, /*nb_negative*/
2282 (unaryfunc) long_pos, /*tp_positive*/
2283 (unaryfunc) long_abs, /*tp_absolute*/
2284 (inquiry) long_nonzero, /*tp_nonzero*/
2285 (unaryfunc) long_invert, /*nb_invert*/
2286 (binaryfunc) long_lshift, /*nb_lshift*/
2287 (binaryfunc) long_rshift, /*nb_rshift*/
2288 (binaryfunc) long_and, /*nb_and*/
2289 (binaryfunc) long_xor, /*nb_xor*/
2290 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002291 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002292 (unaryfunc) long_int, /*nb_int*/
2293 (unaryfunc) long_long, /*nb_long*/
2294 (unaryfunc) long_float, /*nb_float*/
2295 (unaryfunc) long_oct, /*nb_oct*/
2296 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002297 0, /* nb_inplace_add */
2298 0, /* nb_inplace_subtract */
2299 0, /* nb_inplace_multiply */
2300 0, /* nb_inplace_divide */
2301 0, /* nb_inplace_remainder */
2302 0, /* nb_inplace_power */
2303 0, /* nb_inplace_lshift */
2304 0, /* nb_inplace_rshift */
2305 0, /* nb_inplace_and */
2306 0, /* nb_inplace_xor */
2307 0, /* nb_inplace_or */
2308 (binaryfunc)long_div, /* nb_floor_divide */
2309 long_true_divide, /* nb_true_divide */
2310 0, /* nb_inplace_floor_divide */
2311 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002312};
2313
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002314PyTypeObject PyLong_Type = {
2315 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002316 0, /* ob_size */
2317 "long", /* tp_name */
2318 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2319 sizeof(digit), /* tp_itemsize */
2320 (destructor)long_dealloc, /* tp_dealloc */
2321 0, /* tp_print */
2322 0, /* tp_getattr */
2323 0, /* tp_setattr */
2324 (cmpfunc)long_compare, /* tp_compare */
2325 (reprfunc)long_repr, /* tp_repr */
2326 &long_as_number, /* tp_as_number */
2327 0, /* tp_as_sequence */
2328 0, /* tp_as_mapping */
2329 (hashfunc)long_hash, /* tp_hash */
2330 0, /* tp_call */
2331 (reprfunc)long_str, /* tp_str */
2332 PyObject_GenericGetAttr, /* tp_getattro */
2333 0, /* tp_setattro */
2334 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002335 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2336 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002337 long_doc, /* tp_doc */
2338 0, /* tp_traverse */
2339 0, /* tp_clear */
2340 0, /* tp_richcompare */
2341 0, /* tp_weaklistoffset */
2342 0, /* tp_iter */
2343 0, /* tp_iternext */
2344 0, /* tp_methods */
2345 0, /* tp_members */
2346 0, /* tp_getset */
2347 0, /* tp_base */
2348 0, /* tp_dict */
2349 0, /* tp_descr_get */
2350 0, /* tp_descr_set */
2351 0, /* tp_dictoffset */
2352 0, /* tp_init */
2353 0, /* tp_alloc */
2354 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00002355 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002356};