blob: 91e0b66afb117f878aa38970c1bba8aa7544871b [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001
2/* Long (arbitrary precision) integer object implementation */
3
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004/* XXX The functional organization of this file is terrible */
5
Guido van Rossumc0b618a1997-05-02 03:12:38 +00006#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +00007#include "longintrepr.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00009#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000010
Guido van Rossume32e0141992-01-19 16:31:05 +000011#define ABS(x) ((x) < 0 ? -(x) : (x))
12
13/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000014static PyLongObject *long_normalize(PyLongObject *);
15static PyLongObject *mul1(PyLongObject *, wdigit);
16static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
Tim Peters212e6142001-07-14 12:23:19 +000017static PyLongObject *divrem1(PyLongObject *, digit, digit *);
Tim Peters9f688bf2000-07-07 15:53:28 +000018static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000019
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000020static int ticker; /* XXX Could be shared with ceval? */
21
Guido van Rossumc0b618a1997-05-02 03:12:38 +000022#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000023 if (--ticker < 0) { \
24 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000025 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000026 }
27
Guido van Rossumedcc38a1991-05-05 20:09:44 +000028/* Normalize (remove leading zeros from) a long int object.
29 Doesn't attempt to free the storage--in most cases, due to the nature
30 of the algorithms used, this could save at most be one word anyway. */
31
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000033long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000034{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000035 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000036 register int i = j;
37
38 while (i > 0 && v->ob_digit[i-1] == 0)
39 --i;
40 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000041 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000042 return v;
43}
44
45/* Allocate a new long int object with size digits.
46 Return NULL and set exception if we run out of memory. */
47
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000049_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000050{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000052}
53
54/* Create a new long int object from a C long int */
55
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000057PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000058{
Tim Petersce9de2f2001-06-14 04:56:19 +000059 PyLongObject *v;
60 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
61 int ndigits = 0;
62 int negative = 0;
63
64 if (ival < 0) {
65 ival = -ival;
66 negative = 1;
67 }
68
69 /* Count the number of Python digits.
70 We used to pick 5 ("big enough for anything"), but that's a
71 waste of time and space given that 5*15 = 75 bits are rarely
72 needed. */
73 t = (unsigned long)ival;
74 while (t) {
75 ++ndigits;
76 t >>= SHIFT;
77 }
78 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000079 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +000080 digit *p = v->ob_digit;
81 v->ob_size = negative ? -ndigits : ndigits;
82 t = (unsigned long)ival;
83 while (t) {
84 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000085 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000087 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000089}
90
Guido van Rossum53756b11997-01-03 17:14:46 +000091/* Create a new long int object from a C unsigned long int */
92
Guido van Rossumc0b618a1997-05-02 03:12:38 +000093PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000094PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +000095{
Tim Petersce9de2f2001-06-14 04:56:19 +000096 PyLongObject *v;
97 unsigned long t;
98 int ndigits = 0;
99
100 /* Count the number of Python digits. */
101 t = (unsigned long)ival;
102 while (t) {
103 ++ndigits;
104 t >>= SHIFT;
105 }
106 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000107 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000108 digit *p = v->ob_digit;
109 v->ob_size = ndigits;
110 while (ival) {
111 *p++ = (digit)(ival & MASK);
112 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000113 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000114 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000116}
117
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000118/* Create a new long int object from a C double */
119
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000122{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000124 double frac;
125 int i, ndig, expo, neg;
126 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000127 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000128 PyErr_SetString(PyExc_OverflowError,
129 "cannot convert float infinity to long");
130 return NULL;
131 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000132 if (dval < 0.0) {
133 neg = 1;
134 dval = -dval;
135 }
136 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
137 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000139 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000141 if (v == NULL)
142 return NULL;
143 frac = ldexp(frac, (expo-1) % SHIFT + 1);
144 for (i = ndig; --i >= 0; ) {
145 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000146 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000147 frac = frac - (double)bits;
148 frac = ldexp(frac, SHIFT);
149 }
150 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000151 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000153}
154
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000155/* Get a C long int from a long int object.
156 Returns -1 and sets an error condition if overflow occurs. */
157
158long
Tim Peters9f688bf2000-07-07 15:53:28 +0000159PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000160{
Guido van Rossumf7531811998-05-26 14:33:37 +0000161 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000163 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000164 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000165
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000166 if (vv == NULL || !PyLong_Check(vv)) {
167 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000168 return -1;
169 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000171 i = v->ob_size;
172 sign = 1;
173 x = 0;
174 if (i < 0) {
175 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000176 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000177 }
178 while (--i >= 0) {
179 prev = x;
180 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000181 if ((x >> SHIFT) != prev)
182 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000183 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000184 /* Haven't lost any bits, but if the sign bit is set we're in
185 * trouble *unless* this is the min negative number. So,
186 * trouble iff sign bit set && (positive || some bit set other
187 * than the sign bit).
188 */
189 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
190 goto overflow;
191 return (long)x * sign;
192
193 overflow:
194 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000195 "long int too large to convert");
Guido van Rossumf7531811998-05-26 14:33:37 +0000196 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000197}
198
Guido van Rossum53756b11997-01-03 17:14:46 +0000199/* Get a C long int from a long int object.
200 Returns -1 and sets an error condition if overflow occurs. */
201
202unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000203PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000204{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000206 unsigned long x, prev;
207 int i;
208
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 if (vv == NULL || !PyLong_Check(vv)) {
210 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000211 return (unsigned long) -1;
212 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000214 i = v->ob_size;
215 x = 0;
216 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000218 "can't convert negative value to unsigned long");
219 return (unsigned long) -1;
220 }
221 while (--i >= 0) {
222 prev = x;
223 x = (x << SHIFT) + v->ob_digit[i];
224 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000226 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000227 return (unsigned long) -1;
228 }
229 }
230 return x;
231}
232
Tim Peters2a9b3672001-06-11 21:23:58 +0000233PyObject *
234_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
235 int little_endian, int is_signed)
236{
237 const unsigned char* pstartbyte;/* LSB of bytes */
238 int incr; /* direction to move pstartbyte */
239 const unsigned char* pendbyte; /* MSB of bytes */
240 size_t numsignificantbytes; /* number of bytes that matter */
241 size_t ndigits; /* number of Python long digits */
242 PyLongObject* v; /* result */
243 int idigit = 0; /* next free index in v->ob_digit */
244
245 if (n == 0)
246 return PyLong_FromLong(0L);
247
248 if (little_endian) {
249 pstartbyte = bytes;
250 pendbyte = bytes + n - 1;
251 incr = 1;
252 }
253 else {
254 pstartbyte = bytes + n - 1;
255 pendbyte = bytes;
256 incr = -1;
257 }
258
259 if (is_signed)
260 is_signed = *pendbyte >= 0x80;
261
262 /* Compute numsignificantbytes. This consists of finding the most
263 significant byte. Leading 0 bytes are insignficant if the number
264 is positive, and leading 0xff bytes if negative. */
265 {
266 size_t i;
267 const unsigned char* p = pendbyte;
268 const int pincr = -incr; /* search MSB to LSB */
269 const unsigned char insignficant = is_signed ? 0xff : 0x00;
270
271 for (i = 0; i < n; ++i, p += pincr) {
272 if (*p != insignficant)
273 break;
274 }
275 numsignificantbytes = n - i;
276 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
277 actually has 2 significant bytes. OTOH, 0xff0001 ==
278 -0x00ffff, so we wouldn't *need* to bump it there; but we
279 do for 0xffff = -0x0001. To be safe without bothering to
280 check every case, bump it regardless. */
281 if (is_signed && numsignificantbytes < n)
282 ++numsignificantbytes;
283 }
284
285 /* How many Python long digits do we need? We have
286 8*numsignificantbytes bits, and each Python long digit has SHIFT
287 bits, so it's the ceiling of the quotient. */
288 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
289 if (ndigits > (size_t)INT_MAX)
290 return PyErr_NoMemory();
291 v = _PyLong_New((int)ndigits);
292 if (v == NULL)
293 return NULL;
294
295 /* Copy the bits over. The tricky parts are computing 2's-comp on
296 the fly for signed numbers, and dealing with the mismatch between
297 8-bit bytes and (probably) 15-bit Python digits.*/
298 {
299 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000300 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000301 twodigits accum = 0; /* sliding register */
302 unsigned int accumbits = 0; /* number of bits in accum */
303 const unsigned char* p = pstartbyte;
304
305 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000306 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000307 /* Compute correction for 2's comp, if needed. */
308 if (is_signed) {
309 thisbyte = (0xff ^ thisbyte) + carry;
310 carry = thisbyte >> 8;
311 thisbyte &= 0xff;
312 }
313 /* Because we're going LSB to MSB, thisbyte is
314 more significant than what's already in accum,
315 so needs to be prepended to accum. */
316 accum |= thisbyte << accumbits;
317 accumbits += 8;
318 if (accumbits >= SHIFT) {
319 /* There's enough to fill a Python digit. */
320 assert(idigit < (int)ndigits);
321 v->ob_digit[idigit] = (digit)(accum & MASK);
322 ++idigit;
323 accum >>= SHIFT;
324 accumbits -= SHIFT;
325 assert(accumbits < SHIFT);
326 }
327 }
328 assert(accumbits < SHIFT);
329 if (accumbits) {
330 assert(idigit < (int)ndigits);
331 v->ob_digit[idigit] = (digit)accum;
332 ++idigit;
333 }
334 }
335
336 v->ob_size = is_signed ? -idigit : idigit;
337 return (PyObject *)long_normalize(v);
338}
339
340int
341_PyLong_AsByteArray(PyLongObject* v,
342 unsigned char* bytes, size_t n,
343 int little_endian, int is_signed)
344{
345 int i; /* index into v->ob_digit */
346 int ndigits; /* |v->ob_size| */
347 twodigits accum; /* sliding register */
348 unsigned int accumbits; /* # bits in accum */
349 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
350 twodigits carry; /* for computing 2's-comp */
351 size_t j; /* # bytes filled */
352 unsigned char* p; /* pointer to next byte in bytes */
353 int pincr; /* direction to move p */
354
355 assert(v != NULL && PyLong_Check(v));
356
357 if (v->ob_size < 0) {
358 ndigits = -(v->ob_size);
359 if (!is_signed) {
360 PyErr_SetString(PyExc_TypeError,
361 "can't convert negative long to unsigned");
362 return -1;
363 }
364 do_twos_comp = 1;
365 }
366 else {
367 ndigits = v->ob_size;
368 do_twos_comp = 0;
369 }
370
371 if (little_endian) {
372 p = bytes;
373 pincr = 1;
374 }
375 else {
376 p = bytes + n - 1;
377 pincr = -1;
378 }
379
Tim Peters898cf852001-06-13 20:50:08 +0000380 /* Copy over all the Python digits.
381 It's crucial that every Python digit except for the MSD contribute
382 exactly SHIFT bits to the total, so first assert that the long is
383 normalized. */
384 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000385 j = 0;
386 accum = 0;
387 accumbits = 0;
388 carry = do_twos_comp ? 1 : 0;
389 for (i = 0; i < ndigits; ++i) {
390 twodigits thisdigit = v->ob_digit[i];
391 if (do_twos_comp) {
392 thisdigit = (thisdigit ^ MASK) + carry;
393 carry = thisdigit >> SHIFT;
394 thisdigit &= MASK;
395 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000396 /* Because we're going LSB to MSB, thisdigit is more
397 significant than what's already in accum, so needs to be
398 prepended to accum. */
399 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000400 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000401
Tim Petersede05092001-06-14 08:53:38 +0000402 /* The most-significant digit may be (probably is) at least
403 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000404 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000405 /* Count # of sign bits -- they needn't be stored,
406 * although for signed conversion we need later to
407 * make sure at least one sign bit gets stored.
408 * First shift conceptual sign bit to real sign bit.
409 */
410 stwodigits s = (stwodigits)(thisdigit <<
411 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000412 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000413 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000414 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000415 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000416 }
Tim Petersede05092001-06-14 08:53:38 +0000417 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000418 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000419
Tim Peters2a9b3672001-06-11 21:23:58 +0000420 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000421 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000422 if (j >= n)
423 goto Overflow;
424 ++j;
425 *p = (unsigned char)(accum & 0xff);
426 p += pincr;
427 accumbits -= 8;
428 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000429 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000430 }
431
432 /* Store the straggler (if any). */
433 assert(accumbits < 8);
434 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000435 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000436 if (j >= n)
437 goto Overflow;
438 ++j;
439 if (do_twos_comp) {
440 /* Fill leading bits of the byte with sign bits
441 (appropriately pretending that the long had an
442 infinite supply of sign bits). */
443 accum |= (~(twodigits)0) << accumbits;
444 }
445 *p = (unsigned char)(accum & 0xff);
446 p += pincr;
447 }
Tim Peters05607ad2001-06-13 21:01:27 +0000448 else if (j == n && n > 0 && is_signed) {
449 /* The main loop filled the byte array exactly, so the code
450 just above didn't get to ensure there's a sign bit, and the
451 loop below wouldn't add one either. Make sure a sign bit
452 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000453 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000454 int sign_bit_set = msb >= 0x80;
455 assert(accumbits == 0);
456 if (sign_bit_set == do_twos_comp)
457 return 0;
458 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000459 goto Overflow;
460 }
Tim Peters05607ad2001-06-13 21:01:27 +0000461
462 /* Fill remaining bytes with copies of the sign bit. */
463 {
464 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
465 for ( ; j < n; ++j, p += pincr)
466 *p = signbyte;
467 }
468
Tim Peters2a9b3672001-06-11 21:23:58 +0000469 return 0;
470
471Overflow:
472 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
473 return -1;
474
475}
476
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000477double
478_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
479{
480/* NBITS_WANTED should be > the number of bits in a double's precision,
481 but small enough so that 2**NBITS_WANTED is within the normal double
482 range. nbitsneeded is set to 1 less than that because the most-significant
483 Python digit contains at least 1 significant bit, but we don't want to
484 bother counting them (catering to the worst case cheaply).
485
486 57 is one more than VAX-D double precision; I (Tim) don't know of a double
487 format with more precision than that; it's 1 larger so that we add in at
488 least one round bit to stand in for the ignored least-significant bits.
489*/
490#define NBITS_WANTED 57
491 PyLongObject *v;
492 double x;
493 const double multiplier = (double)(1L << SHIFT);
494 int i, sign;
495 int nbitsneeded;
496
497 if (vv == NULL || !PyLong_Check(vv)) {
498 PyErr_BadInternalCall();
499 return -1;
500 }
501 v = (PyLongObject *)vv;
502 i = v->ob_size;
503 sign = 1;
504 if (i < 0) {
505 sign = -1;
506 i = -(i);
507 }
508 else if (i == 0) {
509 *exponent = 0;
510 return 0.0;
511 }
512 --i;
513 x = (double)v->ob_digit[i];
514 nbitsneeded = NBITS_WANTED - 1;
515 /* Invariant: i Python digits remain unaccounted for. */
516 while (i > 0 && nbitsneeded > 0) {
517 --i;
518 x = x * multiplier + (double)v->ob_digit[i];
519 nbitsneeded -= SHIFT;
520 }
521 /* There are i digits we didn't shift in. Pretending they're all
522 zeroes, the true value is x * 2**(i*SHIFT). */
523 *exponent = i;
524 assert(x > 0.0);
525 return x * sign;
526#undef NBITS_WANTED
527}
528
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000529/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000530
531double
Tim Peters9f688bf2000-07-07 15:53:28 +0000532PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000533{
Tim Peters9fffa3e2001-09-04 05:14:19 +0000534 int e;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000535 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000536
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 if (vv == NULL || !PyLong_Check(vv)) {
538 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000539 return -1;
540 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000541 x = _PyLong_AsScaledDouble(vv, &e);
542 if (x == -1.0 && PyErr_Occurred())
543 return -1.0;
544 if (e > INT_MAX / SHIFT)
545 goto overflow;
546 errno = 0;
547 x = ldexp(x, e * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000548 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000549 goto overflow;
550 return x;
551
552overflow:
553 PyErr_SetString(PyExc_OverflowError,
554 "long int too large to convert to float");
555 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000556}
557
Guido van Rossum78694d91998-09-18 14:14:13 +0000558/* Create a new long (or int) object from a C pointer */
559
560PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000561PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000562{
Tim Peters70128a12001-06-16 08:48:40 +0000563#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000564 return PyInt_FromLong((long)p);
565#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000566
Tim Peters70128a12001-06-16 08:48:40 +0000567#ifndef HAVE_LONG_LONG
568# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
569#endif
570#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
571# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
572#endif
573 /* optimize null pointers */
574 if (p == NULL)
575 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000576 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000577
578#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000579}
580
581/* Get a C pointer from a long object (or an int object in some cases) */
582
583void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000584PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000585{
586 /* This function will allow int or long objects. If vv is neither,
587 then the PyLong_AsLong*() functions will raise the exception:
588 PyExc_SystemError, "bad argument to internal function"
589 */
Tim Peters70128a12001-06-16 08:48:40 +0000590#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000591 long x;
592
Tim Peters70128a12001-06-16 08:48:40 +0000593 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000594 x = PyInt_AS_LONG(vv);
595 else
596 x = PyLong_AsLong(vv);
597#else
Tim Peters70128a12001-06-16 08:48:40 +0000598
599#ifndef HAVE_LONG_LONG
600# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
601#endif
602#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
603# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
604#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000605 LONG_LONG x;
606
Tim Peters70128a12001-06-16 08:48:40 +0000607 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000608 x = PyInt_AS_LONG(vv);
609 else
610 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000611
612#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000613
614 if (x == -1 && PyErr_Occurred())
615 return NULL;
616 return (void *)x;
617}
618
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000619#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000620
621/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
622 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000623 */
624
Tim Peterscf37dfc2001-06-14 18:42:50 +0000625#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000626
627/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000628
629PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000630PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000631{
Tim Petersd1a7da62001-06-13 00:35:57 +0000632 LONG_LONG bytes = ival;
633 int one = 1;
634 return _PyLong_FromByteArray(
635 (unsigned char *)&bytes,
636 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000637}
638
Tim Petersd1a7da62001-06-13 00:35:57 +0000639/* Create a new long int object from a C unsigned LONG_LONG int. */
640
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000641PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000642PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000643{
Tim Petersd1a7da62001-06-13 00:35:57 +0000644 unsigned LONG_LONG bytes = ival;
645 int one = 1;
646 return _PyLong_FromByteArray(
647 (unsigned char *)&bytes,
648 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000649}
650
Guido van Rossum3293b071998-08-25 16:07:15 +0000651/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000652 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000653
Guido van Rossum3293b071998-08-25 16:07:15 +0000654LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000655PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000656{
Tim Petersd1a7da62001-06-13 00:35:57 +0000657 LONG_LONG bytes;
658 int one = 1;
659 int res;
660
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000661 if (vv == NULL || !PyLong_Check(vv)) {
662 PyErr_BadInternalCall();
663 return -1;
664 }
665
Tim Petersd1a7da62001-06-13 00:35:57 +0000666 res = _PyLong_AsByteArray(
667 (PyLongObject *)vv, (unsigned char *)&bytes,
668 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000669
Tim Peters9cb0c382001-06-13 20:45:17 +0000670 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000671}
672
Tim Petersd1a7da62001-06-13 00:35:57 +0000673/* Get a C unsigned LONG_LONG int from a long int object.
674 Return -1 and set an error if overflow occurs. */
675
Guido van Rossum3293b071998-08-25 16:07:15 +0000676unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000677PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000678{
Tim Petersd1a7da62001-06-13 00:35:57 +0000679 unsigned LONG_LONG bytes;
680 int one = 1;
681 int res;
682
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000683 if (vv == NULL || !PyLong_Check(vv)) {
684 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000685 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000686 }
687
Tim Petersd1a7da62001-06-13 00:35:57 +0000688 res = _PyLong_AsByteArray(
689 (PyLongObject *)vv, (unsigned char *)&bytes,
690 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000691
Tim Peters9cb0c382001-06-13 20:45:17 +0000692 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000693}
Tim Petersd1a7da62001-06-13 00:35:57 +0000694
695#undef IS_LITTLE_ENDIAN
696
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000697#endif /* HAVE_LONG_LONG */
698
Neil Schemenauerba872e22001-01-04 01:46:03 +0000699
700static int
701convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
702 if (PyLong_Check(v)) {
703 *a = (PyLongObject *) v;
704 Py_INCREF(v);
705 }
706 else if (PyInt_Check(v)) {
707 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
708 }
709 else {
710 return 0;
711 }
712 if (PyLong_Check(w)) {
713 *b = (PyLongObject *) w;
714 Py_INCREF(w);
715 }
716 else if (PyInt_Check(w)) {
717 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
718 }
719 else {
720 Py_DECREF(*a);
721 return 0;
722 }
723 return 1;
724}
725
726#define CONVERT_BINOP(v, w, a, b) \
727 if (!convert_binop(v, w, a, b)) { \
728 Py_INCREF(Py_NotImplemented); \
729 return Py_NotImplemented; \
730 }
731
732
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000733/* Multiply by a single digit, ignoring the sign. */
734
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000736mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000737{
738 return muladd1(a, n, (digit)0);
739}
740
741/* Multiply by a single digit and add a single digit, ignoring the sign. */
742
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000743static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000744muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000745{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000746 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000747 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000748 twodigits carry = extra;
749 int i;
750
751 if (z == NULL)
752 return NULL;
753 for (i = 0; i < size_a; ++i) {
754 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000755 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000756 carry >>= SHIFT;
757 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000758 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000759 return long_normalize(z);
760}
761
Tim Peters212e6142001-07-14 12:23:19 +0000762/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
763 in pout, and returning the remainder. pin and pout point at the LSD.
764 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
765 long_format, but that should be done with great care since longs are
766 immutable. */
767
768static digit
769inplace_divrem1(digit *pout, digit *pin, int size, digit n)
770{
771 twodigits rem = 0;
772
773 assert(n > 0 && n <= MASK);
774 pin += size;
775 pout += size;
776 while (--size >= 0) {
777 digit hi;
778 rem = (rem << SHIFT) + *--pin;
779 *--pout = hi = (digit)(rem / n);
780 rem -= hi * n;
781 }
782 return (digit)rem;
783}
784
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000785/* Divide a long integer by a digit, returning both the quotient
786 (as function result) and the remainder (through *prem).
787 The sign of a is ignored; n should not be zero. */
788
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000789static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000790divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000791{
Tim Peters212e6142001-07-14 12:23:19 +0000792 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000793 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000794
795 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000796 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000797 if (z == NULL)
798 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000799 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000800 return long_normalize(z);
801}
802
803/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000804 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000805 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000806
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000808long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000809{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 register PyLongObject *a = (PyLongObject *)aa;
811 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000812 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000813 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000814 char *p;
815 int bits;
816 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000817
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818 if (a == NULL || !PyLong_Check(a)) {
819 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000820 return NULL;
821 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000822 assert(base >= 2 && base <= 36);
823
824 /* Compute a rough upper bound for the length of the string */
825 i = base;
826 bits = 0;
827 while (i > 1) {
828 ++bits;
829 i >>= 1;
830 }
Fred Drake121ee271999-12-23 15:41:28 +0000831 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000832 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000833 if (str == NULL)
834 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000835 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000836 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000837 if (addL)
838 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000839 if (a->ob_size < 0)
840 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000841
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000842 if (a->ob_size == 0) {
843 *--p = '0';
844 }
845 else if ((base & (base - 1)) == 0) {
846 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000847 twodigits accum = 0;
848 int accumbits = 0; /* # of bits in accum */
849 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000850 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000851 while ((i >>= 1) > 1)
852 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000853
854 for (i = 0; i < size_a; ++i) {
855 accum |= a->ob_digit[i] << accumbits;
856 accumbits += SHIFT;
857 assert(accumbits >= basebits);
858 do {
859 char digit = (char)(accum & (base - 1));
860 digit += (digit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000861 assert(p > PyString_AS_STRING(str));
Tim Peters586b2e32001-07-15 09:11:14 +0000862 *--p = digit;
863 accumbits -= basebits;
864 accum >>= basebits;
865 } while (i < size_a-1 ? accumbits >= basebits :
866 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000867 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000868 }
869 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000870 /* Not 0, and base not a power of 2. Divide repeatedly by
871 base, but for speed use the highest power of base that
872 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000873 int size = size_a;
874 digit *pin = a->ob_digit;
875 PyLongObject *scratch;
876 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000877 digit powbase = base; /* powbase == base ** power */
878 int power = 1;
879 for (;;) {
880 unsigned long newpow = powbase * (unsigned long)base;
881 if (newpow >> SHIFT) /* doesn't fit in a digit */
882 break;
883 powbase = (digit)newpow;
884 ++power;
885 }
Tim Peters212e6142001-07-14 12:23:19 +0000886
887 /* Get a scratch area for repeated division. */
888 scratch = _PyLong_New(size);
889 if (scratch == NULL) {
890 Py_DECREF(str);
891 return NULL;
892 }
893
894 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000895 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000896 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000897 digit rem = inplace_divrem1(scratch->ob_digit,
898 pin, size, powbase);
899 pin = scratch->ob_digit; /* no need to use a again */
900 if (pin[size - 1] == 0)
901 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000902 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +0000903 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000904 Py_DECREF(str);
905 return NULL;
906 })
Tim Peters212e6142001-07-14 12:23:19 +0000907
908 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000909 assert(ntostore > 0);
910 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000911 digit nextrem = (digit)(rem / base);
912 char c = (char)(rem - nextrem * base);
913 assert(p > PyString_AS_STRING(str));
914 c += (c < 10) ? '0' : 'A'-10;
915 *--p = c;
916 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000917 --ntostore;
918 /* Termination is a bit delicate: must not
919 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +0000920 remaining quotient and rem are both 0. */
921 } while (ntostore && (size || rem));
922 } while (size != 0);
923 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000924 }
925
Guido van Rossum2c475421992-08-14 15:13:07 +0000926 if (base == 8) {
927 if (size_a != 0)
928 *--p = '0';
929 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000930 else if (base == 16) {
931 *--p = 'x';
932 *--p = '0';
933 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000934 else if (base != 10) {
935 *--p = '#';
936 *--p = '0' + base%10;
937 if (base > 10)
938 *--p = '0' + base/10;
939 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000940 if (sign)
941 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942 if (p != PyString_AS_STRING(str)) {
943 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000944 assert(p > q);
945 do {
946 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000947 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948 _PyString_Resize((PyObject **)&str,
949 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000950 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000951 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000952}
953
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000954PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000955PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000956{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000957 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000958 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000959 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000960
Guido van Rossum472c04f1996-12-05 21:57:21 +0000961 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000962 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000963 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000964 return NULL;
965 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000966 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000967 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000968 if (*str == '+')
969 ++str;
970 else if (*str == '-') {
971 ++str;
972 sign = -1;
973 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000974 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000975 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000976 if (base == 0) {
977 if (str[0] != '0')
978 base = 10;
979 else if (str[1] == 'x' || str[1] == 'X')
980 base = 16;
981 else
982 base = 8;
983 }
984 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
985 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000986 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000987 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000988 for ( ; z != NULL; ++str) {
989 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000990 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000991
992 if (*str <= '9')
993 k = *str - '0';
994 else if (*str >= 'a')
995 k = *str - 'a' + 10;
996 else if (*str >= 'A')
997 k = *str - 'A' + 10;
998 if (k < 0 || k >= base)
999 break;
1000 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001001 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001002 z = temp;
1003 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001004 if (z == NULL)
1005 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001006 if (str == start)
1007 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001008 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001009 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001010 if (*str == 'L' || *str == 'l')
1011 str++;
1012 while (*str && isspace(Py_CHARMASK(*str)))
1013 str++;
1014 if (*str != '\0')
1015 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001016 if (pend)
1017 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001018 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001019
1020 onError:
1021 PyErr_Format(PyExc_ValueError,
1022 "invalid literal for long(): %.200s", orig_str);
1023 Py_XDECREF(z);
1024 return NULL;
1025}
1026
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001027#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001028PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001029PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001030{
1031 char buffer[256];
1032
1033 if (length >= sizeof(buffer)) {
1034 PyErr_SetString(PyExc_ValueError,
1035 "long() literal too large to convert");
1036 return NULL;
1037 }
1038 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
1039 return NULL;
1040
1041 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001042}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001043#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001044
Tim Peters9f688bf2000-07-07 15:53:28 +00001045/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001047 (PyLongObject *, PyLongObject *, PyLongObject **);
1048static PyObject *long_pos(PyLongObject *);
1049static int long_divrem(PyLongObject *, PyLongObject *,
1050 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001051
1052/* Long division with remainder, top-level routine */
1053
Guido van Rossume32e0141992-01-19 16:31:05 +00001054static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001055long_divrem(PyLongObject *a, PyLongObject *b,
1056 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001057{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001058 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001060
1061 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001062 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001063 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001064 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001065 }
1066 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001067 (size_a == size_b &&
1068 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001069 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001070 *pdiv = _PyLong_New(0);
1071 Py_INCREF(a);
1072 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001073 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001074 }
1075 if (size_b == 1) {
1076 digit rem = 0;
1077 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001078 if (z == NULL)
1079 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001081 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001082 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001083 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001084 if (z == NULL)
1085 return -1;
1086 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001087 /* Set the signs.
1088 The quotient z has the sign of a*b;
1089 the remainder r has the sign of a,
1090 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001091 if ((a->ob_size < 0) != (b->ob_size < 0))
1092 z->ob_size = -(z->ob_size);
1093 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1094 (*prem)->ob_size = -((*prem)->ob_size);
1095 *pdiv = z;
1096 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001097}
1098
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001099/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001100
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001102x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001103{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001104 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001105 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001106 PyLongObject *v = mul1(v1, d);
1107 PyLongObject *w = mul1(w1, d);
1108 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001109 int j, k;
1110
1111 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001112 Py_XDECREF(v);
1113 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001114 return NULL;
1115 }
1116
1117 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001118 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001119 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001120
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001121 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001122 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001123
1124 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1125 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1126 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001127 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001128 int i;
1129
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001130 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001131 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001132 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001133 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001134 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001135 if (vj == w->ob_digit[size_w-1])
1136 q = MASK;
1137 else
1138 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1139 w->ob_digit[size_w-1];
1140
1141 while (w->ob_digit[size_w-2]*q >
1142 ((
1143 ((twodigits)vj << SHIFT)
1144 + v->ob_digit[j-1]
1145 - q*w->ob_digit[size_w-1]
1146 ) << SHIFT)
1147 + v->ob_digit[j-2])
1148 --q;
1149
1150 for (i = 0; i < size_w && i+k < size_v; ++i) {
1151 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001152 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001153 carry += v->ob_digit[i+k] - z
1154 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001155 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001156 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1157 carry, SHIFT);
1158 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001159 }
1160
1161 if (i+k < size_v) {
1162 carry += v->ob_digit[i+k];
1163 v->ob_digit[i+k] = 0;
1164 }
1165
1166 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001167 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001168 else {
1169 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001170 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001171 carry = 0;
1172 for (i = 0; i < size_w && i+k < size_v; ++i) {
1173 carry += v->ob_digit[i+k] + w->ob_digit[i];
1174 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001175 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1176 BASE_TWODIGITS_TYPE,
1177 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001178 }
1179 }
1180 } /* for j, k */
1181
Guido van Rossumc206c761995-01-10 15:23:19 +00001182 if (a == NULL)
1183 *prem = NULL;
1184 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001185 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001186 *prem = divrem1(v, d, &d);
1187 /* d receives the (unused) remainder */
1188 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001189 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001190 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001191 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001192 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001193 Py_DECREF(v);
1194 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001195 return a;
1196}
1197
1198/* Methods */
1199
1200static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001201long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001202{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001203 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001204}
1205
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001206static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001207long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001208{
Fred Drake121ee271999-12-23 15:41:28 +00001209 return long_format(v, 10, 1);
1210}
1211
1212static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001213long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001214{
1215 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001216}
1217
1218static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001219long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001220{
1221 int sign;
1222
Guido van Rossumc6913e71991-11-19 20:26:46 +00001223 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001224 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001225 sign = 0;
1226 else
1227 sign = a->ob_size - b->ob_size;
1228 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001229 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001230 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001231 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1232 ;
1233 if (i < 0)
1234 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001235 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001236 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001237 if (a->ob_size < 0)
1238 sign = -sign;
1239 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001240 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001241 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001242}
1243
Guido van Rossum9bfef441993-03-29 10:43:31 +00001244static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001245long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001246{
1247 long x;
1248 int i, sign;
1249
1250 /* This is designed so that Python ints and longs with the
1251 same value hash to the same value, otherwise comparisons
1252 of mapping keys will turn out weird */
1253 i = v->ob_size;
1254 sign = 1;
1255 x = 0;
1256 if (i < 0) {
1257 sign = -1;
1258 i = -(i);
1259 }
1260 while (--i >= 0) {
1261 /* Force a 32-bit circular shift */
1262 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1263 x += v->ob_digit[i];
1264 }
1265 x = x * sign;
1266 if (x == -1)
1267 x = -2;
1268 return x;
1269}
1270
1271
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001272/* Add the absolute values of two long integers. */
1273
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001274static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001275x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001276{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001277 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001279 int i;
1280 digit carry = 0;
1281
1282 /* Ensure a is the larger of the two: */
1283 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284 { PyLongObject *temp = a; a = b; b = temp; }
1285 { int size_temp = size_a;
1286 size_a = size_b;
1287 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001288 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001289 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001290 if (z == NULL)
1291 return NULL;
1292 for (i = 0; i < size_b; ++i) {
1293 carry += a->ob_digit[i] + b->ob_digit[i];
1294 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001295 carry >>= SHIFT;
1296 }
1297 for (; i < size_a; ++i) {
1298 carry += a->ob_digit[i];
1299 z->ob_digit[i] = carry & MASK;
1300 carry >>= SHIFT;
1301 }
1302 z->ob_digit[i] = carry;
1303 return long_normalize(z);
1304}
1305
1306/* Subtract the absolute values of two integers. */
1307
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001309x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001310{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001311 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001312 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001313 int i;
1314 int sign = 1;
1315 digit borrow = 0;
1316
1317 /* Ensure a is the larger of the two: */
1318 if (size_a < size_b) {
1319 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001320 { PyLongObject *temp = a; a = b; b = temp; }
1321 { int size_temp = size_a;
1322 size_a = size_b;
1323 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001324 }
1325 else if (size_a == size_b) {
1326 /* Find highest digit where a and b differ: */
1327 i = size_a;
1328 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1329 ;
1330 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001332 if (a->ob_digit[i] < b->ob_digit[i]) {
1333 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001335 }
1336 size_a = size_b = i+1;
1337 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001338 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001339 if (z == NULL)
1340 return NULL;
1341 for (i = 0; i < size_b; ++i) {
1342 /* The following assumes unsigned arithmetic
1343 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001344 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001345 z->ob_digit[i] = borrow & MASK;
1346 borrow >>= SHIFT;
1347 borrow &= 1; /* Keep only one sign bit */
1348 }
1349 for (; i < size_a; ++i) {
1350 borrow = a->ob_digit[i] - borrow;
1351 z->ob_digit[i] = borrow & MASK;
1352 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001353 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001354 }
1355 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001356 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001357 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001358 return long_normalize(z);
1359}
1360
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001362long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001363{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001364 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001365
Neil Schemenauerba872e22001-01-04 01:46:03 +00001366 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1367
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001368 if (a->ob_size < 0) {
1369 if (b->ob_size < 0) {
1370 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001371 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001372 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001373 }
1374 else
1375 z = x_sub(b, a);
1376 }
1377 else {
1378 if (b->ob_size < 0)
1379 z = x_sub(a, b);
1380 else
1381 z = x_add(a, b);
1382 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001383 Py_DECREF(a);
1384 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001386}
1387
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001388static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001389long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001390{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001391 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001392
Neil Schemenauerba872e22001-01-04 01:46:03 +00001393 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1394
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001395 if (a->ob_size < 0) {
1396 if (b->ob_size < 0)
1397 z = x_sub(a, b);
1398 else
1399 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001400 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001401 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001402 }
1403 else {
1404 if (b->ob_size < 0)
1405 z = x_add(a, b);
1406 else
1407 z = x_sub(a, b);
1408 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001409 Py_DECREF(a);
1410 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001411 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001412}
1413
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001414static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001415long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001416{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001417 /* sequence * long */
1418 long n = PyLong_AsLong((PyObject *) w);
1419 if (n == -1 && PyErr_Occurred())
1420 return NULL;
1421 else
1422 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1423}
1424
1425static PyObject *
1426long_mul(PyLongObject *v, PyLongObject *w)
1427{
1428 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001429 int size_a;
1430 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001431 int i;
1432
Neil Schemenauerba872e22001-01-04 01:46:03 +00001433 if (v->ob_type->tp_as_sequence &&
1434 v->ob_type->tp_as_sequence->sq_repeat) {
1435 return long_repeat((PyObject *)v, w);
1436 }
1437 else if (w->ob_type->tp_as_sequence &&
1438 w->ob_type->tp_as_sequence->sq_repeat) {
1439 return long_repeat((PyObject *)w, v);
1440 }
1441
1442 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1443
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001444 size_a = ABS(a->ob_size);
1445 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001446 if (size_a > size_b) {
1447 /* we are faster with the small object on the left */
1448 int hold_sa = size_a;
1449 PyLongObject *hold_a = a;
1450 size_a = size_b;
1451 size_b = hold_sa;
1452 a = b;
1453 b = hold_a;
1454 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001456 if (z == NULL) {
1457 Py_DECREF(a);
1458 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001459 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001460 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001461 for (i = 0; i < z->ob_size; ++i)
1462 z->ob_digit[i] = 0;
1463 for (i = 0; i < size_a; ++i) {
1464 twodigits carry = 0;
1465 twodigits f = a->ob_digit[i];
1466 int j;
1467
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001468 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001469 Py_DECREF(a);
1470 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001471 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001472 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001473 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001474 for (j = 0; j < size_b; ++j) {
1475 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001476 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001477 carry >>= SHIFT;
1478 }
1479 for (; carry != 0; ++j) {
1480 assert(i+j < z->ob_size);
1481 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001482 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001483 carry >>= SHIFT;
1484 }
1485 }
1486 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001487 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001488 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001489 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001490 Py_DECREF(a);
1491 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001492 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001493}
1494
Guido van Rossume32e0141992-01-19 16:31:05 +00001495/* The / and % operators are now defined in terms of divmod().
1496 The expression a mod b has the value a - b*floor(a/b).
1497 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001498 |a| by |b|, with the sign of a. This is also expressed
1499 as a - b*trunc(a/b), if trunc truncates towards zero.
1500 Some examples:
1501 a b a rem b a mod b
1502 13 10 3 3
1503 -13 10 -3 7
1504 13 -10 3 -7
1505 -13 -10 -3 -3
1506 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001507 have different signs. We then subtract one from the 'div'
1508 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001509
Guido van Rossume32e0141992-01-19 16:31:05 +00001510static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001511l_divmod(PyLongObject *v, PyLongObject *w,
1512 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001513{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001514 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001515
1516 if (long_divrem(v, w, &div, &mod) < 0)
1517 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001518 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1519 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001520 PyLongObject *temp;
1521 PyLongObject *one;
1522 temp = (PyLongObject *) long_add(mod, w);
1523 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001524 mod = temp;
1525 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001526 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001527 return -1;
1528 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001529 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001530 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001531 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1532 Py_DECREF(mod);
1533 Py_DECREF(div);
1534 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001535 return -1;
1536 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001537 Py_DECREF(one);
1538 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001539 div = temp;
1540 }
1541 *pdiv = div;
1542 *pmod = mod;
1543 return 0;
1544}
1545
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001546static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001547long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001548{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001549 PyLongObject *a, *b, *div, *mod;
1550
1551 CONVERT_BINOP(v, w, &a, &b);
1552
1553 if (l_divmod(a, b, &div, &mod) < 0) {
1554 Py_DECREF(a);
1555 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001556 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001557 }
1558 Py_DECREF(a);
1559 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001560 Py_DECREF(mod);
1561 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001562}
1563
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001564static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001565long_classic_div(PyObject *v, PyObject *w)
1566{
1567 PyLongObject *a, *b, *div, *mod;
1568
1569 CONVERT_BINOP(v, w, &a, &b);
1570
1571 if (Py_DivisionWarningFlag &&
1572 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1573 div = NULL;
1574 else if (l_divmod(a, b, &div, &mod) < 0)
1575 div = NULL;
1576 else
1577 Py_DECREF(mod);
1578
1579 Py_DECREF(a);
1580 Py_DECREF(b);
1581 return (PyObject *)div;
1582}
1583
1584static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00001585long_true_divide(PyObject *v, PyObject *w)
1586{
Tim Peterse2a60002001-09-04 06:17:36 +00001587 PyLongObject *a, *b;
1588 double ad, bd;
1589 int aexp, bexp;
1590
1591 CONVERT_BINOP(v, w, &a, &b);
1592 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
1593 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
1594 if ((ad == -1.0 || bd == -1.0) && PyErr_Occurred())
1595 return NULL;
1596
1597 if (bd == 0.0) {
1598 PyErr_SetString(PyExc_ZeroDivisionError,
1599 "long division or modulo by zero");
1600 return NULL;
1601 }
1602
1603 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
1604 ad /= bd; /* overflow/underflow impossible here */
1605 aexp -= bexp;
1606 if (aexp > INT_MAX / SHIFT)
1607 goto overflow;
1608 errno = 0;
1609 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00001610 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00001611 goto overflow;
1612 return PyFloat_FromDouble(ad);
1613
1614overflow:
1615 PyErr_SetString(PyExc_OverflowError,
1616 "long/long too large for a float");
1617 return NULL;
1618
Tim Peters20dab9f2001-09-04 05:31:47 +00001619}
1620
1621static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001622long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001623{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001624 PyLongObject *a, *b, *div, *mod;
1625
1626 CONVERT_BINOP(v, w, &a, &b);
1627
1628 if (l_divmod(a, b, &div, &mod) < 0) {
1629 Py_DECREF(a);
1630 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001631 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001632 }
1633 Py_DECREF(a);
1634 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001635 Py_DECREF(div);
1636 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001637}
1638
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001640long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001641{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001642 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001643 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001644
1645 CONVERT_BINOP(v, w, &a, &b);
1646
1647 if (l_divmod(a, b, &div, &mod) < 0) {
1648 Py_DECREF(a);
1649 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001650 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001651 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001652 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001653 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001654 PyTuple_SetItem(z, 0, (PyObject *) div);
1655 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001656 }
1657 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001658 Py_DECREF(div);
1659 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001660 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001661 Py_DECREF(a);
1662 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001663 return z;
1664}
1665
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001666static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001667long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001668{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001669 PyLongObject *a, *b;
1670 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001671 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001672 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001673
1674 CONVERT_BINOP(v, w, &a, &b);
1675 if (PyLong_Check(x) || Py_None == x) {
1676 c = x;
1677 Py_INCREF(x);
1678 }
1679 else if (PyInt_Check(x)) {
1680 c = PyLong_FromLong(PyInt_AS_LONG(x));
1681 }
1682 else {
1683 Py_DECREF(a);
1684 Py_DECREF(b);
1685 Py_INCREF(Py_NotImplemented);
1686 return Py_NotImplemented;
1687 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001688
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001689 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001690 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001691 Py_DECREF(a);
1692 Py_DECREF(b);
1693 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00001694 if (x != Py_None) {
1695 PyErr_SetString(PyExc_TypeError, "integer pow() arg "
1696 "3 must not be specified when arg 2 is < 0");
1697 return NULL;
1698 }
1699 /* Return a float. This works because we know that
1700 this calls float_pow() which converts its
1701 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001702 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001703 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001704 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001705 for (i = 0; i < size_b; ++i) {
1706 digit bi = b->ob_digit[i];
1707 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001708
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001709 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001710 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001711
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001712 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001713 temp = (PyLongObject *)long_mul(z, a);
1714 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001715 if (c!=Py_None && temp!=NULL) {
1716 if (l_divmod(temp,(PyLongObject *)c,
1717 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001718 Py_DECREF(temp);
1719 z = NULL;
1720 goto error;
1721 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001722 Py_XDECREF(div);
1723 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001724 temp = mod;
1725 }
1726 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001727 if (z == NULL)
1728 break;
1729 }
1730 bi >>= 1;
1731 if (bi == 0 && i+1 == size_b)
1732 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001733 temp = (PyLongObject *)long_mul(a, a);
1734 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001735 if (c!=Py_None && temp!=NULL) {
1736 if (l_divmod(temp, (PyLongObject *)c, &div,
1737 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001738 Py_DECREF(temp);
1739 z = NULL;
1740 goto error;
1741 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001742 Py_XDECREF(div);
1743 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001744 temp = mod;
1745 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001746 a = temp;
1747 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001748 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001749 z = NULL;
1750 break;
1751 }
1752 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001753 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001754 break;
1755 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001756 if (c!=Py_None && z!=NULL) {
1757 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001758 Py_DECREF(z);
1759 z = NULL;
1760 }
1761 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001762 Py_XDECREF(div);
1763 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001764 z = mod;
1765 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001766 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001767 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001768 Py_XDECREF(a);
1769 Py_DECREF(b);
1770 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001771 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001772}
1773
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001774static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001775long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001776{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001777 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001778 PyLongObject *x;
1779 PyLongObject *w;
1780 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001781 if (w == NULL)
1782 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001783 x = (PyLongObject *) long_add(v, w);
1784 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001785 if (x == NULL)
1786 return NULL;
1787 if (x->ob_size != 0)
1788 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001789 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001790}
1791
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001792static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001793long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001794{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001795 Py_INCREF(v);
1796 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001797}
1798
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001799static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001800long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001801{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001802 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001803 int i, n;
1804 n = ABS(v->ob_size);
1805 if (n == 0) {
1806 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001807 Py_INCREF(v);
1808 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001809 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001810 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001811 if (z == NULL)
1812 return NULL;
1813 for (i = 0; i < n; i++)
1814 z->ob_digit[i] = v->ob_digit[i];
1815 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001816 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001817}
1818
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001819static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001820long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001821{
1822 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001823 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001824 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001825 Py_INCREF(v);
1826 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001827 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001828}
1829
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001830static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001831long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001832{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001833 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001834}
1835
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001836static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001837long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001838{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001839 PyLongObject *a, *b;
1840 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001841 long shiftby;
1842 int newsize, wordshift, loshift, hishift, i, j;
1843 digit lomask, himask;
1844
Neil Schemenauerba872e22001-01-04 01:46:03 +00001845 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1846
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001847 if (a->ob_size < 0) {
1848 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001849 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001850 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001851 if (a1 == NULL)
1852 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001853 a2 = (PyLongObject *) long_rshift(a1, b);
1854 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001855 if (a2 == NULL)
1856 goto rshift_error;
1857 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001858 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001859 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001860 else {
1861
1862 shiftby = PyLong_AsLong((PyObject *)b);
1863 if (shiftby == -1L && PyErr_Occurred())
1864 goto rshift_error;
1865 if (shiftby < 0) {
1866 PyErr_SetString(PyExc_ValueError,
1867 "negative shift count");
1868 goto rshift_error;
1869 }
1870 wordshift = shiftby / SHIFT;
1871 newsize = ABS(a->ob_size) - wordshift;
1872 if (newsize <= 0) {
1873 z = _PyLong_New(0);
1874 Py_DECREF(a);
1875 Py_DECREF(b);
1876 return (PyObject *)z;
1877 }
1878 loshift = shiftby % SHIFT;
1879 hishift = SHIFT - loshift;
1880 lomask = ((digit)1 << hishift) - 1;
1881 himask = MASK ^ lomask;
1882 z = _PyLong_New(newsize);
1883 if (z == NULL)
1884 goto rshift_error;
1885 if (a->ob_size < 0)
1886 z->ob_size = -(z->ob_size);
1887 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1888 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1889 if (i+1 < newsize)
1890 z->ob_digit[i] |=
1891 (a->ob_digit[j+1] << hishift) & himask;
1892 }
1893 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001894 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001895rshift_error:
1896 Py_DECREF(a);
1897 Py_DECREF(b);
1898 return (PyObject *) z;
1899
Guido van Rossumc6913e71991-11-19 20:26:46 +00001900}
1901
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001902static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001903long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001904{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001905 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001906 PyLongObject *a, *b;
1907 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001908 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001909 int oldsize, newsize, wordshift, remshift, i, j;
1910 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001911
Neil Schemenauerba872e22001-01-04 01:46:03 +00001912 CONVERT_BINOP(v, w, &a, &b);
1913
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001914 shiftby = PyLong_AsLong((PyObject *)b);
1915 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001916 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001917 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001918 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001919 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001920 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001921 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001922 PyErr_SetString(PyExc_ValueError,
1923 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001924 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001925 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001926 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1927 wordshift = (int)shiftby / SHIFT;
1928 remshift = (int)shiftby - wordshift * SHIFT;
1929
1930 oldsize = ABS(a->ob_size);
1931 newsize = oldsize + wordshift;
1932 if (remshift)
1933 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001934 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001935 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001936 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001937 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001938 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001939 for (i = 0; i < wordshift; i++)
1940 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001941 accum = 0;
1942 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1943 accum |= a->ob_digit[j] << remshift;
1944 z->ob_digit[i] = (digit)(accum & MASK);
1945 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001946 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001947 if (remshift)
1948 z->ob_digit[newsize-1] = (digit)accum;
1949 else
1950 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001951 z = long_normalize(z);
1952lshift_error:
1953 Py_DECREF(a);
1954 Py_DECREF(b);
1955 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001956}
1957
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001958
1959/* Bitwise and/xor/or operations */
1960
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001961#define MAX(x, y) ((x) < (y) ? (y) : (x))
1962#define MIN(x, y) ((x) > (y) ? (y) : (x))
1963
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001964static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001965long_bitwise(PyLongObject *a,
1966 int op, /* '&', '|', '^' */
1967 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001968{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001969 digit maska, maskb; /* 0 or MASK */
1970 int negz;
1971 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001972 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001973 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001974 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001975 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001976
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001977 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001978 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001979 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001980 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001981 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001982 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001983 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001984 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001985 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001986 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001987 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001988 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001989 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001990 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001991 maskb = 0;
1992 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001993
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001994 negz = 0;
1995 switch (op) {
1996 case '^':
1997 if (maska != maskb) {
1998 maska ^= MASK;
1999 negz = -1;
2000 }
2001 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002002 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002003 if (maska && maskb) {
2004 op = '|';
2005 maska ^= MASK;
2006 maskb ^= MASK;
2007 negz = -1;
2008 }
2009 break;
2010 case '|':
2011 if (maska || maskb) {
2012 op = '&';
2013 maska ^= MASK;
2014 maskb ^= MASK;
2015 negz = -1;
2016 }
2017 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002018 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002019
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002020 /* JRH: The original logic here was to allocate the result value (z)
2021 as the longer of the two operands. However, there are some cases
2022 where the result is guaranteed to be shorter than that: AND of two
2023 positives, OR of two negatives: use the shorter number. AND with
2024 mixed signs: use the positive number. OR with mixed signs: use the
2025 negative number. After the transformations above, op will be '&'
2026 iff one of these cases applies, and mask will be non-0 for operands
2027 whose length should be ignored.
2028 */
2029
2030 size_a = a->ob_size;
2031 size_b = b->ob_size;
2032 size_z = op == '&'
2033 ? (maska
2034 ? size_b
2035 : (maskb ? size_a : MIN(size_a, size_b)))
2036 : MAX(size_a, size_b);
2037 z = _PyLong_New(size_z);
2038 if (a == NULL || b == NULL || z == NULL) {
2039 Py_XDECREF(a);
2040 Py_XDECREF(b);
2041 Py_XDECREF(z);
2042 return NULL;
2043 }
2044
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002045 for (i = 0; i < size_z; ++i) {
2046 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2047 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2048 switch (op) {
2049 case '&': z->ob_digit[i] = diga & digb; break;
2050 case '|': z->ob_digit[i] = diga | digb; break;
2051 case '^': z->ob_digit[i] = diga ^ digb; break;
2052 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002053 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002054
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002055 Py_DECREF(a);
2056 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002057 z = long_normalize(z);
2058 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002059 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002060 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002061 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002062 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002063}
2064
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002065static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002066long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002067{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002068 PyLongObject *a, *b;
2069 PyObject *c;
2070 CONVERT_BINOP(v, w, &a, &b);
2071 c = long_bitwise(a, '&', b);
2072 Py_DECREF(a);
2073 Py_DECREF(b);
2074 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002075}
2076
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002077static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002078long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002079{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002080 PyLongObject *a, *b;
2081 PyObject *c;
2082 CONVERT_BINOP(v, w, &a, &b);
2083 c = long_bitwise(a, '^', b);
2084 Py_DECREF(a);
2085 Py_DECREF(b);
2086 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002087}
2088
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002089static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002090long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002091{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002092 PyLongObject *a, *b;
2093 PyObject *c;
2094 CONVERT_BINOP(v, w, &a, &b);
2095 c = long_bitwise(a, '|', b);
2096 Py_DECREF(a);
2097 Py_DECREF(b);
2098 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002099}
2100
Guido van Rossum234f9421993-06-17 12:35:49 +00002101static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002102long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002103{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002104 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002105 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002106 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002107 return 0;
2108 }
2109 return 1; /* Can't do it */
2110}
2111
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002112static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002113long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002114{
2115 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002116 x = PyLong_AsLong(v);
2117 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002118 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002119 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002120}
2121
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002122static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002123long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002124{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002125 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002126 return v;
2127}
2128
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002129static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002130long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002131{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002132 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002133 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002134 if (result == -1.0 && PyErr_Occurred())
2135 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002136 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002137}
2138
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002139static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002140long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002141{
Fred Drake121ee271999-12-23 15:41:28 +00002142 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002143}
2144
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002145static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002146long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002147{
Fred Drake121ee271999-12-23 15:41:28 +00002148 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002149}
Guido van Rossumbef14172001-08-29 15:47:46 +00002150staticforward PyObject *
2151long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002152
Tim Peters6d6c1a32001-08-02 04:15:00 +00002153static PyObject *
2154long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2155{
2156 PyObject *x = NULL;
2157 int base = -909; /* unlikely! */
2158 static char *kwlist[] = {"x", "base", 0};
2159
Guido van Rossumbef14172001-08-29 15:47:46 +00002160 if (type != &PyLong_Type)
2161 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002162 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2163 &x, &base))
2164 return NULL;
2165 if (x == NULL)
2166 return PyLong_FromLong(0L);
2167 if (base == -909)
2168 return PyNumber_Long(x);
2169 else if (PyString_Check(x))
2170 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002171#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002172 else if (PyUnicode_Check(x))
2173 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2174 PyUnicode_GET_SIZE(x),
2175 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002176#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002177 else {
2178 PyErr_SetString(PyExc_TypeError,
2179 "long() can't convert non-string with explicit base");
2180 return NULL;
2181 }
2182}
2183
Guido van Rossumbef14172001-08-29 15:47:46 +00002184/* Wimpy, slow approach to tp_new calls for subtypes of long:
2185 first create a regular long from whatever arguments we got,
2186 then allocate a subtype instance and initialize it from
2187 the regular long. The regular long is then thrown away.
2188*/
2189static PyObject *
2190long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2191{
2192 PyLongObject *tmp, *new;
2193 int i, n;
2194
2195 assert(PyType_IsSubtype(type, &PyLong_Type));
2196 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2197 if (tmp == NULL)
2198 return NULL;
2199 assert(PyLong_Check(tmp));
2200 n = tmp->ob_size;
2201 if (n < 0)
2202 n = -n;
2203 new = (PyLongObject *)type->tp_alloc(type, n);
2204 if (new == NULL)
2205 return NULL;
2206 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002207 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002208 for (i = 0; i < n; i++)
2209 new->ob_digit[i] = tmp->ob_digit[i];
2210 Py_DECREF(tmp);
2211 return (PyObject *)new;
2212}
2213
Tim Peters6d6c1a32001-08-02 04:15:00 +00002214static char long_doc[] =
2215"long(x[, base]) -> integer\n\
2216\n\
2217Convert a string or number to a long integer, if possible. A floating\n\
2218point argument will be truncated towards zero (this does not include a\n\
2219string representation of a floating point number!) When converting a\n\
2220string, use the optional base. It is an error to supply a base when\n\
2221converting a non-string.";
2222
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002223static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002224 (binaryfunc) long_add, /*nb_add*/
2225 (binaryfunc) long_sub, /*nb_subtract*/
2226 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002227 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002228 (binaryfunc) long_mod, /*nb_remainder*/
2229 (binaryfunc) long_divmod, /*nb_divmod*/
2230 (ternaryfunc) long_pow, /*nb_power*/
2231 (unaryfunc) long_neg, /*nb_negative*/
2232 (unaryfunc) long_pos, /*tp_positive*/
2233 (unaryfunc) long_abs, /*tp_absolute*/
2234 (inquiry) long_nonzero, /*tp_nonzero*/
2235 (unaryfunc) long_invert, /*nb_invert*/
2236 (binaryfunc) long_lshift, /*nb_lshift*/
2237 (binaryfunc) long_rshift, /*nb_rshift*/
2238 (binaryfunc) long_and, /*nb_and*/
2239 (binaryfunc) long_xor, /*nb_xor*/
2240 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002241 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002242 (unaryfunc) long_int, /*nb_int*/
2243 (unaryfunc) long_long, /*nb_long*/
2244 (unaryfunc) long_float, /*nb_float*/
2245 (unaryfunc) long_oct, /*nb_oct*/
2246 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002247 0, /* nb_inplace_add */
2248 0, /* nb_inplace_subtract */
2249 0, /* nb_inplace_multiply */
2250 0, /* nb_inplace_divide */
2251 0, /* nb_inplace_remainder */
2252 0, /* nb_inplace_power */
2253 0, /* nb_inplace_lshift */
2254 0, /* nb_inplace_rshift */
2255 0, /* nb_inplace_and */
2256 0, /* nb_inplace_xor */
2257 0, /* nb_inplace_or */
2258 (binaryfunc)long_div, /* nb_floor_divide */
2259 long_true_divide, /* nb_true_divide */
2260 0, /* nb_inplace_floor_divide */
2261 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002262};
2263
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002264PyTypeObject PyLong_Type = {
2265 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002266 0, /* ob_size */
2267 "long", /* tp_name */
2268 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2269 sizeof(digit), /* tp_itemsize */
2270 (destructor)long_dealloc, /* tp_dealloc */
2271 0, /* tp_print */
2272 0, /* tp_getattr */
2273 0, /* tp_setattr */
2274 (cmpfunc)long_compare, /* tp_compare */
2275 (reprfunc)long_repr, /* tp_repr */
2276 &long_as_number, /* tp_as_number */
2277 0, /* tp_as_sequence */
2278 0, /* tp_as_mapping */
2279 (hashfunc)long_hash, /* tp_hash */
2280 0, /* tp_call */
2281 (reprfunc)long_str, /* tp_str */
2282 PyObject_GenericGetAttr, /* tp_getattro */
2283 0, /* tp_setattro */
2284 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002285 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2286 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002287 long_doc, /* tp_doc */
2288 0, /* tp_traverse */
2289 0, /* tp_clear */
2290 0, /* tp_richcompare */
2291 0, /* tp_weaklistoffset */
2292 0, /* tp_iter */
2293 0, /* tp_iternext */
2294 0, /* tp_methods */
2295 0, /* tp_members */
2296 0, /* tp_getset */
2297 0, /* tp_base */
2298 0, /* tp_dict */
2299 0, /* tp_descr_get */
2300 0, /* tp_descr_set */
2301 0, /* tp_dictoffset */
2302 0, /* tp_init */
2303 0, /* tp_alloc */
2304 long_new, /* tp_new */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002305};