blob: 17af671d6ba3810a9b5d4a59539b87f407bc64ba [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 Rossumedcc38a1991-05-05 20:09:44 +00009#include <assert.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000010#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011
Guido van Rossume32e0141992-01-19 16:31:05 +000012#define ABS(x) ((x) < 0 ? -(x) : (x))
13
14/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000015static PyLongObject *long_normalize(PyLongObject *);
16static PyLongObject *mul1(PyLongObject *, wdigit);
17static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
18static PyLongObject *divrem1(PyLongObject *, wdigit, digit *);
19static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000020
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000021static int ticker; /* XXX Could be shared with ceval? */
22
Guido van Rossumc0b618a1997-05-02 03:12:38 +000023#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000024 if (--ticker < 0) { \
25 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000026 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000027 }
28
Guido van Rossumedcc38a1991-05-05 20:09:44 +000029/* Normalize (remove leading zeros from) a long int object.
30 Doesn't attempt to free the storage--in most cases, due to the nature
31 of the algorithms used, this could save at most be one word anyway. */
32
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000034long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000035{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000036 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000037 register int i = j;
38
39 while (i > 0 && v->ob_digit[i-1] == 0)
40 --i;
41 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000042 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000043 return v;
44}
45
46/* Allocate a new long int object with size digits.
47 Return NULL and set exception if we run out of memory. */
48
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000050_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000051{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000053}
54
55/* Create a new long int object from a C long int */
56
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000058PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000059{
Guido van Rossum472c04f1996-12-05 21:57:21 +000060 /* Assume a C long fits in at most 5 'digits' */
61 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 PyLongObject *v = _PyLong_New(5);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000063 if (v != NULL) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000064 unsigned long t = ival;
65 int i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000066 if (ival < 0) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000067 t = -ival;
Guido van Rossum4c260ff1992-01-14 18:36:43 +000068 v->ob_size = -(v->ob_size);
Guido van Rossum472c04f1996-12-05 21:57:21 +000069 }
70 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +000071 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000072 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000073 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000074 v = long_normalize(v);
75 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000076 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000077}
78
Guido van Rossum53756b11997-01-03 17:14:46 +000079/* Create a new long int object from a C unsigned long int */
80
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000082PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +000083{
84 /* Assume a C long fits in at most 5 'digits' */
85 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 PyLongObject *v = _PyLong_New(5);
Guido van Rossum53756b11997-01-03 17:14:46 +000087 if (v != NULL) {
88 unsigned long t = ival;
89 int i;
90 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +000091 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum53756b11997-01-03 17:14:46 +000092 t >>= SHIFT;
93 }
94 v = long_normalize(v);
95 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +000097}
98
Guido van Rossum149e9ea1991-06-03 10:58:24 +000099/* Create a new long int object from a C double */
100
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000103{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000104 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000105 double frac;
106 int i, ndig, expo, neg;
107 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000108 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000109 PyErr_SetString(PyExc_OverflowError,
110 "cannot convert float infinity to long");
111 return NULL;
112 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000113 if (dval < 0.0) {
114 neg = 1;
115 dval = -dval;
116 }
117 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
118 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000120 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000122 if (v == NULL)
123 return NULL;
124 frac = ldexp(frac, (expo-1) % SHIFT + 1);
125 for (i = ndig; --i >= 0; ) {
126 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000127 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000128 frac = frac - (double)bits;
129 frac = ldexp(frac, SHIFT);
130 }
131 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000132 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000134}
135
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000136/* Get a C long int from a long int object.
137 Returns -1 and sets an error condition if overflow occurs. */
138
139long
Tim Peters9f688bf2000-07-07 15:53:28 +0000140PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000141{
Guido van Rossumf7531811998-05-26 14:33:37 +0000142 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000144 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000145 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000146
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 if (vv == NULL || !PyLong_Check(vv)) {
148 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000149 return -1;
150 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000152 i = v->ob_size;
153 sign = 1;
154 x = 0;
155 if (i < 0) {
156 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000157 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000158 }
159 while (--i >= 0) {
160 prev = x;
161 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000162 if ((x >> SHIFT) != prev)
163 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000164 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000165 /* Haven't lost any bits, but if the sign bit is set we're in
166 * trouble *unless* this is the min negative number. So,
167 * trouble iff sign bit set && (positive || some bit set other
168 * than the sign bit).
169 */
170 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
171 goto overflow;
172 return (long)x * sign;
173
174 overflow:
175 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000176 "long int too large to convert");
Guido van Rossumf7531811998-05-26 14:33:37 +0000177 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000178}
179
Guido van Rossum53756b11997-01-03 17:14:46 +0000180/* Get a C long int from a long int object.
181 Returns -1 and sets an error condition if overflow occurs. */
182
183unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000184PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000185{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000187 unsigned long x, prev;
188 int i;
189
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190 if (vv == NULL || !PyLong_Check(vv)) {
191 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000192 return (unsigned long) -1;
193 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000195 i = v->ob_size;
196 x = 0;
197 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000199 "can't convert negative value to unsigned long");
200 return (unsigned long) -1;
201 }
202 while (--i >= 0) {
203 prev = x;
204 x = (x << SHIFT) + v->ob_digit[i];
205 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000207 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000208 return (unsigned long) -1;
209 }
210 }
211 return x;
212}
213
Tim Peters2a9b3672001-06-11 21:23:58 +0000214PyObject *
215_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
216 int little_endian, int is_signed)
217{
218 const unsigned char* pstartbyte;/* LSB of bytes */
219 int incr; /* direction to move pstartbyte */
220 const unsigned char* pendbyte; /* MSB of bytes */
221 size_t numsignificantbytes; /* number of bytes that matter */
222 size_t ndigits; /* number of Python long digits */
223 PyLongObject* v; /* result */
224 int idigit = 0; /* next free index in v->ob_digit */
225
226 if (n == 0)
227 return PyLong_FromLong(0L);
228
229 if (little_endian) {
230 pstartbyte = bytes;
231 pendbyte = bytes + n - 1;
232 incr = 1;
233 }
234 else {
235 pstartbyte = bytes + n - 1;
236 pendbyte = bytes;
237 incr = -1;
238 }
239
240 if (is_signed)
241 is_signed = *pendbyte >= 0x80;
242
243 /* Compute numsignificantbytes. This consists of finding the most
244 significant byte. Leading 0 bytes are insignficant if the number
245 is positive, and leading 0xff bytes if negative. */
246 {
247 size_t i;
248 const unsigned char* p = pendbyte;
249 const int pincr = -incr; /* search MSB to LSB */
250 const unsigned char insignficant = is_signed ? 0xff : 0x00;
251
252 for (i = 0; i < n; ++i, p += pincr) {
253 if (*p != insignficant)
254 break;
255 }
256 numsignificantbytes = n - i;
257 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
258 actually has 2 significant bytes. OTOH, 0xff0001 ==
259 -0x00ffff, so we wouldn't *need* to bump it there; but we
260 do for 0xffff = -0x0001. To be safe without bothering to
261 check every case, bump it regardless. */
262 if (is_signed && numsignificantbytes < n)
263 ++numsignificantbytes;
264 }
265
266 /* How many Python long digits do we need? We have
267 8*numsignificantbytes bits, and each Python long digit has SHIFT
268 bits, so it's the ceiling of the quotient. */
269 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
270 if (ndigits > (size_t)INT_MAX)
271 return PyErr_NoMemory();
272 v = _PyLong_New((int)ndigits);
273 if (v == NULL)
274 return NULL;
275
276 /* Copy the bits over. The tricky parts are computing 2's-comp on
277 the fly for signed numbers, and dealing with the mismatch between
278 8-bit bytes and (probably) 15-bit Python digits.*/
279 {
280 size_t i;
281 unsigned int carry = 1; /* for 2's-comp calculation */
282 twodigits accum = 0; /* sliding register */
283 unsigned int accumbits = 0; /* number of bits in accum */
284 const unsigned char* p = pstartbyte;
285
286 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000287 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000288 /* Compute correction for 2's comp, if needed. */
289 if (is_signed) {
290 thisbyte = (0xff ^ thisbyte) + carry;
291 carry = thisbyte >> 8;
292 thisbyte &= 0xff;
293 }
294 /* Because we're going LSB to MSB, thisbyte is
295 more significant than what's already in accum,
296 so needs to be prepended to accum. */
297 accum |= thisbyte << accumbits;
298 accumbits += 8;
299 if (accumbits >= SHIFT) {
300 /* There's enough to fill a Python digit. */
301 assert(idigit < (int)ndigits);
302 v->ob_digit[idigit] = (digit)(accum & MASK);
303 ++idigit;
304 accum >>= SHIFT;
305 accumbits -= SHIFT;
306 assert(accumbits < SHIFT);
307 }
308 }
309 assert(accumbits < SHIFT);
310 if (accumbits) {
311 assert(idigit < (int)ndigits);
312 v->ob_digit[idigit] = (digit)accum;
313 ++idigit;
314 }
315 }
316
317 v->ob_size = is_signed ? -idigit : idigit;
318 return (PyObject *)long_normalize(v);
319}
320
321int
322_PyLong_AsByteArray(PyLongObject* v,
323 unsigned char* bytes, size_t n,
324 int little_endian, int is_signed)
325{
326 int i; /* index into v->ob_digit */
327 int ndigits; /* |v->ob_size| */
328 twodigits accum; /* sliding register */
329 unsigned int accumbits; /* # bits in accum */
330 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
331 twodigits carry; /* for computing 2's-comp */
332 size_t j; /* # bytes filled */
333 unsigned char* p; /* pointer to next byte in bytes */
334 int pincr; /* direction to move p */
335
336 assert(v != NULL && PyLong_Check(v));
337
338 if (v->ob_size < 0) {
339 ndigits = -(v->ob_size);
340 if (!is_signed) {
341 PyErr_SetString(PyExc_TypeError,
342 "can't convert negative long to unsigned");
343 return -1;
344 }
345 do_twos_comp = 1;
346 }
347 else {
348 ndigits = v->ob_size;
349 do_twos_comp = 0;
350 }
351
352 if (little_endian) {
353 p = bytes;
354 pincr = 1;
355 }
356 else {
357 p = bytes + n - 1;
358 pincr = -1;
359 }
360
361 /* Copy over all the Python digits. */
362 j = 0;
363 accum = 0;
364 accumbits = 0;
365 carry = do_twos_comp ? 1 : 0;
366 for (i = 0; i < ndigits; ++i) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000367 unsigned int numnewbits = SHIFT;
Tim Peters2a9b3672001-06-11 21:23:58 +0000368 twodigits thisdigit = v->ob_digit[i];
369 if (do_twos_comp) {
370 thisdigit = (thisdigit ^ MASK) + carry;
371 carry = thisdigit >> SHIFT;
372 thisdigit &= MASK;
373 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000374 /* Because we're going LSB to MSB, thisdigit is more
375 significant than what's already in accum, so needs to be
376 prepended to accum. */
377 accum |= thisdigit << accumbits;
378
379 /* How many new bits did we add? The most-significant digit
380 may be (probably is) at least partly empty. */
381 if (i == ndigits - 1) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000382 twodigits bitmask = 1 << (SHIFT - 1);
383 twodigits signbit = do_twos_comp << (SHIFT - 1);
384 unsigned int nsignbits = 0;
385 while ((thisdigit & bitmask) == signbit && bitmask) {
386 ++nsignbits;
387 bitmask >>= 1;
388 signbit >>= 1;
389 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000390 assert(nsignbits <= SHIFT);
391 numnewbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000392 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000393 accumbits += numnewbits;
394
Tim Peters2a9b3672001-06-11 21:23:58 +0000395 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000396 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000397 if (j >= n)
398 goto Overflow;
399 ++j;
400 *p = (unsigned char)(accum & 0xff);
401 p += pincr;
402 accumbits -= 8;
403 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000404 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000405 }
406
407 /* Store the straggler (if any). */
408 assert(accumbits < 8);
409 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000410 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000411 if (j >= n)
412 goto Overflow;
413 ++j;
414 if (do_twos_comp) {
415 /* Fill leading bits of the byte with sign bits
416 (appropriately pretending that the long had an
417 infinite supply of sign bits). */
418 accum |= (~(twodigits)0) << accumbits;
419 }
420 *p = (unsigned char)(accum & 0xff);
421 p += pincr;
422 }
423
424 /* Fill remaining bytes with copies of the sign bit. */
425 for ( ; j < n; ++j, p += pincr)
426 *p = (unsigned char)(do_twos_comp ? 0xff : 0);
427
428 /* Check for delicate overflow (not enough room for the sign bit). */
429 if (j > 0 && is_signed) {
430 unsigned char msb = *(p - pincr);
431 int sign_bit_set = (msb & 0x80) != 0;
432 if (sign_bit_set != do_twos_comp)
433 goto Overflow;
434 }
435 return 0;
436
437Overflow:
438 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
439 return -1;
440
441}
442
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000443/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000444
445double
Tim Peters9f688bf2000-07-07 15:53:28 +0000446PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000447{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000449 double x;
450 double multiplier = (double) (1L << SHIFT);
451 int i, sign;
452
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453 if (vv == NULL || !PyLong_Check(vv)) {
454 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000455 return -1;
456 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000458 i = v->ob_size;
459 sign = 1;
460 x = 0.0;
461 if (i < 0) {
462 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000463 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000464 }
465 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000466 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000467 }
468 return x * sign;
469}
470
Guido van Rossum78694d91998-09-18 14:14:13 +0000471/* Create a new long (or int) object from a C pointer */
472
473PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000474PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000475{
476#if SIZEOF_VOID_P == SIZEOF_LONG
477 return PyInt_FromLong((long)p);
478#else
479 /* optimize null pointers */
480 if ( p == NULL )
481 return PyInt_FromLong(0);
482
483 /* we can assume that HAVE_LONG_LONG is true. if not, then the
484 configuration process should have bailed (having big pointers
485 without long longs seems non-sensical) */
486 return PyLong_FromLongLong((LONG_LONG)p);
487#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
488}
489
490/* Get a C pointer from a long object (or an int object in some cases) */
491
492void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000493PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000494{
495 /* This function will allow int or long objects. If vv is neither,
496 then the PyLong_AsLong*() functions will raise the exception:
497 PyExc_SystemError, "bad argument to internal function"
498 */
499
500#if SIZEOF_VOID_P == SIZEOF_LONG
501 long x;
502
503 if ( PyInt_Check(vv) )
504 x = PyInt_AS_LONG(vv);
505 else
506 x = PyLong_AsLong(vv);
507#else
508 /* we can assume that HAVE_LONG_LONG is true. if not, then the
509 configuration process should have bailed (having big pointers
510 without long longs seems non-sensical) */
511 LONG_LONG x;
512
513 if ( PyInt_Check(vv) )
514 x = PyInt_AS_LONG(vv);
515 else
516 x = PyLong_AsLongLong(vv);
517#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
518
519 if (x == -1 && PyErr_Occurred())
520 return NULL;
521 return (void *)x;
522}
523
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000524#ifdef HAVE_LONG_LONG
525/*
Guido van Rossum3293b071998-08-25 16:07:15 +0000526 * LONG_LONG support by Chris Herborth (chrish@qnx.com)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000527 *
528 * For better or worse :-), I tried to follow the coding style already
529 * here.
530 */
531
Guido van Rossum3293b071998-08-25 16:07:15 +0000532/* Create a new long int object from a C LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000533
534PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000535PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000536{
537#if SIZEOF_LONG_LONG == SIZEOF_LONG
538 /* In case the compiler is faking it. */
539 return PyLong_FromLong( (long)ival );
540#else
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000541 if ((LONG_LONG)LONG_MIN <= ival && ival <= (LONG_LONG)LONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000542 return PyLong_FromLong( (long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000543 }
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000544 else if (0 <= ival && ival <= (unsigned LONG_LONG)ULONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000545 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000546 }
547 else {
Guido van Rossum3293b071998-08-25 16:07:15 +0000548 /* Assume a C LONG_LONG fits in at most 10 'digits'.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000549 * Should be OK if we're assuming long fits in 5.
550 */
551 PyLongObject *v = _PyLong_New(10);
552
553 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000554 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000555 int i;
556 if (ival < 0) {
557 t = -ival;
558 v->ob_size = -(v->ob_size);
559 }
560
561 for (i = 0; i < 10; i++) {
562 v->ob_digit[i] = (digit) (t & MASK);
563 t >>= SHIFT;
564 }
565
566 v = long_normalize(v);
567 }
568
569 return (PyObject *)v;
570 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000571#endif
572}
573
Guido van Rossum3293b071998-08-25 16:07:15 +0000574/* Create a new long int object from a C unsigned LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000575PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000576PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000577{
578#if SIZEOF_LONG_LONG == SIZEOF_LONG
579 /* In case the compiler is faking it. */
580 return PyLong_FromUnsignedLong( (unsigned long)ival );
581#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000582 if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000583 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000584 }
585 else {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000586 /* Assume a C long fits in at most 10 'digits'. */
587 PyLongObject *v = _PyLong_New(10);
588
589 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000590 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000591 int i;
592 for (i = 0; i < 10; i++) {
593 v->ob_digit[i] = (digit) (t & MASK);
594 t >>= SHIFT;
595 }
596
597 v = long_normalize(v);
598 }
599
600 return (PyObject *)v;
601 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000602#endif
603}
604
Guido van Rossum3293b071998-08-25 16:07:15 +0000605/* Get a C LONG_LONG int from a long int object.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000606 Returns -1 and sets an error condition if overflow occurs. */
607
Guido van Rossum3293b071998-08-25 16:07:15 +0000608LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000609PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000610{
611#if SIZEOF_LONG_LONG == SIZEOF_LONG
612 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000613 return (LONG_LONG)PyLong_AsLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000614#else
615 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000616 LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000617 int i, sign;
618
619 if (vv == NULL || !PyLong_Check(vv)) {
620 PyErr_BadInternalCall();
621 return -1;
622 }
623
624 v = (PyLongObject *)vv;
625 i = v->ob_size;
626 sign = 1;
627 x = 0;
628
629 if (i < 0) {
630 sign = -1;
631 i = -(i);
632 }
633
634 while (--i >= 0) {
635 prev = x;
636 x = (x << SHIFT) + v->ob_digit[i];
637 if ((x >> SHIFT) != prev) {
638 PyErr_SetString(PyExc_OverflowError,
639 "long int too long to convert");
640 return -1;
641 }
642 }
643
644 return x * sign;
645#endif
646}
647
Guido van Rossum3293b071998-08-25 16:07:15 +0000648unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000649PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000650{
651#if SIZEOF_LONG_LONG == 4
652 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000653 return (unsigned LONG_LONG)PyLong_AsUnsignedLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000654#else
655 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000656 unsigned LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000657 int i;
658
659 if (vv == NULL || !PyLong_Check(vv)) {
660 PyErr_BadInternalCall();
Guido van Rossum3293b071998-08-25 16:07:15 +0000661 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000662 }
663
664 v = (PyLongObject *)vv;
665 i = v->ob_size;
666 x = 0;
667
668 if (i < 0) {
669 PyErr_SetString(PyExc_OverflowError,
670 "can't convert negative value to unsigned long");
Guido van Rossum3293b071998-08-25 16:07:15 +0000671 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000672 }
673
674 while (--i >= 0) {
675 prev = x;
676 x = (x << SHIFT) + v->ob_digit[i];
677 if ((x >> SHIFT) != prev) {
678 PyErr_SetString(PyExc_OverflowError,
679 "long int too long to convert");
Guido van Rossum3293b071998-08-25 16:07:15 +0000680 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000681 }
682 }
683
684 return x;
685#endif
686}
687#endif /* HAVE_LONG_LONG */
688
Neil Schemenauerba872e22001-01-04 01:46:03 +0000689
690static int
691convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
692 if (PyLong_Check(v)) {
693 *a = (PyLongObject *) v;
694 Py_INCREF(v);
695 }
696 else if (PyInt_Check(v)) {
697 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
698 }
699 else {
700 return 0;
701 }
702 if (PyLong_Check(w)) {
703 *b = (PyLongObject *) w;
704 Py_INCREF(w);
705 }
706 else if (PyInt_Check(w)) {
707 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
708 }
709 else {
710 Py_DECREF(*a);
711 return 0;
712 }
713 return 1;
714}
715
716#define CONVERT_BINOP(v, w, a, b) \
717 if (!convert_binop(v, w, a, b)) { \
718 Py_INCREF(Py_NotImplemented); \
719 return Py_NotImplemented; \
720 }
721
722
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000723/* Multiply by a single digit, ignoring the sign. */
724
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000726mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000727{
728 return muladd1(a, n, (digit)0);
729}
730
731/* Multiply by a single digit and add a single digit, ignoring the sign. */
732
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000733static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000734muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000735{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000736 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000738 twodigits carry = extra;
739 int i;
740
741 if (z == NULL)
742 return NULL;
743 for (i = 0; i < size_a; ++i) {
744 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000745 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000746 carry >>= SHIFT;
747 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000748 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000749 return long_normalize(z);
750}
751
752/* Divide a long integer by a digit, returning both the quotient
753 (as function result) and the remainder (through *prem).
754 The sign of a is ignored; n should not be zero. */
755
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000757divrem1(PyLongObject *a, wdigit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000758{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000759 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000761 int i;
762 twodigits rem = 0;
763
764 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000766 if (z == NULL)
767 return NULL;
768 for (i = size; --i >= 0; ) {
769 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000770 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000771 rem %= n;
772 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000773 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000774 return long_normalize(z);
775}
776
777/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000778 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000779 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000780
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000782long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000783{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784 register PyLongObject *a = (PyLongObject *)aa;
785 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000786 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000787 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000788 char *p;
789 int bits;
790 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000791
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792 if (a == NULL || !PyLong_Check(a)) {
793 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000794 return NULL;
795 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000796 assert(base >= 2 && base <= 36);
797
798 /* Compute a rough upper bound for the length of the string */
799 i = base;
800 bits = 0;
801 while (i > 1) {
802 ++bits;
803 i >>= 1;
804 }
Fred Drake121ee271999-12-23 15:41:28 +0000805 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000807 if (str == NULL)
808 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000810 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000811 if (addL)
812 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000813 if (a->ob_size < 0)
814 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000815
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000816 if (a->ob_size == 0) {
817 *--p = '0';
818 }
819 else if ((base & (base - 1)) == 0) {
820 /* JRH: special case for power-of-2 bases */
821 twodigits temp = a->ob_digit[0];
822 int bitsleft = SHIFT;
823 int rem;
824 int last = abs(a->ob_size);
825 int basebits = 1;
826 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000827 while ((i >>= 1) > 1)
828 ++basebits;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000829
830 i = 0;
831 for (;;) {
832 while (bitsleft >= basebits) {
833 if ((temp == 0) && (i >= last - 1)) break;
834 rem = temp & (base - 1);
835 if (rem < 10)
836 rem += '0';
837 else
838 rem += 'A' - 10;
839 assert(p > PyString_AS_STRING(str));
840 *--p = (char) rem;
841 bitsleft -= basebits;
842 temp >>= basebits;
843 }
844 if (++i >= last) {
845 if (temp == 0) break;
846 bitsleft = 99;
847 /* loop again to pick up final digits */
848 }
849 else {
850 temp = (a->ob_digit[i] << bitsleft) | temp;
851 bitsleft += SHIFT;
852 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000853 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000854 }
855 else {
856 Py_INCREF(a);
857 do {
858 digit rem;
859 PyLongObject *temp = divrem1(a, (digit)base, &rem);
860 if (temp == NULL) {
861 Py_DECREF(a);
862 Py_DECREF(str);
863 return NULL;
864 }
865 if (rem < 10)
866 rem += '0';
867 else
868 rem += 'A'-10;
869 assert(p > PyString_AS_STRING(str));
870 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000871 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000872 a = temp;
873 SIGCHECK({
874 Py_DECREF(a);
875 Py_DECREF(str);
876 return NULL;
877 })
878 } while (ABS(a->ob_size) != 0);
879 Py_DECREF(a);
880 }
881
Guido van Rossum2c475421992-08-14 15:13:07 +0000882 if (base == 8) {
883 if (size_a != 0)
884 *--p = '0';
885 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000886 else if (base == 16) {
887 *--p = 'x';
888 *--p = '0';
889 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000890 else if (base != 10) {
891 *--p = '#';
892 *--p = '0' + base%10;
893 if (base > 10)
894 *--p = '0' + base/10;
895 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000896 if (sign)
897 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000898 if (p != PyString_AS_STRING(str)) {
899 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000900 assert(p > q);
901 do {
902 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000903 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 _PyString_Resize((PyObject **)&str,
905 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000906 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000908}
909
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000910PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000911PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000912{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000913 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000914 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000916
Guido van Rossum472c04f1996-12-05 21:57:21 +0000917 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000919 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000920 return NULL;
921 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000922 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000923 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000924 if (*str == '+')
925 ++str;
926 else if (*str == '-') {
927 ++str;
928 sign = -1;
929 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000930 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000931 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000932 if (base == 0) {
933 if (str[0] != '0')
934 base = 10;
935 else if (str[1] == 'x' || str[1] == 'X')
936 base = 16;
937 else
938 base = 8;
939 }
940 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
941 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000943 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000944 for ( ; z != NULL; ++str) {
945 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000947
948 if (*str <= '9')
949 k = *str - '0';
950 else if (*str >= 'a')
951 k = *str - 'a' + 10;
952 else if (*str >= 'A')
953 k = *str - 'A' + 10;
954 if (k < 0 || k >= base)
955 break;
956 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000958 z = temp;
959 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000960 if (z == NULL)
961 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000962 if (str == start)
963 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000964 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000965 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000966 if (*str == 'L' || *str == 'l')
967 str++;
968 while (*str && isspace(Py_CHARMASK(*str)))
969 str++;
970 if (*str != '\0')
971 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000972 if (pend)
973 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000975
976 onError:
977 PyErr_Format(PyExc_ValueError,
978 "invalid literal for long(): %.200s", orig_str);
979 Py_XDECREF(z);
980 return NULL;
981}
982
983PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000984PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000985{
986 char buffer[256];
987
988 if (length >= sizeof(buffer)) {
989 PyErr_SetString(PyExc_ValueError,
990 "long() literal too large to convert");
991 return NULL;
992 }
993 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
994 return NULL;
995
996 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000997}
998
Tim Peters9f688bf2000-07-07 15:53:28 +0000999/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001000static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001001 (PyLongObject *, PyLongObject *, PyLongObject **);
1002static PyObject *long_pos(PyLongObject *);
1003static int long_divrem(PyLongObject *, PyLongObject *,
1004 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001005
1006/* Long division with remainder, top-level routine */
1007
Guido van Rossume32e0141992-01-19 16:31:05 +00001008static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001009long_divrem(PyLongObject *a, PyLongObject *b,
1010 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001011{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001012 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001014
1015 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001016 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001017 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001018 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001019 }
1020 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001021 (size_a == size_b &&
1022 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001023 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001024 *pdiv = _PyLong_New(0);
1025 Py_INCREF(a);
1026 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001027 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001028 }
1029 if (size_b == 1) {
1030 digit rem = 0;
1031 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001032 if (z == NULL)
1033 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001035 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001036 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001037 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001038 if (z == NULL)
1039 return -1;
1040 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001041 /* Set the signs.
1042 The quotient z has the sign of a*b;
1043 the remainder r has the sign of a,
1044 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001045 if ((a->ob_size < 0) != (b->ob_size < 0))
1046 z->ob_size = -(z->ob_size);
1047 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1048 (*prem)->ob_size = -((*prem)->ob_size);
1049 *pdiv = z;
1050 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001051}
1052
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001053/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001054
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001056x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001057{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001058 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001059 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001060 PyLongObject *v = mul1(v1, d);
1061 PyLongObject *w = mul1(w1, d);
1062 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001063 int j, k;
1064
1065 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001066 Py_XDECREF(v);
1067 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001068 return NULL;
1069 }
1070
1071 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001072 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001073 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001074
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001075 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001076 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001077
1078 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1079 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1080 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001081 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001082 int i;
1083
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001084 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001086 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001087 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001088 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001089 if (vj == w->ob_digit[size_w-1])
1090 q = MASK;
1091 else
1092 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1093 w->ob_digit[size_w-1];
1094
1095 while (w->ob_digit[size_w-2]*q >
1096 ((
1097 ((twodigits)vj << SHIFT)
1098 + v->ob_digit[j-1]
1099 - q*w->ob_digit[size_w-1]
1100 ) << SHIFT)
1101 + v->ob_digit[j-2])
1102 --q;
1103
1104 for (i = 0; i < size_w && i+k < size_v; ++i) {
1105 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001106 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001107 carry += v->ob_digit[i+k] - z
1108 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001109 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001110 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1111 carry, SHIFT);
1112 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001113 }
1114
1115 if (i+k < size_v) {
1116 carry += v->ob_digit[i+k];
1117 v->ob_digit[i+k] = 0;
1118 }
1119
1120 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001121 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001122 else {
1123 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001124 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001125 carry = 0;
1126 for (i = 0; i < size_w && i+k < size_v; ++i) {
1127 carry += v->ob_digit[i+k] + w->ob_digit[i];
1128 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001129 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1130 BASE_TWODIGITS_TYPE,
1131 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001132 }
1133 }
1134 } /* for j, k */
1135
Guido van Rossumc206c761995-01-10 15:23:19 +00001136 if (a == NULL)
1137 *prem = NULL;
1138 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001139 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001140 *prem = divrem1(v, d, &d);
1141 /* d receives the (unused) remainder */
1142 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001144 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001145 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001146 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001147 Py_DECREF(v);
1148 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001149 return a;
1150}
1151
1152/* Methods */
1153
1154static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001155long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001156{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001157 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001158}
1159
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001160static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001161long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001162{
Fred Drake121ee271999-12-23 15:41:28 +00001163 return long_format(v, 10, 1);
1164}
1165
1166static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001167long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001168{
1169 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001170}
1171
1172static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001173long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001174{
1175 int sign;
1176
Guido van Rossumc6913e71991-11-19 20:26:46 +00001177 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001178 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001179 sign = 0;
1180 else
1181 sign = a->ob_size - b->ob_size;
1182 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001183 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001184 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001185 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1186 ;
1187 if (i < 0)
1188 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001189 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001190 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001191 if (a->ob_size < 0)
1192 sign = -sign;
1193 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001194 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001195 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001196}
1197
Guido van Rossum9bfef441993-03-29 10:43:31 +00001198static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001199long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001200{
1201 long x;
1202 int i, sign;
1203
1204 /* This is designed so that Python ints and longs with the
1205 same value hash to the same value, otherwise comparisons
1206 of mapping keys will turn out weird */
1207 i = v->ob_size;
1208 sign = 1;
1209 x = 0;
1210 if (i < 0) {
1211 sign = -1;
1212 i = -(i);
1213 }
1214 while (--i >= 0) {
1215 /* Force a 32-bit circular shift */
1216 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1217 x += v->ob_digit[i];
1218 }
1219 x = x * sign;
1220 if (x == -1)
1221 x = -2;
1222 return x;
1223}
1224
1225
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001226/* Add the absolute values of two long integers. */
1227
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001229x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001230{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001231 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001232 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001233 int i;
1234 digit carry = 0;
1235
1236 /* Ensure a is the larger of the two: */
1237 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001238 { PyLongObject *temp = a; a = b; b = temp; }
1239 { int size_temp = size_a;
1240 size_a = size_b;
1241 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001242 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001244 if (z == NULL)
1245 return NULL;
1246 for (i = 0; i < size_b; ++i) {
1247 carry += a->ob_digit[i] + b->ob_digit[i];
1248 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001249 carry >>= SHIFT;
1250 }
1251 for (; i < size_a; ++i) {
1252 carry += a->ob_digit[i];
1253 z->ob_digit[i] = carry & MASK;
1254 carry >>= SHIFT;
1255 }
1256 z->ob_digit[i] = carry;
1257 return long_normalize(z);
1258}
1259
1260/* Subtract the absolute values of two integers. */
1261
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001262static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001263x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001264{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001265 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001266 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001267 int i;
1268 int sign = 1;
1269 digit borrow = 0;
1270
1271 /* Ensure a is the larger of the two: */
1272 if (size_a < size_b) {
1273 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001274 { PyLongObject *temp = a; a = b; b = temp; }
1275 { int size_temp = size_a;
1276 size_a = size_b;
1277 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001278 }
1279 else if (size_a == size_b) {
1280 /* Find highest digit where a and b differ: */
1281 i = size_a;
1282 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1283 ;
1284 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001286 if (a->ob_digit[i] < b->ob_digit[i]) {
1287 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001288 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001289 }
1290 size_a = size_b = i+1;
1291 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001293 if (z == NULL)
1294 return NULL;
1295 for (i = 0; i < size_b; ++i) {
1296 /* The following assumes unsigned arithmetic
1297 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001298 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001299 z->ob_digit[i] = borrow & MASK;
1300 borrow >>= SHIFT;
1301 borrow &= 1; /* Keep only one sign bit */
1302 }
1303 for (; i < size_a; ++i) {
1304 borrow = a->ob_digit[i] - borrow;
1305 z->ob_digit[i] = borrow & MASK;
1306 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001307 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001308 }
1309 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001310 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001311 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001312 return long_normalize(z);
1313}
1314
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001316long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001317{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001318 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001319
Neil Schemenauerba872e22001-01-04 01:46:03 +00001320 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1321
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001322 if (a->ob_size < 0) {
1323 if (b->ob_size < 0) {
1324 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001325 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001326 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001327 }
1328 else
1329 z = x_sub(b, a);
1330 }
1331 else {
1332 if (b->ob_size < 0)
1333 z = x_sub(a, b);
1334 else
1335 z = x_add(a, b);
1336 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001337 Py_DECREF(a);
1338 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001340}
1341
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001343long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001344{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001345 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001346
Neil Schemenauerba872e22001-01-04 01:46:03 +00001347 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1348
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001349 if (a->ob_size < 0) {
1350 if (b->ob_size < 0)
1351 z = x_sub(a, b);
1352 else
1353 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001354 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001355 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001356 }
1357 else {
1358 if (b->ob_size < 0)
1359 z = x_add(a, b);
1360 else
1361 z = x_sub(a, b);
1362 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001363 Py_DECREF(a);
1364 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001365 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001366}
1367
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001368static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001369long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001370{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001371 /* sequence * long */
1372 long n = PyLong_AsLong((PyObject *) w);
1373 if (n == -1 && PyErr_Occurred())
1374 return NULL;
1375 else
1376 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1377}
1378
1379static PyObject *
1380long_mul(PyLongObject *v, PyLongObject *w)
1381{
1382 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001383 int size_a;
1384 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001385 int i;
1386
Neil Schemenauerba872e22001-01-04 01:46:03 +00001387 if (v->ob_type->tp_as_sequence &&
1388 v->ob_type->tp_as_sequence->sq_repeat) {
1389 return long_repeat((PyObject *)v, w);
1390 }
1391 else if (w->ob_type->tp_as_sequence &&
1392 w->ob_type->tp_as_sequence->sq_repeat) {
1393 return long_repeat((PyObject *)w, v);
1394 }
1395
1396 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1397
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001398 size_a = ABS(a->ob_size);
1399 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001400 if (size_a > size_b) {
1401 /* we are faster with the small object on the left */
1402 int hold_sa = size_a;
1403 PyLongObject *hold_a = a;
1404 size_a = size_b;
1405 size_b = hold_sa;
1406 a = b;
1407 b = hold_a;
1408 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001409 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001410 if (z == NULL) {
1411 Py_DECREF(a);
1412 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001413 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001414 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001415 for (i = 0; i < z->ob_size; ++i)
1416 z->ob_digit[i] = 0;
1417 for (i = 0; i < size_a; ++i) {
1418 twodigits carry = 0;
1419 twodigits f = a->ob_digit[i];
1420 int j;
1421
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001422 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001423 Py_DECREF(a);
1424 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001425 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001426 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001427 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001428 for (j = 0; j < size_b; ++j) {
1429 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001430 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001431 carry >>= SHIFT;
1432 }
1433 for (; carry != 0; ++j) {
1434 assert(i+j < z->ob_size);
1435 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001436 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001437 carry >>= SHIFT;
1438 }
1439 }
1440 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001441 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001442 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001443 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001444 Py_DECREF(a);
1445 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001447}
1448
Guido van Rossume32e0141992-01-19 16:31:05 +00001449/* The / and % operators are now defined in terms of divmod().
1450 The expression a mod b has the value a - b*floor(a/b).
1451 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001452 |a| by |b|, with the sign of a. This is also expressed
1453 as a - b*trunc(a/b), if trunc truncates towards zero.
1454 Some examples:
1455 a b a rem b a mod b
1456 13 10 3 3
1457 -13 10 -3 7
1458 13 -10 3 -7
1459 -13 -10 -3 -3
1460 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001461 have different signs. We then subtract one from the 'div'
1462 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001463
Guido van Rossume32e0141992-01-19 16:31:05 +00001464static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001465l_divmod(PyLongObject *v, PyLongObject *w,
1466 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001467{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001468 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001469
1470 if (long_divrem(v, w, &div, &mod) < 0)
1471 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001472 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1473 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001474 PyLongObject *temp;
1475 PyLongObject *one;
1476 temp = (PyLongObject *) long_add(mod, w);
1477 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001478 mod = temp;
1479 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001480 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001481 return -1;
1482 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001483 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001484 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001485 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1486 Py_DECREF(mod);
1487 Py_DECREF(div);
1488 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001489 return -1;
1490 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001491 Py_DECREF(one);
1492 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001493 div = temp;
1494 }
1495 *pdiv = div;
1496 *pmod = mod;
1497 return 0;
1498}
1499
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001500static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001501long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001502{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001503 PyLongObject *a, *b, *div, *mod;
1504
1505 CONVERT_BINOP(v, w, &a, &b);
1506
1507 if (l_divmod(a, b, &div, &mod) < 0) {
1508 Py_DECREF(a);
1509 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001510 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001511 }
1512 Py_DECREF(a);
1513 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001514 Py_DECREF(mod);
1515 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001516}
1517
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001518static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001519long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001520{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001521 PyLongObject *a, *b, *div, *mod;
1522
1523 CONVERT_BINOP(v, w, &a, &b);
1524
1525 if (l_divmod(a, b, &div, &mod) < 0) {
1526 Py_DECREF(a);
1527 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001528 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001529 }
1530 Py_DECREF(a);
1531 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001532 Py_DECREF(div);
1533 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001534}
1535
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001537long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001538{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001539 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001540 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001541
1542 CONVERT_BINOP(v, w, &a, &b);
1543
1544 if (l_divmod(a, b, &div, &mod) < 0) {
1545 Py_DECREF(a);
1546 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001547 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001548 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001549 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001550 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001551 PyTuple_SetItem(z, 0, (PyObject *) div);
1552 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001553 }
1554 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001555 Py_DECREF(div);
1556 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001557 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001558 Py_DECREF(a);
1559 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001560 return z;
1561}
1562
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001563static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001564long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001565{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001566 PyLongObject *a, *b;
1567 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001569 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001570
1571 CONVERT_BINOP(v, w, &a, &b);
1572 if (PyLong_Check(x) || Py_None == x) {
1573 c = x;
1574 Py_INCREF(x);
1575 }
1576 else if (PyInt_Check(x)) {
1577 c = PyLong_FromLong(PyInt_AS_LONG(x));
1578 }
1579 else {
1580 Py_DECREF(a);
1581 Py_DECREF(b);
1582 Py_INCREF(Py_NotImplemented);
1583 return Py_NotImplemented;
1584 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001585
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001586 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001587 if (size_b < 0) {
Tim Petersc54d1902000-10-06 00:36:09 +00001588 if (a->ob_size)
1589 PyErr_SetString(PyExc_ValueError,
1590 "long integer to a negative power");
1591 else
1592 PyErr_SetString(PyExc_ZeroDivisionError,
1593 "zero to a negative power");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001594 z = NULL;
1595 goto error;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001596 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001597 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001598 for (i = 0; i < size_b; ++i) {
1599 digit bi = b->ob_digit[i];
1600 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001601
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001602 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001603 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001604
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001605 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001606 temp = (PyLongObject *)long_mul(z, a);
1607 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001608 if (c!=Py_None && temp!=NULL) {
1609 if (l_divmod(temp,(PyLongObject *)c,
1610 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001611 Py_DECREF(temp);
1612 z = NULL;
1613 goto error;
1614 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001615 Py_XDECREF(div);
1616 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001617 temp = mod;
1618 }
1619 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001620 if (z == NULL)
1621 break;
1622 }
1623 bi >>= 1;
1624 if (bi == 0 && i+1 == size_b)
1625 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001626 temp = (PyLongObject *)long_mul(a, a);
1627 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001628 if (c!=Py_None && temp!=NULL) {
1629 if (l_divmod(temp, (PyLongObject *)c, &div,
1630 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001631 Py_DECREF(temp);
1632 z = NULL;
1633 goto error;
1634 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001635 Py_XDECREF(div);
1636 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001637 temp = mod;
1638 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001639 a = temp;
1640 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001641 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001642 z = NULL;
1643 break;
1644 }
1645 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001646 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001647 break;
1648 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001649 if (c!=Py_None && z!=NULL) {
1650 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001651 Py_DECREF(z);
1652 z = NULL;
1653 }
1654 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001655 Py_XDECREF(div);
1656 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001657 z = mod;
1658 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001659 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001660 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001661 Py_XDECREF(a);
1662 Py_DECREF(b);
1663 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001664 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001665}
1666
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001667static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001668long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001669{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001670 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001671 PyLongObject *x;
1672 PyLongObject *w;
1673 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001674 if (w == NULL)
1675 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001676 x = (PyLongObject *) long_add(v, w);
1677 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001678 if (x == NULL)
1679 return NULL;
1680 if (x->ob_size != 0)
1681 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001682 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001683}
1684
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001685static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001686long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001687{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001688 Py_INCREF(v);
1689 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001690}
1691
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001692static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001693long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001694{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001695 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001696 int i, n;
1697 n = ABS(v->ob_size);
1698 if (n == 0) {
1699 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001700 Py_INCREF(v);
1701 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001702 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001703 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001704 if (z == NULL)
1705 return NULL;
1706 for (i = 0; i < n; i++)
1707 z->ob_digit[i] = v->ob_digit[i];
1708 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001709 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001710}
1711
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001712static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001713long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001714{
1715 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001716 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001717 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001718 Py_INCREF(v);
1719 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001720 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001721}
1722
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001723static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001724long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001725{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001726 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001727}
1728
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001729static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001730long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001731{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001732 PyLongObject *a, *b;
1733 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001734 long shiftby;
1735 int newsize, wordshift, loshift, hishift, i, j;
1736 digit lomask, himask;
1737
Neil Schemenauerba872e22001-01-04 01:46:03 +00001738 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1739
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001740 if (a->ob_size < 0) {
1741 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001742 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001743 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001744 if (a1 == NULL)
1745 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001746 a2 = (PyLongObject *) long_rshift(a1, b);
1747 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001748 if (a2 == NULL)
1749 goto rshift_error;
1750 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001751 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001752 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001753 else {
1754
1755 shiftby = PyLong_AsLong((PyObject *)b);
1756 if (shiftby == -1L && PyErr_Occurred())
1757 goto rshift_error;
1758 if (shiftby < 0) {
1759 PyErr_SetString(PyExc_ValueError,
1760 "negative shift count");
1761 goto rshift_error;
1762 }
1763 wordshift = shiftby / SHIFT;
1764 newsize = ABS(a->ob_size) - wordshift;
1765 if (newsize <= 0) {
1766 z = _PyLong_New(0);
1767 Py_DECREF(a);
1768 Py_DECREF(b);
1769 return (PyObject *)z;
1770 }
1771 loshift = shiftby % SHIFT;
1772 hishift = SHIFT - loshift;
1773 lomask = ((digit)1 << hishift) - 1;
1774 himask = MASK ^ lomask;
1775 z = _PyLong_New(newsize);
1776 if (z == NULL)
1777 goto rshift_error;
1778 if (a->ob_size < 0)
1779 z->ob_size = -(z->ob_size);
1780 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1781 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1782 if (i+1 < newsize)
1783 z->ob_digit[i] |=
1784 (a->ob_digit[j+1] << hishift) & himask;
1785 }
1786 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001787 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001788rshift_error:
1789 Py_DECREF(a);
1790 Py_DECREF(b);
1791 return (PyObject *) z;
1792
Guido van Rossumc6913e71991-11-19 20:26:46 +00001793}
1794
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001795static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001796long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001797{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001798 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001799 PyLongObject *a, *b;
1800 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001801 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001802 int oldsize, newsize, wordshift, remshift, i, j;
1803 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001804
Neil Schemenauerba872e22001-01-04 01:46:03 +00001805 CONVERT_BINOP(v, w, &a, &b);
1806
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001807 shiftby = PyLong_AsLong((PyObject *)b);
1808 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001809 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001810 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001811 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001812 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001813 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001814 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001815 PyErr_SetString(PyExc_ValueError,
1816 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001817 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001818 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001819 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1820 wordshift = (int)shiftby / SHIFT;
1821 remshift = (int)shiftby - wordshift * SHIFT;
1822
1823 oldsize = ABS(a->ob_size);
1824 newsize = oldsize + wordshift;
1825 if (remshift)
1826 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001827 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001828 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001829 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001830 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001831 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001832 for (i = 0; i < wordshift; i++)
1833 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001834 accum = 0;
1835 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1836 accum |= a->ob_digit[j] << remshift;
1837 z->ob_digit[i] = (digit)(accum & MASK);
1838 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001839 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001840 if (remshift)
1841 z->ob_digit[newsize-1] = (digit)accum;
1842 else
1843 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001844 z = long_normalize(z);
1845lshift_error:
1846 Py_DECREF(a);
1847 Py_DECREF(b);
1848 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001849}
1850
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001851
1852/* Bitwise and/xor/or operations */
1853
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001854#define MAX(x, y) ((x) < (y) ? (y) : (x))
1855#define MIN(x, y) ((x) > (y) ? (y) : (x))
1856
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001857static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001858long_bitwise(PyLongObject *a,
1859 int op, /* '&', '|', '^' */
1860 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001861{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001862 digit maska, maskb; /* 0 or MASK */
1863 int negz;
1864 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001865 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001866 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001867 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001868 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001869
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001870 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001871 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001872 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001873 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001874 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001875 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001876 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001877 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001878 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001879 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001880 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001881 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001882 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001883 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001884 maskb = 0;
1885 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001886
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001887 negz = 0;
1888 switch (op) {
1889 case '^':
1890 if (maska != maskb) {
1891 maska ^= MASK;
1892 negz = -1;
1893 }
1894 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001895 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001896 if (maska && maskb) {
1897 op = '|';
1898 maska ^= MASK;
1899 maskb ^= MASK;
1900 negz = -1;
1901 }
1902 break;
1903 case '|':
1904 if (maska || maskb) {
1905 op = '&';
1906 maska ^= MASK;
1907 maskb ^= MASK;
1908 negz = -1;
1909 }
1910 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001911 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001912
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001913 /* JRH: The original logic here was to allocate the result value (z)
1914 as the longer of the two operands. However, there are some cases
1915 where the result is guaranteed to be shorter than that: AND of two
1916 positives, OR of two negatives: use the shorter number. AND with
1917 mixed signs: use the positive number. OR with mixed signs: use the
1918 negative number. After the transformations above, op will be '&'
1919 iff one of these cases applies, and mask will be non-0 for operands
1920 whose length should be ignored.
1921 */
1922
1923 size_a = a->ob_size;
1924 size_b = b->ob_size;
1925 size_z = op == '&'
1926 ? (maska
1927 ? size_b
1928 : (maskb ? size_a : MIN(size_a, size_b)))
1929 : MAX(size_a, size_b);
1930 z = _PyLong_New(size_z);
1931 if (a == NULL || b == NULL || z == NULL) {
1932 Py_XDECREF(a);
1933 Py_XDECREF(b);
1934 Py_XDECREF(z);
1935 return NULL;
1936 }
1937
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001938 for (i = 0; i < size_z; ++i) {
1939 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1940 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1941 switch (op) {
1942 case '&': z->ob_digit[i] = diga & digb; break;
1943 case '|': z->ob_digit[i] = diga | digb; break;
1944 case '^': z->ob_digit[i] = diga ^ digb; break;
1945 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001946 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001947
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001948 Py_DECREF(a);
1949 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001950 z = long_normalize(z);
1951 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001952 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001953 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001954 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001955 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001956}
1957
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001958static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001959long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001960{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001961 PyLongObject *a, *b;
1962 PyObject *c;
1963 CONVERT_BINOP(v, w, &a, &b);
1964 c = long_bitwise(a, '&', b);
1965 Py_DECREF(a);
1966 Py_DECREF(b);
1967 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001968}
1969
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001970static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001971long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001972{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001973 PyLongObject *a, *b;
1974 PyObject *c;
1975 CONVERT_BINOP(v, w, &a, &b);
1976 c = long_bitwise(a, '^', b);
1977 Py_DECREF(a);
1978 Py_DECREF(b);
1979 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001980}
1981
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001982static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001983long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001984{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001985 PyLongObject *a, *b;
1986 PyObject *c;
1987 CONVERT_BINOP(v, w, &a, &b);
1988 c = long_bitwise(a, '|', b);
1989 Py_DECREF(a);
1990 Py_DECREF(b);
1991 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001992}
1993
Guido van Rossum234f9421993-06-17 12:35:49 +00001994static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001995long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001996{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001997 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001998 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001999 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002000 return 0;
2001 }
2002 return 1; /* Can't do it */
2003}
2004
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002005static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002006long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002007{
2008 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002009 x = PyLong_AsLong(v);
2010 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002011 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002012 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002013}
2014
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002015static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002016long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002017{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002018 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002019 return v;
2020}
2021
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002022static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002023long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002024{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002025 double result;
2026 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002027 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00002028 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002029 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002030}
2031
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002032static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002033long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002034{
Fred Drake121ee271999-12-23 15:41:28 +00002035 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002036}
2037
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002038static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002039long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002040{
Fred Drake121ee271999-12-23 15:41:28 +00002041 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002042}
2043
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002044static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002045 (binaryfunc) long_add, /*nb_add*/
2046 (binaryfunc) long_sub, /*nb_subtract*/
2047 (binaryfunc) long_mul, /*nb_multiply*/
2048 (binaryfunc) long_div, /*nb_divide*/
2049 (binaryfunc) long_mod, /*nb_remainder*/
2050 (binaryfunc) long_divmod, /*nb_divmod*/
2051 (ternaryfunc) long_pow, /*nb_power*/
2052 (unaryfunc) long_neg, /*nb_negative*/
2053 (unaryfunc) long_pos, /*tp_positive*/
2054 (unaryfunc) long_abs, /*tp_absolute*/
2055 (inquiry) long_nonzero, /*tp_nonzero*/
2056 (unaryfunc) long_invert, /*nb_invert*/
2057 (binaryfunc) long_lshift, /*nb_lshift*/
2058 (binaryfunc) long_rshift, /*nb_rshift*/
2059 (binaryfunc) long_and, /*nb_and*/
2060 (binaryfunc) long_xor, /*nb_xor*/
2061 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002062 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002063 (unaryfunc) long_int, /*nb_int*/
2064 (unaryfunc) long_long, /*nb_long*/
2065 (unaryfunc) long_float, /*nb_float*/
2066 (unaryfunc) long_oct, /*nb_oct*/
2067 (unaryfunc) long_hex, /*nb_hex*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00002068 0, /*nb_inplace_add*/
2069 0, /*nb_inplace_subtract*/
2070 0, /*nb_inplace_multiply*/
2071 0, /*nb_inplace_divide*/
2072 0, /*nb_inplace_remainder*/
2073 0, /*nb_inplace_power*/
2074 0, /*nb_inplace_lshift*/
2075 0, /*nb_inplace_rshift*/
2076 0, /*nb_inplace_and*/
2077 0, /*nb_inplace_xor*/
2078 0, /*nb_inplace_or*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002079};
2080
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002081PyTypeObject PyLong_Type = {
2082 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002083 0,
2084 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002085 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002086 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00002087 (destructor)long_dealloc, /*tp_dealloc*/
2088 0, /*tp_print*/
2089 0, /*tp_getattr*/
2090 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002091 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002092 (reprfunc)long_repr, /*tp_repr*/
2093 &long_as_number, /*tp_as_number*/
2094 0, /*tp_as_sequence*/
2095 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002096 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002097 0, /*tp_call*/
2098 (reprfunc)long_str, /*tp_str*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00002099 0, /*tp_getattro*/
2100 0, /*tp_setattro*/
2101 0, /*tp_as_buffer*/
Guido van Rossum6fd867b2001-01-17 15:33:18 +00002102 Py_TPFLAGS_CHECKTYPES /*tp_flags*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002103};