blob: 42094190e4adfdf01364aa0d4a25add5b007b453 [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
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000477/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000478
479double
Tim Peters9f688bf2000-07-07 15:53:28 +0000480PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000481{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000483 double x;
484 double multiplier = (double) (1L << SHIFT);
485 int i, sign;
486
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 if (vv == NULL || !PyLong_Check(vv)) {
488 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000489 return -1;
490 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000492 i = v->ob_size;
493 sign = 1;
494 x = 0.0;
495 if (i < 0) {
496 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000497 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000498 }
499 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000500 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000501 }
502 return x * sign;
503}
504
Guido van Rossum78694d91998-09-18 14:14:13 +0000505/* Create a new long (or int) object from a C pointer */
506
507PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000508PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000509{
Tim Peters70128a12001-06-16 08:48:40 +0000510#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000511 return PyInt_FromLong((long)p);
512#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000513
Tim Peters70128a12001-06-16 08:48:40 +0000514#ifndef HAVE_LONG_LONG
515# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
516#endif
517#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
518# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
519#endif
520 /* optimize null pointers */
521 if (p == NULL)
522 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000523 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000524
525#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000526}
527
528/* Get a C pointer from a long object (or an int object in some cases) */
529
530void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000531PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000532{
533 /* This function will allow int or long objects. If vv is neither,
534 then the PyLong_AsLong*() functions will raise the exception:
535 PyExc_SystemError, "bad argument to internal function"
536 */
Tim Peters70128a12001-06-16 08:48:40 +0000537#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000538 long x;
539
Tim Peters70128a12001-06-16 08:48:40 +0000540 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000541 x = PyInt_AS_LONG(vv);
542 else
543 x = PyLong_AsLong(vv);
544#else
Tim Peters70128a12001-06-16 08:48:40 +0000545
546#ifndef HAVE_LONG_LONG
547# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
548#endif
549#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
550# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
551#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000552 LONG_LONG x;
553
Tim Peters70128a12001-06-16 08:48:40 +0000554 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000555 x = PyInt_AS_LONG(vv);
556 else
557 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000558
559#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000560
561 if (x == -1 && PyErr_Occurred())
562 return NULL;
563 return (void *)x;
564}
565
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000566#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000567
568/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
569 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000570 */
571
Tim Peterscf37dfc2001-06-14 18:42:50 +0000572#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000573
574/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000575
576PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000577PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000578{
Tim Petersd1a7da62001-06-13 00:35:57 +0000579 LONG_LONG bytes = ival;
580 int one = 1;
581 return _PyLong_FromByteArray(
582 (unsigned char *)&bytes,
583 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000584}
585
Tim Petersd1a7da62001-06-13 00:35:57 +0000586/* Create a new long int object from a C unsigned LONG_LONG int. */
587
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000588PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000589PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000590{
Tim Petersd1a7da62001-06-13 00:35:57 +0000591 unsigned LONG_LONG bytes = ival;
592 int one = 1;
593 return _PyLong_FromByteArray(
594 (unsigned char *)&bytes,
595 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000596}
597
Guido van Rossum3293b071998-08-25 16:07:15 +0000598/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000599 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000600
Guido van Rossum3293b071998-08-25 16:07:15 +0000601LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000602PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000603{
Tim Petersd1a7da62001-06-13 00:35:57 +0000604 LONG_LONG bytes;
605 int one = 1;
606 int res;
607
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000608 if (vv == NULL || !PyLong_Check(vv)) {
609 PyErr_BadInternalCall();
610 return -1;
611 }
612
Tim Petersd1a7da62001-06-13 00:35:57 +0000613 res = _PyLong_AsByteArray(
614 (PyLongObject *)vv, (unsigned char *)&bytes,
615 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000616
Tim Peters9cb0c382001-06-13 20:45:17 +0000617 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000618}
619
Tim Petersd1a7da62001-06-13 00:35:57 +0000620/* Get a C unsigned LONG_LONG int from a long int object.
621 Return -1 and set an error if overflow occurs. */
622
Guido van Rossum3293b071998-08-25 16:07:15 +0000623unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000624PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000625{
Tim Petersd1a7da62001-06-13 00:35:57 +0000626 unsigned LONG_LONG bytes;
627 int one = 1;
628 int res;
629
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000630 if (vv == NULL || !PyLong_Check(vv)) {
631 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000632 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000633 }
634
Tim Petersd1a7da62001-06-13 00:35:57 +0000635 res = _PyLong_AsByteArray(
636 (PyLongObject *)vv, (unsigned char *)&bytes,
637 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000638
Tim Peters9cb0c382001-06-13 20:45:17 +0000639 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000640}
Tim Petersd1a7da62001-06-13 00:35:57 +0000641
642#undef IS_LITTLE_ENDIAN
643
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000644#endif /* HAVE_LONG_LONG */
645
Neil Schemenauerba872e22001-01-04 01:46:03 +0000646
647static int
648convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
649 if (PyLong_Check(v)) {
650 *a = (PyLongObject *) v;
651 Py_INCREF(v);
652 }
653 else if (PyInt_Check(v)) {
654 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
655 }
656 else {
657 return 0;
658 }
659 if (PyLong_Check(w)) {
660 *b = (PyLongObject *) w;
661 Py_INCREF(w);
662 }
663 else if (PyInt_Check(w)) {
664 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
665 }
666 else {
667 Py_DECREF(*a);
668 return 0;
669 }
670 return 1;
671}
672
673#define CONVERT_BINOP(v, w, a, b) \
674 if (!convert_binop(v, w, a, b)) { \
675 Py_INCREF(Py_NotImplemented); \
676 return Py_NotImplemented; \
677 }
678
679
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000680/* Multiply by a single digit, ignoring the sign. */
681
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000683mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000684{
685 return muladd1(a, n, (digit)0);
686}
687
688/* Multiply by a single digit and add a single digit, ignoring the sign. */
689
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000691muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000692{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000693 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000695 twodigits carry = extra;
696 int i;
697
698 if (z == NULL)
699 return NULL;
700 for (i = 0; i < size_a; ++i) {
701 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000702 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000703 carry >>= SHIFT;
704 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000705 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000706 return long_normalize(z);
707}
708
Tim Peters212e6142001-07-14 12:23:19 +0000709/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
710 in pout, and returning the remainder. pin and pout point at the LSD.
711 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
712 long_format, but that should be done with great care since longs are
713 immutable. */
714
715static digit
716inplace_divrem1(digit *pout, digit *pin, int size, digit n)
717{
718 twodigits rem = 0;
719
720 assert(n > 0 && n <= MASK);
721 pin += size;
722 pout += size;
723 while (--size >= 0) {
724 digit hi;
725 rem = (rem << SHIFT) + *--pin;
726 *--pout = hi = (digit)(rem / n);
727 rem -= hi * n;
728 }
729 return (digit)rem;
730}
731
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000732/* Divide a long integer by a digit, returning both the quotient
733 (as function result) and the remainder (through *prem).
734 The sign of a is ignored; n should not be zero. */
735
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000737divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000738{
Tim Peters212e6142001-07-14 12:23:19 +0000739 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000741
742 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000743 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000744 if (z == NULL)
745 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000746 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000747 return long_normalize(z);
748}
749
750/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000751 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000752 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000753
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000755long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000756{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757 register PyLongObject *a = (PyLongObject *)aa;
758 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000759 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000760 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000761 char *p;
762 int bits;
763 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000764
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 if (a == NULL || !PyLong_Check(a)) {
766 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000767 return NULL;
768 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000769 assert(base >= 2 && base <= 36);
770
771 /* Compute a rough upper bound for the length of the string */
772 i = base;
773 bits = 0;
774 while (i > 1) {
775 ++bits;
776 i >>= 1;
777 }
Fred Drake121ee271999-12-23 15:41:28 +0000778 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000780 if (str == NULL)
781 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000783 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000784 if (addL)
785 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000786 if (a->ob_size < 0)
787 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000788
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000789 if (a->ob_size == 0) {
790 *--p = '0';
791 }
792 else if ((base & (base - 1)) == 0) {
793 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000794 twodigits accum = 0;
795 int accumbits = 0; /* # of bits in accum */
796 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000797 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000798 while ((i >>= 1) > 1)
799 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000800
801 for (i = 0; i < size_a; ++i) {
802 accum |= a->ob_digit[i] << accumbits;
803 accumbits += SHIFT;
804 assert(accumbits >= basebits);
805 do {
806 char digit = (char)(accum & (base - 1));
807 digit += (digit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000808 assert(p > PyString_AS_STRING(str));
Tim Peters586b2e32001-07-15 09:11:14 +0000809 *--p = digit;
810 accumbits -= basebits;
811 accum >>= basebits;
812 } while (i < size_a-1 ? accumbits >= basebits :
813 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000814 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000815 }
816 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000817 /* Not 0, and base not a power of 2. Divide repeatedly by
818 base, but for speed use the highest power of base that
819 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000820 int size = size_a;
821 digit *pin = a->ob_digit;
822 PyLongObject *scratch;
823 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000824 digit powbase = base; /* powbase == base ** power */
825 int power = 1;
826 for (;;) {
827 unsigned long newpow = powbase * (unsigned long)base;
828 if (newpow >> SHIFT) /* doesn't fit in a digit */
829 break;
830 powbase = (digit)newpow;
831 ++power;
832 }
Tim Peters212e6142001-07-14 12:23:19 +0000833
834 /* Get a scratch area for repeated division. */
835 scratch = _PyLong_New(size);
836 if (scratch == NULL) {
837 Py_DECREF(str);
838 return NULL;
839 }
840
841 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000842 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000843 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000844 digit rem = inplace_divrem1(scratch->ob_digit,
845 pin, size, powbase);
846 pin = scratch->ob_digit; /* no need to use a again */
847 if (pin[size - 1] == 0)
848 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000849 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +0000850 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000851 Py_DECREF(str);
852 return NULL;
853 })
Tim Peters212e6142001-07-14 12:23:19 +0000854
855 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000856 assert(ntostore > 0);
857 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000858 digit nextrem = (digit)(rem / base);
859 char c = (char)(rem - nextrem * base);
860 assert(p > PyString_AS_STRING(str));
861 c += (c < 10) ? '0' : 'A'-10;
862 *--p = c;
863 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000864 --ntostore;
865 /* Termination is a bit delicate: must not
866 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +0000867 remaining quotient and rem are both 0. */
868 } while (ntostore && (size || rem));
869 } while (size != 0);
870 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000871 }
872
Guido van Rossum2c475421992-08-14 15:13:07 +0000873 if (base == 8) {
874 if (size_a != 0)
875 *--p = '0';
876 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000877 else if (base == 16) {
878 *--p = 'x';
879 *--p = '0';
880 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000881 else if (base != 10) {
882 *--p = '#';
883 *--p = '0' + base%10;
884 if (base > 10)
885 *--p = '0' + base/10;
886 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000887 if (sign)
888 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 if (p != PyString_AS_STRING(str)) {
890 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000891 assert(p > q);
892 do {
893 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000894 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 _PyString_Resize((PyObject **)&str,
896 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000897 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000898 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000899}
900
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000901PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000902PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000903{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000904 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000905 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000906 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000907
Guido van Rossum472c04f1996-12-05 21:57:21 +0000908 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000910 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000911 return NULL;
912 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000913 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000914 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000915 if (*str == '+')
916 ++str;
917 else if (*str == '-') {
918 ++str;
919 sign = -1;
920 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000921 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000922 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000923 if (base == 0) {
924 if (str[0] != '0')
925 base = 10;
926 else if (str[1] == 'x' || str[1] == 'X')
927 base = 16;
928 else
929 base = 8;
930 }
931 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
932 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000934 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000935 for ( ; z != NULL; ++str) {
936 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000938
939 if (*str <= '9')
940 k = *str - '0';
941 else if (*str >= 'a')
942 k = *str - 'a' + 10;
943 else if (*str >= 'A')
944 k = *str - 'A' + 10;
945 if (k < 0 || k >= base)
946 break;
947 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000949 z = temp;
950 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000951 if (z == NULL)
952 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000953 if (str == start)
954 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000955 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000956 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000957 if (*str == 'L' || *str == 'l')
958 str++;
959 while (*str && isspace(Py_CHARMASK(*str)))
960 str++;
961 if (*str != '\0')
962 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000963 if (pend)
964 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000966
967 onError:
968 PyErr_Format(PyExc_ValueError,
969 "invalid literal for long(): %.200s", orig_str);
970 Py_XDECREF(z);
971 return NULL;
972}
973
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000974#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000975PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000976PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000977{
978 char buffer[256];
979
980 if (length >= sizeof(buffer)) {
981 PyErr_SetString(PyExc_ValueError,
982 "long() literal too large to convert");
983 return NULL;
984 }
985 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
986 return NULL;
987
988 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000989}
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000990#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000991
Tim Peters9f688bf2000-07-07 15:53:28 +0000992/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000993static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +0000994 (PyLongObject *, PyLongObject *, PyLongObject **);
995static PyObject *long_pos(PyLongObject *);
996static int long_divrem(PyLongObject *, PyLongObject *,
997 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000998
999/* Long division with remainder, top-level routine */
1000
Guido van Rossume32e0141992-01-19 16:31:05 +00001001static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001002long_divrem(PyLongObject *a, PyLongObject *b,
1003 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001004{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001005 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001007
1008 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001009 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001010 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001011 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001012 }
1013 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001014 (size_a == size_b &&
1015 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001016 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 *pdiv = _PyLong_New(0);
1018 Py_INCREF(a);
1019 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001020 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001021 }
1022 if (size_b == 1) {
1023 digit rem = 0;
1024 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001025 if (z == NULL)
1026 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001028 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001029 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001030 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001031 if (z == NULL)
1032 return -1;
1033 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001034 /* Set the signs.
1035 The quotient z has the sign of a*b;
1036 the remainder r has the sign of a,
1037 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001038 if ((a->ob_size < 0) != (b->ob_size < 0))
1039 z->ob_size = -(z->ob_size);
1040 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1041 (*prem)->ob_size = -((*prem)->ob_size);
1042 *pdiv = z;
1043 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001044}
1045
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001046/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001047
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001048static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001049x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001050{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001051 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001052 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 PyLongObject *v = mul1(v1, d);
1054 PyLongObject *w = mul1(w1, d);
1055 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001056 int j, k;
1057
1058 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 Py_XDECREF(v);
1060 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001061 return NULL;
1062 }
1063
1064 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001065 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001066 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001067
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001068 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001070
1071 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1072 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1073 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001074 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001075 int i;
1076
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001077 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001079 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001080 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001081 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001082 if (vj == w->ob_digit[size_w-1])
1083 q = MASK;
1084 else
1085 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1086 w->ob_digit[size_w-1];
1087
1088 while (w->ob_digit[size_w-2]*q >
1089 ((
1090 ((twodigits)vj << SHIFT)
1091 + v->ob_digit[j-1]
1092 - q*w->ob_digit[size_w-1]
1093 ) << SHIFT)
1094 + v->ob_digit[j-2])
1095 --q;
1096
1097 for (i = 0; i < size_w && i+k < size_v; ++i) {
1098 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001099 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100 carry += v->ob_digit[i+k] - z
1101 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001102 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001103 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1104 carry, SHIFT);
1105 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001106 }
1107
1108 if (i+k < size_v) {
1109 carry += v->ob_digit[i+k];
1110 v->ob_digit[i+k] = 0;
1111 }
1112
1113 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001114 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001115 else {
1116 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001117 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001118 carry = 0;
1119 for (i = 0; i < size_w && i+k < size_v; ++i) {
1120 carry += v->ob_digit[i+k] + w->ob_digit[i];
1121 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001122 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1123 BASE_TWODIGITS_TYPE,
1124 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001125 }
1126 }
1127 } /* for j, k */
1128
Guido van Rossumc206c761995-01-10 15:23:19 +00001129 if (a == NULL)
1130 *prem = NULL;
1131 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001132 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001133 *prem = divrem1(v, d, &d);
1134 /* d receives the (unused) remainder */
1135 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001136 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001137 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001138 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001139 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001140 Py_DECREF(v);
1141 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001142 return a;
1143}
1144
1145/* Methods */
1146
1147static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001148long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001149{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001150 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001151}
1152
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001153static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001154long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001155{
Fred Drake121ee271999-12-23 15:41:28 +00001156 return long_format(v, 10, 1);
1157}
1158
1159static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001160long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001161{
1162 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001163}
1164
1165static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001166long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001167{
1168 int sign;
1169
Guido van Rossumc6913e71991-11-19 20:26:46 +00001170 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001171 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001172 sign = 0;
1173 else
1174 sign = a->ob_size - b->ob_size;
1175 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001176 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001177 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001178 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1179 ;
1180 if (i < 0)
1181 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001182 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001183 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001184 if (a->ob_size < 0)
1185 sign = -sign;
1186 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001187 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001188 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001189}
1190
Guido van Rossum9bfef441993-03-29 10:43:31 +00001191static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001192long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001193{
1194 long x;
1195 int i, sign;
1196
1197 /* This is designed so that Python ints and longs with the
1198 same value hash to the same value, otherwise comparisons
1199 of mapping keys will turn out weird */
1200 i = v->ob_size;
1201 sign = 1;
1202 x = 0;
1203 if (i < 0) {
1204 sign = -1;
1205 i = -(i);
1206 }
1207 while (--i >= 0) {
1208 /* Force a 32-bit circular shift */
1209 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1210 x += v->ob_digit[i];
1211 }
1212 x = x * sign;
1213 if (x == -1)
1214 x = -2;
1215 return x;
1216}
1217
1218
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001219/* Add the absolute values of two long integers. */
1220
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001222x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001223{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001224 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001225 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001226 int i;
1227 digit carry = 0;
1228
1229 /* Ensure a is the larger of the two: */
1230 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001231 { PyLongObject *temp = a; a = b; b = temp; }
1232 { int size_temp = size_a;
1233 size_a = size_b;
1234 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001235 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001237 if (z == NULL)
1238 return NULL;
1239 for (i = 0; i < size_b; ++i) {
1240 carry += a->ob_digit[i] + b->ob_digit[i];
1241 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001242 carry >>= SHIFT;
1243 }
1244 for (; i < size_a; ++i) {
1245 carry += a->ob_digit[i];
1246 z->ob_digit[i] = carry & MASK;
1247 carry >>= SHIFT;
1248 }
1249 z->ob_digit[i] = carry;
1250 return long_normalize(z);
1251}
1252
1253/* Subtract the absolute values of two integers. */
1254
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001255static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001256x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001257{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001258 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001259 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001260 int i;
1261 int sign = 1;
1262 digit borrow = 0;
1263
1264 /* Ensure a is the larger of the two: */
1265 if (size_a < size_b) {
1266 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001267 { PyLongObject *temp = a; a = b; b = temp; }
1268 { int size_temp = size_a;
1269 size_a = size_b;
1270 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001271 }
1272 else if (size_a == size_b) {
1273 /* Find highest digit where a and b differ: */
1274 i = size_a;
1275 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1276 ;
1277 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001279 if (a->ob_digit[i] < b->ob_digit[i]) {
1280 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001281 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001282 }
1283 size_a = size_b = i+1;
1284 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001286 if (z == NULL)
1287 return NULL;
1288 for (i = 0; i < size_b; ++i) {
1289 /* The following assumes unsigned arithmetic
1290 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001291 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001292 z->ob_digit[i] = borrow & MASK;
1293 borrow >>= SHIFT;
1294 borrow &= 1; /* Keep only one sign bit */
1295 }
1296 for (; i < size_a; ++i) {
1297 borrow = a->ob_digit[i] - borrow;
1298 z->ob_digit[i] = borrow & MASK;
1299 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001300 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001301 }
1302 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001303 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001304 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001305 return long_normalize(z);
1306}
1307
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001309long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001310{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001311 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001312
Neil Schemenauerba872e22001-01-04 01:46:03 +00001313 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1314
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001315 if (a->ob_size < 0) {
1316 if (b->ob_size < 0) {
1317 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001318 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001319 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001320 }
1321 else
1322 z = x_sub(b, a);
1323 }
1324 else {
1325 if (b->ob_size < 0)
1326 z = x_sub(a, b);
1327 else
1328 z = x_add(a, b);
1329 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001330 Py_DECREF(a);
1331 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001332 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001333}
1334
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001336long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001337{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001338 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001339
Neil Schemenauerba872e22001-01-04 01:46:03 +00001340 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1341
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001342 if (a->ob_size < 0) {
1343 if (b->ob_size < 0)
1344 z = x_sub(a, b);
1345 else
1346 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001347 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001348 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001349 }
1350 else {
1351 if (b->ob_size < 0)
1352 z = x_add(a, b);
1353 else
1354 z = x_sub(a, b);
1355 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001356 Py_DECREF(a);
1357 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001359}
1360
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001362long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001363{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001364 /* sequence * long */
1365 long n = PyLong_AsLong((PyObject *) w);
1366 if (n == -1 && PyErr_Occurred())
1367 return NULL;
1368 else
1369 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1370}
1371
1372static PyObject *
1373long_mul(PyLongObject *v, PyLongObject *w)
1374{
1375 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001376 int size_a;
1377 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001378 int i;
1379
Neil Schemenauerba872e22001-01-04 01:46:03 +00001380 if (v->ob_type->tp_as_sequence &&
1381 v->ob_type->tp_as_sequence->sq_repeat) {
1382 return long_repeat((PyObject *)v, w);
1383 }
1384 else if (w->ob_type->tp_as_sequence &&
1385 w->ob_type->tp_as_sequence->sq_repeat) {
1386 return long_repeat((PyObject *)w, v);
1387 }
1388
1389 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1390
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001391 size_a = ABS(a->ob_size);
1392 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001393 if (size_a > size_b) {
1394 /* we are faster with the small object on the left */
1395 int hold_sa = size_a;
1396 PyLongObject *hold_a = a;
1397 size_a = size_b;
1398 size_b = hold_sa;
1399 a = b;
1400 b = hold_a;
1401 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001402 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001403 if (z == NULL) {
1404 Py_DECREF(a);
1405 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001406 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001407 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001408 for (i = 0; i < z->ob_size; ++i)
1409 z->ob_digit[i] = 0;
1410 for (i = 0; i < size_a; ++i) {
1411 twodigits carry = 0;
1412 twodigits f = a->ob_digit[i];
1413 int j;
1414
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001415 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001416 Py_DECREF(a);
1417 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001419 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001420 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001421 for (j = 0; j < size_b; ++j) {
1422 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001423 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001424 carry >>= SHIFT;
1425 }
1426 for (; carry != 0; ++j) {
1427 assert(i+j < z->ob_size);
1428 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001429 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001430 carry >>= SHIFT;
1431 }
1432 }
1433 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001434 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001435 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001436 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001437 Py_DECREF(a);
1438 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001439 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001440}
1441
Guido van Rossume32e0141992-01-19 16:31:05 +00001442/* The / and % operators are now defined in terms of divmod().
1443 The expression a mod b has the value a - b*floor(a/b).
1444 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001445 |a| by |b|, with the sign of a. This is also expressed
1446 as a - b*trunc(a/b), if trunc truncates towards zero.
1447 Some examples:
1448 a b a rem b a mod b
1449 13 10 3 3
1450 -13 10 -3 7
1451 13 -10 3 -7
1452 -13 -10 -3 -3
1453 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001454 have different signs. We then subtract one from the 'div'
1455 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001456
Guido van Rossume32e0141992-01-19 16:31:05 +00001457static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001458l_divmod(PyLongObject *v, PyLongObject *w,
1459 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001460{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001462
1463 if (long_divrem(v, w, &div, &mod) < 0)
1464 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001465 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1466 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001467 PyLongObject *temp;
1468 PyLongObject *one;
1469 temp = (PyLongObject *) long_add(mod, w);
1470 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001471 mod = temp;
1472 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001473 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001474 return -1;
1475 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001476 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001477 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001478 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1479 Py_DECREF(mod);
1480 Py_DECREF(div);
1481 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001482 return -1;
1483 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001484 Py_DECREF(one);
1485 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001486 div = temp;
1487 }
1488 *pdiv = div;
1489 *pmod = mod;
1490 return 0;
1491}
1492
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001493static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001494long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001495{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001496 PyLongObject *a, *b, *div, *mod;
1497
1498 CONVERT_BINOP(v, w, &a, &b);
1499
1500 if (l_divmod(a, b, &div, &mod) < 0) {
1501 Py_DECREF(a);
1502 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001503 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001504 }
1505 Py_DECREF(a);
1506 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001507 Py_DECREF(mod);
1508 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001509}
1510
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001511static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001512long_classic_div(PyObject *v, PyObject *w)
1513{
1514 PyLongObject *a, *b, *div, *mod;
1515
1516 CONVERT_BINOP(v, w, &a, &b);
1517
1518 if (Py_DivisionWarningFlag &&
1519 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1520 div = NULL;
1521 else if (l_divmod(a, b, &div, &mod) < 0)
1522 div = NULL;
1523 else
1524 Py_DECREF(mod);
1525
1526 Py_DECREF(a);
1527 Py_DECREF(b);
1528 return (PyObject *)div;
1529}
1530
1531static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001532long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001533{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001534 PyLongObject *a, *b, *div, *mod;
1535
1536 CONVERT_BINOP(v, w, &a, &b);
1537
1538 if (l_divmod(a, b, &div, &mod) < 0) {
1539 Py_DECREF(a);
1540 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001541 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001542 }
1543 Py_DECREF(a);
1544 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001545 Py_DECREF(div);
1546 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001547}
1548
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001549static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001550long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001551{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001552 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001553 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001554
1555 CONVERT_BINOP(v, w, &a, &b);
1556
1557 if (l_divmod(a, b, &div, &mod) < 0) {
1558 Py_DECREF(a);
1559 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001560 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001561 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001562 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001563 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001564 PyTuple_SetItem(z, 0, (PyObject *) div);
1565 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001566 }
1567 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568 Py_DECREF(div);
1569 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001570 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001571 Py_DECREF(a);
1572 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001573 return z;
1574}
1575
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001576static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001577long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001578{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001579 PyLongObject *a, *b;
1580 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001581 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001582 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001583
1584 CONVERT_BINOP(v, w, &a, &b);
1585 if (PyLong_Check(x) || Py_None == x) {
1586 c = x;
1587 Py_INCREF(x);
1588 }
1589 else if (PyInt_Check(x)) {
1590 c = PyLong_FromLong(PyInt_AS_LONG(x));
1591 }
1592 else {
1593 Py_DECREF(a);
1594 Py_DECREF(b);
1595 Py_INCREF(Py_NotImplemented);
1596 return Py_NotImplemented;
1597 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001598
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001599 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001600 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001601 /* Return a float. This works because we know that
1602 this calls float_pow() which converts its
1603 arguments to double. */
1604 Py_DECREF(a);
1605 Py_DECREF(b);
1606 Py_DECREF(c);
1607 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001608 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001609 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001610 for (i = 0; i < size_b; ++i) {
1611 digit bi = b->ob_digit[i];
1612 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001613
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001614 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001615 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001616
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001617 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001618 temp = (PyLongObject *)long_mul(z, a);
1619 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001620 if (c!=Py_None && temp!=NULL) {
1621 if (l_divmod(temp,(PyLongObject *)c,
1622 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001623 Py_DECREF(temp);
1624 z = NULL;
1625 goto error;
1626 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001627 Py_XDECREF(div);
1628 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001629 temp = mod;
1630 }
1631 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001632 if (z == NULL)
1633 break;
1634 }
1635 bi >>= 1;
1636 if (bi == 0 && i+1 == size_b)
1637 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001638 temp = (PyLongObject *)long_mul(a, a);
1639 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001640 if (c!=Py_None && temp!=NULL) {
1641 if (l_divmod(temp, (PyLongObject *)c, &div,
1642 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001643 Py_DECREF(temp);
1644 z = NULL;
1645 goto error;
1646 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001647 Py_XDECREF(div);
1648 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001649 temp = mod;
1650 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001651 a = temp;
1652 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001653 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001654 z = NULL;
1655 break;
1656 }
1657 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001658 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001659 break;
1660 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001661 if (c!=Py_None && z!=NULL) {
1662 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001663 Py_DECREF(z);
1664 z = NULL;
1665 }
1666 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001667 Py_XDECREF(div);
1668 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001669 z = mod;
1670 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001671 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001672 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001673 Py_XDECREF(a);
1674 Py_DECREF(b);
1675 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001676 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001677}
1678
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001679static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001680long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001681{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001682 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001683 PyLongObject *x;
1684 PyLongObject *w;
1685 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001686 if (w == NULL)
1687 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001688 x = (PyLongObject *) long_add(v, w);
1689 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001690 if (x == NULL)
1691 return NULL;
1692 if (x->ob_size != 0)
1693 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001694 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001695}
1696
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001697static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001698long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001699{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001700 Py_INCREF(v);
1701 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001702}
1703
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001704static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001705long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001706{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001707 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001708 int i, n;
1709 n = ABS(v->ob_size);
1710 if (n == 0) {
1711 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001712 Py_INCREF(v);
1713 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001714 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001715 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001716 if (z == NULL)
1717 return NULL;
1718 for (i = 0; i < n; i++)
1719 z->ob_digit[i] = v->ob_digit[i];
1720 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001721 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001722}
1723
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001724static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001725long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001726{
1727 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001728 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001729 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001730 Py_INCREF(v);
1731 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001732 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001733}
1734
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001735static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001736long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001737{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001738 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001739}
1740
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001741static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001742long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001743{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001744 PyLongObject *a, *b;
1745 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001746 long shiftby;
1747 int newsize, wordshift, loshift, hishift, i, j;
1748 digit lomask, himask;
1749
Neil Schemenauerba872e22001-01-04 01:46:03 +00001750 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1751
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001752 if (a->ob_size < 0) {
1753 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001754 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001755 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001756 if (a1 == NULL)
1757 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001758 a2 = (PyLongObject *) long_rshift(a1, b);
1759 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001760 if (a2 == NULL)
1761 goto rshift_error;
1762 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001763 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001764 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001765 else {
1766
1767 shiftby = PyLong_AsLong((PyObject *)b);
1768 if (shiftby == -1L && PyErr_Occurred())
1769 goto rshift_error;
1770 if (shiftby < 0) {
1771 PyErr_SetString(PyExc_ValueError,
1772 "negative shift count");
1773 goto rshift_error;
1774 }
1775 wordshift = shiftby / SHIFT;
1776 newsize = ABS(a->ob_size) - wordshift;
1777 if (newsize <= 0) {
1778 z = _PyLong_New(0);
1779 Py_DECREF(a);
1780 Py_DECREF(b);
1781 return (PyObject *)z;
1782 }
1783 loshift = shiftby % SHIFT;
1784 hishift = SHIFT - loshift;
1785 lomask = ((digit)1 << hishift) - 1;
1786 himask = MASK ^ lomask;
1787 z = _PyLong_New(newsize);
1788 if (z == NULL)
1789 goto rshift_error;
1790 if (a->ob_size < 0)
1791 z->ob_size = -(z->ob_size);
1792 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1793 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1794 if (i+1 < newsize)
1795 z->ob_digit[i] |=
1796 (a->ob_digit[j+1] << hishift) & himask;
1797 }
1798 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001799 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001800rshift_error:
1801 Py_DECREF(a);
1802 Py_DECREF(b);
1803 return (PyObject *) z;
1804
Guido van Rossumc6913e71991-11-19 20:26:46 +00001805}
1806
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001807static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001808long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001809{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001810 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001811 PyLongObject *a, *b;
1812 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001813 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001814 int oldsize, newsize, wordshift, remshift, i, j;
1815 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001816
Neil Schemenauerba872e22001-01-04 01:46:03 +00001817 CONVERT_BINOP(v, w, &a, &b);
1818
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001819 shiftby = PyLong_AsLong((PyObject *)b);
1820 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001821 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001822 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001823 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001824 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001825 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001826 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001827 PyErr_SetString(PyExc_ValueError,
1828 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001829 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001830 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001831 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1832 wordshift = (int)shiftby / SHIFT;
1833 remshift = (int)shiftby - wordshift * SHIFT;
1834
1835 oldsize = ABS(a->ob_size);
1836 newsize = oldsize + wordshift;
1837 if (remshift)
1838 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001839 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001840 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001841 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001842 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001843 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001844 for (i = 0; i < wordshift; i++)
1845 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001846 accum = 0;
1847 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1848 accum |= a->ob_digit[j] << remshift;
1849 z->ob_digit[i] = (digit)(accum & MASK);
1850 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001851 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001852 if (remshift)
1853 z->ob_digit[newsize-1] = (digit)accum;
1854 else
1855 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001856 z = long_normalize(z);
1857lshift_error:
1858 Py_DECREF(a);
1859 Py_DECREF(b);
1860 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001861}
1862
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001863
1864/* Bitwise and/xor/or operations */
1865
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001866#define MAX(x, y) ((x) < (y) ? (y) : (x))
1867#define MIN(x, y) ((x) > (y) ? (y) : (x))
1868
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001869static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001870long_bitwise(PyLongObject *a,
1871 int op, /* '&', '|', '^' */
1872 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001873{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001874 digit maska, maskb; /* 0 or MASK */
1875 int negz;
1876 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001877 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001878 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001879 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001880 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001881
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001882 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001883 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001884 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001885 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001886 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001887 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001888 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001889 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001890 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001891 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001892 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001893 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001894 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001895 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001896 maskb = 0;
1897 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001898
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001899 negz = 0;
1900 switch (op) {
1901 case '^':
1902 if (maska != maskb) {
1903 maska ^= MASK;
1904 negz = -1;
1905 }
1906 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001907 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001908 if (maska && maskb) {
1909 op = '|';
1910 maska ^= MASK;
1911 maskb ^= MASK;
1912 negz = -1;
1913 }
1914 break;
1915 case '|':
1916 if (maska || maskb) {
1917 op = '&';
1918 maska ^= MASK;
1919 maskb ^= MASK;
1920 negz = -1;
1921 }
1922 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001923 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001924
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001925 /* JRH: The original logic here was to allocate the result value (z)
1926 as the longer of the two operands. However, there are some cases
1927 where the result is guaranteed to be shorter than that: AND of two
1928 positives, OR of two negatives: use the shorter number. AND with
1929 mixed signs: use the positive number. OR with mixed signs: use the
1930 negative number. After the transformations above, op will be '&'
1931 iff one of these cases applies, and mask will be non-0 for operands
1932 whose length should be ignored.
1933 */
1934
1935 size_a = a->ob_size;
1936 size_b = b->ob_size;
1937 size_z = op == '&'
1938 ? (maska
1939 ? size_b
1940 : (maskb ? size_a : MIN(size_a, size_b)))
1941 : MAX(size_a, size_b);
1942 z = _PyLong_New(size_z);
1943 if (a == NULL || b == NULL || z == NULL) {
1944 Py_XDECREF(a);
1945 Py_XDECREF(b);
1946 Py_XDECREF(z);
1947 return NULL;
1948 }
1949
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001950 for (i = 0; i < size_z; ++i) {
1951 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1952 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1953 switch (op) {
1954 case '&': z->ob_digit[i] = diga & digb; break;
1955 case '|': z->ob_digit[i] = diga | digb; break;
1956 case '^': z->ob_digit[i] = diga ^ digb; break;
1957 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001958 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001959
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001960 Py_DECREF(a);
1961 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001962 z = long_normalize(z);
1963 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001964 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001965 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001966 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001967 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001968}
1969
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001970static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001971long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001972{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001973 PyLongObject *a, *b;
1974 PyObject *c;
1975 CONVERT_BINOP(v, w, &a, &b);
1976 c = long_bitwise(a, '&', b);
1977 Py_DECREF(a);
1978 Py_DECREF(b);
1979 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001980}
1981
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001982static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001983long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001984{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001985 PyLongObject *a, *b;
1986 PyObject *c;
1987 CONVERT_BINOP(v, w, &a, &b);
1988 c = long_bitwise(a, '^', b);
1989 Py_DECREF(a);
1990 Py_DECREF(b);
1991 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001992}
1993
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001994static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001995long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001996{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001997 PyLongObject *a, *b;
1998 PyObject *c;
1999 CONVERT_BINOP(v, w, &a, &b);
2000 c = long_bitwise(a, '|', b);
2001 Py_DECREF(a);
2002 Py_DECREF(b);
2003 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002004}
2005
Guido van Rossum4668b002001-08-08 05:00:18 +00002006static PyObject *
2007long_true_divide(PyObject *v, PyObject *w)
2008{
2009 return PyFloat_Type.tp_as_number->nb_divide(v, w);
2010}
2011
Guido van Rossum234f9421993-06-17 12:35:49 +00002012static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002013long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002014{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002015 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002016 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002017 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002018 return 0;
2019 }
2020 return 1; /* Can't do it */
2021}
2022
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002023static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002024long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002025{
2026 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002027 x = PyLong_AsLong(v);
2028 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002029 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002030 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002031}
2032
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002033static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002034long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002035{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002036 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002037 return v;
2038}
2039
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002040static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002041long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002042{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002043 double result;
2044 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002045 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00002046 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002047 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002048}
2049
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002050static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002051long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002052{
Fred Drake121ee271999-12-23 15:41:28 +00002053 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002054}
2055
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002056static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002057long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002058{
Fred Drake121ee271999-12-23 15:41:28 +00002059 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002060}
Guido van Rossumbef14172001-08-29 15:47:46 +00002061staticforward PyObject *
2062long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002063
Tim Peters6d6c1a32001-08-02 04:15:00 +00002064static PyObject *
2065long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2066{
2067 PyObject *x = NULL;
2068 int base = -909; /* unlikely! */
2069 static char *kwlist[] = {"x", "base", 0};
2070
Guido van Rossumbef14172001-08-29 15:47:46 +00002071 if (type != &PyLong_Type)
2072 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002073 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2074 &x, &base))
2075 return NULL;
2076 if (x == NULL)
2077 return PyLong_FromLong(0L);
2078 if (base == -909)
2079 return PyNumber_Long(x);
2080 else if (PyString_Check(x))
2081 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002082#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002083 else if (PyUnicode_Check(x))
2084 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2085 PyUnicode_GET_SIZE(x),
2086 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002087#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002088 else {
2089 PyErr_SetString(PyExc_TypeError,
2090 "long() can't convert non-string with explicit base");
2091 return NULL;
2092 }
2093}
2094
Guido van Rossumbef14172001-08-29 15:47:46 +00002095/* Wimpy, slow approach to tp_new calls for subtypes of long:
2096 first create a regular long from whatever arguments we got,
2097 then allocate a subtype instance and initialize it from
2098 the regular long. The regular long is then thrown away.
2099*/
2100static PyObject *
2101long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2102{
2103 PyLongObject *tmp, *new;
2104 int i, n;
2105
2106 assert(PyType_IsSubtype(type, &PyLong_Type));
2107 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2108 if (tmp == NULL)
2109 return NULL;
2110 assert(PyLong_Check(tmp));
2111 n = tmp->ob_size;
2112 if (n < 0)
2113 n = -n;
2114 new = (PyLongObject *)type->tp_alloc(type, n);
2115 if (new == NULL)
2116 return NULL;
2117 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002118 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002119 for (i = 0; i < n; i++)
2120 new->ob_digit[i] = tmp->ob_digit[i];
2121 Py_DECREF(tmp);
2122 return (PyObject *)new;
2123}
2124
Tim Peters6d6c1a32001-08-02 04:15:00 +00002125static char long_doc[] =
2126"long(x[, base]) -> integer\n\
2127\n\
2128Convert a string or number to a long integer, if possible. A floating\n\
2129point argument will be truncated towards zero (this does not include a\n\
2130string representation of a floating point number!) When converting a\n\
2131string, use the optional base. It is an error to supply a base when\n\
2132converting a non-string.";
2133
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002134static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002135 (binaryfunc) long_add, /*nb_add*/
2136 (binaryfunc) long_sub, /*nb_subtract*/
2137 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002138 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002139 (binaryfunc) long_mod, /*nb_remainder*/
2140 (binaryfunc) long_divmod, /*nb_divmod*/
2141 (ternaryfunc) long_pow, /*nb_power*/
2142 (unaryfunc) long_neg, /*nb_negative*/
2143 (unaryfunc) long_pos, /*tp_positive*/
2144 (unaryfunc) long_abs, /*tp_absolute*/
2145 (inquiry) long_nonzero, /*tp_nonzero*/
2146 (unaryfunc) long_invert, /*nb_invert*/
2147 (binaryfunc) long_lshift, /*nb_lshift*/
2148 (binaryfunc) long_rshift, /*nb_rshift*/
2149 (binaryfunc) long_and, /*nb_and*/
2150 (binaryfunc) long_xor, /*nb_xor*/
2151 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002152 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002153 (unaryfunc) long_int, /*nb_int*/
2154 (unaryfunc) long_long, /*nb_long*/
2155 (unaryfunc) long_float, /*nb_float*/
2156 (unaryfunc) long_oct, /*nb_oct*/
2157 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002158 0, /* nb_inplace_add */
2159 0, /* nb_inplace_subtract */
2160 0, /* nb_inplace_multiply */
2161 0, /* nb_inplace_divide */
2162 0, /* nb_inplace_remainder */
2163 0, /* nb_inplace_power */
2164 0, /* nb_inplace_lshift */
2165 0, /* nb_inplace_rshift */
2166 0, /* nb_inplace_and */
2167 0, /* nb_inplace_xor */
2168 0, /* nb_inplace_or */
2169 (binaryfunc)long_div, /* nb_floor_divide */
2170 long_true_divide, /* nb_true_divide */
2171 0, /* nb_inplace_floor_divide */
2172 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002173};
2174
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002175PyTypeObject PyLong_Type = {
2176 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002177 0, /* ob_size */
2178 "long", /* tp_name */
2179 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2180 sizeof(digit), /* tp_itemsize */
2181 (destructor)long_dealloc, /* tp_dealloc */
2182 0, /* tp_print */
2183 0, /* tp_getattr */
2184 0, /* tp_setattr */
2185 (cmpfunc)long_compare, /* tp_compare */
2186 (reprfunc)long_repr, /* tp_repr */
2187 &long_as_number, /* tp_as_number */
2188 0, /* tp_as_sequence */
2189 0, /* tp_as_mapping */
2190 (hashfunc)long_hash, /* tp_hash */
2191 0, /* tp_call */
2192 (reprfunc)long_str, /* tp_str */
2193 PyObject_GenericGetAttr, /* tp_getattro */
2194 0, /* tp_setattro */
2195 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002196 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2197 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002198 long_doc, /* tp_doc */
2199 0, /* tp_traverse */
2200 0, /* tp_clear */
2201 0, /* tp_richcompare */
2202 0, /* tp_weaklistoffset */
2203 0, /* tp_iter */
2204 0, /* tp_iternext */
2205 0, /* tp_methods */
2206 0, /* tp_members */
2207 0, /* tp_getset */
2208 0, /* tp_base */
2209 0, /* tp_dict */
2210 0, /* tp_descr_get */
2211 0, /* tp_descr_set */
2212 0, /* tp_dictoffset */
2213 0, /* tp_init */
2214 0, /* tp_alloc */
2215 long_new, /* tp_new */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002216};