blob: 4d4a9599bcfe0b136055bb3f34cf9b9794463e58 [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 Py_DECREF(a);
1602 Py_DECREF(b);
1603 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00001604 if (x != Py_None) {
1605 PyErr_SetString(PyExc_TypeError, "integer pow() arg "
1606 "3 must not be specified when arg 2 is < 0");
1607 return NULL;
1608 }
1609 /* Return a float. This works because we know that
1610 this calls float_pow() which converts its
1611 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001612 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001613 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001614 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001615 for (i = 0; i < size_b; ++i) {
1616 digit bi = b->ob_digit[i];
1617 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001618
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001619 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001620 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001621
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001622 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001623 temp = (PyLongObject *)long_mul(z, a);
1624 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001625 if (c!=Py_None && temp!=NULL) {
1626 if (l_divmod(temp,(PyLongObject *)c,
1627 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001628 Py_DECREF(temp);
1629 z = NULL;
1630 goto error;
1631 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001632 Py_XDECREF(div);
1633 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001634 temp = mod;
1635 }
1636 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001637 if (z == NULL)
1638 break;
1639 }
1640 bi >>= 1;
1641 if (bi == 0 && i+1 == size_b)
1642 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001643 temp = (PyLongObject *)long_mul(a, a);
1644 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001645 if (c!=Py_None && temp!=NULL) {
1646 if (l_divmod(temp, (PyLongObject *)c, &div,
1647 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001648 Py_DECREF(temp);
1649 z = NULL;
1650 goto error;
1651 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001652 Py_XDECREF(div);
1653 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001654 temp = mod;
1655 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001656 a = temp;
1657 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001658 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001659 z = NULL;
1660 break;
1661 }
1662 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001663 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001664 break;
1665 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001666 if (c!=Py_None && z!=NULL) {
1667 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001668 Py_DECREF(z);
1669 z = NULL;
1670 }
1671 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001672 Py_XDECREF(div);
1673 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001674 z = mod;
1675 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001676 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001677 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001678 Py_XDECREF(a);
1679 Py_DECREF(b);
1680 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001681 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001682}
1683
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001684static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001685long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001686{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001687 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001688 PyLongObject *x;
1689 PyLongObject *w;
1690 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001691 if (w == NULL)
1692 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001693 x = (PyLongObject *) long_add(v, w);
1694 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001695 if (x == NULL)
1696 return NULL;
1697 if (x->ob_size != 0)
1698 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001699 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001700}
1701
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001702static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001703long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001704{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001705 Py_INCREF(v);
1706 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001707}
1708
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001709static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001710long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001711{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001712 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001713 int i, n;
1714 n = ABS(v->ob_size);
1715 if (n == 0) {
1716 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001717 Py_INCREF(v);
1718 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001719 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001720 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001721 if (z == NULL)
1722 return NULL;
1723 for (i = 0; i < n; i++)
1724 z->ob_digit[i] = v->ob_digit[i];
1725 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001726 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001727}
1728
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001729static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001730long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001731{
1732 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001733 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001734 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001735 Py_INCREF(v);
1736 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001737 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001738}
1739
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001740static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001741long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001742{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001743 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001744}
1745
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001746static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001747long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001748{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001749 PyLongObject *a, *b;
1750 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001751 long shiftby;
1752 int newsize, wordshift, loshift, hishift, i, j;
1753 digit lomask, himask;
1754
Neil Schemenauerba872e22001-01-04 01:46:03 +00001755 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1756
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001757 if (a->ob_size < 0) {
1758 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001759 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001760 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001761 if (a1 == NULL)
1762 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001763 a2 = (PyLongObject *) long_rshift(a1, b);
1764 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001765 if (a2 == NULL)
1766 goto rshift_error;
1767 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001768 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001769 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001770 else {
1771
1772 shiftby = PyLong_AsLong((PyObject *)b);
1773 if (shiftby == -1L && PyErr_Occurred())
1774 goto rshift_error;
1775 if (shiftby < 0) {
1776 PyErr_SetString(PyExc_ValueError,
1777 "negative shift count");
1778 goto rshift_error;
1779 }
1780 wordshift = shiftby / SHIFT;
1781 newsize = ABS(a->ob_size) - wordshift;
1782 if (newsize <= 0) {
1783 z = _PyLong_New(0);
1784 Py_DECREF(a);
1785 Py_DECREF(b);
1786 return (PyObject *)z;
1787 }
1788 loshift = shiftby % SHIFT;
1789 hishift = SHIFT - loshift;
1790 lomask = ((digit)1 << hishift) - 1;
1791 himask = MASK ^ lomask;
1792 z = _PyLong_New(newsize);
1793 if (z == NULL)
1794 goto rshift_error;
1795 if (a->ob_size < 0)
1796 z->ob_size = -(z->ob_size);
1797 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1798 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1799 if (i+1 < newsize)
1800 z->ob_digit[i] |=
1801 (a->ob_digit[j+1] << hishift) & himask;
1802 }
1803 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001804 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001805rshift_error:
1806 Py_DECREF(a);
1807 Py_DECREF(b);
1808 return (PyObject *) z;
1809
Guido van Rossumc6913e71991-11-19 20:26:46 +00001810}
1811
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001812static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001813long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001814{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001815 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001816 PyLongObject *a, *b;
1817 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001818 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001819 int oldsize, newsize, wordshift, remshift, i, j;
1820 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001821
Neil Schemenauerba872e22001-01-04 01:46:03 +00001822 CONVERT_BINOP(v, w, &a, &b);
1823
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001824 shiftby = PyLong_AsLong((PyObject *)b);
1825 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001826 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001827 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001828 PyErr_SetString(PyExc_ValueError, "negative 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 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001832 PyErr_SetString(PyExc_ValueError,
1833 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001834 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001835 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001836 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1837 wordshift = (int)shiftby / SHIFT;
1838 remshift = (int)shiftby - wordshift * SHIFT;
1839
1840 oldsize = ABS(a->ob_size);
1841 newsize = oldsize + wordshift;
1842 if (remshift)
1843 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001844 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001845 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001846 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001847 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001848 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001849 for (i = 0; i < wordshift; i++)
1850 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001851 accum = 0;
1852 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1853 accum |= a->ob_digit[j] << remshift;
1854 z->ob_digit[i] = (digit)(accum & MASK);
1855 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001856 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001857 if (remshift)
1858 z->ob_digit[newsize-1] = (digit)accum;
1859 else
1860 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001861 z = long_normalize(z);
1862lshift_error:
1863 Py_DECREF(a);
1864 Py_DECREF(b);
1865 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001866}
1867
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001868
1869/* Bitwise and/xor/or operations */
1870
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001871#define MAX(x, y) ((x) < (y) ? (y) : (x))
1872#define MIN(x, y) ((x) > (y) ? (y) : (x))
1873
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001874static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001875long_bitwise(PyLongObject *a,
1876 int op, /* '&', '|', '^' */
1877 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001878{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001879 digit maska, maskb; /* 0 or MASK */
1880 int negz;
1881 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001882 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001883 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001884 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001885 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001886
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001887 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001888 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001889 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001890 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001891 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001892 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001893 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001894 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001895 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001896 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001897 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001898 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001899 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001900 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001901 maskb = 0;
1902 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001903
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001904 negz = 0;
1905 switch (op) {
1906 case '^':
1907 if (maska != maskb) {
1908 maska ^= MASK;
1909 negz = -1;
1910 }
1911 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001912 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001913 if (maska && maskb) {
1914 op = '|';
1915 maska ^= MASK;
1916 maskb ^= MASK;
1917 negz = -1;
1918 }
1919 break;
1920 case '|':
1921 if (maska || maskb) {
1922 op = '&';
1923 maska ^= MASK;
1924 maskb ^= MASK;
1925 negz = -1;
1926 }
1927 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001928 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001929
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001930 /* JRH: The original logic here was to allocate the result value (z)
1931 as the longer of the two operands. However, there are some cases
1932 where the result is guaranteed to be shorter than that: AND of two
1933 positives, OR of two negatives: use the shorter number. AND with
1934 mixed signs: use the positive number. OR with mixed signs: use the
1935 negative number. After the transformations above, op will be '&'
1936 iff one of these cases applies, and mask will be non-0 for operands
1937 whose length should be ignored.
1938 */
1939
1940 size_a = a->ob_size;
1941 size_b = b->ob_size;
1942 size_z = op == '&'
1943 ? (maska
1944 ? size_b
1945 : (maskb ? size_a : MIN(size_a, size_b)))
1946 : MAX(size_a, size_b);
1947 z = _PyLong_New(size_z);
1948 if (a == NULL || b == NULL || z == NULL) {
1949 Py_XDECREF(a);
1950 Py_XDECREF(b);
1951 Py_XDECREF(z);
1952 return NULL;
1953 }
1954
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001955 for (i = 0; i < size_z; ++i) {
1956 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1957 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1958 switch (op) {
1959 case '&': z->ob_digit[i] = diga & digb; break;
1960 case '|': z->ob_digit[i] = diga | digb; break;
1961 case '^': z->ob_digit[i] = diga ^ digb; break;
1962 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001963 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001964
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001965 Py_DECREF(a);
1966 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001967 z = long_normalize(z);
1968 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001969 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001970 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001971 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001972 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001973}
1974
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001975static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001976long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001977{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001978 PyLongObject *a, *b;
1979 PyObject *c;
1980 CONVERT_BINOP(v, w, &a, &b);
1981 c = long_bitwise(a, '&', b);
1982 Py_DECREF(a);
1983 Py_DECREF(b);
1984 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001985}
1986
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001987static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001988long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001989{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001990 PyLongObject *a, *b;
1991 PyObject *c;
1992 CONVERT_BINOP(v, w, &a, &b);
1993 c = long_bitwise(a, '^', b);
1994 Py_DECREF(a);
1995 Py_DECREF(b);
1996 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001997}
1998
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001999static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002000long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002001{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002002 PyLongObject *a, *b;
2003 PyObject *c;
2004 CONVERT_BINOP(v, w, &a, &b);
2005 c = long_bitwise(a, '|', b);
2006 Py_DECREF(a);
2007 Py_DECREF(b);
2008 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002009}
2010
Guido van Rossum4668b002001-08-08 05:00:18 +00002011static PyObject *
2012long_true_divide(PyObject *v, PyObject *w)
2013{
2014 return PyFloat_Type.tp_as_number->nb_divide(v, w);
2015}
2016
Guido van Rossum234f9421993-06-17 12:35:49 +00002017static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002018long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002019{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002020 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002021 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002022 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002023 return 0;
2024 }
2025 return 1; /* Can't do it */
2026}
2027
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002028static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002029long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002030{
2031 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002032 x = PyLong_AsLong(v);
2033 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002034 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002035 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002036}
2037
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002038static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002039long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002040{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002041 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002042 return v;
2043}
2044
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002045static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002046long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002047{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002048 double result;
2049 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002050 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00002051 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002052 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002053}
2054
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002055static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002056long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002057{
Fred Drake121ee271999-12-23 15:41:28 +00002058 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002059}
2060
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002061static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002062long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002063{
Fred Drake121ee271999-12-23 15:41:28 +00002064 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002065}
Guido van Rossumbef14172001-08-29 15:47:46 +00002066staticforward PyObject *
2067long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002068
Tim Peters6d6c1a32001-08-02 04:15:00 +00002069static PyObject *
2070long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2071{
2072 PyObject *x = NULL;
2073 int base = -909; /* unlikely! */
2074 static char *kwlist[] = {"x", "base", 0};
2075
Guido van Rossumbef14172001-08-29 15:47:46 +00002076 if (type != &PyLong_Type)
2077 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002078 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2079 &x, &base))
2080 return NULL;
2081 if (x == NULL)
2082 return PyLong_FromLong(0L);
2083 if (base == -909)
2084 return PyNumber_Long(x);
2085 else if (PyString_Check(x))
2086 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002087#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002088 else if (PyUnicode_Check(x))
2089 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2090 PyUnicode_GET_SIZE(x),
2091 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002092#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002093 else {
2094 PyErr_SetString(PyExc_TypeError,
2095 "long() can't convert non-string with explicit base");
2096 return NULL;
2097 }
2098}
2099
Guido van Rossumbef14172001-08-29 15:47:46 +00002100/* Wimpy, slow approach to tp_new calls for subtypes of long:
2101 first create a regular long from whatever arguments we got,
2102 then allocate a subtype instance and initialize it from
2103 the regular long. The regular long is then thrown away.
2104*/
2105static PyObject *
2106long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2107{
2108 PyLongObject *tmp, *new;
2109 int i, n;
2110
2111 assert(PyType_IsSubtype(type, &PyLong_Type));
2112 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2113 if (tmp == NULL)
2114 return NULL;
2115 assert(PyLong_Check(tmp));
2116 n = tmp->ob_size;
2117 if (n < 0)
2118 n = -n;
2119 new = (PyLongObject *)type->tp_alloc(type, n);
2120 if (new == NULL)
2121 return NULL;
2122 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002123 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002124 for (i = 0; i < n; i++)
2125 new->ob_digit[i] = tmp->ob_digit[i];
2126 Py_DECREF(tmp);
2127 return (PyObject *)new;
2128}
2129
Tim Peters6d6c1a32001-08-02 04:15:00 +00002130static char long_doc[] =
2131"long(x[, base]) -> integer\n\
2132\n\
2133Convert a string or number to a long integer, if possible. A floating\n\
2134point argument will be truncated towards zero (this does not include a\n\
2135string representation of a floating point number!) When converting a\n\
2136string, use the optional base. It is an error to supply a base when\n\
2137converting a non-string.";
2138
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002139static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002140 (binaryfunc) long_add, /*nb_add*/
2141 (binaryfunc) long_sub, /*nb_subtract*/
2142 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002143 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002144 (binaryfunc) long_mod, /*nb_remainder*/
2145 (binaryfunc) long_divmod, /*nb_divmod*/
2146 (ternaryfunc) long_pow, /*nb_power*/
2147 (unaryfunc) long_neg, /*nb_negative*/
2148 (unaryfunc) long_pos, /*tp_positive*/
2149 (unaryfunc) long_abs, /*tp_absolute*/
2150 (inquiry) long_nonzero, /*tp_nonzero*/
2151 (unaryfunc) long_invert, /*nb_invert*/
2152 (binaryfunc) long_lshift, /*nb_lshift*/
2153 (binaryfunc) long_rshift, /*nb_rshift*/
2154 (binaryfunc) long_and, /*nb_and*/
2155 (binaryfunc) long_xor, /*nb_xor*/
2156 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002157 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002158 (unaryfunc) long_int, /*nb_int*/
2159 (unaryfunc) long_long, /*nb_long*/
2160 (unaryfunc) long_float, /*nb_float*/
2161 (unaryfunc) long_oct, /*nb_oct*/
2162 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002163 0, /* nb_inplace_add */
2164 0, /* nb_inplace_subtract */
2165 0, /* nb_inplace_multiply */
2166 0, /* nb_inplace_divide */
2167 0, /* nb_inplace_remainder */
2168 0, /* nb_inplace_power */
2169 0, /* nb_inplace_lshift */
2170 0, /* nb_inplace_rshift */
2171 0, /* nb_inplace_and */
2172 0, /* nb_inplace_xor */
2173 0, /* nb_inplace_or */
2174 (binaryfunc)long_div, /* nb_floor_divide */
2175 long_true_divide, /* nb_true_divide */
2176 0, /* nb_inplace_floor_divide */
2177 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002178};
2179
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002180PyTypeObject PyLong_Type = {
2181 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002182 0, /* ob_size */
2183 "long", /* tp_name */
2184 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2185 sizeof(digit), /* tp_itemsize */
2186 (destructor)long_dealloc, /* tp_dealloc */
2187 0, /* tp_print */
2188 0, /* tp_getattr */
2189 0, /* tp_setattr */
2190 (cmpfunc)long_compare, /* tp_compare */
2191 (reprfunc)long_repr, /* tp_repr */
2192 &long_as_number, /* tp_as_number */
2193 0, /* tp_as_sequence */
2194 0, /* tp_as_mapping */
2195 (hashfunc)long_hash, /* tp_hash */
2196 0, /* tp_call */
2197 (reprfunc)long_str, /* tp_str */
2198 PyObject_GenericGetAttr, /* tp_getattro */
2199 0, /* tp_setattro */
2200 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002201 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2202 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002203 long_doc, /* tp_doc */
2204 0, /* tp_traverse */
2205 0, /* tp_clear */
2206 0, /* tp_richcompare */
2207 0, /* tp_weaklistoffset */
2208 0, /* tp_iter */
2209 0, /* tp_iternext */
2210 0, /* tp_methods */
2211 0, /* tp_members */
2212 0, /* tp_getset */
2213 0, /* tp_base */
2214 0, /* tp_dict */
2215 0, /* tp_descr_get */
2216 0, /* tp_descr_set */
2217 0, /* tp_dictoffset */
2218 0, /* tp_init */
2219 0, /* tp_alloc */
2220 long_new, /* tp_new */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002221};