blob: 01a7276893426c7ade9f0f95cd5ad90802019b54 [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001
2/* Long (arbitrary precision) integer object implementation */
3
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004/* XXX The functional organization of this file is terrible */
5
Guido van Rossumc0b618a1997-05-02 03:12:38 +00006#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +00007#include "longintrepr.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00009#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000010
Guido van Rossume32e0141992-01-19 16:31:05 +000011#define ABS(x) ((x) < 0 ? -(x) : (x))
12
13/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000014static PyLongObject *long_normalize(PyLongObject *);
15static PyLongObject *mul1(PyLongObject *, wdigit);
16static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
Tim Peters212e6142001-07-14 12:23:19 +000017static PyLongObject *divrem1(PyLongObject *, digit, digit *);
Tim Peters9f688bf2000-07-07 15:53:28 +000018static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000019
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000020static int ticker; /* XXX Could be shared with ceval? */
21
Guido van Rossumc0b618a1997-05-02 03:12:38 +000022#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000023 if (--ticker < 0) { \
24 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000025 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000026 }
27
Guido van Rossumedcc38a1991-05-05 20:09:44 +000028/* Normalize (remove leading zeros from) a long int object.
29 Doesn't attempt to free the storage--in most cases, due to the nature
30 of the algorithms used, this could save at most be one word anyway. */
31
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000033long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000034{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000035 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000036 register int i = j;
37
38 while (i > 0 && v->ob_digit[i-1] == 0)
39 --i;
40 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000041 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000042 return v;
43}
44
45/* Allocate a new long int object with size digits.
46 Return NULL and set exception if we run out of memory. */
47
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000049_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000050{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000052}
53
54/* Create a new long int object from a C long int */
55
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000057PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000058{
Tim Petersce9de2f2001-06-14 04:56:19 +000059 PyLongObject *v;
60 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
61 int ndigits = 0;
62 int negative = 0;
63
64 if (ival < 0) {
65 ival = -ival;
66 negative = 1;
67 }
68
69 /* Count the number of Python digits.
70 We used to pick 5 ("big enough for anything"), but that's a
71 waste of time and space given that 5*15 = 75 bits are rarely
72 needed. */
73 t = (unsigned long)ival;
74 while (t) {
75 ++ndigits;
76 t >>= SHIFT;
77 }
78 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000079 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +000080 digit *p = v->ob_digit;
81 v->ob_size = negative ? -ndigits : ndigits;
82 t = (unsigned long)ival;
83 while (t) {
84 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000085 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000087 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000089}
90
Guido van Rossum53756b11997-01-03 17:14:46 +000091/* Create a new long int object from a C unsigned long int */
92
Guido van Rossumc0b618a1997-05-02 03:12:38 +000093PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000094PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +000095{
Tim Petersce9de2f2001-06-14 04:56:19 +000096 PyLongObject *v;
97 unsigned long t;
98 int ndigits = 0;
99
100 /* Count the number of Python digits. */
101 t = (unsigned long)ival;
102 while (t) {
103 ++ndigits;
104 t >>= SHIFT;
105 }
106 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000107 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000108 digit *p = v->ob_digit;
109 v->ob_size = ndigits;
110 while (ival) {
111 *p++ = (digit)(ival & MASK);
112 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000113 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000114 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000116}
117
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000118/* Create a new long int object from a C double */
119
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000122{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000124 double frac;
125 int i, ndig, expo, neg;
126 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000127 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000128 PyErr_SetString(PyExc_OverflowError,
129 "cannot convert float infinity to long");
130 return NULL;
131 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000132 if (dval < 0.0) {
133 neg = 1;
134 dval = -dval;
135 }
136 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
137 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000139 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000141 if (v == NULL)
142 return NULL;
143 frac = ldexp(frac, (expo-1) % SHIFT + 1);
144 for (i = ndig; --i >= 0; ) {
145 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000146 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000147 frac = frac - (double)bits;
148 frac = ldexp(frac, SHIFT);
149 }
150 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000151 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000153}
154
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000155/* Get a C long int from a long int object.
156 Returns -1 and sets an error condition if overflow occurs. */
157
158long
Tim Peters9f688bf2000-07-07 15:53:28 +0000159PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000160{
Guido van Rossumf7531811998-05-26 14:33:37 +0000161 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000163 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000164 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000165
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000166 if (vv == NULL || !PyLong_Check(vv)) {
167 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000168 return -1;
169 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000171 i = v->ob_size;
172 sign = 1;
173 x = 0;
174 if (i < 0) {
175 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000176 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000177 }
178 while (--i >= 0) {
179 prev = x;
180 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000181 if ((x >> SHIFT) != prev)
182 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000183 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000184 /* Haven't lost any bits, but if the sign bit is set we're in
185 * trouble *unless* this is the min negative number. So,
186 * trouble iff sign bit set && (positive || some bit set other
187 * than the sign bit).
188 */
189 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
190 goto overflow;
191 return (long)x * sign;
192
193 overflow:
194 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000195 "long int too large to convert");
Guido van Rossumf7531811998-05-26 14:33:37 +0000196 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000197}
198
Guido van Rossum53756b11997-01-03 17:14:46 +0000199/* Get a C long int from a long int object.
200 Returns -1 and sets an error condition if overflow occurs. */
201
202unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000203PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000204{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000206 unsigned long x, prev;
207 int i;
208
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 if (vv == NULL || !PyLong_Check(vv)) {
210 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000211 return (unsigned long) -1;
212 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000214 i = v->ob_size;
215 x = 0;
216 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000218 "can't convert negative value to unsigned long");
219 return (unsigned long) -1;
220 }
221 while (--i >= 0) {
222 prev = x;
223 x = (x << SHIFT) + v->ob_digit[i];
224 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000226 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000227 return (unsigned long) -1;
228 }
229 }
230 return x;
231}
232
Tim Peters2a9b3672001-06-11 21:23:58 +0000233PyObject *
234_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
235 int little_endian, int is_signed)
236{
237 const unsigned char* pstartbyte;/* LSB of bytes */
238 int incr; /* direction to move pstartbyte */
239 const unsigned char* pendbyte; /* MSB of bytes */
240 size_t numsignificantbytes; /* number of bytes that matter */
241 size_t ndigits; /* number of Python long digits */
242 PyLongObject* v; /* result */
243 int idigit = 0; /* next free index in v->ob_digit */
244
245 if (n == 0)
246 return PyLong_FromLong(0L);
247
248 if (little_endian) {
249 pstartbyte = bytes;
250 pendbyte = bytes + n - 1;
251 incr = 1;
252 }
253 else {
254 pstartbyte = bytes + n - 1;
255 pendbyte = bytes;
256 incr = -1;
257 }
258
259 if (is_signed)
260 is_signed = *pendbyte >= 0x80;
261
262 /* Compute numsignificantbytes. This consists of finding the most
263 significant byte. Leading 0 bytes are insignficant if the number
264 is positive, and leading 0xff bytes if negative. */
265 {
266 size_t i;
267 const unsigned char* p = pendbyte;
268 const int pincr = -incr; /* search MSB to LSB */
269 const unsigned char insignficant = is_signed ? 0xff : 0x00;
270
271 for (i = 0; i < n; ++i, p += pincr) {
272 if (*p != insignficant)
273 break;
274 }
275 numsignificantbytes = n - i;
276 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
277 actually has 2 significant bytes. OTOH, 0xff0001 ==
278 -0x00ffff, so we wouldn't *need* to bump it there; but we
279 do for 0xffff = -0x0001. To be safe without bothering to
280 check every case, bump it regardless. */
281 if (is_signed && numsignificantbytes < n)
282 ++numsignificantbytes;
283 }
284
285 /* How many Python long digits do we need? We have
286 8*numsignificantbytes bits, and each Python long digit has SHIFT
287 bits, so it's the ceiling of the quotient. */
288 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
289 if (ndigits > (size_t)INT_MAX)
290 return PyErr_NoMemory();
291 v = _PyLong_New((int)ndigits);
292 if (v == NULL)
293 return NULL;
294
295 /* Copy the bits over. The tricky parts are computing 2's-comp on
296 the fly for signed numbers, and dealing with the mismatch between
297 8-bit bytes and (probably) 15-bit Python digits.*/
298 {
299 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000300 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000301 twodigits accum = 0; /* sliding register */
302 unsigned int accumbits = 0; /* number of bits in accum */
303 const unsigned char* p = pstartbyte;
304
305 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000306 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000307 /* Compute correction for 2's comp, if needed. */
308 if (is_signed) {
309 thisbyte = (0xff ^ thisbyte) + carry;
310 carry = thisbyte >> 8;
311 thisbyte &= 0xff;
312 }
313 /* Because we're going LSB to MSB, thisbyte is
314 more significant than what's already in accum,
315 so needs to be prepended to accum. */
316 accum |= thisbyte << accumbits;
317 accumbits += 8;
318 if (accumbits >= SHIFT) {
319 /* There's enough to fill a Python digit. */
320 assert(idigit < (int)ndigits);
321 v->ob_digit[idigit] = (digit)(accum & MASK);
322 ++idigit;
323 accum >>= SHIFT;
324 accumbits -= SHIFT;
325 assert(accumbits < SHIFT);
326 }
327 }
328 assert(accumbits < SHIFT);
329 if (accumbits) {
330 assert(idigit < (int)ndigits);
331 v->ob_digit[idigit] = (digit)accum;
332 ++idigit;
333 }
334 }
335
336 v->ob_size = is_signed ? -idigit : idigit;
337 return (PyObject *)long_normalize(v);
338}
339
340int
341_PyLong_AsByteArray(PyLongObject* v,
342 unsigned char* bytes, size_t n,
343 int little_endian, int is_signed)
344{
345 int i; /* index into v->ob_digit */
346 int ndigits; /* |v->ob_size| */
347 twodigits accum; /* sliding register */
348 unsigned int accumbits; /* # bits in accum */
349 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
350 twodigits carry; /* for computing 2's-comp */
351 size_t j; /* # bytes filled */
352 unsigned char* p; /* pointer to next byte in bytes */
353 int pincr; /* direction to move p */
354
355 assert(v != NULL && PyLong_Check(v));
356
357 if (v->ob_size < 0) {
358 ndigits = -(v->ob_size);
359 if (!is_signed) {
360 PyErr_SetString(PyExc_TypeError,
361 "can't convert negative long to unsigned");
362 return -1;
363 }
364 do_twos_comp = 1;
365 }
366 else {
367 ndigits = v->ob_size;
368 do_twos_comp = 0;
369 }
370
371 if (little_endian) {
372 p = bytes;
373 pincr = 1;
374 }
375 else {
376 p = bytes + n - 1;
377 pincr = -1;
378 }
379
Tim Peters898cf852001-06-13 20:50:08 +0000380 /* Copy over all the Python digits.
381 It's crucial that every Python digit except for the MSD contribute
382 exactly SHIFT bits to the total, so first assert that the long is
383 normalized. */
384 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000385 j = 0;
386 accum = 0;
387 accumbits = 0;
388 carry = do_twos_comp ? 1 : 0;
389 for (i = 0; i < ndigits; ++i) {
390 twodigits thisdigit = v->ob_digit[i];
391 if (do_twos_comp) {
392 thisdigit = (thisdigit ^ MASK) + carry;
393 carry = thisdigit >> SHIFT;
394 thisdigit &= MASK;
395 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000396 /* Because we're going LSB to MSB, thisdigit is more
397 significant than what's already in accum, so needs to be
398 prepended to accum. */
399 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000400 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000401
Tim Petersede05092001-06-14 08:53:38 +0000402 /* The most-significant digit may be (probably is) at least
403 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000404 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000405 /* Count # of sign bits -- they needn't be stored,
406 * although for signed conversion we need later to
407 * make sure at least one sign bit gets stored.
408 * First shift conceptual sign bit to real sign bit.
409 */
410 stwodigits s = (stwodigits)(thisdigit <<
411 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000412 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000413 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000414 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000415 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000416 }
Tim Petersede05092001-06-14 08:53:38 +0000417 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000418 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000419
Tim Peters2a9b3672001-06-11 21:23:58 +0000420 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000421 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000422 if (j >= n)
423 goto Overflow;
424 ++j;
425 *p = (unsigned char)(accum & 0xff);
426 p += pincr;
427 accumbits -= 8;
428 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000429 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000430 }
431
432 /* Store the straggler (if any). */
433 assert(accumbits < 8);
434 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000435 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000436 if (j >= n)
437 goto Overflow;
438 ++j;
439 if (do_twos_comp) {
440 /* Fill leading bits of the byte with sign bits
441 (appropriately pretending that the long had an
442 infinite supply of sign bits). */
443 accum |= (~(twodigits)0) << accumbits;
444 }
445 *p = (unsigned char)(accum & 0xff);
446 p += pincr;
447 }
Tim Peters05607ad2001-06-13 21:01:27 +0000448 else if (j == n && n > 0 && is_signed) {
449 /* The main loop filled the byte array exactly, so the code
450 just above didn't get to ensure there's a sign bit, and the
451 loop below wouldn't add one either. Make sure a sign bit
452 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000453 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000454 int sign_bit_set = msb >= 0x80;
455 assert(accumbits == 0);
456 if (sign_bit_set == do_twos_comp)
457 return 0;
458 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000459 goto Overflow;
460 }
Tim Peters05607ad2001-06-13 21:01:27 +0000461
462 /* Fill remaining bytes with copies of the sign bit. */
463 {
464 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
465 for ( ; j < n; ++j, p += pincr)
466 *p = signbyte;
467 }
468
Tim Peters2a9b3672001-06-11 21:23:58 +0000469 return 0;
470
471Overflow:
472 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
473 return -1;
474
475}
476
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000477/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000478
479double
Tim Peters9f688bf2000-07-07 15:53:28 +0000480PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000481{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000483 double x;
484 double multiplier = (double) (1L << SHIFT);
485 int i, sign;
486
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 if (vv == NULL || !PyLong_Check(vv)) {
488 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000489 return -1;
490 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000492 i = v->ob_size;
493 sign = 1;
494 x = 0.0;
495 if (i < 0) {
496 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000497 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000498 }
499 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000500 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000501 }
502 return x * sign;
503}
504
Guido van Rossum78694d91998-09-18 14:14:13 +0000505/* Create a new long (or int) object from a C pointer */
506
507PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000508PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000509{
Tim Peters70128a12001-06-16 08:48:40 +0000510#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000511 return PyInt_FromLong((long)p);
512#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000513
Tim Peters70128a12001-06-16 08:48:40 +0000514#ifndef HAVE_LONG_LONG
515# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
516#endif
517#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
518# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
519#endif
520 /* optimize null pointers */
521 if (p == NULL)
522 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000523 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000524
525#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000526}
527
528/* Get a C pointer from a long object (or an int object in some cases) */
529
530void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000531PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000532{
533 /* This function will allow int or long objects. If vv is neither,
534 then the PyLong_AsLong*() functions will raise the exception:
535 PyExc_SystemError, "bad argument to internal function"
536 */
Tim Peters70128a12001-06-16 08:48:40 +0000537#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000538 long x;
539
Tim Peters70128a12001-06-16 08:48:40 +0000540 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000541 x = PyInt_AS_LONG(vv);
542 else
543 x = PyLong_AsLong(vv);
544#else
Tim Peters70128a12001-06-16 08:48:40 +0000545
546#ifndef HAVE_LONG_LONG
547# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
548#endif
549#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
550# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
551#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000552 LONG_LONG x;
553
Tim Peters70128a12001-06-16 08:48:40 +0000554 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000555 x = PyInt_AS_LONG(vv);
556 else
557 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000558
559#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000560
561 if (x == -1 && PyErr_Occurred())
562 return NULL;
563 return (void *)x;
564}
565
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000566#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000567
568/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
569 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000570 */
571
Tim Peterscf37dfc2001-06-14 18:42:50 +0000572#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000573
574/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000575
576PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000577PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000578{
Tim Petersd1a7da62001-06-13 00:35:57 +0000579 LONG_LONG bytes = ival;
580 int one = 1;
581 return _PyLong_FromByteArray(
582 (unsigned char *)&bytes,
583 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000584}
585
Tim Petersd1a7da62001-06-13 00:35:57 +0000586/* Create a new long int object from a C unsigned LONG_LONG int. */
587
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000588PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000589PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000590{
Tim Petersd1a7da62001-06-13 00:35:57 +0000591 unsigned LONG_LONG bytes = ival;
592 int one = 1;
593 return _PyLong_FromByteArray(
594 (unsigned char *)&bytes,
595 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000596}
597
Guido van Rossum3293b071998-08-25 16:07:15 +0000598/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000599 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000600
Guido van Rossum3293b071998-08-25 16:07:15 +0000601LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000602PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000603{
Tim Petersd1a7da62001-06-13 00:35:57 +0000604 LONG_LONG bytes;
605 int one = 1;
606 int res;
607
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000608 if (vv == NULL || !PyLong_Check(vv)) {
609 PyErr_BadInternalCall();
610 return -1;
611 }
612
Tim Petersd1a7da62001-06-13 00:35:57 +0000613 res = _PyLong_AsByteArray(
614 (PyLongObject *)vv, (unsigned char *)&bytes,
615 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000616
Tim Peters9cb0c382001-06-13 20:45:17 +0000617 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000618}
619
Tim Petersd1a7da62001-06-13 00:35:57 +0000620/* Get a C unsigned LONG_LONG int from a long int object.
621 Return -1 and set an error if overflow occurs. */
622
Guido van Rossum3293b071998-08-25 16:07:15 +0000623unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000624PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000625{
Tim Petersd1a7da62001-06-13 00:35:57 +0000626 unsigned LONG_LONG bytes;
627 int one = 1;
628 int res;
629
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000630 if (vv == NULL || !PyLong_Check(vv)) {
631 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000632 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000633 }
634
Tim Petersd1a7da62001-06-13 00:35:57 +0000635 res = _PyLong_AsByteArray(
636 (PyLongObject *)vv, (unsigned char *)&bytes,
637 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000638
Tim Peters9cb0c382001-06-13 20:45:17 +0000639 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000640}
Tim Petersd1a7da62001-06-13 00:35:57 +0000641
642#undef IS_LITTLE_ENDIAN
643
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000644#endif /* HAVE_LONG_LONG */
645
Neil Schemenauerba872e22001-01-04 01:46:03 +0000646
647static int
648convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
649 if (PyLong_Check(v)) {
650 *a = (PyLongObject *) v;
651 Py_INCREF(v);
652 }
653 else if (PyInt_Check(v)) {
654 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
655 }
656 else {
657 return 0;
658 }
659 if (PyLong_Check(w)) {
660 *b = (PyLongObject *) w;
661 Py_INCREF(w);
662 }
663 else if (PyInt_Check(w)) {
664 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
665 }
666 else {
667 Py_DECREF(*a);
668 return 0;
669 }
670 return 1;
671}
672
673#define CONVERT_BINOP(v, w, a, b) \
674 if (!convert_binop(v, w, a, b)) { \
675 Py_INCREF(Py_NotImplemented); \
676 return Py_NotImplemented; \
677 }
678
679
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000680/* Multiply by a single digit, ignoring the sign. */
681
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000683mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000684{
685 return muladd1(a, n, (digit)0);
686}
687
688/* Multiply by a single digit and add a single digit, ignoring the sign. */
689
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000691muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000692{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000693 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000695 twodigits carry = extra;
696 int i;
697
698 if (z == NULL)
699 return NULL;
700 for (i = 0; i < size_a; ++i) {
701 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000702 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000703 carry >>= SHIFT;
704 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000705 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000706 return long_normalize(z);
707}
708
Tim Peters212e6142001-07-14 12:23:19 +0000709/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
710 in pout, and returning the remainder. pin and pout point at the LSD.
711 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
712 long_format, but that should be done with great care since longs are
713 immutable. */
714
715static digit
716inplace_divrem1(digit *pout, digit *pin, int size, digit n)
717{
718 twodigits rem = 0;
719
720 assert(n > 0 && n <= MASK);
721 pin += size;
722 pout += size;
723 while (--size >= 0) {
724 digit hi;
725 rem = (rem << SHIFT) + *--pin;
726 *--pout = hi = (digit)(rem / n);
727 rem -= hi * n;
728 }
729 return (digit)rem;
730}
731
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000732/* Divide a long integer by a digit, returning both the quotient
733 (as function result) and the remainder (through *prem).
734 The sign of a is ignored; n should not be zero. */
735
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000737divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000738{
Tim Peters212e6142001-07-14 12:23:19 +0000739 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000741
742 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000743 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000744 if (z == NULL)
745 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000746 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000747 return long_normalize(z);
748}
749
750/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000751 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000752 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000753
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000755long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000756{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757 register PyLongObject *a = (PyLongObject *)aa;
758 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000759 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000760 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000761 char *p;
762 int bits;
763 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000764
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 if (a == NULL || !PyLong_Check(a)) {
766 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000767 return NULL;
768 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000769 assert(base >= 2 && base <= 36);
770
771 /* Compute a rough upper bound for the length of the string */
772 i = base;
773 bits = 0;
774 while (i > 1) {
775 ++bits;
776 i >>= 1;
777 }
Fred Drake121ee271999-12-23 15:41:28 +0000778 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000780 if (str == NULL)
781 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000783 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000784 if (addL)
785 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000786 if (a->ob_size < 0)
787 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000788
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000789 if (a->ob_size == 0) {
790 *--p = '0';
791 }
792 else if ((base & (base - 1)) == 0) {
793 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000794 twodigits accum = 0;
795 int accumbits = 0; /* # of bits in accum */
796 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000797 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000798 while ((i >>= 1) > 1)
799 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000800
801 for (i = 0; i < size_a; ++i) {
802 accum |= a->ob_digit[i] << accumbits;
803 accumbits += SHIFT;
804 assert(accumbits >= basebits);
805 do {
806 char digit = (char)(accum & (base - 1));
807 digit += (digit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000808 assert(p > PyString_AS_STRING(str));
Tim Peters586b2e32001-07-15 09:11:14 +0000809 *--p = digit;
810 accumbits -= basebits;
811 accum >>= basebits;
812 } while (i < size_a-1 ? accumbits >= basebits :
813 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000814 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000815 }
816 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000817 /* Not 0, and base not a power of 2. Divide repeatedly by
818 base, but for speed use the highest power of base that
819 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000820 int size = size_a;
821 digit *pin = a->ob_digit;
822 PyLongObject *scratch;
823 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000824 digit powbase = base; /* powbase == base ** power */
825 int power = 1;
826 for (;;) {
827 unsigned long newpow = powbase * (unsigned long)base;
828 if (newpow >> SHIFT) /* doesn't fit in a digit */
829 break;
830 powbase = (digit)newpow;
831 ++power;
832 }
Tim Peters212e6142001-07-14 12:23:19 +0000833
834 /* Get a scratch area for repeated division. */
835 scratch = _PyLong_New(size);
836 if (scratch == NULL) {
837 Py_DECREF(str);
838 return NULL;
839 }
840
841 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000842 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000843 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000844 digit rem = inplace_divrem1(scratch->ob_digit,
845 pin, size, powbase);
846 pin = scratch->ob_digit; /* no need to use a again */
847 if (pin[size - 1] == 0)
848 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000849 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +0000850 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000851 Py_DECREF(str);
852 return NULL;
853 })
Tim Peters212e6142001-07-14 12:23:19 +0000854
855 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000856 assert(ntostore > 0);
857 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000858 digit nextrem = (digit)(rem / base);
859 char c = (char)(rem - nextrem * base);
860 assert(p > PyString_AS_STRING(str));
861 c += (c < 10) ? '0' : 'A'-10;
862 *--p = c;
863 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000864 --ntostore;
865 /* Termination is a bit delicate: must not
866 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +0000867 remaining quotient and rem are both 0. */
868 } while (ntostore && (size || rem));
869 } while (size != 0);
870 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000871 }
872
Guido van Rossum2c475421992-08-14 15:13:07 +0000873 if (base == 8) {
874 if (size_a != 0)
875 *--p = '0';
876 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000877 else if (base == 16) {
878 *--p = 'x';
879 *--p = '0';
880 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000881 else if (base != 10) {
882 *--p = '#';
883 *--p = '0' + base%10;
884 if (base > 10)
885 *--p = '0' + base/10;
886 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000887 if (sign)
888 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 if (p != PyString_AS_STRING(str)) {
890 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000891 assert(p > q);
892 do {
893 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000894 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 _PyString_Resize((PyObject **)&str,
896 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000897 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000898 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000899}
900
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000901PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000902PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000903{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000904 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000905 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000906 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000907
Guido van Rossum472c04f1996-12-05 21:57:21 +0000908 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000910 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000911 return NULL;
912 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000913 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000914 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000915 if (*str == '+')
916 ++str;
917 else if (*str == '-') {
918 ++str;
919 sign = -1;
920 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000921 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000922 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000923 if (base == 0) {
924 if (str[0] != '0')
925 base = 10;
926 else if (str[1] == 'x' || str[1] == 'X')
927 base = 16;
928 else
929 base = 8;
930 }
931 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
932 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000934 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000935 for ( ; z != NULL; ++str) {
936 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000938
939 if (*str <= '9')
940 k = *str - '0';
941 else if (*str >= 'a')
942 k = *str - 'a' + 10;
943 else if (*str >= 'A')
944 k = *str - 'A' + 10;
945 if (k < 0 || k >= base)
946 break;
947 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000949 z = temp;
950 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000951 if (z == NULL)
952 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000953 if (str == start)
954 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000955 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000956 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000957 if (*str == 'L' || *str == 'l')
958 str++;
959 while (*str && isspace(Py_CHARMASK(*str)))
960 str++;
961 if (*str != '\0')
962 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000963 if (pend)
964 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000966
967 onError:
968 PyErr_Format(PyExc_ValueError,
969 "invalid literal for long(): %.200s", orig_str);
970 Py_XDECREF(z);
971 return NULL;
972}
973
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000974#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000975PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000976PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000977{
978 char buffer[256];
979
980 if (length >= sizeof(buffer)) {
981 PyErr_SetString(PyExc_ValueError,
982 "long() literal too large to convert");
983 return NULL;
984 }
985 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
986 return NULL;
987
988 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000989}
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000990#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000991
Tim Peters9f688bf2000-07-07 15:53:28 +0000992/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000993static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +0000994 (PyLongObject *, PyLongObject *, PyLongObject **);
995static PyObject *long_pos(PyLongObject *);
996static int long_divrem(PyLongObject *, PyLongObject *,
997 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000998
999/* Long division with remainder, top-level routine */
1000
Guido van Rossume32e0141992-01-19 16:31:05 +00001001static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001002long_divrem(PyLongObject *a, PyLongObject *b,
1003 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001004{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001005 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001007
1008 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001009 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001010 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001011 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001012 }
1013 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001014 (size_a == size_b &&
1015 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001016 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 *pdiv = _PyLong_New(0);
1018 Py_INCREF(a);
1019 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001020 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001021 }
1022 if (size_b == 1) {
1023 digit rem = 0;
1024 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001025 if (z == NULL)
1026 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001028 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001029 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001030 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001031 if (z == NULL)
1032 return -1;
1033 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001034 /* Set the signs.
1035 The quotient z has the sign of a*b;
1036 the remainder r has the sign of a,
1037 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001038 if ((a->ob_size < 0) != (b->ob_size < 0))
1039 z->ob_size = -(z->ob_size);
1040 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1041 (*prem)->ob_size = -((*prem)->ob_size);
1042 *pdiv = z;
1043 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001044}
1045
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001046/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001047
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001048static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001049x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001050{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001051 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001052 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053 PyLongObject *v = mul1(v1, d);
1054 PyLongObject *w = mul1(w1, d);
1055 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001056 int j, k;
1057
1058 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 Py_XDECREF(v);
1060 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001061 return NULL;
1062 }
1063
1064 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001065 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001066 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001067
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001068 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001070
1071 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1072 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1073 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001074 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001075 int i;
1076
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001077 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001079 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001080 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001081 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001082 if (vj == w->ob_digit[size_w-1])
1083 q = MASK;
1084 else
1085 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1086 w->ob_digit[size_w-1];
1087
1088 while (w->ob_digit[size_w-2]*q >
1089 ((
1090 ((twodigits)vj << SHIFT)
1091 + v->ob_digit[j-1]
1092 - q*w->ob_digit[size_w-1]
1093 ) << SHIFT)
1094 + v->ob_digit[j-2])
1095 --q;
1096
1097 for (i = 0; i < size_w && i+k < size_v; ++i) {
1098 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001099 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100 carry += v->ob_digit[i+k] - z
1101 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001102 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001103 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1104 carry, SHIFT);
1105 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001106 }
1107
1108 if (i+k < size_v) {
1109 carry += v->ob_digit[i+k];
1110 v->ob_digit[i+k] = 0;
1111 }
1112
1113 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001114 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001115 else {
1116 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001117 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001118 carry = 0;
1119 for (i = 0; i < size_w && i+k < size_v; ++i) {
1120 carry += v->ob_digit[i+k] + w->ob_digit[i];
1121 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001122 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1123 BASE_TWODIGITS_TYPE,
1124 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001125 }
1126 }
1127 } /* for j, k */
1128
Guido van Rossumc206c761995-01-10 15:23:19 +00001129 if (a == NULL)
1130 *prem = NULL;
1131 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001132 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001133 *prem = divrem1(v, d, &d);
1134 /* d receives the (unused) remainder */
1135 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001136 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001137 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001138 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001139 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001140 Py_DECREF(v);
1141 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001142 return a;
1143}
1144
1145/* Methods */
1146
1147static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001148long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001149{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001150 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001151}
1152
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001153static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001154long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001155{
Fred Drake121ee271999-12-23 15:41:28 +00001156 return long_format(v, 10, 1);
1157}
1158
1159static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001160long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001161{
1162 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001163}
1164
1165static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001166long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001167{
1168 int sign;
1169
Guido van Rossumc6913e71991-11-19 20:26:46 +00001170 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001171 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001172 sign = 0;
1173 else
1174 sign = a->ob_size - b->ob_size;
1175 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001176 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001177 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001178 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1179 ;
1180 if (i < 0)
1181 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001182 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001183 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001184 if (a->ob_size < 0)
1185 sign = -sign;
1186 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001187 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001188 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001189}
1190
Guido van Rossum9bfef441993-03-29 10:43:31 +00001191static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001192long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001193{
1194 long x;
1195 int i, sign;
1196
1197 /* This is designed so that Python ints and longs with the
1198 same value hash to the same value, otherwise comparisons
1199 of mapping keys will turn out weird */
1200 i = v->ob_size;
1201 sign = 1;
1202 x = 0;
1203 if (i < 0) {
1204 sign = -1;
1205 i = -(i);
1206 }
1207 while (--i >= 0) {
1208 /* Force a 32-bit circular shift */
1209 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1210 x += v->ob_digit[i];
1211 }
1212 x = x * sign;
1213 if (x == -1)
1214 x = -2;
1215 return x;
1216}
1217
1218
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001219/* Add the absolute values of two long integers. */
1220
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001222x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001223{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001224 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001225 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001226 int i;
1227 digit carry = 0;
1228
1229 /* Ensure a is the larger of the two: */
1230 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001231 { PyLongObject *temp = a; a = b; b = temp; }
1232 { int size_temp = size_a;
1233 size_a = size_b;
1234 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001235 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001237 if (z == NULL)
1238 return NULL;
1239 for (i = 0; i < size_b; ++i) {
1240 carry += a->ob_digit[i] + b->ob_digit[i];
1241 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001242 carry >>= SHIFT;
1243 }
1244 for (; i < size_a; ++i) {
1245 carry += a->ob_digit[i];
1246 z->ob_digit[i] = carry & MASK;
1247 carry >>= SHIFT;
1248 }
1249 z->ob_digit[i] = carry;
1250 return long_normalize(z);
1251}
1252
1253/* Subtract the absolute values of two integers. */
1254
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001255static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001256x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001257{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001258 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001259 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001260 int i;
1261 int sign = 1;
1262 digit borrow = 0;
1263
1264 /* Ensure a is the larger of the two: */
1265 if (size_a < size_b) {
1266 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001267 { PyLongObject *temp = a; a = b; b = temp; }
1268 { int size_temp = size_a;
1269 size_a = size_b;
1270 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001271 }
1272 else if (size_a == size_b) {
1273 /* Find highest digit where a and b differ: */
1274 i = size_a;
1275 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1276 ;
1277 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001279 if (a->ob_digit[i] < b->ob_digit[i]) {
1280 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001281 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001282 }
1283 size_a = size_b = i+1;
1284 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001286 if (z == NULL)
1287 return NULL;
1288 for (i = 0; i < size_b; ++i) {
1289 /* The following assumes unsigned arithmetic
1290 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001291 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001292 z->ob_digit[i] = borrow & MASK;
1293 borrow >>= SHIFT;
1294 borrow &= 1; /* Keep only one sign bit */
1295 }
1296 for (; i < size_a; ++i) {
1297 borrow = a->ob_digit[i] - borrow;
1298 z->ob_digit[i] = borrow & MASK;
1299 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001300 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001301 }
1302 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001303 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001304 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001305 return long_normalize(z);
1306}
1307
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001309long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001310{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001311 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001312
Neil Schemenauerba872e22001-01-04 01:46:03 +00001313 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1314
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001315 if (a->ob_size < 0) {
1316 if (b->ob_size < 0) {
1317 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001318 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001319 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001320 }
1321 else
1322 z = x_sub(b, a);
1323 }
1324 else {
1325 if (b->ob_size < 0)
1326 z = x_sub(a, b);
1327 else
1328 z = x_add(a, b);
1329 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001330 Py_DECREF(a);
1331 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001332 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001333}
1334
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001336long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001337{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001338 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001339
Neil Schemenauerba872e22001-01-04 01:46:03 +00001340 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1341
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001342 if (a->ob_size < 0) {
1343 if (b->ob_size < 0)
1344 z = x_sub(a, b);
1345 else
1346 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001347 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001348 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001349 }
1350 else {
1351 if (b->ob_size < 0)
1352 z = x_add(a, b);
1353 else
1354 z = x_sub(a, b);
1355 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001356 Py_DECREF(a);
1357 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001359}
1360
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001362long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001363{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001364 /* sequence * long */
1365 long n = PyLong_AsLong((PyObject *) w);
1366 if (n == -1 && PyErr_Occurred())
1367 return NULL;
1368 else
1369 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1370}
1371
1372static PyObject *
1373long_mul(PyLongObject *v, PyLongObject *w)
1374{
1375 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001376 int size_a;
1377 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001378 int i;
1379
Neil Schemenauerba872e22001-01-04 01:46:03 +00001380 if (v->ob_type->tp_as_sequence &&
1381 v->ob_type->tp_as_sequence->sq_repeat) {
1382 return long_repeat((PyObject *)v, w);
1383 }
1384 else if (w->ob_type->tp_as_sequence &&
1385 w->ob_type->tp_as_sequence->sq_repeat) {
1386 return long_repeat((PyObject *)w, v);
1387 }
1388
1389 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1390
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001391 size_a = ABS(a->ob_size);
1392 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001393 if (size_a > size_b) {
1394 /* we are faster with the small object on the left */
1395 int hold_sa = size_a;
1396 PyLongObject *hold_a = a;
1397 size_a = size_b;
1398 size_b = hold_sa;
1399 a = b;
1400 b = hold_a;
1401 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001402 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001403 if (z == NULL) {
1404 Py_DECREF(a);
1405 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001406 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001407 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001408 for (i = 0; i < z->ob_size; ++i)
1409 z->ob_digit[i] = 0;
1410 for (i = 0; i < size_a; ++i) {
1411 twodigits carry = 0;
1412 twodigits f = a->ob_digit[i];
1413 int j;
1414
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001415 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001416 Py_DECREF(a);
1417 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001419 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001420 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001421 for (j = 0; j < size_b; ++j) {
1422 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001423 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001424 carry >>= SHIFT;
1425 }
1426 for (; carry != 0; ++j) {
1427 assert(i+j < z->ob_size);
1428 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001429 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001430 carry >>= SHIFT;
1431 }
1432 }
1433 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001434 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001435 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001436 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001437 Py_DECREF(a);
1438 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001439 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001440}
1441
Guido van Rossume32e0141992-01-19 16:31:05 +00001442/* The / and % operators are now defined in terms of divmod().
1443 The expression a mod b has the value a - b*floor(a/b).
1444 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001445 |a| by |b|, with the sign of a. This is also expressed
1446 as a - b*trunc(a/b), if trunc truncates towards zero.
1447 Some examples:
1448 a b a rem b a mod b
1449 13 10 3 3
1450 -13 10 -3 7
1451 13 -10 3 -7
1452 -13 -10 -3 -3
1453 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001454 have different signs. We then subtract one from the 'div'
1455 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001456
Guido van Rossume32e0141992-01-19 16:31:05 +00001457static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001458l_divmod(PyLongObject *v, PyLongObject *w,
1459 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001460{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001462
1463 if (long_divrem(v, w, &div, &mod) < 0)
1464 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001465 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1466 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001467 PyLongObject *temp;
1468 PyLongObject *one;
1469 temp = (PyLongObject *) long_add(mod, w);
1470 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001471 mod = temp;
1472 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001473 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001474 return -1;
1475 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001476 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001477 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001478 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1479 Py_DECREF(mod);
1480 Py_DECREF(div);
1481 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001482 return -1;
1483 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001484 Py_DECREF(one);
1485 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001486 div = temp;
1487 }
1488 *pdiv = div;
1489 *pmod = mod;
1490 return 0;
1491}
1492
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001493static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001494long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001495{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001496 PyLongObject *a, *b, *div, *mod;
1497
1498 CONVERT_BINOP(v, w, &a, &b);
1499
1500 if (l_divmod(a, b, &div, &mod) < 0) {
1501 Py_DECREF(a);
1502 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001503 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001504 }
1505 Py_DECREF(a);
1506 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001507 Py_DECREF(mod);
1508 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001509}
1510
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001511static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001512long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001513{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001514 PyLongObject *a, *b, *div, *mod;
1515
1516 CONVERT_BINOP(v, w, &a, &b);
1517
1518 if (l_divmod(a, b, &div, &mod) < 0) {
1519 Py_DECREF(a);
1520 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001521 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001522 }
1523 Py_DECREF(a);
1524 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001525 Py_DECREF(div);
1526 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001527}
1528
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001529static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001530long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001531{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001532 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001533 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001534
1535 CONVERT_BINOP(v, w, &a, &b);
1536
1537 if (l_divmod(a, b, &div, &mod) < 0) {
1538 Py_DECREF(a);
1539 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001540 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001541 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001542 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001543 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001544 PyTuple_SetItem(z, 0, (PyObject *) div);
1545 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001546 }
1547 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001548 Py_DECREF(div);
1549 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001550 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001551 Py_DECREF(a);
1552 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001553 return z;
1554}
1555
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001556static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001557long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001558{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001559 PyLongObject *a, *b;
1560 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001561 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001562 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001563
1564 CONVERT_BINOP(v, w, &a, &b);
1565 if (PyLong_Check(x) || Py_None == x) {
1566 c = x;
1567 Py_INCREF(x);
1568 }
1569 else if (PyInt_Check(x)) {
1570 c = PyLong_FromLong(PyInt_AS_LONG(x));
1571 }
1572 else {
1573 Py_DECREF(a);
1574 Py_DECREF(b);
1575 Py_INCREF(Py_NotImplemented);
1576 return Py_NotImplemented;
1577 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001578
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001579 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001580 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001581 /* Return a float. This works because we know that
1582 this calls float_pow() which converts its
1583 arguments to double. */
1584 Py_DECREF(a);
1585 Py_DECREF(b);
1586 Py_DECREF(c);
1587 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001588 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001589 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001590 for (i = 0; i < size_b; ++i) {
1591 digit bi = b->ob_digit[i];
1592 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001593
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001594 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001595 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001596
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001597 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001598 temp = (PyLongObject *)long_mul(z, a);
1599 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001600 if (c!=Py_None && temp!=NULL) {
1601 if (l_divmod(temp,(PyLongObject *)c,
1602 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001603 Py_DECREF(temp);
1604 z = NULL;
1605 goto error;
1606 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001607 Py_XDECREF(div);
1608 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001609 temp = mod;
1610 }
1611 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001612 if (z == NULL)
1613 break;
1614 }
1615 bi >>= 1;
1616 if (bi == 0 && i+1 == size_b)
1617 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001618 temp = (PyLongObject *)long_mul(a, a);
1619 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001620 if (c!=Py_None && temp!=NULL) {
1621 if (l_divmod(temp, (PyLongObject *)c, &div,
1622 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001623 Py_DECREF(temp);
1624 z = NULL;
1625 goto error;
1626 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001627 Py_XDECREF(div);
1628 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001629 temp = mod;
1630 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001631 a = temp;
1632 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001633 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001634 z = NULL;
1635 break;
1636 }
1637 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001638 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001639 break;
1640 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001641 if (c!=Py_None && z!=NULL) {
1642 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001643 Py_DECREF(z);
1644 z = NULL;
1645 }
1646 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001647 Py_XDECREF(div);
1648 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001649 z = mod;
1650 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001651 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001652 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001653 Py_XDECREF(a);
1654 Py_DECREF(b);
1655 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001656 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001657}
1658
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001660long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001661{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001662 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001663 PyLongObject *x;
1664 PyLongObject *w;
1665 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001666 if (w == NULL)
1667 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001668 x = (PyLongObject *) long_add(v, w);
1669 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001670 if (x == NULL)
1671 return NULL;
1672 if (x->ob_size != 0)
1673 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001674 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001675}
1676
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001677static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001678long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001679{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001680 Py_INCREF(v);
1681 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001682}
1683
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001684static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001685long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001686{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001687 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001688 int i, n;
1689 n = ABS(v->ob_size);
1690 if (n == 0) {
1691 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001692 Py_INCREF(v);
1693 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001694 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001695 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001696 if (z == NULL)
1697 return NULL;
1698 for (i = 0; i < n; i++)
1699 z->ob_digit[i] = v->ob_digit[i];
1700 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001701 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001702}
1703
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001704static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001705long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001706{
1707 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001708 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001709 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001710 Py_INCREF(v);
1711 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001712 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001713}
1714
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001715static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001716long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001717{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001718 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001719}
1720
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001721static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001722long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001723{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001724 PyLongObject *a, *b;
1725 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001726 long shiftby;
1727 int newsize, wordshift, loshift, hishift, i, j;
1728 digit lomask, himask;
1729
Neil Schemenauerba872e22001-01-04 01:46:03 +00001730 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1731
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001732 if (a->ob_size < 0) {
1733 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001734 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001735 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001736 if (a1 == NULL)
1737 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001738 a2 = (PyLongObject *) long_rshift(a1, b);
1739 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001740 if (a2 == NULL)
1741 goto rshift_error;
1742 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001743 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001744 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001745 else {
1746
1747 shiftby = PyLong_AsLong((PyObject *)b);
1748 if (shiftby == -1L && PyErr_Occurred())
1749 goto rshift_error;
1750 if (shiftby < 0) {
1751 PyErr_SetString(PyExc_ValueError,
1752 "negative shift count");
1753 goto rshift_error;
1754 }
1755 wordshift = shiftby / SHIFT;
1756 newsize = ABS(a->ob_size) - wordshift;
1757 if (newsize <= 0) {
1758 z = _PyLong_New(0);
1759 Py_DECREF(a);
1760 Py_DECREF(b);
1761 return (PyObject *)z;
1762 }
1763 loshift = shiftby % SHIFT;
1764 hishift = SHIFT - loshift;
1765 lomask = ((digit)1 << hishift) - 1;
1766 himask = MASK ^ lomask;
1767 z = _PyLong_New(newsize);
1768 if (z == NULL)
1769 goto rshift_error;
1770 if (a->ob_size < 0)
1771 z->ob_size = -(z->ob_size);
1772 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1773 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1774 if (i+1 < newsize)
1775 z->ob_digit[i] |=
1776 (a->ob_digit[j+1] << hishift) & himask;
1777 }
1778 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001779 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001780rshift_error:
1781 Py_DECREF(a);
1782 Py_DECREF(b);
1783 return (PyObject *) z;
1784
Guido van Rossumc6913e71991-11-19 20:26:46 +00001785}
1786
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001787static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001788long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001789{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001790 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001791 PyLongObject *a, *b;
1792 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001793 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001794 int oldsize, newsize, wordshift, remshift, i, j;
1795 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001796
Neil Schemenauerba872e22001-01-04 01:46:03 +00001797 CONVERT_BINOP(v, w, &a, &b);
1798
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001799 shiftby = PyLong_AsLong((PyObject *)b);
1800 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001801 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001802 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001803 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001804 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001805 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001806 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001807 PyErr_SetString(PyExc_ValueError,
1808 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001809 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001810 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001811 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1812 wordshift = (int)shiftby / SHIFT;
1813 remshift = (int)shiftby - wordshift * SHIFT;
1814
1815 oldsize = ABS(a->ob_size);
1816 newsize = oldsize + wordshift;
1817 if (remshift)
1818 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001819 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001820 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001821 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001822 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001823 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001824 for (i = 0; i < wordshift; i++)
1825 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001826 accum = 0;
1827 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1828 accum |= a->ob_digit[j] << remshift;
1829 z->ob_digit[i] = (digit)(accum & MASK);
1830 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001831 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001832 if (remshift)
1833 z->ob_digit[newsize-1] = (digit)accum;
1834 else
1835 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001836 z = long_normalize(z);
1837lshift_error:
1838 Py_DECREF(a);
1839 Py_DECREF(b);
1840 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001841}
1842
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001843
1844/* Bitwise and/xor/or operations */
1845
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001846#define MAX(x, y) ((x) < (y) ? (y) : (x))
1847#define MIN(x, y) ((x) > (y) ? (y) : (x))
1848
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001849static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001850long_bitwise(PyLongObject *a,
1851 int op, /* '&', '|', '^' */
1852 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001853{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001854 digit maska, maskb; /* 0 or MASK */
1855 int negz;
1856 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001857 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001858 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001859 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001860 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001861
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001862 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001863 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001864 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001865 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001866 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001867 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001868 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001869 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001870 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001871 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001872 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001873 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001874 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001875 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001876 maskb = 0;
1877 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001878
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001879 negz = 0;
1880 switch (op) {
1881 case '^':
1882 if (maska != maskb) {
1883 maska ^= MASK;
1884 negz = -1;
1885 }
1886 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001887 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001888 if (maska && maskb) {
1889 op = '|';
1890 maska ^= MASK;
1891 maskb ^= MASK;
1892 negz = -1;
1893 }
1894 break;
1895 case '|':
1896 if (maska || maskb) {
1897 op = '&';
1898 maska ^= MASK;
1899 maskb ^= MASK;
1900 negz = -1;
1901 }
1902 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001903 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001904
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001905 /* JRH: The original logic here was to allocate the result value (z)
1906 as the longer of the two operands. However, there are some cases
1907 where the result is guaranteed to be shorter than that: AND of two
1908 positives, OR of two negatives: use the shorter number. AND with
1909 mixed signs: use the positive number. OR with mixed signs: use the
1910 negative number. After the transformations above, op will be '&'
1911 iff one of these cases applies, and mask will be non-0 for operands
1912 whose length should be ignored.
1913 */
1914
1915 size_a = a->ob_size;
1916 size_b = b->ob_size;
1917 size_z = op == '&'
1918 ? (maska
1919 ? size_b
1920 : (maskb ? size_a : MIN(size_a, size_b)))
1921 : MAX(size_a, size_b);
1922 z = _PyLong_New(size_z);
1923 if (a == NULL || b == NULL || z == NULL) {
1924 Py_XDECREF(a);
1925 Py_XDECREF(b);
1926 Py_XDECREF(z);
1927 return NULL;
1928 }
1929
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001930 for (i = 0; i < size_z; ++i) {
1931 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1932 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1933 switch (op) {
1934 case '&': z->ob_digit[i] = diga & digb; break;
1935 case '|': z->ob_digit[i] = diga | digb; break;
1936 case '^': z->ob_digit[i] = diga ^ digb; break;
1937 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001938 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001939
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001940 Py_DECREF(a);
1941 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001942 z = long_normalize(z);
1943 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001944 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001945 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001946 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001947 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001948}
1949
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001950static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001951long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001952{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001953 PyLongObject *a, *b;
1954 PyObject *c;
1955 CONVERT_BINOP(v, w, &a, &b);
1956 c = long_bitwise(a, '&', b);
1957 Py_DECREF(a);
1958 Py_DECREF(b);
1959 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001960}
1961
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001962static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001963long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001964{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001965 PyLongObject *a, *b;
1966 PyObject *c;
1967 CONVERT_BINOP(v, w, &a, &b);
1968 c = long_bitwise(a, '^', b);
1969 Py_DECREF(a);
1970 Py_DECREF(b);
1971 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001972}
1973
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001974static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001975long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001976{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001977 PyLongObject *a, *b;
1978 PyObject *c;
1979 CONVERT_BINOP(v, w, &a, &b);
1980 c = long_bitwise(a, '|', b);
1981 Py_DECREF(a);
1982 Py_DECREF(b);
1983 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001984}
1985
Guido van Rossum4668b002001-08-08 05:00:18 +00001986static PyObject *
1987long_true_divide(PyObject *v, PyObject *w)
1988{
1989 return PyFloat_Type.tp_as_number->nb_divide(v, w);
1990}
1991
Guido van Rossum234f9421993-06-17 12:35:49 +00001992static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001993long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001994{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001995 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001996 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001997 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001998 return 0;
1999 }
2000 return 1; /* Can't do it */
2001}
2002
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002003static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002004long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002005{
2006 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002007 x = PyLong_AsLong(v);
2008 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002009 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002010 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002011}
2012
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002013static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002014long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002015{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002016 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002017 return v;
2018}
2019
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002020static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002021long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002022{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002023 double result;
2024 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002025 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00002026 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002027 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002028}
2029
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002030static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002031long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002032{
Fred Drake121ee271999-12-23 15:41:28 +00002033 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002034}
2035
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002036static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002037long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002038{
Fred Drake121ee271999-12-23 15:41:28 +00002039 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002040}
2041
Tim Peters6d6c1a32001-08-02 04:15:00 +00002042static PyObject *
2043long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2044{
2045 PyObject *x = NULL;
2046 int base = -909; /* unlikely! */
2047 static char *kwlist[] = {"x", "base", 0};
2048
2049 assert(type == &PyLong_Type);
2050 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2051 &x, &base))
2052 return NULL;
2053 if (x == NULL)
2054 return PyLong_FromLong(0L);
2055 if (base == -909)
2056 return PyNumber_Long(x);
2057 else if (PyString_Check(x))
2058 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002059#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002060 else if (PyUnicode_Check(x))
2061 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2062 PyUnicode_GET_SIZE(x),
2063 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002064#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002065 else {
2066 PyErr_SetString(PyExc_TypeError,
2067 "long() can't convert non-string with explicit base");
2068 return NULL;
2069 }
2070}
2071
2072static char long_doc[] =
2073"long(x[, base]) -> integer\n\
2074\n\
2075Convert a string or number to a long integer, if possible. A floating\n\
2076point argument will be truncated towards zero (this does not include a\n\
2077string representation of a floating point number!) When converting a\n\
2078string, use the optional base. It is an error to supply a base when\n\
2079converting a non-string.";
2080
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002081static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002082 (binaryfunc) long_add, /*nb_add*/
2083 (binaryfunc) long_sub, /*nb_subtract*/
2084 (binaryfunc) long_mul, /*nb_multiply*/
2085 (binaryfunc) long_div, /*nb_divide*/
2086 (binaryfunc) long_mod, /*nb_remainder*/
2087 (binaryfunc) long_divmod, /*nb_divmod*/
2088 (ternaryfunc) long_pow, /*nb_power*/
2089 (unaryfunc) long_neg, /*nb_negative*/
2090 (unaryfunc) long_pos, /*tp_positive*/
2091 (unaryfunc) long_abs, /*tp_absolute*/
2092 (inquiry) long_nonzero, /*tp_nonzero*/
2093 (unaryfunc) long_invert, /*nb_invert*/
2094 (binaryfunc) long_lshift, /*nb_lshift*/
2095 (binaryfunc) long_rshift, /*nb_rshift*/
2096 (binaryfunc) long_and, /*nb_and*/
2097 (binaryfunc) long_xor, /*nb_xor*/
2098 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002099 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002100 (unaryfunc) long_int, /*nb_int*/
2101 (unaryfunc) long_long, /*nb_long*/
2102 (unaryfunc) long_float, /*nb_float*/
2103 (unaryfunc) long_oct, /*nb_oct*/
2104 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002105 0, /* nb_inplace_add */
2106 0, /* nb_inplace_subtract */
2107 0, /* nb_inplace_multiply */
2108 0, /* nb_inplace_divide */
2109 0, /* nb_inplace_remainder */
2110 0, /* nb_inplace_power */
2111 0, /* nb_inplace_lshift */
2112 0, /* nb_inplace_rshift */
2113 0, /* nb_inplace_and */
2114 0, /* nb_inplace_xor */
2115 0, /* nb_inplace_or */
2116 (binaryfunc)long_div, /* nb_floor_divide */
2117 long_true_divide, /* nb_true_divide */
2118 0, /* nb_inplace_floor_divide */
2119 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002120};
2121
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002122PyTypeObject PyLong_Type = {
2123 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002124 0, /* ob_size */
2125 "long", /* tp_name */
2126 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2127 sizeof(digit), /* tp_itemsize */
2128 (destructor)long_dealloc, /* tp_dealloc */
2129 0, /* tp_print */
2130 0, /* tp_getattr */
2131 0, /* tp_setattr */
2132 (cmpfunc)long_compare, /* tp_compare */
2133 (reprfunc)long_repr, /* tp_repr */
2134 &long_as_number, /* tp_as_number */
2135 0, /* tp_as_sequence */
2136 0, /* tp_as_mapping */
2137 (hashfunc)long_hash, /* tp_hash */
2138 0, /* tp_call */
2139 (reprfunc)long_str, /* tp_str */
2140 PyObject_GenericGetAttr, /* tp_getattro */
2141 0, /* tp_setattro */
2142 0, /* tp_as_buffer */
2143 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
2144 long_doc, /* tp_doc */
2145 0, /* tp_traverse */
2146 0, /* tp_clear */
2147 0, /* tp_richcompare */
2148 0, /* tp_weaklistoffset */
2149 0, /* tp_iter */
2150 0, /* tp_iternext */
2151 0, /* tp_methods */
2152 0, /* tp_members */
2153 0, /* tp_getset */
2154 0, /* tp_base */
2155 0, /* tp_dict */
2156 0, /* tp_descr_get */
2157 0, /* tp_descr_set */
2158 0, /* tp_dictoffset */
2159 0, /* tp_init */
2160 0, /* tp_alloc */
2161 long_new, /* tp_new */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002162};