blob: f8a912940a94415f4513c7adec38b407e076dfa9 [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
Tim Peters898cf852001-06-13 20:50:08 +0000361 /* Copy over all the Python digits.
362 It's crucial that every Python digit except for the MSD contribute
363 exactly SHIFT bits to the total, so first assert that the long is
364 normalized. */
365 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000366 j = 0;
367 accum = 0;
368 accumbits = 0;
369 carry = do_twos_comp ? 1 : 0;
370 for (i = 0; i < ndigits; ++i) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000371 unsigned int numnewbits = SHIFT;
Tim Peters2a9b3672001-06-11 21:23:58 +0000372 twodigits thisdigit = v->ob_digit[i];
373 if (do_twos_comp) {
374 thisdigit = (thisdigit ^ MASK) + carry;
375 carry = thisdigit >> SHIFT;
376 thisdigit &= MASK;
377 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000378 /* Because we're going LSB to MSB, thisdigit is more
379 significant than what's already in accum, so needs to be
380 prepended to accum. */
381 accum |= thisdigit << accumbits;
382
383 /* How many new bits did we add? The most-significant digit
384 may be (probably is) at least partly empty. */
385 if (i == ndigits - 1) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000386 twodigits bitmask = 1 << (SHIFT - 1);
387 twodigits signbit = do_twos_comp << (SHIFT - 1);
388 unsigned int nsignbits = 0;
389 while ((thisdigit & bitmask) == signbit && bitmask) {
390 ++nsignbits;
391 bitmask >>= 1;
392 signbit >>= 1;
393 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000394 assert(nsignbits <= SHIFT);
395 numnewbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000396 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000397 accumbits += numnewbits;
398
Tim Peters2a9b3672001-06-11 21:23:58 +0000399 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000400 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000401 if (j >= n)
402 goto Overflow;
403 ++j;
404 *p = (unsigned char)(accum & 0xff);
405 p += pincr;
406 accumbits -= 8;
407 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000408 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000409 }
410
411 /* Store the straggler (if any). */
412 assert(accumbits < 8);
413 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000414 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000415 if (j >= n)
416 goto Overflow;
417 ++j;
418 if (do_twos_comp) {
419 /* Fill leading bits of the byte with sign bits
420 (appropriately pretending that the long had an
421 infinite supply of sign bits). */
422 accum |= (~(twodigits)0) << accumbits;
423 }
424 *p = (unsigned char)(accum & 0xff);
425 p += pincr;
426 }
427
428 /* Fill remaining bytes with copies of the sign bit. */
429 for ( ; j < n; ++j, p += pincr)
430 *p = (unsigned char)(do_twos_comp ? 0xff : 0);
431
432 /* Check for delicate overflow (not enough room for the sign bit). */
433 if (j > 0 && is_signed) {
434 unsigned char msb = *(p - pincr);
435 int sign_bit_set = (msb & 0x80) != 0;
436 if (sign_bit_set != do_twos_comp)
437 goto Overflow;
438 }
439 return 0;
440
441Overflow:
442 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
443 return -1;
444
445}
446
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000447/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000448
449double
Tim Peters9f688bf2000-07-07 15:53:28 +0000450PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000451{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000453 double x;
454 double multiplier = (double) (1L << SHIFT);
455 int i, sign;
456
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 if (vv == NULL || !PyLong_Check(vv)) {
458 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000459 return -1;
460 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000462 i = v->ob_size;
463 sign = 1;
464 x = 0.0;
465 if (i < 0) {
466 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000467 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000468 }
469 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000470 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000471 }
472 return x * sign;
473}
474
Guido van Rossum78694d91998-09-18 14:14:13 +0000475/* Create a new long (or int) object from a C pointer */
476
477PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000478PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000479{
480#if SIZEOF_VOID_P == SIZEOF_LONG
481 return PyInt_FromLong((long)p);
482#else
483 /* optimize null pointers */
484 if ( p == NULL )
485 return PyInt_FromLong(0);
486
487 /* we can assume that HAVE_LONG_LONG is true. if not, then the
488 configuration process should have bailed (having big pointers
489 without long longs seems non-sensical) */
490 return PyLong_FromLongLong((LONG_LONG)p);
491#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
492}
493
494/* Get a C pointer from a long object (or an int object in some cases) */
495
496void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000497PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000498{
499 /* This function will allow int or long objects. If vv is neither,
500 then the PyLong_AsLong*() functions will raise the exception:
501 PyExc_SystemError, "bad argument to internal function"
502 */
503
504#if SIZEOF_VOID_P == SIZEOF_LONG
505 long x;
506
507 if ( PyInt_Check(vv) )
508 x = PyInt_AS_LONG(vv);
509 else
510 x = PyLong_AsLong(vv);
511#else
512 /* we can assume that HAVE_LONG_LONG is true. if not, then the
513 configuration process should have bailed (having big pointers
514 without long longs seems non-sensical) */
515 LONG_LONG x;
516
517 if ( PyInt_Check(vv) )
518 x = PyInt_AS_LONG(vv);
519 else
520 x = PyLong_AsLongLong(vv);
521#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
522
523 if (x == -1 && PyErr_Occurred())
524 return NULL;
525 return (void *)x;
526}
527
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000528#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000529
530/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
531 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000532 */
533
Tim Petersd1a7da62001-06-13 00:35:57 +0000534#define IS_LITTLE_ENDIAN *(char*)&one != '\0'
535
536/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000537
538PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000539PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000540{
Tim Petersd1a7da62001-06-13 00:35:57 +0000541 LONG_LONG bytes = ival;
542 int one = 1;
543 return _PyLong_FromByteArray(
544 (unsigned char *)&bytes,
545 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000546}
547
Tim Petersd1a7da62001-06-13 00:35:57 +0000548/* Create a new long int object from a C unsigned LONG_LONG int. */
549
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000550PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000551PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000552{
Tim Petersd1a7da62001-06-13 00:35:57 +0000553 unsigned LONG_LONG bytes = ival;
554 int one = 1;
555 return _PyLong_FromByteArray(
556 (unsigned char *)&bytes,
557 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000558}
559
Guido van Rossum3293b071998-08-25 16:07:15 +0000560/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000561 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000562
Guido van Rossum3293b071998-08-25 16:07:15 +0000563LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000564PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000565{
Tim Petersd1a7da62001-06-13 00:35:57 +0000566 LONG_LONG bytes;
567 int one = 1;
568 int res;
569
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000570 if (vv == NULL || !PyLong_Check(vv)) {
571 PyErr_BadInternalCall();
572 return -1;
573 }
574
Tim Petersd1a7da62001-06-13 00:35:57 +0000575 res = _PyLong_AsByteArray(
576 (PyLongObject *)vv, (unsigned char *)&bytes,
577 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000578
Tim Peters9cb0c382001-06-13 20:45:17 +0000579 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000580}
581
Tim Petersd1a7da62001-06-13 00:35:57 +0000582/* Get a C unsigned LONG_LONG int from a long int object.
583 Return -1 and set an error if overflow occurs. */
584
Guido van Rossum3293b071998-08-25 16:07:15 +0000585unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000586PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000587{
Tim Petersd1a7da62001-06-13 00:35:57 +0000588 unsigned LONG_LONG bytes;
589 int one = 1;
590 int res;
591
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000592 if (vv == NULL || !PyLong_Check(vv)) {
593 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000594 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000595 }
596
Tim Petersd1a7da62001-06-13 00:35:57 +0000597 res = _PyLong_AsByteArray(
598 (PyLongObject *)vv, (unsigned char *)&bytes,
599 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000600
Tim Peters9cb0c382001-06-13 20:45:17 +0000601 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000602}
Tim Petersd1a7da62001-06-13 00:35:57 +0000603
604#undef IS_LITTLE_ENDIAN
605
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000606#endif /* HAVE_LONG_LONG */
607
Neil Schemenauerba872e22001-01-04 01:46:03 +0000608
609static int
610convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
611 if (PyLong_Check(v)) {
612 *a = (PyLongObject *) v;
613 Py_INCREF(v);
614 }
615 else if (PyInt_Check(v)) {
616 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
617 }
618 else {
619 return 0;
620 }
621 if (PyLong_Check(w)) {
622 *b = (PyLongObject *) w;
623 Py_INCREF(w);
624 }
625 else if (PyInt_Check(w)) {
626 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
627 }
628 else {
629 Py_DECREF(*a);
630 return 0;
631 }
632 return 1;
633}
634
635#define CONVERT_BINOP(v, w, a, b) \
636 if (!convert_binop(v, w, a, b)) { \
637 Py_INCREF(Py_NotImplemented); \
638 return Py_NotImplemented; \
639 }
640
641
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000642/* Multiply by a single digit, ignoring the sign. */
643
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000645mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000646{
647 return muladd1(a, n, (digit)0);
648}
649
650/* Multiply by a single digit and add a single digit, ignoring the sign. */
651
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000653muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000654{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000655 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000657 twodigits carry = extra;
658 int i;
659
660 if (z == NULL)
661 return NULL;
662 for (i = 0; i < size_a; ++i) {
663 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000664 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000665 carry >>= SHIFT;
666 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000667 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000668 return long_normalize(z);
669}
670
671/* Divide a long integer by a digit, returning both the quotient
672 (as function result) and the remainder (through *prem).
673 The sign of a is ignored; n should not be zero. */
674
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000676divrem1(PyLongObject *a, wdigit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000677{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000678 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000679 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000680 int i;
681 twodigits rem = 0;
682
683 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000684 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000685 if (z == NULL)
686 return NULL;
687 for (i = size; --i >= 0; ) {
688 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000689 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000690 rem %= n;
691 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000692 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000693 return long_normalize(z);
694}
695
696/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000697 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000698 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000699
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000701long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000702{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 register PyLongObject *a = (PyLongObject *)aa;
704 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000705 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000706 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000707 char *p;
708 int bits;
709 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000710
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 if (a == NULL || !PyLong_Check(a)) {
712 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000713 return NULL;
714 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000715 assert(base >= 2 && base <= 36);
716
717 /* Compute a rough upper bound for the length of the string */
718 i = base;
719 bits = 0;
720 while (i > 1) {
721 ++bits;
722 i >>= 1;
723 }
Fred Drake121ee271999-12-23 15:41:28 +0000724 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000726 if (str == NULL)
727 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000729 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000730 if (addL)
731 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000732 if (a->ob_size < 0)
733 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000734
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000735 if (a->ob_size == 0) {
736 *--p = '0';
737 }
738 else if ((base & (base - 1)) == 0) {
739 /* JRH: special case for power-of-2 bases */
740 twodigits temp = a->ob_digit[0];
741 int bitsleft = SHIFT;
742 int rem;
743 int last = abs(a->ob_size);
744 int basebits = 1;
745 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000746 while ((i >>= 1) > 1)
747 ++basebits;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000748
749 i = 0;
750 for (;;) {
751 while (bitsleft >= basebits) {
752 if ((temp == 0) && (i >= last - 1)) break;
753 rem = temp & (base - 1);
754 if (rem < 10)
755 rem += '0';
756 else
757 rem += 'A' - 10;
758 assert(p > PyString_AS_STRING(str));
759 *--p = (char) rem;
760 bitsleft -= basebits;
761 temp >>= basebits;
762 }
763 if (++i >= last) {
764 if (temp == 0) break;
765 bitsleft = 99;
766 /* loop again to pick up final digits */
767 }
768 else {
769 temp = (a->ob_digit[i] << bitsleft) | temp;
770 bitsleft += SHIFT;
771 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000772 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000773 }
774 else {
775 Py_INCREF(a);
776 do {
777 digit rem;
778 PyLongObject *temp = divrem1(a, (digit)base, &rem);
779 if (temp == NULL) {
780 Py_DECREF(a);
781 Py_DECREF(str);
782 return NULL;
783 }
784 if (rem < 10)
785 rem += '0';
786 else
787 rem += 'A'-10;
788 assert(p > PyString_AS_STRING(str));
789 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000790 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000791 a = temp;
792 SIGCHECK({
793 Py_DECREF(a);
794 Py_DECREF(str);
795 return NULL;
796 })
797 } while (ABS(a->ob_size) != 0);
798 Py_DECREF(a);
799 }
800
Guido van Rossum2c475421992-08-14 15:13:07 +0000801 if (base == 8) {
802 if (size_a != 0)
803 *--p = '0';
804 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000805 else if (base == 16) {
806 *--p = 'x';
807 *--p = '0';
808 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000809 else if (base != 10) {
810 *--p = '#';
811 *--p = '0' + base%10;
812 if (base > 10)
813 *--p = '0' + base/10;
814 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000815 if (sign)
816 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 if (p != PyString_AS_STRING(str)) {
818 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000819 assert(p > q);
820 do {
821 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000822 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 _PyString_Resize((PyObject **)&str,
824 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000825 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000826 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000827}
828
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000829PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000830PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000831{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000832 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000833 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000835
Guido van Rossum472c04f1996-12-05 21:57:21 +0000836 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000838 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000839 return NULL;
840 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000841 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000842 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000843 if (*str == '+')
844 ++str;
845 else if (*str == '-') {
846 ++str;
847 sign = -1;
848 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000849 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000850 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000851 if (base == 0) {
852 if (str[0] != '0')
853 base = 10;
854 else if (str[1] == 'x' || str[1] == 'X')
855 base = 16;
856 else
857 base = 8;
858 }
859 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
860 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000862 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000863 for ( ; z != NULL; ++str) {
864 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000866
867 if (*str <= '9')
868 k = *str - '0';
869 else if (*str >= 'a')
870 k = *str - 'a' + 10;
871 else if (*str >= 'A')
872 k = *str - 'A' + 10;
873 if (k < 0 || k >= base)
874 break;
875 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000877 z = temp;
878 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000879 if (z == NULL)
880 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000881 if (str == start)
882 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000883 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000884 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000885 if (*str == 'L' || *str == 'l')
886 str++;
887 while (*str && isspace(Py_CHARMASK(*str)))
888 str++;
889 if (*str != '\0')
890 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000891 if (pend)
892 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000894
895 onError:
896 PyErr_Format(PyExc_ValueError,
897 "invalid literal for long(): %.200s", orig_str);
898 Py_XDECREF(z);
899 return NULL;
900}
901
902PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000903PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000904{
905 char buffer[256];
906
907 if (length >= sizeof(buffer)) {
908 PyErr_SetString(PyExc_ValueError,
909 "long() literal too large to convert");
910 return NULL;
911 }
912 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
913 return NULL;
914
915 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000916}
917
Tim Peters9f688bf2000-07-07 15:53:28 +0000918/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +0000920 (PyLongObject *, PyLongObject *, PyLongObject **);
921static PyObject *long_pos(PyLongObject *);
922static int long_divrem(PyLongObject *, PyLongObject *,
923 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000924
925/* Long division with remainder, top-level routine */
926
Guido van Rossume32e0141992-01-19 16:31:05 +0000927static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000928long_divrem(PyLongObject *a, PyLongObject *b,
929 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000930{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000931 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000933
934 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000935 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000936 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +0000937 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000938 }
939 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000940 (size_a == size_b &&
941 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000942 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943 *pdiv = _PyLong_New(0);
944 Py_INCREF(a);
945 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000946 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000947 }
948 if (size_b == 1) {
949 digit rem = 0;
950 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000951 if (z == NULL)
952 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000953 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000954 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000955 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000956 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000957 if (z == NULL)
958 return -1;
959 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000960 /* Set the signs.
961 The quotient z has the sign of a*b;
962 the remainder r has the sign of a,
963 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000964 if ((a->ob_size < 0) != (b->ob_size < 0))
965 z->ob_size = -(z->ob_size);
966 if (a->ob_size < 0 && (*prem)->ob_size != 0)
967 (*prem)->ob_size = -((*prem)->ob_size);
968 *pdiv = z;
969 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000970}
971
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000972/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000973
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000975x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000976{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000977 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000978 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 PyLongObject *v = mul1(v1, d);
980 PyLongObject *w = mul1(w1, d);
981 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000982 int j, k;
983
984 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985 Py_XDECREF(v);
986 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000987 return NULL;
988 }
989
990 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000991 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000992 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000993
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000994 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000995 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000996
997 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
998 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
999 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001000 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001001 int i;
1002
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001003 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001004 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001005 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001006 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001007 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001008 if (vj == w->ob_digit[size_w-1])
1009 q = MASK;
1010 else
1011 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1012 w->ob_digit[size_w-1];
1013
1014 while (w->ob_digit[size_w-2]*q >
1015 ((
1016 ((twodigits)vj << SHIFT)
1017 + v->ob_digit[j-1]
1018 - q*w->ob_digit[size_w-1]
1019 ) << SHIFT)
1020 + v->ob_digit[j-2])
1021 --q;
1022
1023 for (i = 0; i < size_w && i+k < size_v; ++i) {
1024 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001025 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026 carry += v->ob_digit[i+k] - z
1027 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001028 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001029 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1030 carry, SHIFT);
1031 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001032 }
1033
1034 if (i+k < size_v) {
1035 carry += v->ob_digit[i+k];
1036 v->ob_digit[i+k] = 0;
1037 }
1038
1039 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001040 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001041 else {
1042 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001043 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001044 carry = 0;
1045 for (i = 0; i < size_w && i+k < size_v; ++i) {
1046 carry += v->ob_digit[i+k] + w->ob_digit[i];
1047 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001048 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1049 BASE_TWODIGITS_TYPE,
1050 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001051 }
1052 }
1053 } /* for j, k */
1054
Guido van Rossumc206c761995-01-10 15:23:19 +00001055 if (a == NULL)
1056 *prem = NULL;
1057 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001058 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001059 *prem = divrem1(v, d, &d);
1060 /* d receives the (unused) remainder */
1061 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001062 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001063 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001064 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001065 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001066 Py_DECREF(v);
1067 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001068 return a;
1069}
1070
1071/* Methods */
1072
1073static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001074long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001075{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001076 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001077}
1078
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001080long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001081{
Fred Drake121ee271999-12-23 15:41:28 +00001082 return long_format(v, 10, 1);
1083}
1084
1085static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001086long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001087{
1088 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001089}
1090
1091static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001092long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001093{
1094 int sign;
1095
Guido van Rossumc6913e71991-11-19 20:26:46 +00001096 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001097 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001098 sign = 0;
1099 else
1100 sign = a->ob_size - b->ob_size;
1101 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001102 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001103 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001104 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1105 ;
1106 if (i < 0)
1107 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001108 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001109 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001110 if (a->ob_size < 0)
1111 sign = -sign;
1112 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001113 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001114 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001115}
1116
Guido van Rossum9bfef441993-03-29 10:43:31 +00001117static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001118long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001119{
1120 long x;
1121 int i, sign;
1122
1123 /* This is designed so that Python ints and longs with the
1124 same value hash to the same value, otherwise comparisons
1125 of mapping keys will turn out weird */
1126 i = v->ob_size;
1127 sign = 1;
1128 x = 0;
1129 if (i < 0) {
1130 sign = -1;
1131 i = -(i);
1132 }
1133 while (--i >= 0) {
1134 /* Force a 32-bit circular shift */
1135 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1136 x += v->ob_digit[i];
1137 }
1138 x = x * sign;
1139 if (x == -1)
1140 x = -2;
1141 return x;
1142}
1143
1144
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001145/* Add the absolute values of two long integers. */
1146
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001147static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001148x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001149{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001150 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001151 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001152 int i;
1153 digit carry = 0;
1154
1155 /* Ensure a is the larger of the two: */
1156 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001157 { PyLongObject *temp = a; a = b; b = temp; }
1158 { int size_temp = size_a;
1159 size_a = size_b;
1160 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001161 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001162 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001163 if (z == NULL)
1164 return NULL;
1165 for (i = 0; i < size_b; ++i) {
1166 carry += a->ob_digit[i] + b->ob_digit[i];
1167 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001168 carry >>= SHIFT;
1169 }
1170 for (; i < size_a; ++i) {
1171 carry += a->ob_digit[i];
1172 z->ob_digit[i] = carry & MASK;
1173 carry >>= SHIFT;
1174 }
1175 z->ob_digit[i] = carry;
1176 return long_normalize(z);
1177}
1178
1179/* Subtract the absolute values of two integers. */
1180
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001181static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001182x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001183{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001184 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001185 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001186 int i;
1187 int sign = 1;
1188 digit borrow = 0;
1189
1190 /* Ensure a is the larger of the two: */
1191 if (size_a < size_b) {
1192 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001193 { PyLongObject *temp = a; a = b; b = temp; }
1194 { int size_temp = size_a;
1195 size_a = size_b;
1196 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001197 }
1198 else if (size_a == size_b) {
1199 /* Find highest digit where a and b differ: */
1200 i = size_a;
1201 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1202 ;
1203 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001204 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001205 if (a->ob_digit[i] < b->ob_digit[i]) {
1206 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001207 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001208 }
1209 size_a = size_b = i+1;
1210 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001211 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001212 if (z == NULL)
1213 return NULL;
1214 for (i = 0; i < size_b; ++i) {
1215 /* The following assumes unsigned arithmetic
1216 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001217 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001218 z->ob_digit[i] = borrow & MASK;
1219 borrow >>= SHIFT;
1220 borrow &= 1; /* Keep only one sign bit */
1221 }
1222 for (; i < size_a; ++i) {
1223 borrow = a->ob_digit[i] - borrow;
1224 z->ob_digit[i] = borrow & MASK;
1225 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001226 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001227 }
1228 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001229 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001230 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001231 return long_normalize(z);
1232}
1233
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001234static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001235long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001236{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001237 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001238
Neil Schemenauerba872e22001-01-04 01:46:03 +00001239 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1240
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001241 if (a->ob_size < 0) {
1242 if (b->ob_size < 0) {
1243 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001244 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001245 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001246 }
1247 else
1248 z = x_sub(b, a);
1249 }
1250 else {
1251 if (b->ob_size < 0)
1252 z = x_sub(a, b);
1253 else
1254 z = x_add(a, b);
1255 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001256 Py_DECREF(a);
1257 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001258 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001259}
1260
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001261static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001262long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001263{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001264 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001265
Neil Schemenauerba872e22001-01-04 01:46:03 +00001266 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1267
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001268 if (a->ob_size < 0) {
1269 if (b->ob_size < 0)
1270 z = x_sub(a, b);
1271 else
1272 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001273 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001274 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001275 }
1276 else {
1277 if (b->ob_size < 0)
1278 z = x_add(a, b);
1279 else
1280 z = x_sub(a, b);
1281 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001282 Py_DECREF(a);
1283 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001285}
1286
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001288long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001289{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001290 /* sequence * long */
1291 long n = PyLong_AsLong((PyObject *) w);
1292 if (n == -1 && PyErr_Occurred())
1293 return NULL;
1294 else
1295 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1296}
1297
1298static PyObject *
1299long_mul(PyLongObject *v, PyLongObject *w)
1300{
1301 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001302 int size_a;
1303 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001304 int i;
1305
Neil Schemenauerba872e22001-01-04 01:46:03 +00001306 if (v->ob_type->tp_as_sequence &&
1307 v->ob_type->tp_as_sequence->sq_repeat) {
1308 return long_repeat((PyObject *)v, w);
1309 }
1310 else if (w->ob_type->tp_as_sequence &&
1311 w->ob_type->tp_as_sequence->sq_repeat) {
1312 return long_repeat((PyObject *)w, v);
1313 }
1314
1315 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1316
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001317 size_a = ABS(a->ob_size);
1318 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001319 if (size_a > size_b) {
1320 /* we are faster with the small object on the left */
1321 int hold_sa = size_a;
1322 PyLongObject *hold_a = a;
1323 size_a = size_b;
1324 size_b = hold_sa;
1325 a = b;
1326 b = hold_a;
1327 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001328 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001329 if (z == NULL) {
1330 Py_DECREF(a);
1331 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001332 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001333 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001334 for (i = 0; i < z->ob_size; ++i)
1335 z->ob_digit[i] = 0;
1336 for (i = 0; i < size_a; ++i) {
1337 twodigits carry = 0;
1338 twodigits f = a->ob_digit[i];
1339 int j;
1340
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001341 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001342 Py_DECREF(a);
1343 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001344 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001345 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001346 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001347 for (j = 0; j < size_b; ++j) {
1348 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001349 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001350 carry >>= SHIFT;
1351 }
1352 for (; carry != 0; ++j) {
1353 assert(i+j < z->ob_size);
1354 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001355 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001356 carry >>= SHIFT;
1357 }
1358 }
1359 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001360 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001361 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001362 z->ob_size = -(z->ob_size);
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 *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001366}
1367
Guido van Rossume32e0141992-01-19 16:31:05 +00001368/* The / and % operators are now defined in terms of divmod().
1369 The expression a mod b has the value a - b*floor(a/b).
1370 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001371 |a| by |b|, with the sign of a. This is also expressed
1372 as a - b*trunc(a/b), if trunc truncates towards zero.
1373 Some examples:
1374 a b a rem b a mod b
1375 13 10 3 3
1376 -13 10 -3 7
1377 13 -10 3 -7
1378 -13 -10 -3 -3
1379 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001380 have different signs. We then subtract one from the 'div'
1381 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001382
Guido van Rossume32e0141992-01-19 16:31:05 +00001383static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001384l_divmod(PyLongObject *v, PyLongObject *w,
1385 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001386{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001388
1389 if (long_divrem(v, w, &div, &mod) < 0)
1390 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001391 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1392 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001393 PyLongObject *temp;
1394 PyLongObject *one;
1395 temp = (PyLongObject *) long_add(mod, w);
1396 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001397 mod = temp;
1398 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001399 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001400 return -1;
1401 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001402 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001403 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001404 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1405 Py_DECREF(mod);
1406 Py_DECREF(div);
1407 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001408 return -1;
1409 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001410 Py_DECREF(one);
1411 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001412 div = temp;
1413 }
1414 *pdiv = div;
1415 *pmod = mod;
1416 return 0;
1417}
1418
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001420long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001421{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001422 PyLongObject *a, *b, *div, *mod;
1423
1424 CONVERT_BINOP(v, w, &a, &b);
1425
1426 if (l_divmod(a, b, &div, &mod) < 0) {
1427 Py_DECREF(a);
1428 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001429 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001430 }
1431 Py_DECREF(a);
1432 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433 Py_DECREF(mod);
1434 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001435}
1436
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001437static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001438long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001439{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001440 PyLongObject *a, *b, *div, *mod;
1441
1442 CONVERT_BINOP(v, w, &a, &b);
1443
1444 if (l_divmod(a, b, &div, &mod) < 0) {
1445 Py_DECREF(a);
1446 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001447 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001448 }
1449 Py_DECREF(a);
1450 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001451 Py_DECREF(div);
1452 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001453}
1454
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001456long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001457{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001458 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001459 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001460
1461 CONVERT_BINOP(v, w, &a, &b);
1462
1463 if (l_divmod(a, b, &div, &mod) < 0) {
1464 Py_DECREF(a);
1465 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001466 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001467 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001468 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001469 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001470 PyTuple_SetItem(z, 0, (PyObject *) div);
1471 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001472 }
1473 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001474 Py_DECREF(div);
1475 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001476 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001477 Py_DECREF(a);
1478 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001479 return z;
1480}
1481
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001482static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001483long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001484{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001485 PyLongObject *a, *b;
1486 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001487 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001488 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001489
1490 CONVERT_BINOP(v, w, &a, &b);
1491 if (PyLong_Check(x) || Py_None == x) {
1492 c = x;
1493 Py_INCREF(x);
1494 }
1495 else if (PyInt_Check(x)) {
1496 c = PyLong_FromLong(PyInt_AS_LONG(x));
1497 }
1498 else {
1499 Py_DECREF(a);
1500 Py_DECREF(b);
1501 Py_INCREF(Py_NotImplemented);
1502 return Py_NotImplemented;
1503 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001504
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001505 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001506 if (size_b < 0) {
Tim Petersc54d1902000-10-06 00:36:09 +00001507 if (a->ob_size)
1508 PyErr_SetString(PyExc_ValueError,
1509 "long integer to a negative power");
1510 else
1511 PyErr_SetString(PyExc_ZeroDivisionError,
1512 "zero to a negative power");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001513 z = NULL;
1514 goto error;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001515 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001516 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001517 for (i = 0; i < size_b; ++i) {
1518 digit bi = b->ob_digit[i];
1519 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001520
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001521 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001522 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001523
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001524 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001525 temp = (PyLongObject *)long_mul(z, a);
1526 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001527 if (c!=Py_None && temp!=NULL) {
1528 if (l_divmod(temp,(PyLongObject *)c,
1529 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001530 Py_DECREF(temp);
1531 z = NULL;
1532 goto error;
1533 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001534 Py_XDECREF(div);
1535 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001536 temp = mod;
1537 }
1538 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001539 if (z == NULL)
1540 break;
1541 }
1542 bi >>= 1;
1543 if (bi == 0 && i+1 == size_b)
1544 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001545 temp = (PyLongObject *)long_mul(a, a);
1546 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001547 if (c!=Py_None && temp!=NULL) {
1548 if (l_divmod(temp, (PyLongObject *)c, &div,
1549 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001550 Py_DECREF(temp);
1551 z = NULL;
1552 goto error;
1553 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001554 Py_XDECREF(div);
1555 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001556 temp = mod;
1557 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001558 a = temp;
1559 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001560 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001561 z = NULL;
1562 break;
1563 }
1564 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001565 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001566 break;
1567 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001568 if (c!=Py_None && z!=NULL) {
1569 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001570 Py_DECREF(z);
1571 z = NULL;
1572 }
1573 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574 Py_XDECREF(div);
1575 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001576 z = mod;
1577 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001578 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001579 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001580 Py_XDECREF(a);
1581 Py_DECREF(b);
1582 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001583 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001584}
1585
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001586static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001587long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001588{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001589 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001590 PyLongObject *x;
1591 PyLongObject *w;
1592 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001593 if (w == NULL)
1594 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001595 x = (PyLongObject *) long_add(v, w);
1596 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001597 if (x == NULL)
1598 return NULL;
1599 if (x->ob_size != 0)
1600 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001601 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001602}
1603
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001604static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001605long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001606{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001607 Py_INCREF(v);
1608 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001609}
1610
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001611static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001612long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001613{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001614 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001615 int i, n;
1616 n = ABS(v->ob_size);
1617 if (n == 0) {
1618 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001619 Py_INCREF(v);
1620 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001621 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001622 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001623 if (z == NULL)
1624 return NULL;
1625 for (i = 0; i < n; i++)
1626 z->ob_digit[i] = v->ob_digit[i];
1627 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001628 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001629}
1630
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001631static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001632long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001633{
1634 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001635 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001636 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001637 Py_INCREF(v);
1638 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001639 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001640}
1641
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001642static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001643long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001644{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001645 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001646}
1647
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001648static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001649long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001650{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001651 PyLongObject *a, *b;
1652 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001653 long shiftby;
1654 int newsize, wordshift, loshift, hishift, i, j;
1655 digit lomask, himask;
1656
Neil Schemenauerba872e22001-01-04 01:46:03 +00001657 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1658
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001659 if (a->ob_size < 0) {
1660 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001661 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001662 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001663 if (a1 == NULL)
1664 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001665 a2 = (PyLongObject *) long_rshift(a1, b);
1666 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001667 if (a2 == NULL)
1668 goto rshift_error;
1669 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001670 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001671 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001672 else {
1673
1674 shiftby = PyLong_AsLong((PyObject *)b);
1675 if (shiftby == -1L && PyErr_Occurred())
1676 goto rshift_error;
1677 if (shiftby < 0) {
1678 PyErr_SetString(PyExc_ValueError,
1679 "negative shift count");
1680 goto rshift_error;
1681 }
1682 wordshift = shiftby / SHIFT;
1683 newsize = ABS(a->ob_size) - wordshift;
1684 if (newsize <= 0) {
1685 z = _PyLong_New(0);
1686 Py_DECREF(a);
1687 Py_DECREF(b);
1688 return (PyObject *)z;
1689 }
1690 loshift = shiftby % SHIFT;
1691 hishift = SHIFT - loshift;
1692 lomask = ((digit)1 << hishift) - 1;
1693 himask = MASK ^ lomask;
1694 z = _PyLong_New(newsize);
1695 if (z == NULL)
1696 goto rshift_error;
1697 if (a->ob_size < 0)
1698 z->ob_size = -(z->ob_size);
1699 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1700 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1701 if (i+1 < newsize)
1702 z->ob_digit[i] |=
1703 (a->ob_digit[j+1] << hishift) & himask;
1704 }
1705 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001706 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001707rshift_error:
1708 Py_DECREF(a);
1709 Py_DECREF(b);
1710 return (PyObject *) z;
1711
Guido van Rossumc6913e71991-11-19 20:26:46 +00001712}
1713
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001714static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001715long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001716{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001717 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001718 PyLongObject *a, *b;
1719 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001720 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001721 int oldsize, newsize, wordshift, remshift, i, j;
1722 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001723
Neil Schemenauerba872e22001-01-04 01:46:03 +00001724 CONVERT_BINOP(v, w, &a, &b);
1725
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001726 shiftby = PyLong_AsLong((PyObject *)b);
1727 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001728 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001729 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001730 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001731 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001732 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001733 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001734 PyErr_SetString(PyExc_ValueError,
1735 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001736 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001737 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001738 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1739 wordshift = (int)shiftby / SHIFT;
1740 remshift = (int)shiftby - wordshift * SHIFT;
1741
1742 oldsize = ABS(a->ob_size);
1743 newsize = oldsize + wordshift;
1744 if (remshift)
1745 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001746 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001747 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001748 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001749 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001750 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001751 for (i = 0; i < wordshift; i++)
1752 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001753 accum = 0;
1754 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1755 accum |= a->ob_digit[j] << remshift;
1756 z->ob_digit[i] = (digit)(accum & MASK);
1757 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001758 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001759 if (remshift)
1760 z->ob_digit[newsize-1] = (digit)accum;
1761 else
1762 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001763 z = long_normalize(z);
1764lshift_error:
1765 Py_DECREF(a);
1766 Py_DECREF(b);
1767 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001768}
1769
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001770
1771/* Bitwise and/xor/or operations */
1772
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001773#define MAX(x, y) ((x) < (y) ? (y) : (x))
1774#define MIN(x, y) ((x) > (y) ? (y) : (x))
1775
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001776static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001777long_bitwise(PyLongObject *a,
1778 int op, /* '&', '|', '^' */
1779 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001780{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001781 digit maska, maskb; /* 0 or MASK */
1782 int negz;
1783 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001784 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001785 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001786 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001787 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001788
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001789 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001790 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001791 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001792 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001793 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001794 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001795 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001796 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001797 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001798 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001799 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001800 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001801 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001802 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001803 maskb = 0;
1804 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001805
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001806 negz = 0;
1807 switch (op) {
1808 case '^':
1809 if (maska != maskb) {
1810 maska ^= MASK;
1811 negz = -1;
1812 }
1813 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001814 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001815 if (maska && maskb) {
1816 op = '|';
1817 maska ^= MASK;
1818 maskb ^= MASK;
1819 negz = -1;
1820 }
1821 break;
1822 case '|':
1823 if (maska || maskb) {
1824 op = '&';
1825 maska ^= MASK;
1826 maskb ^= MASK;
1827 negz = -1;
1828 }
1829 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001830 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001831
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001832 /* JRH: The original logic here was to allocate the result value (z)
1833 as the longer of the two operands. However, there are some cases
1834 where the result is guaranteed to be shorter than that: AND of two
1835 positives, OR of two negatives: use the shorter number. AND with
1836 mixed signs: use the positive number. OR with mixed signs: use the
1837 negative number. After the transformations above, op will be '&'
1838 iff one of these cases applies, and mask will be non-0 for operands
1839 whose length should be ignored.
1840 */
1841
1842 size_a = a->ob_size;
1843 size_b = b->ob_size;
1844 size_z = op == '&'
1845 ? (maska
1846 ? size_b
1847 : (maskb ? size_a : MIN(size_a, size_b)))
1848 : MAX(size_a, size_b);
1849 z = _PyLong_New(size_z);
1850 if (a == NULL || b == NULL || z == NULL) {
1851 Py_XDECREF(a);
1852 Py_XDECREF(b);
1853 Py_XDECREF(z);
1854 return NULL;
1855 }
1856
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001857 for (i = 0; i < size_z; ++i) {
1858 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1859 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1860 switch (op) {
1861 case '&': z->ob_digit[i] = diga & digb; break;
1862 case '|': z->ob_digit[i] = diga | digb; break;
1863 case '^': z->ob_digit[i] = diga ^ digb; break;
1864 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001865 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001866
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001867 Py_DECREF(a);
1868 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001869 z = long_normalize(z);
1870 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001871 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001872 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001873 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001874 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001875}
1876
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001877static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001878long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001879{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001880 PyLongObject *a, *b;
1881 PyObject *c;
1882 CONVERT_BINOP(v, w, &a, &b);
1883 c = long_bitwise(a, '&', b);
1884 Py_DECREF(a);
1885 Py_DECREF(b);
1886 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001887}
1888
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001889static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001890long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001891{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001892 PyLongObject *a, *b;
1893 PyObject *c;
1894 CONVERT_BINOP(v, w, &a, &b);
1895 c = long_bitwise(a, '^', b);
1896 Py_DECREF(a);
1897 Py_DECREF(b);
1898 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001899}
1900
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001901static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001902long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001903{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001904 PyLongObject *a, *b;
1905 PyObject *c;
1906 CONVERT_BINOP(v, w, &a, &b);
1907 c = long_bitwise(a, '|', b);
1908 Py_DECREF(a);
1909 Py_DECREF(b);
1910 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001911}
1912
Guido van Rossum234f9421993-06-17 12:35:49 +00001913static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001914long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001915{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001916 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001917 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001918 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001919 return 0;
1920 }
1921 return 1; /* Can't do it */
1922}
1923
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001924static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001925long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001926{
1927 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001928 x = PyLong_AsLong(v);
1929 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001930 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001931 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001932}
1933
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001934static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001935long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001936{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001937 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001938 return v;
1939}
1940
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001941static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001942long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001943{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001944 double result;
1945 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001946 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001947 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001948 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001949}
1950
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001951static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001952long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001953{
Fred Drake121ee271999-12-23 15:41:28 +00001954 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001955}
1956
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001957static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001958long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001959{
Fred Drake121ee271999-12-23 15:41:28 +00001960 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001961}
1962
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001963static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00001964 (binaryfunc) long_add, /*nb_add*/
1965 (binaryfunc) long_sub, /*nb_subtract*/
1966 (binaryfunc) long_mul, /*nb_multiply*/
1967 (binaryfunc) long_div, /*nb_divide*/
1968 (binaryfunc) long_mod, /*nb_remainder*/
1969 (binaryfunc) long_divmod, /*nb_divmod*/
1970 (ternaryfunc) long_pow, /*nb_power*/
1971 (unaryfunc) long_neg, /*nb_negative*/
1972 (unaryfunc) long_pos, /*tp_positive*/
1973 (unaryfunc) long_abs, /*tp_absolute*/
1974 (inquiry) long_nonzero, /*tp_nonzero*/
1975 (unaryfunc) long_invert, /*nb_invert*/
1976 (binaryfunc) long_lshift, /*nb_lshift*/
1977 (binaryfunc) long_rshift, /*nb_rshift*/
1978 (binaryfunc) long_and, /*nb_and*/
1979 (binaryfunc) long_xor, /*nb_xor*/
1980 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001981 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001982 (unaryfunc) long_int, /*nb_int*/
1983 (unaryfunc) long_long, /*nb_long*/
1984 (unaryfunc) long_float, /*nb_float*/
1985 (unaryfunc) long_oct, /*nb_oct*/
1986 (unaryfunc) long_hex, /*nb_hex*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00001987 0, /*nb_inplace_add*/
1988 0, /*nb_inplace_subtract*/
1989 0, /*nb_inplace_multiply*/
1990 0, /*nb_inplace_divide*/
1991 0, /*nb_inplace_remainder*/
1992 0, /*nb_inplace_power*/
1993 0, /*nb_inplace_lshift*/
1994 0, /*nb_inplace_rshift*/
1995 0, /*nb_inplace_and*/
1996 0, /*nb_inplace_xor*/
1997 0, /*nb_inplace_or*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001998};
1999
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002000PyTypeObject PyLong_Type = {
2001 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002002 0,
2003 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002004 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002005 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00002006 (destructor)long_dealloc, /*tp_dealloc*/
2007 0, /*tp_print*/
2008 0, /*tp_getattr*/
2009 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002010 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002011 (reprfunc)long_repr, /*tp_repr*/
2012 &long_as_number, /*tp_as_number*/
2013 0, /*tp_as_sequence*/
2014 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002015 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002016 0, /*tp_call*/
2017 (reprfunc)long_str, /*tp_str*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00002018 0, /*tp_getattro*/
2019 0, /*tp_setattro*/
2020 0, /*tp_as_buffer*/
Guido van Rossum6fd867b2001-01-17 15:33:18 +00002021 Py_TPFLAGS_CHECKTYPES /*tp_flags*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002022};