blob: 3c22470fb0d1cd041fa9298455f3603b0400739f [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
Tim Petersd1a7da62001-06-13 00:35:57 +0000525
526/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
527 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000528 */
529
Tim Petersd1a7da62001-06-13 00:35:57 +0000530#define IS_LITTLE_ENDIAN *(char*)&one != '\0'
531
532/* 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{
Tim Petersd1a7da62001-06-13 00:35:57 +0000537 LONG_LONG bytes = ival;
538 int one = 1;
539 return _PyLong_FromByteArray(
540 (unsigned char *)&bytes,
541 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000542}
543
Tim Petersd1a7da62001-06-13 00:35:57 +0000544/* Create a new long int object from a C unsigned LONG_LONG int. */
545
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000546PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000547PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000548{
Tim Petersd1a7da62001-06-13 00:35:57 +0000549 unsigned LONG_LONG bytes = ival;
550 int one = 1;
551 return _PyLong_FromByteArray(
552 (unsigned char *)&bytes,
553 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000554}
555
Guido van Rossum3293b071998-08-25 16:07:15 +0000556/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000557 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000558
Guido van Rossum3293b071998-08-25 16:07:15 +0000559LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000560PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000561{
Tim Petersd1a7da62001-06-13 00:35:57 +0000562 LONG_LONG bytes;
563 int one = 1;
564 int res;
565
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000566 if (vv == NULL || !PyLong_Check(vv)) {
567 PyErr_BadInternalCall();
568 return -1;
569 }
570
Tim Petersd1a7da62001-06-13 00:35:57 +0000571 res = _PyLong_AsByteArray(
572 (PyLongObject *)vv, (unsigned char *)&bytes,
573 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000574
Tim Peters9cb0c382001-06-13 20:45:17 +0000575 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000576}
577
Tim Petersd1a7da62001-06-13 00:35:57 +0000578/* Get a C unsigned LONG_LONG int from a long int object.
579 Return -1 and set an error if overflow occurs. */
580
Guido van Rossum3293b071998-08-25 16:07:15 +0000581unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000582PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000583{
Tim Petersd1a7da62001-06-13 00:35:57 +0000584 unsigned LONG_LONG bytes;
585 int one = 1;
586 int res;
587
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000588 if (vv == NULL || !PyLong_Check(vv)) {
589 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000590 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000591 }
592
Tim Petersd1a7da62001-06-13 00:35:57 +0000593 res = _PyLong_AsByteArray(
594 (PyLongObject *)vv, (unsigned char *)&bytes,
595 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000596
Tim Peters9cb0c382001-06-13 20:45:17 +0000597 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000598}
Tim Petersd1a7da62001-06-13 00:35:57 +0000599
600#undef IS_LITTLE_ENDIAN
601
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000602#endif /* HAVE_LONG_LONG */
603
Neil Schemenauerba872e22001-01-04 01:46:03 +0000604
605static int
606convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
607 if (PyLong_Check(v)) {
608 *a = (PyLongObject *) v;
609 Py_INCREF(v);
610 }
611 else if (PyInt_Check(v)) {
612 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
613 }
614 else {
615 return 0;
616 }
617 if (PyLong_Check(w)) {
618 *b = (PyLongObject *) w;
619 Py_INCREF(w);
620 }
621 else if (PyInt_Check(w)) {
622 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
623 }
624 else {
625 Py_DECREF(*a);
626 return 0;
627 }
628 return 1;
629}
630
631#define CONVERT_BINOP(v, w, a, b) \
632 if (!convert_binop(v, w, a, b)) { \
633 Py_INCREF(Py_NotImplemented); \
634 return Py_NotImplemented; \
635 }
636
637
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000638/* Multiply by a single digit, ignoring the sign. */
639
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000640static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000641mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000642{
643 return muladd1(a, n, (digit)0);
644}
645
646/* Multiply by a single digit and add a single digit, ignoring the sign. */
647
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000649muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000650{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000651 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000653 twodigits carry = extra;
654 int i;
655
656 if (z == NULL)
657 return NULL;
658 for (i = 0; i < size_a; ++i) {
659 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000660 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000661 carry >>= SHIFT;
662 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000663 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000664 return long_normalize(z);
665}
666
667/* Divide a long integer by a digit, returning both the quotient
668 (as function result) and the remainder (through *prem).
669 The sign of a is ignored; n should not be zero. */
670
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000672divrem1(PyLongObject *a, wdigit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000673{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000674 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000676 int i;
677 twodigits rem = 0;
678
679 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000681 if (z == NULL)
682 return NULL;
683 for (i = size; --i >= 0; ) {
684 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000685 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000686 rem %= n;
687 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000688 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000689 return long_normalize(z);
690}
691
692/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000693 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000694 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000695
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000697long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000698{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000699 register PyLongObject *a = (PyLongObject *)aa;
700 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000701 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000702 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000703 char *p;
704 int bits;
705 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000706
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707 if (a == NULL || !PyLong_Check(a)) {
708 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000709 return NULL;
710 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000711 assert(base >= 2 && base <= 36);
712
713 /* Compute a rough upper bound for the length of the string */
714 i = base;
715 bits = 0;
716 while (i > 1) {
717 ++bits;
718 i >>= 1;
719 }
Fred Drake121ee271999-12-23 15:41:28 +0000720 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000722 if (str == NULL)
723 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000725 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000726 if (addL)
727 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000728 if (a->ob_size < 0)
729 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000730
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000731 if (a->ob_size == 0) {
732 *--p = '0';
733 }
734 else if ((base & (base - 1)) == 0) {
735 /* JRH: special case for power-of-2 bases */
736 twodigits temp = a->ob_digit[0];
737 int bitsleft = SHIFT;
738 int rem;
739 int last = abs(a->ob_size);
740 int basebits = 1;
741 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000742 while ((i >>= 1) > 1)
743 ++basebits;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000744
745 i = 0;
746 for (;;) {
747 while (bitsleft >= basebits) {
748 if ((temp == 0) && (i >= last - 1)) break;
749 rem = temp & (base - 1);
750 if (rem < 10)
751 rem += '0';
752 else
753 rem += 'A' - 10;
754 assert(p > PyString_AS_STRING(str));
755 *--p = (char) rem;
756 bitsleft -= basebits;
757 temp >>= basebits;
758 }
759 if (++i >= last) {
760 if (temp == 0) break;
761 bitsleft = 99;
762 /* loop again to pick up final digits */
763 }
764 else {
765 temp = (a->ob_digit[i] << bitsleft) | temp;
766 bitsleft += SHIFT;
767 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000768 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000769 }
770 else {
771 Py_INCREF(a);
772 do {
773 digit rem;
774 PyLongObject *temp = divrem1(a, (digit)base, &rem);
775 if (temp == NULL) {
776 Py_DECREF(a);
777 Py_DECREF(str);
778 return NULL;
779 }
780 if (rem < 10)
781 rem += '0';
782 else
783 rem += 'A'-10;
784 assert(p > PyString_AS_STRING(str));
785 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000787 a = temp;
788 SIGCHECK({
789 Py_DECREF(a);
790 Py_DECREF(str);
791 return NULL;
792 })
793 } while (ABS(a->ob_size) != 0);
794 Py_DECREF(a);
795 }
796
Guido van Rossum2c475421992-08-14 15:13:07 +0000797 if (base == 8) {
798 if (size_a != 0)
799 *--p = '0';
800 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000801 else if (base == 16) {
802 *--p = 'x';
803 *--p = '0';
804 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000805 else if (base != 10) {
806 *--p = '#';
807 *--p = '0' + base%10;
808 if (base > 10)
809 *--p = '0' + base/10;
810 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000811 if (sign)
812 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 if (p != PyString_AS_STRING(str)) {
814 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000815 assert(p > q);
816 do {
817 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000818 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819 _PyString_Resize((PyObject **)&str,
820 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000821 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000822 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000823}
824
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000825PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000826PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000827{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000828 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000829 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000831
Guido van Rossum472c04f1996-12-05 21:57:21 +0000832 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000834 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000835 return NULL;
836 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000837 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000838 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000839 if (*str == '+')
840 ++str;
841 else if (*str == '-') {
842 ++str;
843 sign = -1;
844 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000845 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000846 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000847 if (base == 0) {
848 if (str[0] != '0')
849 base = 10;
850 else if (str[1] == 'x' || str[1] == 'X')
851 base = 16;
852 else
853 base = 8;
854 }
855 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
856 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000857 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000858 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000859 for ( ; z != NULL; ++str) {
860 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000862
863 if (*str <= '9')
864 k = *str - '0';
865 else if (*str >= 'a')
866 k = *str - 'a' + 10;
867 else if (*str >= 'A')
868 k = *str - 'A' + 10;
869 if (k < 0 || k >= base)
870 break;
871 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000873 z = temp;
874 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000875 if (z == NULL)
876 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000877 if (str == start)
878 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000879 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000880 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000881 if (*str == 'L' || *str == 'l')
882 str++;
883 while (*str && isspace(Py_CHARMASK(*str)))
884 str++;
885 if (*str != '\0')
886 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000887 if (pend)
888 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000890
891 onError:
892 PyErr_Format(PyExc_ValueError,
893 "invalid literal for long(): %.200s", orig_str);
894 Py_XDECREF(z);
895 return NULL;
896}
897
898PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000899PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000900{
901 char buffer[256];
902
903 if (length >= sizeof(buffer)) {
904 PyErr_SetString(PyExc_ValueError,
905 "long() literal too large to convert");
906 return NULL;
907 }
908 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
909 return NULL;
910
911 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000912}
913
Tim Peters9f688bf2000-07-07 15:53:28 +0000914/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +0000916 (PyLongObject *, PyLongObject *, PyLongObject **);
917static PyObject *long_pos(PyLongObject *);
918static int long_divrem(PyLongObject *, PyLongObject *,
919 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000920
921/* Long division with remainder, top-level routine */
922
Guido van Rossume32e0141992-01-19 16:31:05 +0000923static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000924long_divrem(PyLongObject *a, PyLongObject *b,
925 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000926{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000927 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000929
930 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000931 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000932 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +0000933 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000934 }
935 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000936 (size_a == size_b &&
937 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000938 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000939 *pdiv = _PyLong_New(0);
940 Py_INCREF(a);
941 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000942 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000943 }
944 if (size_b == 1) {
945 digit rem = 0;
946 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000947 if (z == NULL)
948 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000950 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000951 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000952 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000953 if (z == NULL)
954 return -1;
955 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000956 /* Set the signs.
957 The quotient z has the sign of a*b;
958 the remainder r has the sign of a,
959 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000960 if ((a->ob_size < 0) != (b->ob_size < 0))
961 z->ob_size = -(z->ob_size);
962 if (a->ob_size < 0 && (*prem)->ob_size != 0)
963 (*prem)->ob_size = -((*prem)->ob_size);
964 *pdiv = z;
965 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000966}
967
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000968/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000969
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000971x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000972{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000973 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000974 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 PyLongObject *v = mul1(v1, d);
976 PyLongObject *w = mul1(w1, d);
977 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000978 int j, k;
979
980 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000981 Py_XDECREF(v);
982 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000983 return NULL;
984 }
985
986 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000987 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000988 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000989
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000990 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000992
993 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
994 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
995 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000996 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000997 int i;
998
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000999 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001000 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001001 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001002 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001003 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001004 if (vj == w->ob_digit[size_w-1])
1005 q = MASK;
1006 else
1007 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1008 w->ob_digit[size_w-1];
1009
1010 while (w->ob_digit[size_w-2]*q >
1011 ((
1012 ((twodigits)vj << SHIFT)
1013 + v->ob_digit[j-1]
1014 - q*w->ob_digit[size_w-1]
1015 ) << SHIFT)
1016 + v->ob_digit[j-2])
1017 --q;
1018
1019 for (i = 0; i < size_w && i+k < size_v; ++i) {
1020 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001021 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001022 carry += v->ob_digit[i+k] - z
1023 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001024 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001025 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1026 carry, SHIFT);
1027 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001028 }
1029
1030 if (i+k < size_v) {
1031 carry += v->ob_digit[i+k];
1032 v->ob_digit[i+k] = 0;
1033 }
1034
1035 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001036 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001037 else {
1038 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001039 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001040 carry = 0;
1041 for (i = 0; i < size_w && i+k < size_v; ++i) {
1042 carry += v->ob_digit[i+k] + w->ob_digit[i];
1043 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001044 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1045 BASE_TWODIGITS_TYPE,
1046 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001047 }
1048 }
1049 } /* for j, k */
1050
Guido van Rossumc206c761995-01-10 15:23:19 +00001051 if (a == NULL)
1052 *prem = NULL;
1053 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001054 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001055 *prem = divrem1(v, d, &d);
1056 /* d receives the (unused) remainder */
1057 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001059 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001060 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001061 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001062 Py_DECREF(v);
1063 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001064 return a;
1065}
1066
1067/* Methods */
1068
1069static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001070long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001071{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001072 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001073}
1074
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001076long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001077{
Fred Drake121ee271999-12-23 15:41:28 +00001078 return long_format(v, 10, 1);
1079}
1080
1081static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001082long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001083{
1084 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001085}
1086
1087static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001088long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001089{
1090 int sign;
1091
Guido van Rossumc6913e71991-11-19 20:26:46 +00001092 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001093 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001094 sign = 0;
1095 else
1096 sign = a->ob_size - b->ob_size;
1097 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001098 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001099 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001100 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1101 ;
1102 if (i < 0)
1103 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001104 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001105 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001106 if (a->ob_size < 0)
1107 sign = -sign;
1108 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001109 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001110 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001111}
1112
Guido van Rossum9bfef441993-03-29 10:43:31 +00001113static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001114long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001115{
1116 long x;
1117 int i, sign;
1118
1119 /* This is designed so that Python ints and longs with the
1120 same value hash to the same value, otherwise comparisons
1121 of mapping keys will turn out weird */
1122 i = v->ob_size;
1123 sign = 1;
1124 x = 0;
1125 if (i < 0) {
1126 sign = -1;
1127 i = -(i);
1128 }
1129 while (--i >= 0) {
1130 /* Force a 32-bit circular shift */
1131 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1132 x += v->ob_digit[i];
1133 }
1134 x = x * sign;
1135 if (x == -1)
1136 x = -2;
1137 return x;
1138}
1139
1140
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001141/* Add the absolute values of two long integers. */
1142
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001144x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001145{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001146 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001147 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001148 int i;
1149 digit carry = 0;
1150
1151 /* Ensure a is the larger of the two: */
1152 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001153 { PyLongObject *temp = a; a = b; b = temp; }
1154 { int size_temp = size_a;
1155 size_a = size_b;
1156 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001157 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001158 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001159 if (z == NULL)
1160 return NULL;
1161 for (i = 0; i < size_b; ++i) {
1162 carry += a->ob_digit[i] + b->ob_digit[i];
1163 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001164 carry >>= SHIFT;
1165 }
1166 for (; i < size_a; ++i) {
1167 carry += a->ob_digit[i];
1168 z->ob_digit[i] = carry & MASK;
1169 carry >>= SHIFT;
1170 }
1171 z->ob_digit[i] = carry;
1172 return long_normalize(z);
1173}
1174
1175/* Subtract the absolute values of two integers. */
1176
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001177static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001178x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001179{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001180 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001181 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001182 int i;
1183 int sign = 1;
1184 digit borrow = 0;
1185
1186 /* Ensure a is the larger of the two: */
1187 if (size_a < size_b) {
1188 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001189 { PyLongObject *temp = a; a = b; b = temp; }
1190 { int size_temp = size_a;
1191 size_a = size_b;
1192 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001193 }
1194 else if (size_a == size_b) {
1195 /* Find highest digit where a and b differ: */
1196 i = size_a;
1197 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1198 ;
1199 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001200 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001201 if (a->ob_digit[i] < b->ob_digit[i]) {
1202 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001204 }
1205 size_a = size_b = i+1;
1206 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001207 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001208 if (z == NULL)
1209 return NULL;
1210 for (i = 0; i < size_b; ++i) {
1211 /* The following assumes unsigned arithmetic
1212 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001213 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001214 z->ob_digit[i] = borrow & MASK;
1215 borrow >>= SHIFT;
1216 borrow &= 1; /* Keep only one sign bit */
1217 }
1218 for (; i < size_a; ++i) {
1219 borrow = a->ob_digit[i] - borrow;
1220 z->ob_digit[i] = borrow & MASK;
1221 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001222 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001223 }
1224 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001225 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001226 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001227 return long_normalize(z);
1228}
1229
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001231long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001232{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001233 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001234
Neil Schemenauerba872e22001-01-04 01:46:03 +00001235 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1236
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001237 if (a->ob_size < 0) {
1238 if (b->ob_size < 0) {
1239 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001240 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001241 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001242 }
1243 else
1244 z = x_sub(b, a);
1245 }
1246 else {
1247 if (b->ob_size < 0)
1248 z = x_sub(a, b);
1249 else
1250 z = x_add(a, b);
1251 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001252 Py_DECREF(a);
1253 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001255}
1256
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001258long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001259{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001260 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001261
Neil Schemenauerba872e22001-01-04 01:46:03 +00001262 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1263
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001264 if (a->ob_size < 0) {
1265 if (b->ob_size < 0)
1266 z = x_sub(a, b);
1267 else
1268 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001269 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001270 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001271 }
1272 else {
1273 if (b->ob_size < 0)
1274 z = x_add(a, b);
1275 else
1276 z = x_sub(a, b);
1277 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001278 Py_DECREF(a);
1279 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001281}
1282
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001284long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001285{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001286 /* sequence * long */
1287 long n = PyLong_AsLong((PyObject *) w);
1288 if (n == -1 && PyErr_Occurred())
1289 return NULL;
1290 else
1291 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1292}
1293
1294static PyObject *
1295long_mul(PyLongObject *v, PyLongObject *w)
1296{
1297 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001298 int size_a;
1299 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001300 int i;
1301
Neil Schemenauerba872e22001-01-04 01:46:03 +00001302 if (v->ob_type->tp_as_sequence &&
1303 v->ob_type->tp_as_sequence->sq_repeat) {
1304 return long_repeat((PyObject *)v, w);
1305 }
1306 else if (w->ob_type->tp_as_sequence &&
1307 w->ob_type->tp_as_sequence->sq_repeat) {
1308 return long_repeat((PyObject *)w, v);
1309 }
1310
1311 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1312
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001313 size_a = ABS(a->ob_size);
1314 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001315 if (size_a > size_b) {
1316 /* we are faster with the small object on the left */
1317 int hold_sa = size_a;
1318 PyLongObject *hold_a = a;
1319 size_a = size_b;
1320 size_b = hold_sa;
1321 a = b;
1322 b = hold_a;
1323 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001324 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001325 if (z == NULL) {
1326 Py_DECREF(a);
1327 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001328 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001329 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001330 for (i = 0; i < z->ob_size; ++i)
1331 z->ob_digit[i] = 0;
1332 for (i = 0; i < size_a; ++i) {
1333 twodigits carry = 0;
1334 twodigits f = a->ob_digit[i];
1335 int j;
1336
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001337 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001338 Py_DECREF(a);
1339 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001341 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001342 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001343 for (j = 0; j < size_b; ++j) {
1344 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001345 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001346 carry >>= SHIFT;
1347 }
1348 for (; carry != 0; ++j) {
1349 assert(i+j < z->ob_size);
1350 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001351 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001352 carry >>= SHIFT;
1353 }
1354 }
1355 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001356 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001357 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001358 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001359 Py_DECREF(a);
1360 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001362}
1363
Guido van Rossume32e0141992-01-19 16:31:05 +00001364/* The / and % operators are now defined in terms of divmod().
1365 The expression a mod b has the value a - b*floor(a/b).
1366 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001367 |a| by |b|, with the sign of a. This is also expressed
1368 as a - b*trunc(a/b), if trunc truncates towards zero.
1369 Some examples:
1370 a b a rem b a mod b
1371 13 10 3 3
1372 -13 10 -3 7
1373 13 -10 3 -7
1374 -13 -10 -3 -3
1375 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001376 have different signs. We then subtract one from the 'div'
1377 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001378
Guido van Rossume32e0141992-01-19 16:31:05 +00001379static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001380l_divmod(PyLongObject *v, PyLongObject *w,
1381 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001382{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001383 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001384
1385 if (long_divrem(v, w, &div, &mod) < 0)
1386 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001387 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1388 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 PyLongObject *temp;
1390 PyLongObject *one;
1391 temp = (PyLongObject *) long_add(mod, w);
1392 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001393 mod = temp;
1394 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001395 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001396 return -1;
1397 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001399 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1401 Py_DECREF(mod);
1402 Py_DECREF(div);
1403 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001404 return -1;
1405 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406 Py_DECREF(one);
1407 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001408 div = temp;
1409 }
1410 *pdiv = div;
1411 *pmod = mod;
1412 return 0;
1413}
1414
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001416long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001417{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001418 PyLongObject *a, *b, *div, *mod;
1419
1420 CONVERT_BINOP(v, w, &a, &b);
1421
1422 if (l_divmod(a, b, &div, &mod) < 0) {
1423 Py_DECREF(a);
1424 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001425 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001426 }
1427 Py_DECREF(a);
1428 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001429 Py_DECREF(mod);
1430 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001431}
1432
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001434long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001435{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001436 PyLongObject *a, *b, *div, *mod;
1437
1438 CONVERT_BINOP(v, w, &a, &b);
1439
1440 if (l_divmod(a, b, &div, &mod) < 0) {
1441 Py_DECREF(a);
1442 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001443 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001444 }
1445 Py_DECREF(a);
1446 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001447 Py_DECREF(div);
1448 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001449}
1450
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001451static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001452long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001453{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001454 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001456
1457 CONVERT_BINOP(v, w, &a, &b);
1458
1459 if (l_divmod(a, b, &div, &mod) < 0) {
1460 Py_DECREF(a);
1461 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001462 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001463 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001464 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001465 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466 PyTuple_SetItem(z, 0, (PyObject *) div);
1467 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001468 }
1469 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001470 Py_DECREF(div);
1471 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001472 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001473 Py_DECREF(a);
1474 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001475 return z;
1476}
1477
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001478static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001479long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001480{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001481 PyLongObject *a, *b;
1482 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001483 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001484 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001485
1486 CONVERT_BINOP(v, w, &a, &b);
1487 if (PyLong_Check(x) || Py_None == x) {
1488 c = x;
1489 Py_INCREF(x);
1490 }
1491 else if (PyInt_Check(x)) {
1492 c = PyLong_FromLong(PyInt_AS_LONG(x));
1493 }
1494 else {
1495 Py_DECREF(a);
1496 Py_DECREF(b);
1497 Py_INCREF(Py_NotImplemented);
1498 return Py_NotImplemented;
1499 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001500
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001501 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001502 if (size_b < 0) {
Tim Petersc54d1902000-10-06 00:36:09 +00001503 if (a->ob_size)
1504 PyErr_SetString(PyExc_ValueError,
1505 "long integer to a negative power");
1506 else
1507 PyErr_SetString(PyExc_ZeroDivisionError,
1508 "zero to a negative power");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001509 z = NULL;
1510 goto error;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001511 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001512 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001513 for (i = 0; i < size_b; ++i) {
1514 digit bi = b->ob_digit[i];
1515 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001516
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001517 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001518 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001519
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001520 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001521 temp = (PyLongObject *)long_mul(z, a);
1522 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001523 if (c!=Py_None && temp!=NULL) {
1524 if (l_divmod(temp,(PyLongObject *)c,
1525 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001526 Py_DECREF(temp);
1527 z = NULL;
1528 goto error;
1529 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001530 Py_XDECREF(div);
1531 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001532 temp = mod;
1533 }
1534 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001535 if (z == NULL)
1536 break;
1537 }
1538 bi >>= 1;
1539 if (bi == 0 && i+1 == size_b)
1540 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001541 temp = (PyLongObject *)long_mul(a, a);
1542 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001543 if (c!=Py_None && temp!=NULL) {
1544 if (l_divmod(temp, (PyLongObject *)c, &div,
1545 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001546 Py_DECREF(temp);
1547 z = NULL;
1548 goto error;
1549 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001550 Py_XDECREF(div);
1551 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001552 temp = mod;
1553 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001554 a = temp;
1555 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001556 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001557 z = NULL;
1558 break;
1559 }
1560 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001561 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001562 break;
1563 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001564 if (c!=Py_None && z!=NULL) {
1565 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001566 Py_DECREF(z);
1567 z = NULL;
1568 }
1569 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001570 Py_XDECREF(div);
1571 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001572 z = mod;
1573 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001574 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001575 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001576 Py_XDECREF(a);
1577 Py_DECREF(b);
1578 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001579 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001580}
1581
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001583long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001584{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001585 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001586 PyLongObject *x;
1587 PyLongObject *w;
1588 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001589 if (w == NULL)
1590 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001591 x = (PyLongObject *) long_add(v, w);
1592 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001593 if (x == NULL)
1594 return NULL;
1595 if (x->ob_size != 0)
1596 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001597 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001598}
1599
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001600static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001601long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001602{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001603 Py_INCREF(v);
1604 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001605}
1606
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001607static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001608long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001609{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001610 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001611 int i, n;
1612 n = ABS(v->ob_size);
1613 if (n == 0) {
1614 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001615 Py_INCREF(v);
1616 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001617 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001618 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001619 if (z == NULL)
1620 return NULL;
1621 for (i = 0; i < n; i++)
1622 z->ob_digit[i] = v->ob_digit[i];
1623 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001624 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001625}
1626
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001627static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001628long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001629{
1630 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001631 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001632 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001633 Py_INCREF(v);
1634 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001635 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001636}
1637
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001638static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001639long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001640{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001641 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001642}
1643
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001644static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001645long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001646{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001647 PyLongObject *a, *b;
1648 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001649 long shiftby;
1650 int newsize, wordshift, loshift, hishift, i, j;
1651 digit lomask, himask;
1652
Neil Schemenauerba872e22001-01-04 01:46:03 +00001653 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1654
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001655 if (a->ob_size < 0) {
1656 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001657 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001658 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001659 if (a1 == NULL)
1660 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001661 a2 = (PyLongObject *) long_rshift(a1, b);
1662 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001663 if (a2 == NULL)
1664 goto rshift_error;
1665 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001666 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001667 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001668 else {
1669
1670 shiftby = PyLong_AsLong((PyObject *)b);
1671 if (shiftby == -1L && PyErr_Occurred())
1672 goto rshift_error;
1673 if (shiftby < 0) {
1674 PyErr_SetString(PyExc_ValueError,
1675 "negative shift count");
1676 goto rshift_error;
1677 }
1678 wordshift = shiftby / SHIFT;
1679 newsize = ABS(a->ob_size) - wordshift;
1680 if (newsize <= 0) {
1681 z = _PyLong_New(0);
1682 Py_DECREF(a);
1683 Py_DECREF(b);
1684 return (PyObject *)z;
1685 }
1686 loshift = shiftby % SHIFT;
1687 hishift = SHIFT - loshift;
1688 lomask = ((digit)1 << hishift) - 1;
1689 himask = MASK ^ lomask;
1690 z = _PyLong_New(newsize);
1691 if (z == NULL)
1692 goto rshift_error;
1693 if (a->ob_size < 0)
1694 z->ob_size = -(z->ob_size);
1695 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1696 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1697 if (i+1 < newsize)
1698 z->ob_digit[i] |=
1699 (a->ob_digit[j+1] << hishift) & himask;
1700 }
1701 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001702 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001703rshift_error:
1704 Py_DECREF(a);
1705 Py_DECREF(b);
1706 return (PyObject *) z;
1707
Guido van Rossumc6913e71991-11-19 20:26:46 +00001708}
1709
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001710static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001711long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001712{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001713 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001714 PyLongObject *a, *b;
1715 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001716 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001717 int oldsize, newsize, wordshift, remshift, i, j;
1718 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001719
Neil Schemenauerba872e22001-01-04 01:46:03 +00001720 CONVERT_BINOP(v, w, &a, &b);
1721
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001722 shiftby = PyLong_AsLong((PyObject *)b);
1723 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001724 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001725 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001726 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001727 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001728 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001729 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001730 PyErr_SetString(PyExc_ValueError,
1731 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001732 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001733 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001734 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1735 wordshift = (int)shiftby / SHIFT;
1736 remshift = (int)shiftby - wordshift * SHIFT;
1737
1738 oldsize = ABS(a->ob_size);
1739 newsize = oldsize + wordshift;
1740 if (remshift)
1741 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001742 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001743 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001744 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001745 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001746 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001747 for (i = 0; i < wordshift; i++)
1748 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001749 accum = 0;
1750 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1751 accum |= a->ob_digit[j] << remshift;
1752 z->ob_digit[i] = (digit)(accum & MASK);
1753 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001754 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001755 if (remshift)
1756 z->ob_digit[newsize-1] = (digit)accum;
1757 else
1758 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001759 z = long_normalize(z);
1760lshift_error:
1761 Py_DECREF(a);
1762 Py_DECREF(b);
1763 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001764}
1765
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001766
1767/* Bitwise and/xor/or operations */
1768
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001769#define MAX(x, y) ((x) < (y) ? (y) : (x))
1770#define MIN(x, y) ((x) > (y) ? (y) : (x))
1771
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001772static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001773long_bitwise(PyLongObject *a,
1774 int op, /* '&', '|', '^' */
1775 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001776{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001777 digit maska, maskb; /* 0 or MASK */
1778 int negz;
1779 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001780 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001781 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001782 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001783 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001784
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001785 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001786 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001787 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001788 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001789 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001790 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001791 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001792 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001793 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001794 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001795 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001796 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001797 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001798 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001799 maskb = 0;
1800 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001801
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001802 negz = 0;
1803 switch (op) {
1804 case '^':
1805 if (maska != maskb) {
1806 maska ^= MASK;
1807 negz = -1;
1808 }
1809 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001810 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001811 if (maska && maskb) {
1812 op = '|';
1813 maska ^= MASK;
1814 maskb ^= MASK;
1815 negz = -1;
1816 }
1817 break;
1818 case '|':
1819 if (maska || maskb) {
1820 op = '&';
1821 maska ^= MASK;
1822 maskb ^= MASK;
1823 negz = -1;
1824 }
1825 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001826 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001827
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001828 /* JRH: The original logic here was to allocate the result value (z)
1829 as the longer of the two operands. However, there are some cases
1830 where the result is guaranteed to be shorter than that: AND of two
1831 positives, OR of two negatives: use the shorter number. AND with
1832 mixed signs: use the positive number. OR with mixed signs: use the
1833 negative number. After the transformations above, op will be '&'
1834 iff one of these cases applies, and mask will be non-0 for operands
1835 whose length should be ignored.
1836 */
1837
1838 size_a = a->ob_size;
1839 size_b = b->ob_size;
1840 size_z = op == '&'
1841 ? (maska
1842 ? size_b
1843 : (maskb ? size_a : MIN(size_a, size_b)))
1844 : MAX(size_a, size_b);
1845 z = _PyLong_New(size_z);
1846 if (a == NULL || b == NULL || z == NULL) {
1847 Py_XDECREF(a);
1848 Py_XDECREF(b);
1849 Py_XDECREF(z);
1850 return NULL;
1851 }
1852
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001853 for (i = 0; i < size_z; ++i) {
1854 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1855 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1856 switch (op) {
1857 case '&': z->ob_digit[i] = diga & digb; break;
1858 case '|': z->ob_digit[i] = diga | digb; break;
1859 case '^': z->ob_digit[i] = diga ^ digb; break;
1860 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001861 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001862
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001863 Py_DECREF(a);
1864 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001865 z = long_normalize(z);
1866 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001867 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001868 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001869 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001870 return v;
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_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001875{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001876 PyLongObject *a, *b;
1877 PyObject *c;
1878 CONVERT_BINOP(v, w, &a, &b);
1879 c = long_bitwise(a, '&', b);
1880 Py_DECREF(a);
1881 Py_DECREF(b);
1882 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001883}
1884
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001885static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001886long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001887{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001888 PyLongObject *a, *b;
1889 PyObject *c;
1890 CONVERT_BINOP(v, w, &a, &b);
1891 c = long_bitwise(a, '^', b);
1892 Py_DECREF(a);
1893 Py_DECREF(b);
1894 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001895}
1896
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001897static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001898long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001899{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001900 PyLongObject *a, *b;
1901 PyObject *c;
1902 CONVERT_BINOP(v, w, &a, &b);
1903 c = long_bitwise(a, '|', b);
1904 Py_DECREF(a);
1905 Py_DECREF(b);
1906 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001907}
1908
Guido van Rossum234f9421993-06-17 12:35:49 +00001909static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001910long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001911{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001912 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001913 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001914 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001915 return 0;
1916 }
1917 return 1; /* Can't do it */
1918}
1919
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001920static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001921long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001922{
1923 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001924 x = PyLong_AsLong(v);
1925 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001926 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001927 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001928}
1929
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001930static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001931long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001932{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001933 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001934 return v;
1935}
1936
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001937static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001938long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001939{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001940 double result;
1941 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001942 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001943 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001944 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001945}
1946
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001947static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001948long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001949{
Fred Drake121ee271999-12-23 15:41:28 +00001950 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001951}
1952
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001953static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001954long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001955{
Fred Drake121ee271999-12-23 15:41:28 +00001956 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001957}
1958
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001959static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00001960 (binaryfunc) long_add, /*nb_add*/
1961 (binaryfunc) long_sub, /*nb_subtract*/
1962 (binaryfunc) long_mul, /*nb_multiply*/
1963 (binaryfunc) long_div, /*nb_divide*/
1964 (binaryfunc) long_mod, /*nb_remainder*/
1965 (binaryfunc) long_divmod, /*nb_divmod*/
1966 (ternaryfunc) long_pow, /*nb_power*/
1967 (unaryfunc) long_neg, /*nb_negative*/
1968 (unaryfunc) long_pos, /*tp_positive*/
1969 (unaryfunc) long_abs, /*tp_absolute*/
1970 (inquiry) long_nonzero, /*tp_nonzero*/
1971 (unaryfunc) long_invert, /*nb_invert*/
1972 (binaryfunc) long_lshift, /*nb_lshift*/
1973 (binaryfunc) long_rshift, /*nb_rshift*/
1974 (binaryfunc) long_and, /*nb_and*/
1975 (binaryfunc) long_xor, /*nb_xor*/
1976 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001977 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001978 (unaryfunc) long_int, /*nb_int*/
1979 (unaryfunc) long_long, /*nb_long*/
1980 (unaryfunc) long_float, /*nb_float*/
1981 (unaryfunc) long_oct, /*nb_oct*/
1982 (unaryfunc) long_hex, /*nb_hex*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00001983 0, /*nb_inplace_add*/
1984 0, /*nb_inplace_subtract*/
1985 0, /*nb_inplace_multiply*/
1986 0, /*nb_inplace_divide*/
1987 0, /*nb_inplace_remainder*/
1988 0, /*nb_inplace_power*/
1989 0, /*nb_inplace_lshift*/
1990 0, /*nb_inplace_rshift*/
1991 0, /*nb_inplace_and*/
1992 0, /*nb_inplace_xor*/
1993 0, /*nb_inplace_or*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001994};
1995
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001996PyTypeObject PyLong_Type = {
1997 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001998 0,
1999 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002000 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002001 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00002002 (destructor)long_dealloc, /*tp_dealloc*/
2003 0, /*tp_print*/
2004 0, /*tp_getattr*/
2005 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002006 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002007 (reprfunc)long_repr, /*tp_repr*/
2008 &long_as_number, /*tp_as_number*/
2009 0, /*tp_as_sequence*/
2010 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002011 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002012 0, /*tp_call*/
2013 (reprfunc)long_str, /*tp_str*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00002014 0, /*tp_getattro*/
2015 0, /*tp_setattro*/
2016 0, /*tp_as_buffer*/
Guido van Rossum6fd867b2001-01-17 15:33:18 +00002017 Py_TPFLAGS_CHECKTYPES /*tp_flags*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002018};