blob: b511928dbd4ba570a1e80fef3ecadf0d88ec7245 [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001
2/* Long (arbitrary precision) integer object implementation */
3
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004/* XXX The functional organization of this file is terrible */
5
Guido van Rossumc0b618a1997-05-02 03:12:38 +00006#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +00007#include "longintrepr.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00009#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000010
Guido van Rossume32e0141992-01-19 16:31:05 +000011#define ABS(x) ((x) < 0 ? -(x) : (x))
12
13/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000014static PyLongObject *long_normalize(PyLongObject *);
15static PyLongObject *mul1(PyLongObject *, wdigit);
16static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
Tim Peters212e6142001-07-14 12:23:19 +000017static PyLongObject *divrem1(PyLongObject *, digit, digit *);
Tim Peters9f688bf2000-07-07 15:53:28 +000018static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000019
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000020static int ticker; /* XXX Could be shared with ceval? */
21
Guido van Rossumc0b618a1997-05-02 03:12:38 +000022#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000023 if (--ticker < 0) { \
24 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000025 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000026 }
27
Guido van Rossumedcc38a1991-05-05 20:09:44 +000028/* Normalize (remove leading zeros from) a long int object.
29 Doesn't attempt to free the storage--in most cases, due to the nature
30 of the algorithms used, this could save at most be one word anyway. */
31
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000033long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000034{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000035 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000036 register int i = j;
37
38 while (i > 0 && v->ob_digit[i-1] == 0)
39 --i;
40 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000041 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000042 return v;
43}
44
45/* Allocate a new long int object with size digits.
46 Return NULL and set exception if we run out of memory. */
47
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000049_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000050{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000052}
53
54/* Create a new long int object from a C long int */
55
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000057PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000058{
Tim Petersce9de2f2001-06-14 04:56:19 +000059 PyLongObject *v;
60 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
61 int ndigits = 0;
62 int negative = 0;
63
64 if (ival < 0) {
65 ival = -ival;
66 negative = 1;
67 }
68
69 /* Count the number of Python digits.
70 We used to pick 5 ("big enough for anything"), but that's a
71 waste of time and space given that 5*15 = 75 bits are rarely
72 needed. */
73 t = (unsigned long)ival;
74 while (t) {
75 ++ndigits;
76 t >>= SHIFT;
77 }
78 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000079 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +000080 digit *p = v->ob_digit;
81 v->ob_size = negative ? -ndigits : ndigits;
82 t = (unsigned long)ival;
83 while (t) {
84 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000085 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000087 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000089}
90
Guido van Rossum53756b11997-01-03 17:14:46 +000091/* Create a new long int object from a C unsigned long int */
92
Guido van Rossumc0b618a1997-05-02 03:12:38 +000093PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000094PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +000095{
Tim Petersce9de2f2001-06-14 04:56:19 +000096 PyLongObject *v;
97 unsigned long t;
98 int ndigits = 0;
99
100 /* Count the number of Python digits. */
101 t = (unsigned long)ival;
102 while (t) {
103 ++ndigits;
104 t >>= SHIFT;
105 }
106 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000107 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000108 digit *p = v->ob_digit;
109 v->ob_size = ndigits;
110 while (ival) {
111 *p++ = (digit)(ival & MASK);
112 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000113 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000114 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000116}
117
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000118/* Create a new long int object from a C double */
119
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000122{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000124 double frac;
125 int i, ndig, expo, neg;
126 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000127 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000128 PyErr_SetString(PyExc_OverflowError,
129 "cannot convert float infinity to long");
130 return NULL;
131 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000132 if (dval < 0.0) {
133 neg = 1;
134 dval = -dval;
135 }
136 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
137 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000139 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000141 if (v == NULL)
142 return NULL;
143 frac = ldexp(frac, (expo-1) % SHIFT + 1);
144 for (i = ndig; --i >= 0; ) {
145 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000146 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000147 frac = frac - (double)bits;
148 frac = ldexp(frac, SHIFT);
149 }
150 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000151 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000153}
154
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000155/* Get a C long int from a long int object.
156 Returns -1 and sets an error condition if overflow occurs. */
157
158long
Tim Peters9f688bf2000-07-07 15:53:28 +0000159PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000160{
Guido van Rossumf7531811998-05-26 14:33:37 +0000161 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000163 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000164 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000165
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000166 if (vv == NULL || !PyLong_Check(vv)) {
167 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000168 return -1;
169 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000171 i = v->ob_size;
172 sign = 1;
173 x = 0;
174 if (i < 0) {
175 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000176 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000177 }
178 while (--i >= 0) {
179 prev = x;
180 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000181 if ((x >> SHIFT) != prev)
182 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000183 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000184 /* Haven't lost any bits, but if the sign bit is set we're in
185 * trouble *unless* this is the min negative number. So,
186 * trouble iff sign bit set && (positive || some bit set other
187 * than the sign bit).
188 */
189 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
190 goto overflow;
191 return (long)x * sign;
192
193 overflow:
194 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000195 "long int too large to convert");
Guido van Rossumf7531811998-05-26 14:33:37 +0000196 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000197}
198
Guido van Rossum53756b11997-01-03 17:14:46 +0000199/* Get a C long int from a long int object.
200 Returns -1 and sets an error condition if overflow occurs. */
201
202unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000203PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000204{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000206 unsigned long x, prev;
207 int i;
208
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 if (vv == NULL || !PyLong_Check(vv)) {
210 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000211 return (unsigned long) -1;
212 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000214 i = v->ob_size;
215 x = 0;
216 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000218 "can't convert negative value to unsigned long");
219 return (unsigned long) -1;
220 }
221 while (--i >= 0) {
222 prev = x;
223 x = (x << SHIFT) + v->ob_digit[i];
224 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000226 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000227 return (unsigned long) -1;
228 }
229 }
230 return x;
231}
232
Tim Peters2a9b3672001-06-11 21:23:58 +0000233PyObject *
234_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
235 int little_endian, int is_signed)
236{
237 const unsigned char* pstartbyte;/* LSB of bytes */
238 int incr; /* direction to move pstartbyte */
239 const unsigned char* pendbyte; /* MSB of bytes */
240 size_t numsignificantbytes; /* number of bytes that matter */
241 size_t ndigits; /* number of Python long digits */
242 PyLongObject* v; /* result */
243 int idigit = 0; /* next free index in v->ob_digit */
244
245 if (n == 0)
246 return PyLong_FromLong(0L);
247
248 if (little_endian) {
249 pstartbyte = bytes;
250 pendbyte = bytes + n - 1;
251 incr = 1;
252 }
253 else {
254 pstartbyte = bytes + n - 1;
255 pendbyte = bytes;
256 incr = -1;
257 }
258
259 if (is_signed)
260 is_signed = *pendbyte >= 0x80;
261
262 /* Compute numsignificantbytes. This consists of finding the most
263 significant byte. Leading 0 bytes are insignficant if the number
264 is positive, and leading 0xff bytes if negative. */
265 {
266 size_t i;
267 const unsigned char* p = pendbyte;
268 const int pincr = -incr; /* search MSB to LSB */
269 const unsigned char insignficant = is_signed ? 0xff : 0x00;
270
271 for (i = 0; i < n; ++i, p += pincr) {
272 if (*p != insignficant)
273 break;
274 }
275 numsignificantbytes = n - i;
276 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
277 actually has 2 significant bytes. OTOH, 0xff0001 ==
278 -0x00ffff, so we wouldn't *need* to bump it there; but we
279 do for 0xffff = -0x0001. To be safe without bothering to
280 check every case, bump it regardless. */
281 if (is_signed && numsignificantbytes < n)
282 ++numsignificantbytes;
283 }
284
285 /* How many Python long digits do we need? We have
286 8*numsignificantbytes bits, and each Python long digit has SHIFT
287 bits, so it's the ceiling of the quotient. */
288 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
289 if (ndigits > (size_t)INT_MAX)
290 return PyErr_NoMemory();
291 v = _PyLong_New((int)ndigits);
292 if (v == NULL)
293 return NULL;
294
295 /* Copy the bits over. The tricky parts are computing 2's-comp on
296 the fly for signed numbers, and dealing with the mismatch between
297 8-bit bytes and (probably) 15-bit Python digits.*/
298 {
299 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000300 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000301 twodigits accum = 0; /* sliding register */
302 unsigned int accumbits = 0; /* number of bits in accum */
303 const unsigned char* p = pstartbyte;
304
305 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000306 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000307 /* Compute correction for 2's comp, if needed. */
308 if (is_signed) {
309 thisbyte = (0xff ^ thisbyte) + carry;
310 carry = thisbyte >> 8;
311 thisbyte &= 0xff;
312 }
313 /* Because we're going LSB to MSB, thisbyte is
314 more significant than what's already in accum,
315 so needs to be prepended to accum. */
316 accum |= thisbyte << accumbits;
317 accumbits += 8;
318 if (accumbits >= SHIFT) {
319 /* There's enough to fill a Python digit. */
320 assert(idigit < (int)ndigits);
321 v->ob_digit[idigit] = (digit)(accum & MASK);
322 ++idigit;
323 accum >>= SHIFT;
324 accumbits -= SHIFT;
325 assert(accumbits < SHIFT);
326 }
327 }
328 assert(accumbits < SHIFT);
329 if (accumbits) {
330 assert(idigit < (int)ndigits);
331 v->ob_digit[idigit] = (digit)accum;
332 ++idigit;
333 }
334 }
335
336 v->ob_size = is_signed ? -idigit : idigit;
337 return (PyObject *)long_normalize(v);
338}
339
340int
341_PyLong_AsByteArray(PyLongObject* v,
342 unsigned char* bytes, size_t n,
343 int little_endian, int is_signed)
344{
345 int i; /* index into v->ob_digit */
346 int ndigits; /* |v->ob_size| */
347 twodigits accum; /* sliding register */
348 unsigned int accumbits; /* # bits in accum */
349 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
350 twodigits carry; /* for computing 2's-comp */
351 size_t j; /* # bytes filled */
352 unsigned char* p; /* pointer to next byte in bytes */
353 int pincr; /* direction to move p */
354
355 assert(v != NULL && PyLong_Check(v));
356
357 if (v->ob_size < 0) {
358 ndigits = -(v->ob_size);
359 if (!is_signed) {
360 PyErr_SetString(PyExc_TypeError,
361 "can't convert negative long to unsigned");
362 return -1;
363 }
364 do_twos_comp = 1;
365 }
366 else {
367 ndigits = v->ob_size;
368 do_twos_comp = 0;
369 }
370
371 if (little_endian) {
372 p = bytes;
373 pincr = 1;
374 }
375 else {
376 p = bytes + n - 1;
377 pincr = -1;
378 }
379
Tim Peters898cf852001-06-13 20:50:08 +0000380 /* Copy over all the Python digits.
381 It's crucial that every Python digit except for the MSD contribute
382 exactly SHIFT bits to the total, so first assert that the long is
383 normalized. */
384 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000385 j = 0;
386 accum = 0;
387 accumbits = 0;
388 carry = do_twos_comp ? 1 : 0;
389 for (i = 0; i < ndigits; ++i) {
390 twodigits thisdigit = v->ob_digit[i];
391 if (do_twos_comp) {
392 thisdigit = (thisdigit ^ MASK) + carry;
393 carry = thisdigit >> SHIFT;
394 thisdigit &= MASK;
395 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000396 /* Because we're going LSB to MSB, thisdigit is more
397 significant than what's already in accum, so needs to be
398 prepended to accum. */
399 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000400 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000401
Tim Petersede05092001-06-14 08:53:38 +0000402 /* The most-significant digit may be (probably is) at least
403 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000404 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000405 /* Count # of sign bits -- they needn't be stored,
406 * although for signed conversion we need later to
407 * make sure at least one sign bit gets stored.
408 * First shift conceptual sign bit to real sign bit.
409 */
410 stwodigits s = (stwodigits)(thisdigit <<
411 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000412 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000413 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000414 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000415 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000416 }
Tim Petersede05092001-06-14 08:53:38 +0000417 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000418 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000419
Tim Peters2a9b3672001-06-11 21:23:58 +0000420 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000421 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000422 if (j >= n)
423 goto Overflow;
424 ++j;
425 *p = (unsigned char)(accum & 0xff);
426 p += pincr;
427 accumbits -= 8;
428 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000429 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000430 }
431
432 /* Store the straggler (if any). */
433 assert(accumbits < 8);
434 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000435 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000436 if (j >= n)
437 goto Overflow;
438 ++j;
439 if (do_twos_comp) {
440 /* Fill leading bits of the byte with sign bits
441 (appropriately pretending that the long had an
442 infinite supply of sign bits). */
443 accum |= (~(twodigits)0) << accumbits;
444 }
445 *p = (unsigned char)(accum & 0xff);
446 p += pincr;
447 }
Tim Peters05607ad2001-06-13 21:01:27 +0000448 else if (j == n && n > 0 && is_signed) {
449 /* The main loop filled the byte array exactly, so the code
450 just above didn't get to ensure there's a sign bit, and the
451 loop below wouldn't add one either. Make sure a sign bit
452 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000453 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000454 int sign_bit_set = msb >= 0x80;
455 assert(accumbits == 0);
456 if (sign_bit_set == do_twos_comp)
457 return 0;
458 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000459 goto Overflow;
460 }
Tim Peters05607ad2001-06-13 21:01:27 +0000461
462 /* Fill remaining bytes with copies of the sign bit. */
463 {
464 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
465 for ( ; j < n; ++j, p += pincr)
466 *p = signbyte;
467 }
468
Tim Peters2a9b3672001-06-11 21:23:58 +0000469 return 0;
470
471Overflow:
472 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
473 return -1;
474
475}
476
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000477double
478_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
479{
480/* NBITS_WANTED should be > the number of bits in a double's precision,
481 but small enough so that 2**NBITS_WANTED is within the normal double
482 range. nbitsneeded is set to 1 less than that because the most-significant
483 Python digit contains at least 1 significant bit, but we don't want to
484 bother counting them (catering to the worst case cheaply).
485
486 57 is one more than VAX-D double precision; I (Tim) don't know of a double
487 format with more precision than that; it's 1 larger so that we add in at
488 least one round bit to stand in for the ignored least-significant bits.
489*/
490#define NBITS_WANTED 57
491 PyLongObject *v;
492 double x;
493 const double multiplier = (double)(1L << SHIFT);
494 int i, sign;
495 int nbitsneeded;
496
497 if (vv == NULL || !PyLong_Check(vv)) {
498 PyErr_BadInternalCall();
499 return -1;
500 }
501 v = (PyLongObject *)vv;
502 i = v->ob_size;
503 sign = 1;
504 if (i < 0) {
505 sign = -1;
506 i = -(i);
507 }
508 else if (i == 0) {
509 *exponent = 0;
510 return 0.0;
511 }
512 --i;
513 x = (double)v->ob_digit[i];
514 nbitsneeded = NBITS_WANTED - 1;
515 /* Invariant: i Python digits remain unaccounted for. */
516 while (i > 0 && nbitsneeded > 0) {
517 --i;
518 x = x * multiplier + (double)v->ob_digit[i];
519 nbitsneeded -= SHIFT;
520 }
521 /* There are i digits we didn't shift in. Pretending they're all
522 zeroes, the true value is x * 2**(i*SHIFT). */
523 *exponent = i;
524 assert(x > 0.0);
525 return x * sign;
526#undef NBITS_WANTED
527}
528
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000529/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000530
531double
Tim Peters9f688bf2000-07-07 15:53:28 +0000532PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000533{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000535 double x;
536 double multiplier = (double) (1L << SHIFT);
537 int i, sign;
538
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 if (vv == NULL || !PyLong_Check(vv)) {
540 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000541 return -1;
542 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000544 i = v->ob_size;
545 sign = 1;
546 x = 0.0;
547 if (i < 0) {
548 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000549 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000550 }
551 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000552 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000553 }
554 return x * sign;
555}
556
Guido van Rossum78694d91998-09-18 14:14:13 +0000557/* Create a new long (or int) object from a C pointer */
558
559PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000560PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000561{
Tim Peters70128a12001-06-16 08:48:40 +0000562#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000563 return PyInt_FromLong((long)p);
564#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000565
Tim Peters70128a12001-06-16 08:48:40 +0000566#ifndef HAVE_LONG_LONG
567# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
568#endif
569#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
570# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
571#endif
572 /* optimize null pointers */
573 if (p == NULL)
574 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000575 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000576
577#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000578}
579
580/* Get a C pointer from a long object (or an int object in some cases) */
581
582void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000583PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000584{
585 /* This function will allow int or long objects. If vv is neither,
586 then the PyLong_AsLong*() functions will raise the exception:
587 PyExc_SystemError, "bad argument to internal function"
588 */
Tim Peters70128a12001-06-16 08:48:40 +0000589#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000590 long x;
591
Tim Peters70128a12001-06-16 08:48:40 +0000592 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000593 x = PyInt_AS_LONG(vv);
594 else
595 x = PyLong_AsLong(vv);
596#else
Tim Peters70128a12001-06-16 08:48:40 +0000597
598#ifndef HAVE_LONG_LONG
599# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
600#endif
601#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
602# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
603#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000604 LONG_LONG x;
605
Tim Peters70128a12001-06-16 08:48:40 +0000606 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000607 x = PyInt_AS_LONG(vv);
608 else
609 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000610
611#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000612
613 if (x == -1 && PyErr_Occurred())
614 return NULL;
615 return (void *)x;
616}
617
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000618#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000619
620/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
621 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000622 */
623
Tim Peterscf37dfc2001-06-14 18:42:50 +0000624#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000625
626/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000627
628PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000629PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000630{
Tim Petersd1a7da62001-06-13 00:35:57 +0000631 LONG_LONG bytes = ival;
632 int one = 1;
633 return _PyLong_FromByteArray(
634 (unsigned char *)&bytes,
635 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000636}
637
Tim Petersd1a7da62001-06-13 00:35:57 +0000638/* Create a new long int object from a C unsigned LONG_LONG int. */
639
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000640PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000641PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000642{
Tim Petersd1a7da62001-06-13 00:35:57 +0000643 unsigned LONG_LONG bytes = ival;
644 int one = 1;
645 return _PyLong_FromByteArray(
646 (unsigned char *)&bytes,
647 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000648}
649
Guido van Rossum3293b071998-08-25 16:07:15 +0000650/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000651 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000652
Guido van Rossum3293b071998-08-25 16:07:15 +0000653LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000654PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000655{
Tim Petersd1a7da62001-06-13 00:35:57 +0000656 LONG_LONG bytes;
657 int one = 1;
658 int res;
659
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000660 if (vv == NULL || !PyLong_Check(vv)) {
661 PyErr_BadInternalCall();
662 return -1;
663 }
664
Tim Petersd1a7da62001-06-13 00:35:57 +0000665 res = _PyLong_AsByteArray(
666 (PyLongObject *)vv, (unsigned char *)&bytes,
667 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000668
Tim Peters9cb0c382001-06-13 20:45:17 +0000669 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000670}
671
Tim Petersd1a7da62001-06-13 00:35:57 +0000672/* Get a C unsigned LONG_LONG int from a long int object.
673 Return -1 and set an error if overflow occurs. */
674
Guido van Rossum3293b071998-08-25 16:07:15 +0000675unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000676PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000677{
Tim Petersd1a7da62001-06-13 00:35:57 +0000678 unsigned LONG_LONG bytes;
679 int one = 1;
680 int res;
681
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000682 if (vv == NULL || !PyLong_Check(vv)) {
683 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000684 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000685 }
686
Tim Petersd1a7da62001-06-13 00:35:57 +0000687 res = _PyLong_AsByteArray(
688 (PyLongObject *)vv, (unsigned char *)&bytes,
689 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000690
Tim Peters9cb0c382001-06-13 20:45:17 +0000691 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000692}
Tim Petersd1a7da62001-06-13 00:35:57 +0000693
694#undef IS_LITTLE_ENDIAN
695
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000696#endif /* HAVE_LONG_LONG */
697
Neil Schemenauerba872e22001-01-04 01:46:03 +0000698
699static int
700convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
701 if (PyLong_Check(v)) {
702 *a = (PyLongObject *) v;
703 Py_INCREF(v);
704 }
705 else if (PyInt_Check(v)) {
706 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
707 }
708 else {
709 return 0;
710 }
711 if (PyLong_Check(w)) {
712 *b = (PyLongObject *) w;
713 Py_INCREF(w);
714 }
715 else if (PyInt_Check(w)) {
716 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
717 }
718 else {
719 Py_DECREF(*a);
720 return 0;
721 }
722 return 1;
723}
724
725#define CONVERT_BINOP(v, w, a, b) \
726 if (!convert_binop(v, w, a, b)) { \
727 Py_INCREF(Py_NotImplemented); \
728 return Py_NotImplemented; \
729 }
730
731
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000732/* Multiply by a single digit, ignoring the sign. */
733
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000734static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000735mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000736{
737 return muladd1(a, n, (digit)0);
738}
739
740/* Multiply by a single digit and add a single digit, ignoring the sign. */
741
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000742static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000743muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000744{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000745 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000746 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000747 twodigits carry = extra;
748 int i;
749
750 if (z == NULL)
751 return NULL;
752 for (i = 0; i < size_a; ++i) {
753 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000754 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000755 carry >>= SHIFT;
756 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000757 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000758 return long_normalize(z);
759}
760
Tim Peters212e6142001-07-14 12:23:19 +0000761/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
762 in pout, and returning the remainder. pin and pout point at the LSD.
763 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
764 long_format, but that should be done with great care since longs are
765 immutable. */
766
767static digit
768inplace_divrem1(digit *pout, digit *pin, int size, digit n)
769{
770 twodigits rem = 0;
771
772 assert(n > 0 && n <= MASK);
773 pin += size;
774 pout += size;
775 while (--size >= 0) {
776 digit hi;
777 rem = (rem << SHIFT) + *--pin;
778 *--pout = hi = (digit)(rem / n);
779 rem -= hi * n;
780 }
781 return (digit)rem;
782}
783
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000784/* Divide a long integer by a digit, returning both the quotient
785 (as function result) and the remainder (through *prem).
786 The sign of a is ignored; n should not be zero. */
787
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000789divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000790{
Tim Peters212e6142001-07-14 12:23:19 +0000791 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000793
794 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000795 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000796 if (z == NULL)
797 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000798 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000799 return long_normalize(z);
800}
801
802/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000803 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000804 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000805
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000807long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000808{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809 register PyLongObject *a = (PyLongObject *)aa;
810 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000811 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000812 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000813 char *p;
814 int bits;
815 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000816
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 if (a == NULL || !PyLong_Check(a)) {
818 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000819 return NULL;
820 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000821 assert(base >= 2 && base <= 36);
822
823 /* Compute a rough upper bound for the length of the string */
824 i = base;
825 bits = 0;
826 while (i > 1) {
827 ++bits;
828 i >>= 1;
829 }
Fred Drake121ee271999-12-23 15:41:28 +0000830 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000832 if (str == NULL)
833 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000835 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000836 if (addL)
837 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000838 if (a->ob_size < 0)
839 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000840
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000841 if (a->ob_size == 0) {
842 *--p = '0';
843 }
844 else if ((base & (base - 1)) == 0) {
845 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000846 twodigits accum = 0;
847 int accumbits = 0; /* # of bits in accum */
848 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000849 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000850 while ((i >>= 1) > 1)
851 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000852
853 for (i = 0; i < size_a; ++i) {
854 accum |= a->ob_digit[i] << accumbits;
855 accumbits += SHIFT;
856 assert(accumbits >= basebits);
857 do {
858 char digit = (char)(accum & (base - 1));
859 digit += (digit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000860 assert(p > PyString_AS_STRING(str));
Tim Peters586b2e32001-07-15 09:11:14 +0000861 *--p = digit;
862 accumbits -= basebits;
863 accum >>= basebits;
864 } while (i < size_a-1 ? accumbits >= basebits :
865 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000866 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000867 }
868 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000869 /* Not 0, and base not a power of 2. Divide repeatedly by
870 base, but for speed use the highest power of base that
871 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000872 int size = size_a;
873 digit *pin = a->ob_digit;
874 PyLongObject *scratch;
875 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000876 digit powbase = base; /* powbase == base ** power */
877 int power = 1;
878 for (;;) {
879 unsigned long newpow = powbase * (unsigned long)base;
880 if (newpow >> SHIFT) /* doesn't fit in a digit */
881 break;
882 powbase = (digit)newpow;
883 ++power;
884 }
Tim Peters212e6142001-07-14 12:23:19 +0000885
886 /* Get a scratch area for repeated division. */
887 scratch = _PyLong_New(size);
888 if (scratch == NULL) {
889 Py_DECREF(str);
890 return NULL;
891 }
892
893 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000894 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000895 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000896 digit rem = inplace_divrem1(scratch->ob_digit,
897 pin, size, powbase);
898 pin = scratch->ob_digit; /* no need to use a again */
899 if (pin[size - 1] == 0)
900 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000901 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +0000902 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000903 Py_DECREF(str);
904 return NULL;
905 })
Tim Peters212e6142001-07-14 12:23:19 +0000906
907 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000908 assert(ntostore > 0);
909 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000910 digit nextrem = (digit)(rem / base);
911 char c = (char)(rem - nextrem * base);
912 assert(p > PyString_AS_STRING(str));
913 c += (c < 10) ? '0' : 'A'-10;
914 *--p = c;
915 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000916 --ntostore;
917 /* Termination is a bit delicate: must not
918 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +0000919 remaining quotient and rem are both 0. */
920 } while (ntostore && (size || rem));
921 } while (size != 0);
922 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000923 }
924
Guido van Rossum2c475421992-08-14 15:13:07 +0000925 if (base == 8) {
926 if (size_a != 0)
927 *--p = '0';
928 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000929 else if (base == 16) {
930 *--p = 'x';
931 *--p = '0';
932 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000933 else if (base != 10) {
934 *--p = '#';
935 *--p = '0' + base%10;
936 if (base > 10)
937 *--p = '0' + base/10;
938 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000939 if (sign)
940 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941 if (p != PyString_AS_STRING(str)) {
942 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000943 assert(p > q);
944 do {
945 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000946 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947 _PyString_Resize((PyObject **)&str,
948 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000949 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000950 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000951}
952
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000953PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000954PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000955{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000956 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000957 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000959
Guido van Rossum472c04f1996-12-05 21:57:21 +0000960 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000962 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000963 return NULL;
964 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000965 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000966 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000967 if (*str == '+')
968 ++str;
969 else if (*str == '-') {
970 ++str;
971 sign = -1;
972 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000973 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000974 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000975 if (base == 0) {
976 if (str[0] != '0')
977 base = 10;
978 else if (str[1] == 'x' || str[1] == 'X')
979 base = 16;
980 else
981 base = 8;
982 }
983 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
984 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000986 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000987 for ( ; z != NULL; ++str) {
988 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000990
991 if (*str <= '9')
992 k = *str - '0';
993 else if (*str >= 'a')
994 k = *str - 'a' + 10;
995 else if (*str >= 'A')
996 k = *str - 'A' + 10;
997 if (k < 0 || k >= base)
998 break;
999 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001000 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001001 z = temp;
1002 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001003 if (z == NULL)
1004 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001005 if (str == start)
1006 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001007 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001008 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001009 if (*str == 'L' || *str == 'l')
1010 str++;
1011 while (*str && isspace(Py_CHARMASK(*str)))
1012 str++;
1013 if (*str != '\0')
1014 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001015 if (pend)
1016 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001018
1019 onError:
1020 PyErr_Format(PyExc_ValueError,
1021 "invalid literal for long(): %.200s", orig_str);
1022 Py_XDECREF(z);
1023 return NULL;
1024}
1025
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001026#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001027PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001028PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001029{
1030 char buffer[256];
1031
1032 if (length >= sizeof(buffer)) {
1033 PyErr_SetString(PyExc_ValueError,
1034 "long() literal too large to convert");
1035 return NULL;
1036 }
1037 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
1038 return NULL;
1039
1040 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001041}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001042#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001043
Tim Peters9f688bf2000-07-07 15:53:28 +00001044/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001046 (PyLongObject *, PyLongObject *, PyLongObject **);
1047static PyObject *long_pos(PyLongObject *);
1048static int long_divrem(PyLongObject *, PyLongObject *,
1049 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001050
1051/* Long division with remainder, top-level routine */
1052
Guido van Rossume32e0141992-01-19 16:31:05 +00001053static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001054long_divrem(PyLongObject *a, PyLongObject *b,
1055 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001056{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001057 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001059
1060 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001061 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001062 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001063 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001064 }
1065 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001066 (size_a == size_b &&
1067 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001068 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 *pdiv = _PyLong_New(0);
1070 Py_INCREF(a);
1071 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001072 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001073 }
1074 if (size_b == 1) {
1075 digit rem = 0;
1076 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001077 if (z == NULL)
1078 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001080 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001081 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001082 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001083 if (z == NULL)
1084 return -1;
1085 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001086 /* Set the signs.
1087 The quotient z has the sign of a*b;
1088 the remainder r has the sign of a,
1089 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001090 if ((a->ob_size < 0) != (b->ob_size < 0))
1091 z->ob_size = -(z->ob_size);
1092 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1093 (*prem)->ob_size = -((*prem)->ob_size);
1094 *pdiv = z;
1095 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001096}
1097
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001098/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001099
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001101x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001102{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001103 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001104 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001105 PyLongObject *v = mul1(v1, d);
1106 PyLongObject *w = mul1(w1, d);
1107 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001108 int j, k;
1109
1110 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001111 Py_XDECREF(v);
1112 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001113 return NULL;
1114 }
1115
1116 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001117 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001118 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001119
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001120 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001122
1123 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1124 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1125 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001126 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001127 int i;
1128
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001129 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001130 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001131 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001132 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001133 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001134 if (vj == w->ob_digit[size_w-1])
1135 q = MASK;
1136 else
1137 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1138 w->ob_digit[size_w-1];
1139
1140 while (w->ob_digit[size_w-2]*q >
1141 ((
1142 ((twodigits)vj << SHIFT)
1143 + v->ob_digit[j-1]
1144 - q*w->ob_digit[size_w-1]
1145 ) << SHIFT)
1146 + v->ob_digit[j-2])
1147 --q;
1148
1149 for (i = 0; i < size_w && i+k < size_v; ++i) {
1150 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001151 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001152 carry += v->ob_digit[i+k] - z
1153 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001154 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001155 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1156 carry, SHIFT);
1157 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001158 }
1159
1160 if (i+k < size_v) {
1161 carry += v->ob_digit[i+k];
1162 v->ob_digit[i+k] = 0;
1163 }
1164
1165 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001166 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001167 else {
1168 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001169 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001170 carry = 0;
1171 for (i = 0; i < size_w && i+k < size_v; ++i) {
1172 carry += v->ob_digit[i+k] + w->ob_digit[i];
1173 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001174 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1175 BASE_TWODIGITS_TYPE,
1176 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001177 }
1178 }
1179 } /* for j, k */
1180
Guido van Rossumc206c761995-01-10 15:23:19 +00001181 if (a == NULL)
1182 *prem = NULL;
1183 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001184 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001185 *prem = divrem1(v, d, &d);
1186 /* d receives the (unused) remainder */
1187 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001188 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001189 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001190 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001191 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001192 Py_DECREF(v);
1193 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001194 return a;
1195}
1196
1197/* Methods */
1198
1199static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001200long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001201{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001202 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001203}
1204
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001205static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001206long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001207{
Fred Drake121ee271999-12-23 15:41:28 +00001208 return long_format(v, 10, 1);
1209}
1210
1211static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001212long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001213{
1214 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001215}
1216
1217static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001218long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001219{
1220 int sign;
1221
Guido van Rossumc6913e71991-11-19 20:26:46 +00001222 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001223 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001224 sign = 0;
1225 else
1226 sign = a->ob_size - b->ob_size;
1227 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001228 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001229 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001230 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1231 ;
1232 if (i < 0)
1233 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001234 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001235 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001236 if (a->ob_size < 0)
1237 sign = -sign;
1238 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001239 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001240 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001241}
1242
Guido van Rossum9bfef441993-03-29 10:43:31 +00001243static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001244long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001245{
1246 long x;
1247 int i, sign;
1248
1249 /* This is designed so that Python ints and longs with the
1250 same value hash to the same value, otherwise comparisons
1251 of mapping keys will turn out weird */
1252 i = v->ob_size;
1253 sign = 1;
1254 x = 0;
1255 if (i < 0) {
1256 sign = -1;
1257 i = -(i);
1258 }
1259 while (--i >= 0) {
1260 /* Force a 32-bit circular shift */
1261 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1262 x += v->ob_digit[i];
1263 }
1264 x = x * sign;
1265 if (x == -1)
1266 x = -2;
1267 return x;
1268}
1269
1270
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001271/* Add the absolute values of two long integers. */
1272
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001273static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001274x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001275{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001276 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001277 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001278 int i;
1279 digit carry = 0;
1280
1281 /* Ensure a is the larger of the two: */
1282 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283 { PyLongObject *temp = a; a = b; b = temp; }
1284 { int size_temp = size_a;
1285 size_a = size_b;
1286 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001287 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001288 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001289 if (z == NULL)
1290 return NULL;
1291 for (i = 0; i < size_b; ++i) {
1292 carry += a->ob_digit[i] + b->ob_digit[i];
1293 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001294 carry >>= SHIFT;
1295 }
1296 for (; i < size_a; ++i) {
1297 carry += a->ob_digit[i];
1298 z->ob_digit[i] = carry & MASK;
1299 carry >>= SHIFT;
1300 }
1301 z->ob_digit[i] = carry;
1302 return long_normalize(z);
1303}
1304
1305/* Subtract the absolute values of two integers. */
1306
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001308x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001309{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001310 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001312 int i;
1313 int sign = 1;
1314 digit borrow = 0;
1315
1316 /* Ensure a is the larger of the two: */
1317 if (size_a < size_b) {
1318 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 { PyLongObject *temp = a; a = b; b = temp; }
1320 { int size_temp = size_a;
1321 size_a = size_b;
1322 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001323 }
1324 else if (size_a == size_b) {
1325 /* Find highest digit where a and b differ: */
1326 i = size_a;
1327 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1328 ;
1329 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001330 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001331 if (a->ob_digit[i] < b->ob_digit[i]) {
1332 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001334 }
1335 size_a = size_b = i+1;
1336 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001337 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001338 if (z == NULL)
1339 return NULL;
1340 for (i = 0; i < size_b; ++i) {
1341 /* The following assumes unsigned arithmetic
1342 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001343 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001344 z->ob_digit[i] = borrow & MASK;
1345 borrow >>= SHIFT;
1346 borrow &= 1; /* Keep only one sign bit */
1347 }
1348 for (; i < size_a; ++i) {
1349 borrow = a->ob_digit[i] - borrow;
1350 z->ob_digit[i] = borrow & MASK;
1351 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001352 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001353 }
1354 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001355 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001356 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001357 return long_normalize(z);
1358}
1359
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001361long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001362{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001363 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001364
Neil Schemenauerba872e22001-01-04 01:46:03 +00001365 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1366
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001367 if (a->ob_size < 0) {
1368 if (b->ob_size < 0) {
1369 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001370 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001371 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001372 }
1373 else
1374 z = x_sub(b, a);
1375 }
1376 else {
1377 if (b->ob_size < 0)
1378 z = x_sub(a, b);
1379 else
1380 z = x_add(a, b);
1381 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001382 Py_DECREF(a);
1383 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001384 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001385}
1386
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001388long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001389{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001390 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001391
Neil Schemenauerba872e22001-01-04 01:46:03 +00001392 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1393
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001394 if (a->ob_size < 0) {
1395 if (b->ob_size < 0)
1396 z = x_sub(a, b);
1397 else
1398 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001399 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001400 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001401 }
1402 else {
1403 if (b->ob_size < 0)
1404 z = x_add(a, b);
1405 else
1406 z = x_sub(a, b);
1407 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001408 Py_DECREF(a);
1409 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001410 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001411}
1412
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001413static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001414long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001415{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001416 /* sequence * long */
1417 long n = PyLong_AsLong((PyObject *) w);
1418 if (n == -1 && PyErr_Occurred())
1419 return NULL;
1420 else
1421 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1422}
1423
1424static PyObject *
1425long_mul(PyLongObject *v, PyLongObject *w)
1426{
1427 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001428 int size_a;
1429 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001430 int i;
1431
Neil Schemenauerba872e22001-01-04 01:46:03 +00001432 if (v->ob_type->tp_as_sequence &&
1433 v->ob_type->tp_as_sequence->sq_repeat) {
1434 return long_repeat((PyObject *)v, w);
1435 }
1436 else if (w->ob_type->tp_as_sequence &&
1437 w->ob_type->tp_as_sequence->sq_repeat) {
1438 return long_repeat((PyObject *)w, v);
1439 }
1440
1441 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1442
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001443 size_a = ABS(a->ob_size);
1444 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001445 if (size_a > size_b) {
1446 /* we are faster with the small object on the left */
1447 int hold_sa = size_a;
1448 PyLongObject *hold_a = a;
1449 size_a = size_b;
1450 size_b = hold_sa;
1451 a = b;
1452 b = hold_a;
1453 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001454 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001455 if (z == NULL) {
1456 Py_DECREF(a);
1457 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001458 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001459 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001460 for (i = 0; i < z->ob_size; ++i)
1461 z->ob_digit[i] = 0;
1462 for (i = 0; i < size_a; ++i) {
1463 twodigits carry = 0;
1464 twodigits f = a->ob_digit[i];
1465 int j;
1466
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001467 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001468 Py_DECREF(a);
1469 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001470 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001471 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001472 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001473 for (j = 0; j < size_b; ++j) {
1474 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001475 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001476 carry >>= SHIFT;
1477 }
1478 for (; carry != 0; ++j) {
1479 assert(i+j < z->ob_size);
1480 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001481 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001482 carry >>= SHIFT;
1483 }
1484 }
1485 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001486 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001487 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001488 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001489 Py_DECREF(a);
1490 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001491 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001492}
1493
Guido van Rossume32e0141992-01-19 16:31:05 +00001494/* The / and % operators are now defined in terms of divmod().
1495 The expression a mod b has the value a - b*floor(a/b).
1496 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001497 |a| by |b|, with the sign of a. This is also expressed
1498 as a - b*trunc(a/b), if trunc truncates towards zero.
1499 Some examples:
1500 a b a rem b a mod b
1501 13 10 3 3
1502 -13 10 -3 7
1503 13 -10 3 -7
1504 -13 -10 -3 -3
1505 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001506 have different signs. We then subtract one from the 'div'
1507 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001508
Guido van Rossume32e0141992-01-19 16:31:05 +00001509static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001510l_divmod(PyLongObject *v, PyLongObject *w,
1511 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001512{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001513 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001514
1515 if (long_divrem(v, w, &div, &mod) < 0)
1516 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001517 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1518 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001519 PyLongObject *temp;
1520 PyLongObject *one;
1521 temp = (PyLongObject *) long_add(mod, w);
1522 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001523 mod = temp;
1524 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001525 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001526 return -1;
1527 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001528 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001529 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001530 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1531 Py_DECREF(mod);
1532 Py_DECREF(div);
1533 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001534 return -1;
1535 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 Py_DECREF(one);
1537 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001538 div = temp;
1539 }
1540 *pdiv = div;
1541 *pmod = mod;
1542 return 0;
1543}
1544
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001545static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001546long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001547{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001548 PyLongObject *a, *b, *div, *mod;
1549
1550 CONVERT_BINOP(v, w, &a, &b);
1551
1552 if (l_divmod(a, b, &div, &mod) < 0) {
1553 Py_DECREF(a);
1554 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001555 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001556 }
1557 Py_DECREF(a);
1558 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001559 Py_DECREF(mod);
1560 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001561}
1562
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001563static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001564long_classic_div(PyObject *v, PyObject *w)
1565{
1566 PyLongObject *a, *b, *div, *mod;
1567
1568 CONVERT_BINOP(v, w, &a, &b);
1569
1570 if (Py_DivisionWarningFlag &&
1571 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1572 div = NULL;
1573 else if (l_divmod(a, b, &div, &mod) < 0)
1574 div = NULL;
1575 else
1576 Py_DECREF(mod);
1577
1578 Py_DECREF(a);
1579 Py_DECREF(b);
1580 return (PyObject *)div;
1581}
1582
1583static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001584long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001585{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001586 PyLongObject *a, *b, *div, *mod;
1587
1588 CONVERT_BINOP(v, w, &a, &b);
1589
1590 if (l_divmod(a, b, &div, &mod) < 0) {
1591 Py_DECREF(a);
1592 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001593 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001594 }
1595 Py_DECREF(a);
1596 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001597 Py_DECREF(div);
1598 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001599}
1600
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001601static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001602long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001603{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001604 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001605 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001606
1607 CONVERT_BINOP(v, w, &a, &b);
1608
1609 if (l_divmod(a, b, &div, &mod) < 0) {
1610 Py_DECREF(a);
1611 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001612 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001613 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001614 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001615 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001616 PyTuple_SetItem(z, 0, (PyObject *) div);
1617 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001618 }
1619 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001620 Py_DECREF(div);
1621 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001622 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001623 Py_DECREF(a);
1624 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001625 return z;
1626}
1627
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001628static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001629long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001630{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001631 PyLongObject *a, *b;
1632 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001633 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001634 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001635
1636 CONVERT_BINOP(v, w, &a, &b);
1637 if (PyLong_Check(x) || Py_None == x) {
1638 c = x;
1639 Py_INCREF(x);
1640 }
1641 else if (PyInt_Check(x)) {
1642 c = PyLong_FromLong(PyInt_AS_LONG(x));
1643 }
1644 else {
1645 Py_DECREF(a);
1646 Py_DECREF(b);
1647 Py_INCREF(Py_NotImplemented);
1648 return Py_NotImplemented;
1649 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001650
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001651 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001652 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001653 Py_DECREF(a);
1654 Py_DECREF(b);
1655 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00001656 if (x != Py_None) {
1657 PyErr_SetString(PyExc_TypeError, "integer pow() arg "
1658 "3 must not be specified when arg 2 is < 0");
1659 return NULL;
1660 }
1661 /* Return a float. This works because we know that
1662 this calls float_pow() which converts its
1663 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001664 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001665 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001666 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001667 for (i = 0; i < size_b; ++i) {
1668 digit bi = b->ob_digit[i];
1669 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001670
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001671 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001672 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001673
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001674 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001675 temp = (PyLongObject *)long_mul(z, a);
1676 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001677 if (c!=Py_None && temp!=NULL) {
1678 if (l_divmod(temp,(PyLongObject *)c,
1679 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001680 Py_DECREF(temp);
1681 z = NULL;
1682 goto error;
1683 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001684 Py_XDECREF(div);
1685 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001686 temp = mod;
1687 }
1688 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001689 if (z == NULL)
1690 break;
1691 }
1692 bi >>= 1;
1693 if (bi == 0 && i+1 == size_b)
1694 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001695 temp = (PyLongObject *)long_mul(a, a);
1696 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001697 if (c!=Py_None && temp!=NULL) {
1698 if (l_divmod(temp, (PyLongObject *)c, &div,
1699 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001700 Py_DECREF(temp);
1701 z = NULL;
1702 goto error;
1703 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001704 Py_XDECREF(div);
1705 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001706 temp = mod;
1707 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001708 a = temp;
1709 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001710 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001711 z = NULL;
1712 break;
1713 }
1714 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001715 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001716 break;
1717 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001718 if (c!=Py_None && z!=NULL) {
1719 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001720 Py_DECREF(z);
1721 z = NULL;
1722 }
1723 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001724 Py_XDECREF(div);
1725 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001726 z = mod;
1727 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001728 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001729 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001730 Py_XDECREF(a);
1731 Py_DECREF(b);
1732 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001733 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001734}
1735
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001736static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001737long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001738{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001739 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001740 PyLongObject *x;
1741 PyLongObject *w;
1742 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001743 if (w == NULL)
1744 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001745 x = (PyLongObject *) long_add(v, w);
1746 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001747 if (x == NULL)
1748 return NULL;
1749 if (x->ob_size != 0)
1750 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001751 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001752}
1753
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001754static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001755long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001756{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001757 Py_INCREF(v);
1758 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001759}
1760
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001761static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001762long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001763{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001764 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001765 int i, n;
1766 n = ABS(v->ob_size);
1767 if (n == 0) {
1768 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001769 Py_INCREF(v);
1770 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001771 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001772 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001773 if (z == NULL)
1774 return NULL;
1775 for (i = 0; i < n; i++)
1776 z->ob_digit[i] = v->ob_digit[i];
1777 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001778 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001779}
1780
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001781static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001782long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001783{
1784 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001785 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001786 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001787 Py_INCREF(v);
1788 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001789 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001790}
1791
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001792static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001793long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001794{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001795 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001796}
1797
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001798static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001799long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001800{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001801 PyLongObject *a, *b;
1802 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001803 long shiftby;
1804 int newsize, wordshift, loshift, hishift, i, j;
1805 digit lomask, himask;
1806
Neil Schemenauerba872e22001-01-04 01:46:03 +00001807 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1808
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001809 if (a->ob_size < 0) {
1810 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001811 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001812 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001813 if (a1 == NULL)
1814 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001815 a2 = (PyLongObject *) long_rshift(a1, b);
1816 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001817 if (a2 == NULL)
1818 goto rshift_error;
1819 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001820 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001821 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001822 else {
1823
1824 shiftby = PyLong_AsLong((PyObject *)b);
1825 if (shiftby == -1L && PyErr_Occurred())
1826 goto rshift_error;
1827 if (shiftby < 0) {
1828 PyErr_SetString(PyExc_ValueError,
1829 "negative shift count");
1830 goto rshift_error;
1831 }
1832 wordshift = shiftby / SHIFT;
1833 newsize = ABS(a->ob_size) - wordshift;
1834 if (newsize <= 0) {
1835 z = _PyLong_New(0);
1836 Py_DECREF(a);
1837 Py_DECREF(b);
1838 return (PyObject *)z;
1839 }
1840 loshift = shiftby % SHIFT;
1841 hishift = SHIFT - loshift;
1842 lomask = ((digit)1 << hishift) - 1;
1843 himask = MASK ^ lomask;
1844 z = _PyLong_New(newsize);
1845 if (z == NULL)
1846 goto rshift_error;
1847 if (a->ob_size < 0)
1848 z->ob_size = -(z->ob_size);
1849 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1850 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1851 if (i+1 < newsize)
1852 z->ob_digit[i] |=
1853 (a->ob_digit[j+1] << hishift) & himask;
1854 }
1855 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001856 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001857rshift_error:
1858 Py_DECREF(a);
1859 Py_DECREF(b);
1860 return (PyObject *) z;
1861
Guido van Rossumc6913e71991-11-19 20:26:46 +00001862}
1863
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001864static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001865long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001866{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001867 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001868 PyLongObject *a, *b;
1869 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001870 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001871 int oldsize, newsize, wordshift, remshift, i, j;
1872 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001873
Neil Schemenauerba872e22001-01-04 01:46:03 +00001874 CONVERT_BINOP(v, w, &a, &b);
1875
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001876 shiftby = PyLong_AsLong((PyObject *)b);
1877 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001878 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001879 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001880 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001881 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001882 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001883 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001884 PyErr_SetString(PyExc_ValueError,
1885 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001886 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001887 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001888 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1889 wordshift = (int)shiftby / SHIFT;
1890 remshift = (int)shiftby - wordshift * SHIFT;
1891
1892 oldsize = ABS(a->ob_size);
1893 newsize = oldsize + wordshift;
1894 if (remshift)
1895 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001896 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001897 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001898 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001899 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001900 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001901 for (i = 0; i < wordshift; i++)
1902 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001903 accum = 0;
1904 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1905 accum |= a->ob_digit[j] << remshift;
1906 z->ob_digit[i] = (digit)(accum & MASK);
1907 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001908 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001909 if (remshift)
1910 z->ob_digit[newsize-1] = (digit)accum;
1911 else
1912 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001913 z = long_normalize(z);
1914lshift_error:
1915 Py_DECREF(a);
1916 Py_DECREF(b);
1917 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001918}
1919
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001920
1921/* Bitwise and/xor/or operations */
1922
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001923#define MAX(x, y) ((x) < (y) ? (y) : (x))
1924#define MIN(x, y) ((x) > (y) ? (y) : (x))
1925
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001926static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001927long_bitwise(PyLongObject *a,
1928 int op, /* '&', '|', '^' */
1929 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001930{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001931 digit maska, maskb; /* 0 or MASK */
1932 int negz;
1933 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001934 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001935 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001936 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001937 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001938
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001939 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001940 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001941 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001942 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001943 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001944 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001945 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001946 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001947 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001948 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001949 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001950 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001951 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001952 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001953 maskb = 0;
1954 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001955
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001956 negz = 0;
1957 switch (op) {
1958 case '^':
1959 if (maska != maskb) {
1960 maska ^= MASK;
1961 negz = -1;
1962 }
1963 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001964 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001965 if (maska && maskb) {
1966 op = '|';
1967 maska ^= MASK;
1968 maskb ^= MASK;
1969 negz = -1;
1970 }
1971 break;
1972 case '|':
1973 if (maska || maskb) {
1974 op = '&';
1975 maska ^= MASK;
1976 maskb ^= MASK;
1977 negz = -1;
1978 }
1979 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001980 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001981
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001982 /* JRH: The original logic here was to allocate the result value (z)
1983 as the longer of the two operands. However, there are some cases
1984 where the result is guaranteed to be shorter than that: AND of two
1985 positives, OR of two negatives: use the shorter number. AND with
1986 mixed signs: use the positive number. OR with mixed signs: use the
1987 negative number. After the transformations above, op will be '&'
1988 iff one of these cases applies, and mask will be non-0 for operands
1989 whose length should be ignored.
1990 */
1991
1992 size_a = a->ob_size;
1993 size_b = b->ob_size;
1994 size_z = op == '&'
1995 ? (maska
1996 ? size_b
1997 : (maskb ? size_a : MIN(size_a, size_b)))
1998 : MAX(size_a, size_b);
1999 z = _PyLong_New(size_z);
2000 if (a == NULL || b == NULL || z == NULL) {
2001 Py_XDECREF(a);
2002 Py_XDECREF(b);
2003 Py_XDECREF(z);
2004 return NULL;
2005 }
2006
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002007 for (i = 0; i < size_z; ++i) {
2008 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2009 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2010 switch (op) {
2011 case '&': z->ob_digit[i] = diga & digb; break;
2012 case '|': z->ob_digit[i] = diga | digb; break;
2013 case '^': z->ob_digit[i] = diga ^ digb; break;
2014 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002015 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002016
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002017 Py_DECREF(a);
2018 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002019 z = long_normalize(z);
2020 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002021 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002022 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002023 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002024 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002025}
2026
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002027static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002028long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002029{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002030 PyLongObject *a, *b;
2031 PyObject *c;
2032 CONVERT_BINOP(v, w, &a, &b);
2033 c = long_bitwise(a, '&', b);
2034 Py_DECREF(a);
2035 Py_DECREF(b);
2036 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002037}
2038
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002039static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002040long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002041{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002042 PyLongObject *a, *b;
2043 PyObject *c;
2044 CONVERT_BINOP(v, w, &a, &b);
2045 c = long_bitwise(a, '^', b);
2046 Py_DECREF(a);
2047 Py_DECREF(b);
2048 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002049}
2050
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002051static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002052long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002053{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002054 PyLongObject *a, *b;
2055 PyObject *c;
2056 CONVERT_BINOP(v, w, &a, &b);
2057 c = long_bitwise(a, '|', b);
2058 Py_DECREF(a);
2059 Py_DECREF(b);
2060 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002061}
2062
Guido van Rossum4668b002001-08-08 05:00:18 +00002063static PyObject *
2064long_true_divide(PyObject *v, PyObject *w)
2065{
2066 return PyFloat_Type.tp_as_number->nb_divide(v, w);
2067}
2068
Guido van Rossum234f9421993-06-17 12:35:49 +00002069static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002070long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002071{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002072 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002073 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002074 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002075 return 0;
2076 }
2077 return 1; /* Can't do it */
2078}
2079
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002080static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002081long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002082{
2083 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002084 x = PyLong_AsLong(v);
2085 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002086 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002087 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002088}
2089
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002090static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002091long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002092{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002093 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002094 return v;
2095}
2096
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002097static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002098long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002099{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002100 double result;
2101 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002102 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00002103 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002104 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002105}
2106
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002107static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002108long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002109{
Fred Drake121ee271999-12-23 15:41:28 +00002110 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002111}
2112
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002113static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002114long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002115{
Fred Drake121ee271999-12-23 15:41:28 +00002116 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002117}
Guido van Rossumbef14172001-08-29 15:47:46 +00002118staticforward PyObject *
2119long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002120
Tim Peters6d6c1a32001-08-02 04:15:00 +00002121static PyObject *
2122long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2123{
2124 PyObject *x = NULL;
2125 int base = -909; /* unlikely! */
2126 static char *kwlist[] = {"x", "base", 0};
2127
Guido van Rossumbef14172001-08-29 15:47:46 +00002128 if (type != &PyLong_Type)
2129 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002130 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2131 &x, &base))
2132 return NULL;
2133 if (x == NULL)
2134 return PyLong_FromLong(0L);
2135 if (base == -909)
2136 return PyNumber_Long(x);
2137 else if (PyString_Check(x))
2138 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002139#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002140 else if (PyUnicode_Check(x))
2141 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2142 PyUnicode_GET_SIZE(x),
2143 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002144#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002145 else {
2146 PyErr_SetString(PyExc_TypeError,
2147 "long() can't convert non-string with explicit base");
2148 return NULL;
2149 }
2150}
2151
Guido van Rossumbef14172001-08-29 15:47:46 +00002152/* Wimpy, slow approach to tp_new calls for subtypes of long:
2153 first create a regular long from whatever arguments we got,
2154 then allocate a subtype instance and initialize it from
2155 the regular long. The regular long is then thrown away.
2156*/
2157static PyObject *
2158long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2159{
2160 PyLongObject *tmp, *new;
2161 int i, n;
2162
2163 assert(PyType_IsSubtype(type, &PyLong_Type));
2164 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2165 if (tmp == NULL)
2166 return NULL;
2167 assert(PyLong_Check(tmp));
2168 n = tmp->ob_size;
2169 if (n < 0)
2170 n = -n;
2171 new = (PyLongObject *)type->tp_alloc(type, n);
2172 if (new == NULL)
2173 return NULL;
2174 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002175 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002176 for (i = 0; i < n; i++)
2177 new->ob_digit[i] = tmp->ob_digit[i];
2178 Py_DECREF(tmp);
2179 return (PyObject *)new;
2180}
2181
Tim Peters6d6c1a32001-08-02 04:15:00 +00002182static char long_doc[] =
2183"long(x[, base]) -> integer\n\
2184\n\
2185Convert a string or number to a long integer, if possible. A floating\n\
2186point argument will be truncated towards zero (this does not include a\n\
2187string representation of a floating point number!) When converting a\n\
2188string, use the optional base. It is an error to supply a base when\n\
2189converting a non-string.";
2190
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002191static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002192 (binaryfunc) long_add, /*nb_add*/
2193 (binaryfunc) long_sub, /*nb_subtract*/
2194 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002195 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002196 (binaryfunc) long_mod, /*nb_remainder*/
2197 (binaryfunc) long_divmod, /*nb_divmod*/
2198 (ternaryfunc) long_pow, /*nb_power*/
2199 (unaryfunc) long_neg, /*nb_negative*/
2200 (unaryfunc) long_pos, /*tp_positive*/
2201 (unaryfunc) long_abs, /*tp_absolute*/
2202 (inquiry) long_nonzero, /*tp_nonzero*/
2203 (unaryfunc) long_invert, /*nb_invert*/
2204 (binaryfunc) long_lshift, /*nb_lshift*/
2205 (binaryfunc) long_rshift, /*nb_rshift*/
2206 (binaryfunc) long_and, /*nb_and*/
2207 (binaryfunc) long_xor, /*nb_xor*/
2208 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002209 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002210 (unaryfunc) long_int, /*nb_int*/
2211 (unaryfunc) long_long, /*nb_long*/
2212 (unaryfunc) long_float, /*nb_float*/
2213 (unaryfunc) long_oct, /*nb_oct*/
2214 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002215 0, /* nb_inplace_add */
2216 0, /* nb_inplace_subtract */
2217 0, /* nb_inplace_multiply */
2218 0, /* nb_inplace_divide */
2219 0, /* nb_inplace_remainder */
2220 0, /* nb_inplace_power */
2221 0, /* nb_inplace_lshift */
2222 0, /* nb_inplace_rshift */
2223 0, /* nb_inplace_and */
2224 0, /* nb_inplace_xor */
2225 0, /* nb_inplace_or */
2226 (binaryfunc)long_div, /* nb_floor_divide */
2227 long_true_divide, /* nb_true_divide */
2228 0, /* nb_inplace_floor_divide */
2229 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002230};
2231
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002232PyTypeObject PyLong_Type = {
2233 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002234 0, /* ob_size */
2235 "long", /* tp_name */
2236 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2237 sizeof(digit), /* tp_itemsize */
2238 (destructor)long_dealloc, /* tp_dealloc */
2239 0, /* tp_print */
2240 0, /* tp_getattr */
2241 0, /* tp_setattr */
2242 (cmpfunc)long_compare, /* tp_compare */
2243 (reprfunc)long_repr, /* tp_repr */
2244 &long_as_number, /* tp_as_number */
2245 0, /* tp_as_sequence */
2246 0, /* tp_as_mapping */
2247 (hashfunc)long_hash, /* tp_hash */
2248 0, /* tp_call */
2249 (reprfunc)long_str, /* tp_str */
2250 PyObject_GenericGetAttr, /* tp_getattro */
2251 0, /* tp_setattro */
2252 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002253 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2254 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002255 long_doc, /* tp_doc */
2256 0, /* tp_traverse */
2257 0, /* tp_clear */
2258 0, /* tp_richcompare */
2259 0, /* tp_weaklistoffset */
2260 0, /* tp_iter */
2261 0, /* tp_iternext */
2262 0, /* tp_methods */
2263 0, /* tp_members */
2264 0, /* tp_getset */
2265 0, /* tp_base */
2266 0, /* tp_dict */
2267 0, /* tp_descr_get */
2268 0, /* tp_descr_set */
2269 0, /* tp_dictoffset */
2270 0, /* tp_init */
2271 0, /* tp_alloc */
2272 long_new, /* tp_new */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002273};