blob: 5b7a00aa9fcf817b66f1fb1a6e753e10c07453aa [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) {
66 result->ob_size = i;
67 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
Tim Peters9cb0c382001-06-13 20:45:17 +0000697 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000698}
699
Tim Petersd1a7da62001-06-13 00:35:57 +0000700/* Get a C unsigned LONG_LONG int from a long int object.
701 Return -1 and set an error if overflow occurs. */
702
Guido van Rossum3293b071998-08-25 16:07:15 +0000703unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000704PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000705{
Tim Petersd1a7da62001-06-13 00:35:57 +0000706 unsigned LONG_LONG bytes;
707 int one = 1;
708 int res;
709
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000710 if (vv == NULL || !PyLong_Check(vv)) {
711 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000712 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000713 }
714
Tim Petersd1a7da62001-06-13 00:35:57 +0000715 res = _PyLong_AsByteArray(
716 (PyLongObject *)vv, (unsigned char *)&bytes,
717 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000718
Tim Peters9cb0c382001-06-13 20:45:17 +0000719 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000720}
Tim Petersd1a7da62001-06-13 00:35:57 +0000721
722#undef IS_LITTLE_ENDIAN
723
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000724#endif /* HAVE_LONG_LONG */
725
Neil Schemenauerba872e22001-01-04 01:46:03 +0000726
727static int
728convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
729 if (PyLong_Check(v)) {
730 *a = (PyLongObject *) v;
731 Py_INCREF(v);
732 }
733 else if (PyInt_Check(v)) {
734 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
735 }
736 else {
737 return 0;
738 }
739 if (PyLong_Check(w)) {
740 *b = (PyLongObject *) w;
741 Py_INCREF(w);
742 }
743 else if (PyInt_Check(w)) {
744 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
745 }
746 else {
747 Py_DECREF(*a);
748 return 0;
749 }
750 return 1;
751}
752
753#define CONVERT_BINOP(v, w, a, b) \
754 if (!convert_binop(v, w, a, b)) { \
755 Py_INCREF(Py_NotImplemented); \
756 return Py_NotImplemented; \
757 }
758
759
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000760/* Multiply by a single digit, ignoring the sign. */
761
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000762static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000763mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000764{
765 return muladd1(a, n, (digit)0);
766}
767
768/* Multiply by a single digit and add a single digit, ignoring the sign. */
769
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000771muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000772{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000773 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000774 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000775 twodigits carry = extra;
776 int i;
777
778 if (z == NULL)
779 return NULL;
780 for (i = 0; i < size_a; ++i) {
781 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000782 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000783 carry >>= SHIFT;
784 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000785 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000786 return long_normalize(z);
787}
788
Tim Peters212e6142001-07-14 12:23:19 +0000789/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
790 in pout, and returning the remainder. pin and pout point at the LSD.
791 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
792 long_format, but that should be done with great care since longs are
793 immutable. */
794
795static digit
796inplace_divrem1(digit *pout, digit *pin, int size, digit n)
797{
798 twodigits rem = 0;
799
800 assert(n > 0 && n <= MASK);
801 pin += size;
802 pout += size;
803 while (--size >= 0) {
804 digit hi;
805 rem = (rem << SHIFT) + *--pin;
806 *--pout = hi = (digit)(rem / n);
807 rem -= hi * n;
808 }
809 return (digit)rem;
810}
811
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000812/* Divide a long integer by a digit, returning both the quotient
813 (as function result) and the remainder (through *prem).
814 The sign of a is ignored; n should not be zero. */
815
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000817divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000818{
Tim Peters212e6142001-07-14 12:23:19 +0000819 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000820 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000821
822 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000824 if (z == NULL)
825 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000826 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000827 return long_normalize(z);
828}
829
830/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000831 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000832 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000833
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000835long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000836{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 register PyLongObject *a = (PyLongObject *)aa;
838 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000839 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000840 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000841 char *p;
842 int bits;
843 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000844
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000845 if (a == NULL || !PyLong_Check(a)) {
846 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000847 return NULL;
848 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000849 assert(base >= 2 && base <= 36);
850
851 /* Compute a rough upper bound for the length of the string */
852 i = base;
853 bits = 0;
854 while (i > 1) {
855 ++bits;
856 i >>= 1;
857 }
Fred Drake121ee271999-12-23 15:41:28 +0000858 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000859 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000860 if (str == NULL)
861 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000863 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000864 if (addL)
865 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000866 if (a->ob_size < 0)
867 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000868
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000869 if (a->ob_size == 0) {
870 *--p = '0';
871 }
872 else if ((base & (base - 1)) == 0) {
873 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000874 twodigits accum = 0;
875 int accumbits = 0; /* # of bits in accum */
876 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000877 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000878 while ((i >>= 1) > 1)
879 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000880
881 for (i = 0; i < size_a; ++i) {
882 accum |= a->ob_digit[i] << accumbits;
883 accumbits += SHIFT;
884 assert(accumbits >= basebits);
885 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000886 char cdigit = (char)(accum & (base - 1));
887 cdigit += (cdigit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000888 assert(p > PyString_AS_STRING(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000889 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +0000890 accumbits -= basebits;
891 accum >>= basebits;
892 } while (i < size_a-1 ? accumbits >= basebits :
893 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000894 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000895 }
896 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000897 /* Not 0, and base not a power of 2. Divide repeatedly by
898 base, but for speed use the highest power of base that
899 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000900 int size = size_a;
901 digit *pin = a->ob_digit;
902 PyLongObject *scratch;
903 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000904 digit powbase = base; /* powbase == base ** power */
905 int power = 1;
906 for (;;) {
907 unsigned long newpow = powbase * (unsigned long)base;
908 if (newpow >> SHIFT) /* doesn't fit in a digit */
909 break;
910 powbase = (digit)newpow;
911 ++power;
912 }
Tim Peters212e6142001-07-14 12:23:19 +0000913
914 /* Get a scratch area for repeated division. */
915 scratch = _PyLong_New(size);
916 if (scratch == NULL) {
917 Py_DECREF(str);
918 return NULL;
919 }
920
921 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000922 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000923 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000924 digit rem = inplace_divrem1(scratch->ob_digit,
925 pin, size, powbase);
926 pin = scratch->ob_digit; /* no need to use a again */
927 if (pin[size - 1] == 0)
928 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000929 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +0000930 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000931 Py_DECREF(str);
932 return NULL;
933 })
Tim Peters212e6142001-07-14 12:23:19 +0000934
935 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000936 assert(ntostore > 0);
937 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000938 digit nextrem = (digit)(rem / base);
939 char c = (char)(rem - nextrem * base);
940 assert(p > PyString_AS_STRING(str));
941 c += (c < 10) ? '0' : 'A'-10;
942 *--p = c;
943 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000944 --ntostore;
945 /* Termination is a bit delicate: must not
946 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +0000947 remaining quotient and rem are both 0. */
948 } while (ntostore && (size || rem));
949 } while (size != 0);
950 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000951 }
952
Guido van Rossum2c475421992-08-14 15:13:07 +0000953 if (base == 8) {
954 if (size_a != 0)
955 *--p = '0';
956 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000957 else if (base == 16) {
958 *--p = 'x';
959 *--p = '0';
960 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000961 else if (base != 10) {
962 *--p = '#';
963 *--p = '0' + base%10;
964 if (base > 10)
965 *--p = '0' + base/10;
966 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000967 if (sign)
968 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 if (p != PyString_AS_STRING(str)) {
970 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000971 assert(p > q);
972 do {
973 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000974 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 _PyString_Resize((PyObject **)&str,
976 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000977 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000979}
980
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000981PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000982PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000983{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000984 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000985 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000986 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000987
Guido van Rossum472c04f1996-12-05 21:57:21 +0000988 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000990 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000991 return NULL;
992 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000993 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000994 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000995 if (*str == '+')
996 ++str;
997 else if (*str == '-') {
998 ++str;
999 sign = -1;
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 (base == 0) {
1004 if (str[0] != '0')
1005 base = 10;
1006 else if (str[1] == 'x' || str[1] == 'X')
1007 base = 16;
1008 else
1009 base = 8;
1010 }
1011 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1012 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +00001014 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001015 for ( ; z != NULL; ++str) {
1016 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001018
1019 if (*str <= '9')
1020 k = *str - '0';
1021 else if (*str >= 'a')
1022 k = *str - 'a' + 10;
1023 else if (*str >= 'A')
1024 k = *str - 'A' + 10;
1025 if (k < 0 || k >= base)
1026 break;
1027 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001029 z = temp;
1030 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001031 if (z == NULL)
1032 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001033 if (str == start)
1034 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001035 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001036 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001037 if (*str == 'L' || *str == 'l')
1038 str++;
1039 while (*str && isspace(Py_CHARMASK(*str)))
1040 str++;
1041 if (*str != '\0')
1042 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001043 if (pend)
1044 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001046
1047 onError:
1048 PyErr_Format(PyExc_ValueError,
1049 "invalid literal for long(): %.200s", orig_str);
1050 Py_XDECREF(z);
1051 return NULL;
1052}
1053
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001054#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001055PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001056PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001057{
1058 char buffer[256];
1059
1060 if (length >= sizeof(buffer)) {
1061 PyErr_SetString(PyExc_ValueError,
1062 "long() literal too large to convert");
1063 return NULL;
1064 }
1065 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
1066 return NULL;
1067
1068 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001069}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001070#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001071
Tim Peters9f688bf2000-07-07 15:53:28 +00001072/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001073static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001074 (PyLongObject *, PyLongObject *, PyLongObject **);
1075static PyObject *long_pos(PyLongObject *);
1076static int long_divrem(PyLongObject *, PyLongObject *,
1077 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001078
1079/* Long division with remainder, top-level routine */
1080
Guido van Rossume32e0141992-01-19 16:31:05 +00001081static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001082long_divrem(PyLongObject *a, PyLongObject *b,
1083 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001084{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001085 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001087
1088 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001089 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001090 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001091 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001092 }
1093 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001094 (size_a == size_b &&
1095 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001096 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001097 *pdiv = _PyLong_New(0);
1098 Py_INCREF(a);
1099 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001100 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001101 }
1102 if (size_b == 1) {
1103 digit rem = 0;
1104 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001105 if (z == NULL)
1106 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001107 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001108 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001109 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001110 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001111 if (z == NULL)
1112 return -1;
1113 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001114 /* Set the signs.
1115 The quotient z has the sign of a*b;
1116 the remainder r has the sign of a,
1117 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001118 if ((a->ob_size < 0) != (b->ob_size < 0))
1119 z->ob_size = -(z->ob_size);
1120 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1121 (*prem)->ob_size = -((*prem)->ob_size);
1122 *pdiv = z;
1123 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001124}
1125
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001126/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001127
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001128static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001129x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001130{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001131 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001132 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133 PyLongObject *v = mul1(v1, d);
1134 PyLongObject *w = mul1(w1, d);
1135 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001136 int j, k;
1137
1138 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001139 Py_XDECREF(v);
1140 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001141 return NULL;
1142 }
1143
1144 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001145 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001146 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001147
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001148 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001149 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001150
1151 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1152 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1153 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001154 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001155 int i;
1156
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001157 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001158 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001159 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001160 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001161 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001162 if (vj == w->ob_digit[size_w-1])
1163 q = MASK;
1164 else
1165 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1166 w->ob_digit[size_w-1];
1167
1168 while (w->ob_digit[size_w-2]*q >
1169 ((
1170 ((twodigits)vj << SHIFT)
1171 + v->ob_digit[j-1]
1172 - q*w->ob_digit[size_w-1]
1173 ) << SHIFT)
1174 + v->ob_digit[j-2])
1175 --q;
1176
1177 for (i = 0; i < size_w && i+k < size_v; ++i) {
1178 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001179 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001180 carry += v->ob_digit[i+k] - z
1181 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001182 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001183 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1184 carry, SHIFT);
1185 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001186 }
1187
1188 if (i+k < size_v) {
1189 carry += v->ob_digit[i+k];
1190 v->ob_digit[i+k] = 0;
1191 }
1192
1193 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001194 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001195 else {
1196 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001197 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001198 carry = 0;
1199 for (i = 0; i < size_w && i+k < size_v; ++i) {
1200 carry += v->ob_digit[i+k] + w->ob_digit[i];
1201 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001202 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1203 BASE_TWODIGITS_TYPE,
1204 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001205 }
1206 }
1207 } /* for j, k */
1208
Guido van Rossumc206c761995-01-10 15:23:19 +00001209 if (a == NULL)
1210 *prem = NULL;
1211 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001212 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001213 *prem = divrem1(v, d, &d);
1214 /* d receives the (unused) remainder */
1215 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001217 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001218 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001219 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220 Py_DECREF(v);
1221 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001222 return a;
1223}
1224
1225/* Methods */
1226
1227static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001228long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001229{
Guido van Rossum9475a232001-10-05 20:51:39 +00001230 v->ob_type->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001231}
1232
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001233static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001234long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001235{
Fred Drake121ee271999-12-23 15:41:28 +00001236 return long_format(v, 10, 1);
1237}
1238
1239static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001240long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001241{
1242 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001243}
1244
1245static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001246long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001247{
1248 int sign;
1249
Guido van Rossumc6913e71991-11-19 20:26:46 +00001250 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001251 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001252 sign = 0;
1253 else
1254 sign = a->ob_size - b->ob_size;
1255 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001256 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001257 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001258 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1259 ;
1260 if (i < 0)
1261 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001262 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001263 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001264 if (a->ob_size < 0)
1265 sign = -sign;
1266 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001267 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001268 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001269}
1270
Guido van Rossum9bfef441993-03-29 10:43:31 +00001271static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001272long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001273{
1274 long x;
1275 int i, sign;
1276
1277 /* This is designed so that Python ints and longs with the
1278 same value hash to the same value, otherwise comparisons
1279 of mapping keys will turn out weird */
1280 i = v->ob_size;
1281 sign = 1;
1282 x = 0;
1283 if (i < 0) {
1284 sign = -1;
1285 i = -(i);
1286 }
1287 while (--i >= 0) {
1288 /* Force a 32-bit circular shift */
1289 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1290 x += v->ob_digit[i];
1291 }
1292 x = x * sign;
1293 if (x == -1)
1294 x = -2;
1295 return x;
1296}
1297
1298
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001299/* Add the absolute values of two long integers. */
1300
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001301static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001302x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001303{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001304 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001306 int i;
1307 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001308
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001309 /* Ensure a is the larger of the two: */
1310 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311 { PyLongObject *temp = a; a = b; b = temp; }
1312 { int size_temp = size_a;
1313 size_a = size_b;
1314 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001315 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001316 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001317 if (z == NULL)
1318 return NULL;
1319 for (i = 0; i < size_b; ++i) {
1320 carry += a->ob_digit[i] + b->ob_digit[i];
1321 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001322 carry >>= SHIFT;
1323 }
1324 for (; i < size_a; ++i) {
1325 carry += a->ob_digit[i];
1326 z->ob_digit[i] = carry & MASK;
1327 carry >>= SHIFT;
1328 }
1329 z->ob_digit[i] = carry;
1330 return long_normalize(z);
1331}
1332
1333/* Subtract the absolute values of two integers. */
1334
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001336x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001337{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001338 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001340 int i;
1341 int sign = 1;
1342 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001343
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001344 /* Ensure a is the larger of the two: */
1345 if (size_a < size_b) {
1346 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347 { PyLongObject *temp = a; a = b; b = temp; }
1348 { int size_temp = size_a;
1349 size_a = size_b;
1350 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001351 }
1352 else if (size_a == size_b) {
1353 /* Find highest digit where a and b differ: */
1354 i = size_a;
1355 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1356 ;
1357 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001359 if (a->ob_digit[i] < b->ob_digit[i]) {
1360 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001362 }
1363 size_a = size_b = i+1;
1364 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001365 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001366 if (z == NULL)
1367 return NULL;
1368 for (i = 0; i < size_b; ++i) {
1369 /* The following assumes unsigned arithmetic
1370 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001371 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001372 z->ob_digit[i] = borrow & MASK;
1373 borrow >>= SHIFT;
1374 borrow &= 1; /* Keep only one sign bit */
1375 }
1376 for (; i < size_a; ++i) {
1377 borrow = a->ob_digit[i] - borrow;
1378 z->ob_digit[i] = borrow & MASK;
1379 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001380 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001381 }
1382 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001383 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001384 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001385 return long_normalize(z);
1386}
1387
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001388static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001389long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001390{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001391 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001392
Neil Schemenauerba872e22001-01-04 01:46:03 +00001393 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1394
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001395 if (a->ob_size < 0) {
1396 if (b->ob_size < 0) {
1397 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001398 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001399 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001400 }
1401 else
1402 z = x_sub(b, a);
1403 }
1404 else {
1405 if (b->ob_size < 0)
1406 z = x_sub(a, b);
1407 else
1408 z = x_add(a, b);
1409 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001410 Py_DECREF(a);
1411 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001412 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001413}
1414
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001416long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001417{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001418 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001419
Neil Schemenauerba872e22001-01-04 01:46:03 +00001420 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1421
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001422 if (a->ob_size < 0) {
1423 if (b->ob_size < 0)
1424 z = x_sub(a, b);
1425 else
1426 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001427 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001428 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001429 }
1430 else {
1431 if (b->ob_size < 0)
1432 z = x_add(a, b);
1433 else
1434 z = x_sub(a, b);
1435 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001436 Py_DECREF(a);
1437 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001439}
1440
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001441static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001442long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001443{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001444 /* sequence * long */
1445 long n = PyLong_AsLong((PyObject *) w);
1446 if (n == -1 && PyErr_Occurred())
1447 return NULL;
1448 else
1449 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1450}
1451
1452static PyObject *
1453long_mul(PyLongObject *v, PyLongObject *w)
1454{
1455 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001456 int size_a;
1457 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001458 int i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001459
Guido van Rossum7e35d572001-09-15 03:14:32 +00001460 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
1461 if (!PyLong_Check(v) &&
1462 v->ob_type->tp_as_sequence &&
1463 v->ob_type->tp_as_sequence->sq_repeat)
1464 return long_repeat((PyObject *)v, w);
1465 if (!PyLong_Check(w) &&
1466 w->ob_type->tp_as_sequence &&
1467 w->ob_type->tp_as_sequence->sq_repeat)
1468 return long_repeat((PyObject *)w, v);
1469 Py_INCREF(Py_NotImplemented);
1470 return Py_NotImplemented;
1471 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001472
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001473 size_a = ABS(a->ob_size);
1474 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001475 if (size_a > size_b) {
1476 /* we are faster with the small object on the left */
1477 int hold_sa = size_a;
1478 PyLongObject *hold_a = a;
1479 size_a = size_b;
1480 size_b = hold_sa;
1481 a = b;
1482 b = hold_a;
1483 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001484 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001485 if (z == NULL) {
1486 Py_DECREF(a);
1487 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001488 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001489 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001490 for (i = 0; i < z->ob_size; ++i)
1491 z->ob_digit[i] = 0;
1492 for (i = 0; i < size_a; ++i) {
1493 twodigits carry = 0;
1494 twodigits f = a->ob_digit[i];
1495 int j;
1496
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001497 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001498 Py_DECREF(a);
1499 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001500 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001501 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001502 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001503 for (j = 0; j < size_b; ++j) {
1504 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001505 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001506 carry >>= SHIFT;
1507 }
1508 for (; carry != 0; ++j) {
1509 assert(i+j < z->ob_size);
1510 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001511 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001512 carry >>= SHIFT;
1513 }
1514 }
1515 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001516 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001517 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001518 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001519 Py_DECREF(a);
1520 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001521 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001522}
1523
Guido van Rossume32e0141992-01-19 16:31:05 +00001524/* The / and % operators are now defined in terms of divmod().
1525 The expression a mod b has the value a - b*floor(a/b).
1526 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001527 |a| by |b|, with the sign of a. This is also expressed
1528 as a - b*trunc(a/b), if trunc truncates towards zero.
1529 Some examples:
1530 a b a rem b a mod b
1531 13 10 3 3
1532 -13 10 -3 7
1533 13 -10 3 -7
1534 -13 -10 -3 -3
1535 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001536 have different signs. We then subtract one from the 'div'
1537 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001538
Guido van Rossume32e0141992-01-19 16:31:05 +00001539static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001540l_divmod(PyLongObject *v, PyLongObject *w,
1541 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001542{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001544
1545 if (long_divrem(v, w, &div, &mod) < 0)
1546 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001547 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1548 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001549 PyLongObject *temp;
1550 PyLongObject *one;
1551 temp = (PyLongObject *) long_add(mod, w);
1552 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001553 mod = temp;
1554 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001555 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001556 return -1;
1557 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001558 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001559 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001560 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1561 Py_DECREF(mod);
1562 Py_DECREF(div);
1563 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001564 return -1;
1565 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001566 Py_DECREF(one);
1567 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001568 div = temp;
1569 }
1570 *pdiv = div;
1571 *pmod = mod;
1572 return 0;
1573}
1574
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001575static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001576long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001577{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001578 PyLongObject *a, *b, *div, *mod;
1579
1580 CONVERT_BINOP(v, w, &a, &b);
1581
1582 if (l_divmod(a, b, &div, &mod) < 0) {
1583 Py_DECREF(a);
1584 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001585 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001586 }
1587 Py_DECREF(a);
1588 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001589 Py_DECREF(mod);
1590 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001591}
1592
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001593static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001594long_classic_div(PyObject *v, PyObject *w)
1595{
1596 PyLongObject *a, *b, *div, *mod;
1597
1598 CONVERT_BINOP(v, w, &a, &b);
1599
1600 if (Py_DivisionWarningFlag &&
1601 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1602 div = NULL;
1603 else if (l_divmod(a, b, &div, &mod) < 0)
1604 div = NULL;
1605 else
1606 Py_DECREF(mod);
1607
1608 Py_DECREF(a);
1609 Py_DECREF(b);
1610 return (PyObject *)div;
1611}
1612
1613static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00001614long_true_divide(PyObject *v, PyObject *w)
1615{
Tim Peterse2a60002001-09-04 06:17:36 +00001616 PyLongObject *a, *b;
1617 double ad, bd;
Tim Peters6f97e492001-11-04 23:09:40 +00001618 int aexp, bexp, failed;
Tim Peterse2a60002001-09-04 06:17:36 +00001619
1620 CONVERT_BINOP(v, w, &a, &b);
1621 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
1622 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00001623 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
1624 Py_DECREF(a);
1625 Py_DECREF(b);
1626 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00001627 return NULL;
1628
1629 if (bd == 0.0) {
1630 PyErr_SetString(PyExc_ZeroDivisionError,
1631 "long division or modulo by zero");
1632 return NULL;
1633 }
1634
1635 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
1636 ad /= bd; /* overflow/underflow impossible here */
1637 aexp -= bexp;
1638 if (aexp > INT_MAX / SHIFT)
1639 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00001640 else if (aexp < -(INT_MAX / SHIFT))
1641 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00001642 errno = 0;
1643 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00001644 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00001645 goto overflow;
1646 return PyFloat_FromDouble(ad);
1647
1648overflow:
1649 PyErr_SetString(PyExc_OverflowError,
1650 "long/long too large for a float");
1651 return NULL;
1652
Tim Peters20dab9f2001-09-04 05:31:47 +00001653}
1654
1655static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001656long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001657{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001658 PyLongObject *a, *b, *div, *mod;
1659
1660 CONVERT_BINOP(v, w, &a, &b);
1661
1662 if (l_divmod(a, b, &div, &mod) < 0) {
1663 Py_DECREF(a);
1664 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001665 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001666 }
1667 Py_DECREF(a);
1668 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001669 Py_DECREF(div);
1670 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001671}
1672
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001673static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001674long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001675{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001676 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001677 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001678
1679 CONVERT_BINOP(v, w, &a, &b);
1680
1681 if (l_divmod(a, b, &div, &mod) < 0) {
1682 Py_DECREF(a);
1683 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001684 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001685 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001686 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001687 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001688 PyTuple_SetItem(z, 0, (PyObject *) div);
1689 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001690 }
1691 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001692 Py_DECREF(div);
1693 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001694 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001695 Py_DECREF(a);
1696 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001697 return z;
1698}
1699
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001700static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001701long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001702{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001703 PyLongObject *a, *b;
1704 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001705 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001706 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001707
1708 CONVERT_BINOP(v, w, &a, &b);
1709 if (PyLong_Check(x) || Py_None == x) {
1710 c = x;
1711 Py_INCREF(x);
1712 }
1713 else if (PyInt_Check(x)) {
1714 c = PyLong_FromLong(PyInt_AS_LONG(x));
1715 }
1716 else {
1717 Py_DECREF(a);
1718 Py_DECREF(b);
1719 Py_INCREF(Py_NotImplemented);
1720 return Py_NotImplemented;
1721 }
Tim Peters4c483c42001-09-05 06:24:58 +00001722
1723 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
1724 PyErr_SetString(PyExc_ValueError,
1725 "pow() 3rd argument cannot be 0");
1726 z = NULL;
1727 goto error;
1728 }
1729
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001730 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001731 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001732 Py_DECREF(a);
1733 Py_DECREF(b);
1734 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00001735 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00001736 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
1737 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00001738 return NULL;
1739 }
1740 /* Return a float. This works because we know that
1741 this calls float_pow() which converts its
1742 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001743 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001744 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001745 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001746 for (i = 0; i < size_b; ++i) {
1747 digit bi = b->ob_digit[i];
1748 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001749
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001750 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001751 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001752
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001753 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001754 temp = (PyLongObject *)long_mul(z, a);
1755 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001756 if (c!=Py_None && temp!=NULL) {
1757 if (l_divmod(temp,(PyLongObject *)c,
1758 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001759 Py_DECREF(temp);
1760 z = NULL;
1761 goto error;
1762 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001763 Py_XDECREF(div);
1764 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001765 temp = mod;
1766 }
1767 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001768 if (z == NULL)
1769 break;
1770 }
1771 bi >>= 1;
1772 if (bi == 0 && i+1 == size_b)
1773 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001774 temp = (PyLongObject *)long_mul(a, a);
1775 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001776 if (c!=Py_None && temp!=NULL) {
1777 if (l_divmod(temp, (PyLongObject *)c, &div,
1778 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001779 Py_DECREF(temp);
1780 z = NULL;
1781 goto error;
1782 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001783 Py_XDECREF(div);
1784 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001785 temp = mod;
1786 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001787 a = temp;
1788 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001789 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001790 z = NULL;
1791 break;
1792 }
1793 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001794 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001795 break;
1796 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001797 if (c!=Py_None && z!=NULL) {
1798 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001799 Py_DECREF(z);
1800 z = NULL;
1801 }
1802 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001803 Py_XDECREF(div);
1804 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001805 z = mod;
1806 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001807 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001808 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001809 Py_XDECREF(a);
1810 Py_DECREF(b);
1811 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001812 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001813}
1814
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001815static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001816long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001817{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001818 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001819 PyLongObject *x;
1820 PyLongObject *w;
1821 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001822 if (w == NULL)
1823 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001824 x = (PyLongObject *) long_add(v, w);
1825 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001826 if (x == NULL)
1827 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00001828 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001829 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001830}
1831
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001832static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001833long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001834{
Tim Peters69c2de32001-09-11 22:31:33 +00001835 if (PyLong_CheckExact(v)) {
1836 Py_INCREF(v);
1837 return (PyObject *)v;
1838 }
1839 else
1840 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001841}
1842
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001843static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001844long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001845{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001846 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001847 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001848 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001849 Py_INCREF(v);
1850 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001851 }
Tim Peters69c2de32001-09-11 22:31:33 +00001852 z = (PyLongObject *)_PyLong_Copy(v);
1853 if (z != NULL)
1854 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001855 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001856}
1857
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001858static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001859long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001860{
1861 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001862 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00001863 else
1864 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001865}
1866
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001867static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001868long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001869{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001870 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001871}
1872
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001873static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001874long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001875{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001876 PyLongObject *a, *b;
1877 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001878 long shiftby;
1879 int newsize, wordshift, loshift, hishift, i, j;
1880 digit lomask, himask;
1881
Neil Schemenauerba872e22001-01-04 01:46:03 +00001882 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1883
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001884 if (a->ob_size < 0) {
1885 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001886 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001887 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001888 if (a1 == NULL)
1889 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001890 a2 = (PyLongObject *) long_rshift(a1, b);
1891 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001892 if (a2 == NULL)
1893 goto rshift_error;
1894 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001895 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001896 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001897 else {
1898
1899 shiftby = PyLong_AsLong((PyObject *)b);
1900 if (shiftby == -1L && PyErr_Occurred())
1901 goto rshift_error;
1902 if (shiftby < 0) {
1903 PyErr_SetString(PyExc_ValueError,
1904 "negative shift count");
1905 goto rshift_error;
1906 }
1907 wordshift = shiftby / SHIFT;
1908 newsize = ABS(a->ob_size) - wordshift;
1909 if (newsize <= 0) {
1910 z = _PyLong_New(0);
1911 Py_DECREF(a);
1912 Py_DECREF(b);
1913 return (PyObject *)z;
1914 }
1915 loshift = shiftby % SHIFT;
1916 hishift = SHIFT - loshift;
1917 lomask = ((digit)1 << hishift) - 1;
1918 himask = MASK ^ lomask;
1919 z = _PyLong_New(newsize);
1920 if (z == NULL)
1921 goto rshift_error;
1922 if (a->ob_size < 0)
1923 z->ob_size = -(z->ob_size);
1924 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1925 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1926 if (i+1 < newsize)
1927 z->ob_digit[i] |=
1928 (a->ob_digit[j+1] << hishift) & himask;
1929 }
1930 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001931 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001932rshift_error:
1933 Py_DECREF(a);
1934 Py_DECREF(b);
1935 return (PyObject *) z;
1936
Guido van Rossumc6913e71991-11-19 20:26:46 +00001937}
1938
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001939static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001940long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001941{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001942 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001943 PyLongObject *a, *b;
1944 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001945 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001946 int oldsize, newsize, wordshift, remshift, i, j;
1947 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001948
Neil Schemenauerba872e22001-01-04 01:46:03 +00001949 CONVERT_BINOP(v, w, &a, &b);
1950
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001951 shiftby = PyLong_AsLong((PyObject *)b);
1952 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001953 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001954 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001955 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001956 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001957 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001958 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001959 PyErr_SetString(PyExc_ValueError,
1960 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001961 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001962 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001963 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1964 wordshift = (int)shiftby / SHIFT;
1965 remshift = (int)shiftby - wordshift * SHIFT;
1966
1967 oldsize = ABS(a->ob_size);
1968 newsize = oldsize + wordshift;
1969 if (remshift)
1970 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001971 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001972 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001973 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001974 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001975 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001976 for (i = 0; i < wordshift; i++)
1977 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001978 accum = 0;
1979 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1980 accum |= a->ob_digit[j] << remshift;
1981 z->ob_digit[i] = (digit)(accum & MASK);
1982 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001983 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001984 if (remshift)
1985 z->ob_digit[newsize-1] = (digit)accum;
1986 else
1987 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001988 z = long_normalize(z);
1989lshift_error:
1990 Py_DECREF(a);
1991 Py_DECREF(b);
1992 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001993}
1994
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001995
1996/* Bitwise and/xor/or operations */
1997
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001998#define MAX(x, y) ((x) < (y) ? (y) : (x))
1999#define MIN(x, y) ((x) > (y) ? (y) : (x))
2000
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002001static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002002long_bitwise(PyLongObject *a,
2003 int op, /* '&', '|', '^' */
2004 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002005{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002006 digit maska, maskb; /* 0 or MASK */
2007 int negz;
2008 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002009 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002010 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002011 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002012 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002013
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002014 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002015 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002016 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002017 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002018 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002019 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002020 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002021 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002022 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002023 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002024 maskb = 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(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002028 maskb = 0;
2029 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00002030
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002031 negz = 0;
2032 switch (op) {
2033 case '^':
2034 if (maska != maskb) {
2035 maska ^= MASK;
2036 negz = -1;
2037 }
2038 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002039 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002040 if (maska && maskb) {
2041 op = '|';
2042 maska ^= MASK;
2043 maskb ^= MASK;
2044 negz = -1;
2045 }
2046 break;
2047 case '|':
2048 if (maska || maskb) {
2049 op = '&';
2050 maska ^= MASK;
2051 maskb ^= MASK;
2052 negz = -1;
2053 }
2054 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002055 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002056
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002057 /* JRH: The original logic here was to allocate the result value (z)
2058 as the longer of the two operands. However, there are some cases
2059 where the result is guaranteed to be shorter than that: AND of two
2060 positives, OR of two negatives: use the shorter number. AND with
2061 mixed signs: use the positive number. OR with mixed signs: use the
2062 negative number. After the transformations above, op will be '&'
2063 iff one of these cases applies, and mask will be non-0 for operands
2064 whose length should be ignored.
2065 */
2066
2067 size_a = a->ob_size;
2068 size_b = b->ob_size;
2069 size_z = op == '&'
2070 ? (maska
2071 ? size_b
2072 : (maskb ? size_a : MIN(size_a, size_b)))
2073 : MAX(size_a, size_b);
2074 z = _PyLong_New(size_z);
2075 if (a == NULL || b == NULL || z == NULL) {
2076 Py_XDECREF(a);
2077 Py_XDECREF(b);
2078 Py_XDECREF(z);
2079 return NULL;
2080 }
2081
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002082 for (i = 0; i < size_z; ++i) {
2083 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2084 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2085 switch (op) {
2086 case '&': z->ob_digit[i] = diga & digb; break;
2087 case '|': z->ob_digit[i] = diga | digb; break;
2088 case '^': z->ob_digit[i] = diga ^ digb; break;
2089 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002090 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002091
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002092 Py_DECREF(a);
2093 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002094 z = long_normalize(z);
2095 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002096 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002097 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002098 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002099 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002100}
2101
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002102static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002103long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002104{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002105 PyLongObject *a, *b;
2106 PyObject *c;
2107 CONVERT_BINOP(v, w, &a, &b);
2108 c = long_bitwise(a, '&', b);
2109 Py_DECREF(a);
2110 Py_DECREF(b);
2111 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002112}
2113
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002114static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002115long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002116{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002117 PyLongObject *a, *b;
2118 PyObject *c;
2119 CONVERT_BINOP(v, w, &a, &b);
2120 c = long_bitwise(a, '^', b);
2121 Py_DECREF(a);
2122 Py_DECREF(b);
2123 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002124}
2125
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002126static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002127long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002128{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002129 PyLongObject *a, *b;
2130 PyObject *c;
2131 CONVERT_BINOP(v, w, &a, &b);
2132 c = long_bitwise(a, '|', b);
2133 Py_DECREF(a);
2134 Py_DECREF(b);
2135 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002136}
2137
Guido van Rossum234f9421993-06-17 12:35:49 +00002138static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002139long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002140{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002141 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002142 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002143 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002144 return 0;
2145 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002146 else if (PyLong_Check(*pw)) {
2147 Py_INCREF(*pv);
2148 Py_INCREF(*pw);
2149 return 0;
2150 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002151 return 1; /* Can't do it */
2152}
2153
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002154static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002155long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002156{
2157 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002158 x = PyLong_AsLong(v);
2159 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002160 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002161 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002162}
2163
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002164static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002165long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002166{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002167 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002168 return v;
2169}
2170
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002171static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002172long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002173{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002174 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002175 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002176 if (result == -1.0 && PyErr_Occurred())
2177 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002178 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002179}
2180
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002181static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002182long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002183{
Fred Drake121ee271999-12-23 15:41:28 +00002184 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002185}
2186
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002187static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002188long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002189{
Fred Drake121ee271999-12-23 15:41:28 +00002190 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002191}
Guido van Rossumbef14172001-08-29 15:47:46 +00002192staticforward PyObject *
2193long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002194
Tim Peters6d6c1a32001-08-02 04:15:00 +00002195static PyObject *
2196long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2197{
2198 PyObject *x = NULL;
2199 int base = -909; /* unlikely! */
2200 static char *kwlist[] = {"x", "base", 0};
2201
Guido van Rossumbef14172001-08-29 15:47:46 +00002202 if (type != &PyLong_Type)
2203 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002204 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2205 &x, &base))
2206 return NULL;
2207 if (x == NULL)
2208 return PyLong_FromLong(0L);
2209 if (base == -909)
2210 return PyNumber_Long(x);
2211 else if (PyString_Check(x))
2212 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002213#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002214 else if (PyUnicode_Check(x))
2215 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2216 PyUnicode_GET_SIZE(x),
2217 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002218#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002219 else {
2220 PyErr_SetString(PyExc_TypeError,
2221 "long() can't convert non-string with explicit base");
2222 return NULL;
2223 }
2224}
2225
Guido van Rossumbef14172001-08-29 15:47:46 +00002226/* Wimpy, slow approach to tp_new calls for subtypes of long:
2227 first create a regular long from whatever arguments we got,
2228 then allocate a subtype instance and initialize it from
2229 the regular long. The regular long is then thrown away.
2230*/
2231static PyObject *
2232long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2233{
2234 PyLongObject *tmp, *new;
2235 int i, n;
2236
2237 assert(PyType_IsSubtype(type, &PyLong_Type));
2238 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2239 if (tmp == NULL)
2240 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002241 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002242 n = tmp->ob_size;
2243 if (n < 0)
2244 n = -n;
2245 new = (PyLongObject *)type->tp_alloc(type, n);
2246 if (new == NULL)
2247 return NULL;
2248 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002249 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002250 for (i = 0; i < n; i++)
2251 new->ob_digit[i] = tmp->ob_digit[i];
2252 Py_DECREF(tmp);
2253 return (PyObject *)new;
2254}
2255
Tim Peters6d6c1a32001-08-02 04:15:00 +00002256static char long_doc[] =
2257"long(x[, base]) -> integer\n\
2258\n\
2259Convert a string or number to a long integer, if possible. A floating\n\
2260point argument will be truncated towards zero (this does not include a\n\
2261string representation of a floating point number!) When converting a\n\
2262string, use the optional base. It is an error to supply a base when\n\
2263converting a non-string.";
2264
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002265static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002266 (binaryfunc) long_add, /*nb_add*/
2267 (binaryfunc) long_sub, /*nb_subtract*/
2268 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002269 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002270 (binaryfunc) long_mod, /*nb_remainder*/
2271 (binaryfunc) long_divmod, /*nb_divmod*/
2272 (ternaryfunc) long_pow, /*nb_power*/
2273 (unaryfunc) long_neg, /*nb_negative*/
2274 (unaryfunc) long_pos, /*tp_positive*/
2275 (unaryfunc) long_abs, /*tp_absolute*/
2276 (inquiry) long_nonzero, /*tp_nonzero*/
2277 (unaryfunc) long_invert, /*nb_invert*/
2278 (binaryfunc) long_lshift, /*nb_lshift*/
2279 (binaryfunc) long_rshift, /*nb_rshift*/
2280 (binaryfunc) long_and, /*nb_and*/
2281 (binaryfunc) long_xor, /*nb_xor*/
2282 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002283 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002284 (unaryfunc) long_int, /*nb_int*/
2285 (unaryfunc) long_long, /*nb_long*/
2286 (unaryfunc) long_float, /*nb_float*/
2287 (unaryfunc) long_oct, /*nb_oct*/
2288 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002289 0, /* nb_inplace_add */
2290 0, /* nb_inplace_subtract */
2291 0, /* nb_inplace_multiply */
2292 0, /* nb_inplace_divide */
2293 0, /* nb_inplace_remainder */
2294 0, /* nb_inplace_power */
2295 0, /* nb_inplace_lshift */
2296 0, /* nb_inplace_rshift */
2297 0, /* nb_inplace_and */
2298 0, /* nb_inplace_xor */
2299 0, /* nb_inplace_or */
2300 (binaryfunc)long_div, /* nb_floor_divide */
2301 long_true_divide, /* nb_true_divide */
2302 0, /* nb_inplace_floor_divide */
2303 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002304};
2305
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002306PyTypeObject PyLong_Type = {
2307 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002308 0, /* ob_size */
2309 "long", /* tp_name */
2310 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2311 sizeof(digit), /* tp_itemsize */
2312 (destructor)long_dealloc, /* tp_dealloc */
2313 0, /* tp_print */
2314 0, /* tp_getattr */
2315 0, /* tp_setattr */
2316 (cmpfunc)long_compare, /* tp_compare */
2317 (reprfunc)long_repr, /* tp_repr */
2318 &long_as_number, /* tp_as_number */
2319 0, /* tp_as_sequence */
2320 0, /* tp_as_mapping */
2321 (hashfunc)long_hash, /* tp_hash */
2322 0, /* tp_call */
2323 (reprfunc)long_str, /* tp_str */
2324 PyObject_GenericGetAttr, /* tp_getattro */
2325 0, /* tp_setattro */
2326 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002327 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2328 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002329 long_doc, /* tp_doc */
2330 0, /* tp_traverse */
2331 0, /* tp_clear */
2332 0, /* tp_richcompare */
2333 0, /* tp_weaklistoffset */
2334 0, /* tp_iter */
2335 0, /* tp_iternext */
2336 0, /* tp_methods */
2337 0, /* tp_members */
2338 0, /* tp_getset */
2339 0, /* tp_base */
2340 0, /* tp_dict */
2341 0, /* tp_descr_get */
2342 0, /* tp_descr_set */
2343 0, /* tp_dictoffset */
2344 0, /* tp_init */
2345 0, /* tp_alloc */
2346 long_new, /* tp_new */
Guido van Rossum9475a232001-10-05 20:51:39 +00002347 _PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002348};