blob: 85b26a3fe31b11e3dbb6c2a4b7fa6a772f561672 [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{
Tim Petersce9de2f2001-06-14 04:56:19 +000060 PyLongObject *v;
61 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
62 int ndigits = 0;
63 int negative = 0;
64
65 if (ival < 0) {
66 ival = -ival;
67 negative = 1;
68 }
69
70 /* Count the number of Python digits.
71 We used to pick 5 ("big enough for anything"), but that's a
72 waste of time and space given that 5*15 = 75 bits are rarely
73 needed. */
74 t = (unsigned long)ival;
75 while (t) {
76 ++ndigits;
77 t >>= SHIFT;
78 }
79 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000080 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +000081 digit *p = v->ob_digit;
82 v->ob_size = negative ? -ndigits : ndigits;
83 t = (unsigned long)ival;
84 while (t) {
85 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000086 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000087 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000088 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000090}
91
Guido van Rossum53756b11997-01-03 17:14:46 +000092/* Create a new long int object from a C unsigned long int */
93
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000095PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +000096{
Tim Petersce9de2f2001-06-14 04:56:19 +000097 PyLongObject *v;
98 unsigned long t;
99 int ndigits = 0;
100
101 /* Count the number of Python digits. */
102 t = (unsigned long)ival;
103 while (t) {
104 ++ndigits;
105 t >>= SHIFT;
106 }
107 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000108 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000109 digit *p = v->ob_digit;
110 v->ob_size = ndigits;
111 while (ival) {
112 *p++ = (digit)(ival & MASK);
113 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000114 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000115 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000117}
118
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000119/* Create a new long int object from a C double */
120
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000123{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000124 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000125 double frac;
126 int i, ndig, expo, neg;
127 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000128 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000129 PyErr_SetString(PyExc_OverflowError,
130 "cannot convert float infinity to long");
131 return NULL;
132 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000133 if (dval < 0.0) {
134 neg = 1;
135 dval = -dval;
136 }
137 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
138 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000140 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000142 if (v == NULL)
143 return NULL;
144 frac = ldexp(frac, (expo-1) % SHIFT + 1);
145 for (i = ndig; --i >= 0; ) {
146 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000147 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000148 frac = frac - (double)bits;
149 frac = ldexp(frac, SHIFT);
150 }
151 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000152 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000153 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000154}
155
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000156/* Get a C long int from a long int object.
157 Returns -1 and sets an error condition if overflow occurs. */
158
159long
Tim Peters9f688bf2000-07-07 15:53:28 +0000160PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000161{
Guido van Rossumf7531811998-05-26 14:33:37 +0000162 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000164 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000165 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000166
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 if (vv == NULL || !PyLong_Check(vv)) {
168 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000169 return -1;
170 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000172 i = v->ob_size;
173 sign = 1;
174 x = 0;
175 if (i < 0) {
176 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000177 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000178 }
179 while (--i >= 0) {
180 prev = x;
181 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000182 if ((x >> SHIFT) != prev)
183 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000184 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000185 /* Haven't lost any bits, but if the sign bit is set we're in
186 * trouble *unless* this is the min negative number. So,
187 * trouble iff sign bit set && (positive || some bit set other
188 * than the sign bit).
189 */
190 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
191 goto overflow;
192 return (long)x * sign;
193
194 overflow:
195 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000196 "long int too large to convert");
Guido van Rossumf7531811998-05-26 14:33:37 +0000197 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000198}
199
Guido van Rossum53756b11997-01-03 17:14:46 +0000200/* Get a C long int from a long int object.
201 Returns -1 and sets an error condition if overflow occurs. */
202
203unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000204PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000205{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000207 unsigned long x, prev;
208 int i;
209
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 if (vv == NULL || !PyLong_Check(vv)) {
211 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000212 return (unsigned long) -1;
213 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000215 i = v->ob_size;
216 x = 0;
217 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000218 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000219 "can't convert negative value to unsigned long");
220 return (unsigned long) -1;
221 }
222 while (--i >= 0) {
223 prev = x;
224 x = (x << SHIFT) + v->ob_digit[i];
225 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000227 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000228 return (unsigned long) -1;
229 }
230 }
231 return x;
232}
233
Tim Peters2a9b3672001-06-11 21:23:58 +0000234PyObject *
235_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
236 int little_endian, int is_signed)
237{
238 const unsigned char* pstartbyte;/* LSB of bytes */
239 int incr; /* direction to move pstartbyte */
240 const unsigned char* pendbyte; /* MSB of bytes */
241 size_t numsignificantbytes; /* number of bytes that matter */
242 size_t ndigits; /* number of Python long digits */
243 PyLongObject* v; /* result */
244 int idigit = 0; /* next free index in v->ob_digit */
245
246 if (n == 0)
247 return PyLong_FromLong(0L);
248
249 if (little_endian) {
250 pstartbyte = bytes;
251 pendbyte = bytes + n - 1;
252 incr = 1;
253 }
254 else {
255 pstartbyte = bytes + n - 1;
256 pendbyte = bytes;
257 incr = -1;
258 }
259
260 if (is_signed)
261 is_signed = *pendbyte >= 0x80;
262
263 /* Compute numsignificantbytes. This consists of finding the most
264 significant byte. Leading 0 bytes are insignficant if the number
265 is positive, and leading 0xff bytes if negative. */
266 {
267 size_t i;
268 const unsigned char* p = pendbyte;
269 const int pincr = -incr; /* search MSB to LSB */
270 const unsigned char insignficant = is_signed ? 0xff : 0x00;
271
272 for (i = 0; i < n; ++i, p += pincr) {
273 if (*p != insignficant)
274 break;
275 }
276 numsignificantbytes = n - i;
277 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
278 actually has 2 significant bytes. OTOH, 0xff0001 ==
279 -0x00ffff, so we wouldn't *need* to bump it there; but we
280 do for 0xffff = -0x0001. To be safe without bothering to
281 check every case, bump it regardless. */
282 if (is_signed && numsignificantbytes < n)
283 ++numsignificantbytes;
284 }
285
286 /* How many Python long digits do we need? We have
287 8*numsignificantbytes bits, and each Python long digit has SHIFT
288 bits, so it's the ceiling of the quotient. */
289 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
290 if (ndigits > (size_t)INT_MAX)
291 return PyErr_NoMemory();
292 v = _PyLong_New((int)ndigits);
293 if (v == NULL)
294 return NULL;
295
296 /* Copy the bits over. The tricky parts are computing 2's-comp on
297 the fly for signed numbers, and dealing with the mismatch between
298 8-bit bytes and (probably) 15-bit Python digits.*/
299 {
300 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000301 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000302 twodigits accum = 0; /* sliding register */
303 unsigned int accumbits = 0; /* number of bits in accum */
304 const unsigned char* p = pstartbyte;
305
306 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000307 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000308 /* Compute correction for 2's comp, if needed. */
309 if (is_signed) {
310 thisbyte = (0xff ^ thisbyte) + carry;
311 carry = thisbyte >> 8;
312 thisbyte &= 0xff;
313 }
314 /* Because we're going LSB to MSB, thisbyte is
315 more significant than what's already in accum,
316 so needs to be prepended to accum. */
317 accum |= thisbyte << accumbits;
318 accumbits += 8;
319 if (accumbits >= SHIFT) {
320 /* There's enough to fill a Python digit. */
321 assert(idigit < (int)ndigits);
322 v->ob_digit[idigit] = (digit)(accum & MASK);
323 ++idigit;
324 accum >>= SHIFT;
325 accumbits -= SHIFT;
326 assert(accumbits < SHIFT);
327 }
328 }
329 assert(accumbits < SHIFT);
330 if (accumbits) {
331 assert(idigit < (int)ndigits);
332 v->ob_digit[idigit] = (digit)accum;
333 ++idigit;
334 }
335 }
336
337 v->ob_size = is_signed ? -idigit : idigit;
338 return (PyObject *)long_normalize(v);
339}
340
341int
342_PyLong_AsByteArray(PyLongObject* v,
343 unsigned char* bytes, size_t n,
344 int little_endian, int is_signed)
345{
346 int i; /* index into v->ob_digit */
347 int ndigits; /* |v->ob_size| */
348 twodigits accum; /* sliding register */
349 unsigned int accumbits; /* # bits in accum */
350 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
351 twodigits carry; /* for computing 2's-comp */
352 size_t j; /* # bytes filled */
353 unsigned char* p; /* pointer to next byte in bytes */
354 int pincr; /* direction to move p */
355
356 assert(v != NULL && PyLong_Check(v));
357
358 if (v->ob_size < 0) {
359 ndigits = -(v->ob_size);
360 if (!is_signed) {
361 PyErr_SetString(PyExc_TypeError,
362 "can't convert negative long to unsigned");
363 return -1;
364 }
365 do_twos_comp = 1;
366 }
367 else {
368 ndigits = v->ob_size;
369 do_twos_comp = 0;
370 }
371
372 if (little_endian) {
373 p = bytes;
374 pincr = 1;
375 }
376 else {
377 p = bytes + n - 1;
378 pincr = -1;
379 }
380
Tim Peters898cf852001-06-13 20:50:08 +0000381 /* Copy over all the Python digits.
382 It's crucial that every Python digit except for the MSD contribute
383 exactly SHIFT bits to the total, so first assert that the long is
384 normalized. */
385 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000386 j = 0;
387 accum = 0;
388 accumbits = 0;
389 carry = do_twos_comp ? 1 : 0;
390 for (i = 0; i < ndigits; ++i) {
391 twodigits thisdigit = v->ob_digit[i];
392 if (do_twos_comp) {
393 thisdigit = (thisdigit ^ MASK) + carry;
394 carry = thisdigit >> SHIFT;
395 thisdigit &= MASK;
396 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000397 /* Because we're going LSB to MSB, thisdigit is more
398 significant than what's already in accum, so needs to be
399 prepended to accum. */
400 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000401 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000402
Tim Petersede05092001-06-14 08:53:38 +0000403 /* The most-significant digit may be (probably is) at least
404 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000405 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000406 /* Count # of sign bits -- they needn't be stored,
407 * although for signed conversion we need later to
408 * make sure at least one sign bit gets stored.
409 * First shift conceptual sign bit to real sign bit.
410 */
411 stwodigits s = (stwodigits)(thisdigit <<
412 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000413 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000414 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000415 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000416 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000417 }
Tim Petersede05092001-06-14 08:53:38 +0000418 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000419 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000420
Tim Peters2a9b3672001-06-11 21:23:58 +0000421 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000422 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000423 if (j >= n)
424 goto Overflow;
425 ++j;
426 *p = (unsigned char)(accum & 0xff);
427 p += pincr;
428 accumbits -= 8;
429 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000430 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000431 }
432
433 /* Store the straggler (if any). */
434 assert(accumbits < 8);
435 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000436 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000437 if (j >= n)
438 goto Overflow;
439 ++j;
440 if (do_twos_comp) {
441 /* Fill leading bits of the byte with sign bits
442 (appropriately pretending that the long had an
443 infinite supply of sign bits). */
444 accum |= (~(twodigits)0) << accumbits;
445 }
446 *p = (unsigned char)(accum & 0xff);
447 p += pincr;
448 }
Tim Peters05607ad2001-06-13 21:01:27 +0000449 else if (j == n && n > 0 && is_signed) {
450 /* The main loop filled the byte array exactly, so the code
451 just above didn't get to ensure there's a sign bit, and the
452 loop below wouldn't add one either. Make sure a sign bit
453 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000454 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000455 int sign_bit_set = msb >= 0x80;
456 assert(accumbits == 0);
457 if (sign_bit_set == do_twos_comp)
458 return 0;
459 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000460 goto Overflow;
461 }
Tim Peters05607ad2001-06-13 21:01:27 +0000462
463 /* Fill remaining bytes with copies of the sign bit. */
464 {
465 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
466 for ( ; j < n; ++j, p += pincr)
467 *p = signbyte;
468 }
469
Tim Peters2a9b3672001-06-11 21:23:58 +0000470 return 0;
471
472Overflow:
473 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
474 return -1;
475
476}
477
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000478/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000479
480double
Tim Peters9f688bf2000-07-07 15:53:28 +0000481PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000482{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000484 double x;
485 double multiplier = (double) (1L << SHIFT);
486 int i, sign;
487
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 if (vv == NULL || !PyLong_Check(vv)) {
489 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000490 return -1;
491 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000493 i = v->ob_size;
494 sign = 1;
495 x = 0.0;
496 if (i < 0) {
497 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000498 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000499 }
500 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000501 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000502 }
503 return x * sign;
504}
505
Guido van Rossum78694d91998-09-18 14:14:13 +0000506/* Create a new long (or int) object from a C pointer */
507
508PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000509PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000510{
Tim Peters70128a12001-06-16 08:48:40 +0000511#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000512 return PyInt_FromLong((long)p);
513#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000514
Tim Peters70128a12001-06-16 08:48:40 +0000515#ifndef HAVE_LONG_LONG
516# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
517#endif
518#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
519# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
520#endif
521 /* optimize null pointers */
522 if (p == NULL)
523 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000524 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000525
526#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000527}
528
529/* Get a C pointer from a long object (or an int object in some cases) */
530
531void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000532PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000533{
534 /* This function will allow int or long objects. If vv is neither,
535 then the PyLong_AsLong*() functions will raise the exception:
536 PyExc_SystemError, "bad argument to internal function"
537 */
Tim Peters70128a12001-06-16 08:48:40 +0000538#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000539 long x;
540
Tim Peters70128a12001-06-16 08:48:40 +0000541 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000542 x = PyInt_AS_LONG(vv);
543 else
544 x = PyLong_AsLong(vv);
545#else
Tim Peters70128a12001-06-16 08:48:40 +0000546
547#ifndef HAVE_LONG_LONG
548# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
549#endif
550#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
551# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
552#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000553 LONG_LONG x;
554
Tim Peters70128a12001-06-16 08:48:40 +0000555 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000556 x = PyInt_AS_LONG(vv);
557 else
558 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000559
560#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000561
562 if (x == -1 && PyErr_Occurred())
563 return NULL;
564 return (void *)x;
565}
566
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000567#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000568
569/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
570 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000571 */
572
Tim Peterscf37dfc2001-06-14 18:42:50 +0000573#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000574
575/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000576
577PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000578PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000579{
Tim Petersd1a7da62001-06-13 00:35:57 +0000580 LONG_LONG bytes = ival;
581 int one = 1;
582 return _PyLong_FromByteArray(
583 (unsigned char *)&bytes,
584 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000585}
586
Tim Petersd1a7da62001-06-13 00:35:57 +0000587/* Create a new long int object from a C unsigned LONG_LONG int. */
588
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000589PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000590PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000591{
Tim Petersd1a7da62001-06-13 00:35:57 +0000592 unsigned LONG_LONG bytes = ival;
593 int one = 1;
594 return _PyLong_FromByteArray(
595 (unsigned char *)&bytes,
596 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000597}
598
Guido van Rossum3293b071998-08-25 16:07:15 +0000599/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000600 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000601
Guido van Rossum3293b071998-08-25 16:07:15 +0000602LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000603PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000604{
Tim Petersd1a7da62001-06-13 00:35:57 +0000605 LONG_LONG bytes;
606 int one = 1;
607 int res;
608
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000609 if (vv == NULL || !PyLong_Check(vv)) {
610 PyErr_BadInternalCall();
611 return -1;
612 }
613
Tim Petersd1a7da62001-06-13 00:35:57 +0000614 res = _PyLong_AsByteArray(
615 (PyLongObject *)vv, (unsigned char *)&bytes,
616 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000617
Tim Peters9cb0c382001-06-13 20:45:17 +0000618 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000619}
620
Tim Petersd1a7da62001-06-13 00:35:57 +0000621/* Get a C unsigned LONG_LONG int from a long int object.
622 Return -1 and set an error if overflow occurs. */
623
Guido van Rossum3293b071998-08-25 16:07:15 +0000624unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000625PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000626{
Tim Petersd1a7da62001-06-13 00:35:57 +0000627 unsigned LONG_LONG bytes;
628 int one = 1;
629 int res;
630
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000631 if (vv == NULL || !PyLong_Check(vv)) {
632 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000633 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000634 }
635
Tim Petersd1a7da62001-06-13 00:35:57 +0000636 res = _PyLong_AsByteArray(
637 (PyLongObject *)vv, (unsigned char *)&bytes,
638 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000639
Tim Peters9cb0c382001-06-13 20:45:17 +0000640 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000641}
Tim Petersd1a7da62001-06-13 00:35:57 +0000642
643#undef IS_LITTLE_ENDIAN
644
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000645#endif /* HAVE_LONG_LONG */
646
Neil Schemenauerba872e22001-01-04 01:46:03 +0000647
648static int
649convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
650 if (PyLong_Check(v)) {
651 *a = (PyLongObject *) v;
652 Py_INCREF(v);
653 }
654 else if (PyInt_Check(v)) {
655 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
656 }
657 else {
658 return 0;
659 }
660 if (PyLong_Check(w)) {
661 *b = (PyLongObject *) w;
662 Py_INCREF(w);
663 }
664 else if (PyInt_Check(w)) {
665 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
666 }
667 else {
668 Py_DECREF(*a);
669 return 0;
670 }
671 return 1;
672}
673
674#define CONVERT_BINOP(v, w, a, b) \
675 if (!convert_binop(v, w, a, b)) { \
676 Py_INCREF(Py_NotImplemented); \
677 return Py_NotImplemented; \
678 }
679
680
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000681/* Multiply by a single digit, ignoring the sign. */
682
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000684mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000685{
686 return muladd1(a, n, (digit)0);
687}
688
689/* Multiply by a single digit and add a single digit, ignoring the sign. */
690
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000692muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000693{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000694 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000696 twodigits carry = extra;
697 int i;
698
699 if (z == NULL)
700 return NULL;
701 for (i = 0; i < size_a; ++i) {
702 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000703 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000704 carry >>= SHIFT;
705 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000706 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000707 return long_normalize(z);
708}
709
710/* Divide a long integer by a digit, returning both the quotient
711 (as function result) and the remainder (through *prem).
712 The sign of a is ignored; n should not be zero. */
713
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000715divrem1(PyLongObject *a, wdigit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000716{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000717 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000719 int i;
720 twodigits rem = 0;
721
722 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000724 if (z == NULL)
725 return NULL;
726 for (i = size; --i >= 0; ) {
727 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000728 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000729 rem %= n;
730 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000731 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000732 return long_normalize(z);
733}
734
735/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000736 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000737 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000738
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000740long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000741{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000742 register PyLongObject *a = (PyLongObject *)aa;
743 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000744 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000745 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000746 char *p;
747 int bits;
748 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000749
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000750 if (a == NULL || !PyLong_Check(a)) {
751 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000752 return NULL;
753 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000754 assert(base >= 2 && base <= 36);
755
756 /* Compute a rough upper bound for the length of the string */
757 i = base;
758 bits = 0;
759 while (i > 1) {
760 ++bits;
761 i >>= 1;
762 }
Fred Drake121ee271999-12-23 15:41:28 +0000763 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000765 if (str == NULL)
766 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000768 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000769 if (addL)
770 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000771 if (a->ob_size < 0)
772 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000773
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000774 if (a->ob_size == 0) {
775 *--p = '0';
776 }
777 else if ((base & (base - 1)) == 0) {
778 /* JRH: special case for power-of-2 bases */
779 twodigits temp = a->ob_digit[0];
780 int bitsleft = SHIFT;
781 int rem;
782 int last = abs(a->ob_size);
783 int basebits = 1;
784 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000785 while ((i >>= 1) > 1)
786 ++basebits;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000787
788 i = 0;
789 for (;;) {
790 while (bitsleft >= basebits) {
791 if ((temp == 0) && (i >= last - 1)) break;
792 rem = temp & (base - 1);
793 if (rem < 10)
794 rem += '0';
795 else
796 rem += 'A' - 10;
797 assert(p > PyString_AS_STRING(str));
798 *--p = (char) rem;
799 bitsleft -= basebits;
800 temp >>= basebits;
801 }
802 if (++i >= last) {
803 if (temp == 0) break;
804 bitsleft = 99;
805 /* loop again to pick up final digits */
806 }
807 else {
808 temp = (a->ob_digit[i] << bitsleft) | temp;
809 bitsleft += SHIFT;
810 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000811 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000812 }
813 else {
814 Py_INCREF(a);
815 do {
816 digit rem;
817 PyLongObject *temp = divrem1(a, (digit)base, &rem);
818 if (temp == NULL) {
819 Py_DECREF(a);
820 Py_DECREF(str);
821 return NULL;
822 }
823 if (rem < 10)
824 rem += '0';
825 else
826 rem += 'A'-10;
827 assert(p > PyString_AS_STRING(str));
828 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000829 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000830 a = temp;
831 SIGCHECK({
832 Py_DECREF(a);
833 Py_DECREF(str);
834 return NULL;
835 })
836 } while (ABS(a->ob_size) != 0);
837 Py_DECREF(a);
838 }
839
Guido van Rossum2c475421992-08-14 15:13:07 +0000840 if (base == 8) {
841 if (size_a != 0)
842 *--p = '0';
843 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000844 else if (base == 16) {
845 *--p = 'x';
846 *--p = '0';
847 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000848 else if (base != 10) {
849 *--p = '#';
850 *--p = '0' + base%10;
851 if (base > 10)
852 *--p = '0' + base/10;
853 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000854 if (sign)
855 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 if (p != PyString_AS_STRING(str)) {
857 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000858 assert(p > q);
859 do {
860 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000861 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 _PyString_Resize((PyObject **)&str,
863 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000864 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000866}
867
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000869PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000870{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000871 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000872 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000874
Guido van Rossum472c04f1996-12-05 21:57:21 +0000875 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000877 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000878 return NULL;
879 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000880 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000881 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000882 if (*str == '+')
883 ++str;
884 else if (*str == '-') {
885 ++str;
886 sign = -1;
887 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000888 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000889 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000890 if (base == 0) {
891 if (str[0] != '0')
892 base = 10;
893 else if (str[1] == 'x' || str[1] == 'X')
894 base = 16;
895 else
896 base = 8;
897 }
898 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
899 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000900 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000901 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000902 for ( ; z != NULL; ++str) {
903 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000905
906 if (*str <= '9')
907 k = *str - '0';
908 else if (*str >= 'a')
909 k = *str - 'a' + 10;
910 else if (*str >= 'A')
911 k = *str - 'A' + 10;
912 if (k < 0 || k >= base)
913 break;
914 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000916 z = temp;
917 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000918 if (z == NULL)
919 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000920 if (str == start)
921 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000922 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000923 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000924 if (*str == 'L' || *str == 'l')
925 str++;
926 while (*str && isspace(Py_CHARMASK(*str)))
927 str++;
928 if (*str != '\0')
929 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000930 if (pend)
931 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000933
934 onError:
935 PyErr_Format(PyExc_ValueError,
936 "invalid literal for long(): %.200s", orig_str);
937 Py_XDECREF(z);
938 return NULL;
939}
940
941PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000942PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000943{
944 char buffer[256];
945
946 if (length >= sizeof(buffer)) {
947 PyErr_SetString(PyExc_ValueError,
948 "long() literal too large to convert");
949 return NULL;
950 }
951 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
952 return NULL;
953
954 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000955}
956
Tim Peters9f688bf2000-07-07 15:53:28 +0000957/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +0000959 (PyLongObject *, PyLongObject *, PyLongObject **);
960static PyObject *long_pos(PyLongObject *);
961static int long_divrem(PyLongObject *, PyLongObject *,
962 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000963
964/* Long division with remainder, top-level routine */
965
Guido van Rossume32e0141992-01-19 16:31:05 +0000966static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000967long_divrem(PyLongObject *a, PyLongObject *b,
968 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000969{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000970 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000972
973 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000974 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000975 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +0000976 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000977 }
978 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000979 (size_a == size_b &&
980 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000981 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 *pdiv = _PyLong_New(0);
983 Py_INCREF(a);
984 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000985 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000986 }
987 if (size_b == 1) {
988 digit rem = 0;
989 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000990 if (z == NULL)
991 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000992 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000993 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000994 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000995 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000996 if (z == NULL)
997 return -1;
998 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000999 /* Set the signs.
1000 The quotient z has the sign of a*b;
1001 the remainder r has the sign of a,
1002 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001003 if ((a->ob_size < 0) != (b->ob_size < 0))
1004 z->ob_size = -(z->ob_size);
1005 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1006 (*prem)->ob_size = -((*prem)->ob_size);
1007 *pdiv = z;
1008 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001009}
1010
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001011/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001012
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001014x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001015{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001016 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001017 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001018 PyLongObject *v = mul1(v1, d);
1019 PyLongObject *w = mul1(w1, d);
1020 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001021 int j, k;
1022
1023 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001024 Py_XDECREF(v);
1025 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001026 return NULL;
1027 }
1028
1029 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001030 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001031 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001032
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001033 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001035
1036 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1037 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1038 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001039 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001040 int i;
1041
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001042 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001043 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001044 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001045 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001046 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001047 if (vj == w->ob_digit[size_w-1])
1048 q = MASK;
1049 else
1050 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1051 w->ob_digit[size_w-1];
1052
1053 while (w->ob_digit[size_w-2]*q >
1054 ((
1055 ((twodigits)vj << SHIFT)
1056 + v->ob_digit[j-1]
1057 - q*w->ob_digit[size_w-1]
1058 ) << SHIFT)
1059 + v->ob_digit[j-2])
1060 --q;
1061
1062 for (i = 0; i < size_w && i+k < size_v; ++i) {
1063 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001064 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065 carry += v->ob_digit[i+k] - z
1066 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001067 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001068 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1069 carry, SHIFT);
1070 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001071 }
1072
1073 if (i+k < size_v) {
1074 carry += v->ob_digit[i+k];
1075 v->ob_digit[i+k] = 0;
1076 }
1077
1078 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001079 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001080 else {
1081 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001082 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001083 carry = 0;
1084 for (i = 0; i < size_w && i+k < size_v; ++i) {
1085 carry += v->ob_digit[i+k] + w->ob_digit[i];
1086 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001087 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1088 BASE_TWODIGITS_TYPE,
1089 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001090 }
1091 }
1092 } /* for j, k */
1093
Guido van Rossumc206c761995-01-10 15:23:19 +00001094 if (a == NULL)
1095 *prem = NULL;
1096 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001097 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001098 *prem = divrem1(v, d, &d);
1099 /* d receives the (unused) remainder */
1100 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001102 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001103 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001104 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001105 Py_DECREF(v);
1106 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001107 return a;
1108}
1109
1110/* Methods */
1111
1112static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001113long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001114{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001115 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001116}
1117
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001118static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001119long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001120{
Fred Drake121ee271999-12-23 15:41:28 +00001121 return long_format(v, 10, 1);
1122}
1123
1124static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001125long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001126{
1127 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001128}
1129
1130static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001131long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001132{
1133 int sign;
1134
Guido van Rossumc6913e71991-11-19 20:26:46 +00001135 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001136 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001137 sign = 0;
1138 else
1139 sign = a->ob_size - b->ob_size;
1140 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001141 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001142 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001143 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1144 ;
1145 if (i < 0)
1146 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001147 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001148 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001149 if (a->ob_size < 0)
1150 sign = -sign;
1151 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001152 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001153 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001154}
1155
Guido van Rossum9bfef441993-03-29 10:43:31 +00001156static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001157long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001158{
1159 long x;
1160 int i, sign;
1161
1162 /* This is designed so that Python ints and longs with the
1163 same value hash to the same value, otherwise comparisons
1164 of mapping keys will turn out weird */
1165 i = v->ob_size;
1166 sign = 1;
1167 x = 0;
1168 if (i < 0) {
1169 sign = -1;
1170 i = -(i);
1171 }
1172 while (--i >= 0) {
1173 /* Force a 32-bit circular shift */
1174 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1175 x += v->ob_digit[i];
1176 }
1177 x = x * sign;
1178 if (x == -1)
1179 x = -2;
1180 return x;
1181}
1182
1183
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001184/* Add the absolute values of two long integers. */
1185
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001186static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001187x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001188{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001189 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001191 int i;
1192 digit carry = 0;
1193
1194 /* Ensure a is the larger of the two: */
1195 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001196 { PyLongObject *temp = a; a = b; b = temp; }
1197 { int size_temp = size_a;
1198 size_a = size_b;
1199 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001200 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001201 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001202 if (z == NULL)
1203 return NULL;
1204 for (i = 0; i < size_b; ++i) {
1205 carry += a->ob_digit[i] + b->ob_digit[i];
1206 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001207 carry >>= SHIFT;
1208 }
1209 for (; i < size_a; ++i) {
1210 carry += a->ob_digit[i];
1211 z->ob_digit[i] = carry & MASK;
1212 carry >>= SHIFT;
1213 }
1214 z->ob_digit[i] = carry;
1215 return long_normalize(z);
1216}
1217
1218/* Subtract the absolute values of two integers. */
1219
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001221x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001222{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001223 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001224 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001225 int i;
1226 int sign = 1;
1227 digit borrow = 0;
1228
1229 /* Ensure a is the larger of the two: */
1230 if (size_a < size_b) {
1231 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001232 { PyLongObject *temp = a; a = b; b = temp; }
1233 { int size_temp = size_a;
1234 size_a = size_b;
1235 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001236 }
1237 else if (size_a == size_b) {
1238 /* Find highest digit where a and b differ: */
1239 i = size_a;
1240 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1241 ;
1242 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001244 if (a->ob_digit[i] < b->ob_digit[i]) {
1245 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001246 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001247 }
1248 size_a = size_b = i+1;
1249 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001251 if (z == NULL)
1252 return NULL;
1253 for (i = 0; i < size_b; ++i) {
1254 /* The following assumes unsigned arithmetic
1255 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001256 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001257 z->ob_digit[i] = borrow & MASK;
1258 borrow >>= SHIFT;
1259 borrow &= 1; /* Keep only one sign bit */
1260 }
1261 for (; i < size_a; ++i) {
1262 borrow = a->ob_digit[i] - borrow;
1263 z->ob_digit[i] = borrow & MASK;
1264 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001265 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001266 }
1267 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001268 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001269 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001270 return long_normalize(z);
1271}
1272
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001273static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001274long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001275{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001276 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001277
Neil Schemenauerba872e22001-01-04 01:46:03 +00001278 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1279
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001280 if (a->ob_size < 0) {
1281 if (b->ob_size < 0) {
1282 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001283 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001284 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001285 }
1286 else
1287 z = x_sub(b, a);
1288 }
1289 else {
1290 if (b->ob_size < 0)
1291 z = x_sub(a, b);
1292 else
1293 z = x_add(a, b);
1294 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001295 Py_DECREF(a);
1296 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001297 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001298}
1299
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001301long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001302{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001303 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001304
Neil Schemenauerba872e22001-01-04 01:46:03 +00001305 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1306
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001307 if (a->ob_size < 0) {
1308 if (b->ob_size < 0)
1309 z = x_sub(a, b);
1310 else
1311 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001312 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001313 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001314 }
1315 else {
1316 if (b->ob_size < 0)
1317 z = x_add(a, b);
1318 else
1319 z = x_sub(a, b);
1320 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001321 Py_DECREF(a);
1322 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001323 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001324}
1325
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001327long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001328{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001329 /* sequence * long */
1330 long n = PyLong_AsLong((PyObject *) w);
1331 if (n == -1 && PyErr_Occurred())
1332 return NULL;
1333 else
1334 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1335}
1336
1337static PyObject *
1338long_mul(PyLongObject *v, PyLongObject *w)
1339{
1340 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001341 int size_a;
1342 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001343 int i;
1344
Neil Schemenauerba872e22001-01-04 01:46:03 +00001345 if (v->ob_type->tp_as_sequence &&
1346 v->ob_type->tp_as_sequence->sq_repeat) {
1347 return long_repeat((PyObject *)v, w);
1348 }
1349 else if (w->ob_type->tp_as_sequence &&
1350 w->ob_type->tp_as_sequence->sq_repeat) {
1351 return long_repeat((PyObject *)w, v);
1352 }
1353
1354 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1355
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001356 size_a = ABS(a->ob_size);
1357 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001358 if (size_a > size_b) {
1359 /* we are faster with the small object on the left */
1360 int hold_sa = size_a;
1361 PyLongObject *hold_a = a;
1362 size_a = size_b;
1363 size_b = hold_sa;
1364 a = b;
1365 b = hold_a;
1366 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001368 if (z == NULL) {
1369 Py_DECREF(a);
1370 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001371 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001372 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001373 for (i = 0; i < z->ob_size; ++i)
1374 z->ob_digit[i] = 0;
1375 for (i = 0; i < size_a; ++i) {
1376 twodigits carry = 0;
1377 twodigits f = a->ob_digit[i];
1378 int j;
1379
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001380 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001381 Py_DECREF(a);
1382 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001383 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001384 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001385 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001386 for (j = 0; j < size_b; ++j) {
1387 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001388 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001389 carry >>= SHIFT;
1390 }
1391 for (; carry != 0; ++j) {
1392 assert(i+j < z->ob_size);
1393 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001394 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001395 carry >>= SHIFT;
1396 }
1397 }
1398 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001399 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001400 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001401 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001402 Py_DECREF(a);
1403 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001404 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001405}
1406
Guido van Rossume32e0141992-01-19 16:31:05 +00001407/* The / and % operators are now defined in terms of divmod().
1408 The expression a mod b has the value a - b*floor(a/b).
1409 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001410 |a| by |b|, with the sign of a. This is also expressed
1411 as a - b*trunc(a/b), if trunc truncates towards zero.
1412 Some examples:
1413 a b a rem b a mod b
1414 13 10 3 3
1415 -13 10 -3 7
1416 13 -10 3 -7
1417 -13 -10 -3 -3
1418 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001419 have different signs. We then subtract one from the 'div'
1420 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001421
Guido van Rossume32e0141992-01-19 16:31:05 +00001422static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001423l_divmod(PyLongObject *v, PyLongObject *w,
1424 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001425{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001426 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001427
1428 if (long_divrem(v, w, &div, &mod) < 0)
1429 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001430 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1431 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001432 PyLongObject *temp;
1433 PyLongObject *one;
1434 temp = (PyLongObject *) long_add(mod, w);
1435 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001436 mod = temp;
1437 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001439 return -1;
1440 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001441 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001442 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1444 Py_DECREF(mod);
1445 Py_DECREF(div);
1446 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001447 return -1;
1448 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001449 Py_DECREF(one);
1450 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001451 div = temp;
1452 }
1453 *pdiv = div;
1454 *pmod = mod;
1455 return 0;
1456}
1457
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001459long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001460{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001461 PyLongObject *a, *b, *div, *mod;
1462
1463 CONVERT_BINOP(v, w, &a, &b);
1464
1465 if (l_divmod(a, b, &div, &mod) < 0) {
1466 Py_DECREF(a);
1467 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001468 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001469 }
1470 Py_DECREF(a);
1471 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001472 Py_DECREF(mod);
1473 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001474}
1475
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001476static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001477long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001478{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001479 PyLongObject *a, *b, *div, *mod;
1480
1481 CONVERT_BINOP(v, w, &a, &b);
1482
1483 if (l_divmod(a, b, &div, &mod) < 0) {
1484 Py_DECREF(a);
1485 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001486 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001487 }
1488 Py_DECREF(a);
1489 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001490 Py_DECREF(div);
1491 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001492}
1493
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001494static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001495long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001496{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001497 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001498 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001499
1500 CONVERT_BINOP(v, w, &a, &b);
1501
1502 if (l_divmod(a, b, &div, &mod) < 0) {
1503 Py_DECREF(a);
1504 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001505 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001506 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001507 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001508 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509 PyTuple_SetItem(z, 0, (PyObject *) div);
1510 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001511 }
1512 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001513 Py_DECREF(div);
1514 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001515 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001516 Py_DECREF(a);
1517 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001518 return z;
1519}
1520
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001521static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001522long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001523{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001524 PyLongObject *a, *b;
1525 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001526 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001527 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001528
1529 CONVERT_BINOP(v, w, &a, &b);
1530 if (PyLong_Check(x) || Py_None == x) {
1531 c = x;
1532 Py_INCREF(x);
1533 }
1534 else if (PyInt_Check(x)) {
1535 c = PyLong_FromLong(PyInt_AS_LONG(x));
1536 }
1537 else {
1538 Py_DECREF(a);
1539 Py_DECREF(b);
1540 Py_INCREF(Py_NotImplemented);
1541 return Py_NotImplemented;
1542 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001543
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001544 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001545 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001546 /* Return a float. This works because we know that
1547 this calls float_pow() which converts its
1548 arguments to double. */
1549 Py_DECREF(a);
1550 Py_DECREF(b);
1551 Py_DECREF(c);
1552 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001553 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001554 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001555 for (i = 0; i < size_b; ++i) {
1556 digit bi = b->ob_digit[i];
1557 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001558
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001559 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001560 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001561
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001562 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001563 temp = (PyLongObject *)long_mul(z, a);
1564 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001565 if (c!=Py_None && temp!=NULL) {
1566 if (l_divmod(temp,(PyLongObject *)c,
1567 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001568 Py_DECREF(temp);
1569 z = NULL;
1570 goto error;
1571 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001572 Py_XDECREF(div);
1573 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001574 temp = mod;
1575 }
1576 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001577 if (z == NULL)
1578 break;
1579 }
1580 bi >>= 1;
1581 if (bi == 0 && i+1 == size_b)
1582 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001583 temp = (PyLongObject *)long_mul(a, a);
1584 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001585 if (c!=Py_None && temp!=NULL) {
1586 if (l_divmod(temp, (PyLongObject *)c, &div,
1587 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001588 Py_DECREF(temp);
1589 z = NULL;
1590 goto error;
1591 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001592 Py_XDECREF(div);
1593 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001594 temp = mod;
1595 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001596 a = temp;
1597 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001598 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001599 z = NULL;
1600 break;
1601 }
1602 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001603 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001604 break;
1605 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001606 if (c!=Py_None && z!=NULL) {
1607 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001608 Py_DECREF(z);
1609 z = NULL;
1610 }
1611 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001612 Py_XDECREF(div);
1613 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001614 z = mod;
1615 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001616 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001617 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001618 Py_XDECREF(a);
1619 Py_DECREF(b);
1620 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001621 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001622}
1623
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001624static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001625long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001626{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001627 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001628 PyLongObject *x;
1629 PyLongObject *w;
1630 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001631 if (w == NULL)
1632 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001633 x = (PyLongObject *) long_add(v, w);
1634 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001635 if (x == NULL)
1636 return NULL;
1637 if (x->ob_size != 0)
1638 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001640}
1641
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001642static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001643long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001644{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001645 Py_INCREF(v);
1646 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001647}
1648
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001649static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001650long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001651{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001652 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001653 int i, n;
1654 n = ABS(v->ob_size);
1655 if (n == 0) {
1656 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001657 Py_INCREF(v);
1658 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001659 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001660 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001661 if (z == NULL)
1662 return NULL;
1663 for (i = 0; i < n; i++)
1664 z->ob_digit[i] = v->ob_digit[i];
1665 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001666 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001667}
1668
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001669static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001670long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001671{
1672 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001673 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001674 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001675 Py_INCREF(v);
1676 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001677 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001678}
1679
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001680static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001681long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001682{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001683 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001684}
1685
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001686static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001687long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001688{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001689 PyLongObject *a, *b;
1690 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001691 long shiftby;
1692 int newsize, wordshift, loshift, hishift, i, j;
1693 digit lomask, himask;
1694
Neil Schemenauerba872e22001-01-04 01:46:03 +00001695 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1696
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001697 if (a->ob_size < 0) {
1698 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001699 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001700 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001701 if (a1 == NULL)
1702 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001703 a2 = (PyLongObject *) long_rshift(a1, b);
1704 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001705 if (a2 == NULL)
1706 goto rshift_error;
1707 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001708 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001709 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001710 else {
1711
1712 shiftby = PyLong_AsLong((PyObject *)b);
1713 if (shiftby == -1L && PyErr_Occurred())
1714 goto rshift_error;
1715 if (shiftby < 0) {
1716 PyErr_SetString(PyExc_ValueError,
1717 "negative shift count");
1718 goto rshift_error;
1719 }
1720 wordshift = shiftby / SHIFT;
1721 newsize = ABS(a->ob_size) - wordshift;
1722 if (newsize <= 0) {
1723 z = _PyLong_New(0);
1724 Py_DECREF(a);
1725 Py_DECREF(b);
1726 return (PyObject *)z;
1727 }
1728 loshift = shiftby % SHIFT;
1729 hishift = SHIFT - loshift;
1730 lomask = ((digit)1 << hishift) - 1;
1731 himask = MASK ^ lomask;
1732 z = _PyLong_New(newsize);
1733 if (z == NULL)
1734 goto rshift_error;
1735 if (a->ob_size < 0)
1736 z->ob_size = -(z->ob_size);
1737 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1738 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1739 if (i+1 < newsize)
1740 z->ob_digit[i] |=
1741 (a->ob_digit[j+1] << hishift) & himask;
1742 }
1743 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001744 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001745rshift_error:
1746 Py_DECREF(a);
1747 Py_DECREF(b);
1748 return (PyObject *) z;
1749
Guido van Rossumc6913e71991-11-19 20:26:46 +00001750}
1751
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001752static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001753long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001754{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001755 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001756 PyLongObject *a, *b;
1757 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001758 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001759 int oldsize, newsize, wordshift, remshift, i, j;
1760 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001761
Neil Schemenauerba872e22001-01-04 01:46:03 +00001762 CONVERT_BINOP(v, w, &a, &b);
1763
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001764 shiftby = PyLong_AsLong((PyObject *)b);
1765 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001766 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001767 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001768 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001769 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001770 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001771 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001772 PyErr_SetString(PyExc_ValueError,
1773 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001774 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001775 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001776 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1777 wordshift = (int)shiftby / SHIFT;
1778 remshift = (int)shiftby - wordshift * SHIFT;
1779
1780 oldsize = ABS(a->ob_size);
1781 newsize = oldsize + wordshift;
1782 if (remshift)
1783 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001784 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001785 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001786 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001787 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001788 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001789 for (i = 0; i < wordshift; i++)
1790 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001791 accum = 0;
1792 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1793 accum |= a->ob_digit[j] << remshift;
1794 z->ob_digit[i] = (digit)(accum & MASK);
1795 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001796 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001797 if (remshift)
1798 z->ob_digit[newsize-1] = (digit)accum;
1799 else
1800 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001801 z = long_normalize(z);
1802lshift_error:
1803 Py_DECREF(a);
1804 Py_DECREF(b);
1805 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001806}
1807
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001808
1809/* Bitwise and/xor/or operations */
1810
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001811#define MAX(x, y) ((x) < (y) ? (y) : (x))
1812#define MIN(x, y) ((x) > (y) ? (y) : (x))
1813
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001814static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001815long_bitwise(PyLongObject *a,
1816 int op, /* '&', '|', '^' */
1817 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001818{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001819 digit maska, maskb; /* 0 or MASK */
1820 int negz;
1821 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001822 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001823 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001824 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001825 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001826
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001827 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001828 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001829 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001830 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001831 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001832 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001833 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001834 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001835 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001836 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001837 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001838 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001839 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001840 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001841 maskb = 0;
1842 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001843
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001844 negz = 0;
1845 switch (op) {
1846 case '^':
1847 if (maska != maskb) {
1848 maska ^= MASK;
1849 negz = -1;
1850 }
1851 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001852 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001853 if (maska && maskb) {
1854 op = '|';
1855 maska ^= MASK;
1856 maskb ^= MASK;
1857 negz = -1;
1858 }
1859 break;
1860 case '|':
1861 if (maska || maskb) {
1862 op = '&';
1863 maska ^= MASK;
1864 maskb ^= MASK;
1865 negz = -1;
1866 }
1867 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001868 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001869
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001870 /* JRH: The original logic here was to allocate the result value (z)
1871 as the longer of the two operands. However, there are some cases
1872 where the result is guaranteed to be shorter than that: AND of two
1873 positives, OR of two negatives: use the shorter number. AND with
1874 mixed signs: use the positive number. OR with mixed signs: use the
1875 negative number. After the transformations above, op will be '&'
1876 iff one of these cases applies, and mask will be non-0 for operands
1877 whose length should be ignored.
1878 */
1879
1880 size_a = a->ob_size;
1881 size_b = b->ob_size;
1882 size_z = op == '&'
1883 ? (maska
1884 ? size_b
1885 : (maskb ? size_a : MIN(size_a, size_b)))
1886 : MAX(size_a, size_b);
1887 z = _PyLong_New(size_z);
1888 if (a == NULL || b == NULL || z == NULL) {
1889 Py_XDECREF(a);
1890 Py_XDECREF(b);
1891 Py_XDECREF(z);
1892 return NULL;
1893 }
1894
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001895 for (i = 0; i < size_z; ++i) {
1896 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1897 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1898 switch (op) {
1899 case '&': z->ob_digit[i] = diga & digb; break;
1900 case '|': z->ob_digit[i] = diga | digb; break;
1901 case '^': z->ob_digit[i] = diga ^ digb; break;
1902 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001903 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001904
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001905 Py_DECREF(a);
1906 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001907 z = long_normalize(z);
1908 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001909 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001910 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001911 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001912 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001913}
1914
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001915static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001916long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001917{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001918 PyLongObject *a, *b;
1919 PyObject *c;
1920 CONVERT_BINOP(v, w, &a, &b);
1921 c = long_bitwise(a, '&', b);
1922 Py_DECREF(a);
1923 Py_DECREF(b);
1924 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001925}
1926
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001927static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001928long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001929{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001930 PyLongObject *a, *b;
1931 PyObject *c;
1932 CONVERT_BINOP(v, w, &a, &b);
1933 c = long_bitwise(a, '^', b);
1934 Py_DECREF(a);
1935 Py_DECREF(b);
1936 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001937}
1938
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001939static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001940long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001941{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001942 PyLongObject *a, *b;
1943 PyObject *c;
1944 CONVERT_BINOP(v, w, &a, &b);
1945 c = long_bitwise(a, '|', b);
1946 Py_DECREF(a);
1947 Py_DECREF(b);
1948 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001949}
1950
Guido van Rossum234f9421993-06-17 12:35:49 +00001951static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001952long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001953{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001954 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001955 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001956 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001957 return 0;
1958 }
1959 return 1; /* Can't do it */
1960}
1961
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001962static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001963long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001964{
1965 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001966 x = PyLong_AsLong(v);
1967 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001968 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001969 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001970}
1971
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001972static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001973long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001974{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001975 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001976 return v;
1977}
1978
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001979static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001980long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001981{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001982 double result;
1983 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001984 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001985 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001986 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001987}
1988
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001989static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001990long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001991{
Fred Drake121ee271999-12-23 15:41:28 +00001992 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001993}
1994
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001995static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001996long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001997{
Fred Drake121ee271999-12-23 15:41:28 +00001998 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001999}
2000
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002001static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002002 (binaryfunc) long_add, /*nb_add*/
2003 (binaryfunc) long_sub, /*nb_subtract*/
2004 (binaryfunc) long_mul, /*nb_multiply*/
2005 (binaryfunc) long_div, /*nb_divide*/
2006 (binaryfunc) long_mod, /*nb_remainder*/
2007 (binaryfunc) long_divmod, /*nb_divmod*/
2008 (ternaryfunc) long_pow, /*nb_power*/
2009 (unaryfunc) long_neg, /*nb_negative*/
2010 (unaryfunc) long_pos, /*tp_positive*/
2011 (unaryfunc) long_abs, /*tp_absolute*/
2012 (inquiry) long_nonzero, /*tp_nonzero*/
2013 (unaryfunc) long_invert, /*nb_invert*/
2014 (binaryfunc) long_lshift, /*nb_lshift*/
2015 (binaryfunc) long_rshift, /*nb_rshift*/
2016 (binaryfunc) long_and, /*nb_and*/
2017 (binaryfunc) long_xor, /*nb_xor*/
2018 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002019 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002020 (unaryfunc) long_int, /*nb_int*/
2021 (unaryfunc) long_long, /*nb_long*/
2022 (unaryfunc) long_float, /*nb_float*/
2023 (unaryfunc) long_oct, /*nb_oct*/
2024 (unaryfunc) long_hex, /*nb_hex*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00002025 0, /*nb_inplace_add*/
2026 0, /*nb_inplace_subtract*/
2027 0, /*nb_inplace_multiply*/
2028 0, /*nb_inplace_divide*/
2029 0, /*nb_inplace_remainder*/
2030 0, /*nb_inplace_power*/
2031 0, /*nb_inplace_lshift*/
2032 0, /*nb_inplace_rshift*/
2033 0, /*nb_inplace_and*/
2034 0, /*nb_inplace_xor*/
2035 0, /*nb_inplace_or*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002036};
2037
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002038PyTypeObject PyLong_Type = {
2039 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002040 0,
2041 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002042 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002043 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00002044 (destructor)long_dealloc, /*tp_dealloc*/
2045 0, /*tp_print*/
2046 0, /*tp_getattr*/
2047 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002048 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002049 (reprfunc)long_repr, /*tp_repr*/
2050 &long_as_number, /*tp_as_number*/
2051 0, /*tp_as_sequence*/
2052 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002053 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002054 0, /*tp_call*/
2055 (reprfunc)long_str, /*tp_str*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00002056 0, /*tp_getattro*/
2057 0, /*tp_setattro*/
2058 0, /*tp_as_buffer*/
Guido van Rossum6fd867b2001-01-17 15:33:18 +00002059 Py_TPFLAGS_CHECKTYPES /*tp_flags*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002060};