blob: 7c4f75dc6e46cbaced413377cb402168f0fb9a0a [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
Tim Peters64b5ce32001-09-10 20:52:51 +000054PyObject *
55_PyLong_Copy(PyLongObject *src)
56{
57 PyLongObject *result;
58 int i;
59
60 assert(src != NULL);
61 i = src->ob_size;
62 if (i < 0)
63 i = -(i);
64 result = _PyLong_New(i);
65 if (result != NULL) {
66 result->ob_size = i;
67 while (--i >= 0)
68 result->ob_digit[i] = src->ob_digit[i];
69 }
70 return (PyObject *)result;
71}
72
Guido van Rossumedcc38a1991-05-05 20:09:44 +000073/* Create a new long int object from a C long int */
74
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000076PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000077{
Tim Petersce9de2f2001-06-14 04:56:19 +000078 PyLongObject *v;
79 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
80 int ndigits = 0;
81 int negative = 0;
82
83 if (ival < 0) {
84 ival = -ival;
85 negative = 1;
86 }
87
88 /* Count the number of Python digits.
89 We used to pick 5 ("big enough for anything"), but that's a
90 waste of time and space given that 5*15 = 75 bits are rarely
91 needed. */
92 t = (unsigned long)ival;
93 while (t) {
94 ++ndigits;
95 t >>= SHIFT;
96 }
97 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000098 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +000099 digit *p = v->ob_digit;
100 v->ob_size = negative ? -ndigits : ndigits;
101 t = (unsigned long)ival;
102 while (t) {
103 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000104 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000105 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000106 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000107 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000108}
109
Guido van Rossum53756b11997-01-03 17:14:46 +0000110/* Create a new long int object from a C unsigned long int */
111
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000113PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +0000114{
Tim Petersce9de2f2001-06-14 04:56:19 +0000115 PyLongObject *v;
116 unsigned long t;
117 int ndigits = 0;
118
119 /* Count the number of Python digits. */
120 t = (unsigned long)ival;
121 while (t) {
122 ++ndigits;
123 t >>= SHIFT;
124 }
125 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000126 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000127 digit *p = v->ob_digit;
128 v->ob_size = ndigits;
129 while (ival) {
130 *p++ = (digit)(ival & MASK);
131 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000132 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000133 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000135}
136
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000137/* Create a new long int object from a C double */
138
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000141{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000143 double frac;
144 int i, ndig, expo, neg;
145 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000146 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000147 PyErr_SetString(PyExc_OverflowError,
148 "cannot convert float infinity to long");
149 return NULL;
150 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000151 if (dval < 0.0) {
152 neg = 1;
153 dval = -dval;
154 }
155 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
156 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000158 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000160 if (v == NULL)
161 return NULL;
162 frac = ldexp(frac, (expo-1) % SHIFT + 1);
163 for (i = ndig; --i >= 0; ) {
164 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000165 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000166 frac = frac - (double)bits;
167 frac = ldexp(frac, SHIFT);
168 }
169 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000170 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000172}
173
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000174/* Get a C long int from a long int object.
175 Returns -1 and sets an error condition if overflow occurs. */
176
177long
Tim Peters9f688bf2000-07-07 15:53:28 +0000178PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000179{
Guido van Rossumf7531811998-05-26 14:33:37 +0000180 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000182 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000183 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000184
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 if (vv == NULL || !PyLong_Check(vv)) {
186 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000187 return -1;
188 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000190 i = v->ob_size;
191 sign = 1;
192 x = 0;
193 if (i < 0) {
194 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000195 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000196 }
197 while (--i >= 0) {
198 prev = x;
199 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000200 if ((x >> SHIFT) != prev)
201 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000202 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000203 /* Haven't lost any bits, but if the sign bit is set we're in
204 * trouble *unless* this is the min negative number. So,
205 * trouble iff sign bit set && (positive || some bit set other
206 * than the sign bit).
207 */
208 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
209 goto overflow;
210 return (long)x * sign;
211
212 overflow:
213 PyErr_SetString(PyExc_OverflowError,
Skip Montanarobafedec2001-09-13 19:05:30 +0000214 "long int too large to convert to int");
Guido van Rossumf7531811998-05-26 14:33:37 +0000215 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000216}
217
Guido van Rossum53756b11997-01-03 17:14:46 +0000218/* Get a C long int from a long int object.
219 Returns -1 and sets an error condition if overflow occurs. */
220
221unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000222PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000223{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000225 unsigned long x, prev;
226 int i;
227
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 if (vv == NULL || !PyLong_Check(vv)) {
229 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000230 return (unsigned long) -1;
231 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000233 i = v->ob_size;
234 x = 0;
235 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000237 "can't convert negative value to unsigned long");
238 return (unsigned long) -1;
239 }
240 while (--i >= 0) {
241 prev = x;
242 x = (x << SHIFT) + v->ob_digit[i];
243 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000245 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000246 return (unsigned long) -1;
247 }
248 }
249 return x;
250}
251
Tim Peters2a9b3672001-06-11 21:23:58 +0000252PyObject *
253_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
254 int little_endian, int is_signed)
255{
256 const unsigned char* pstartbyte;/* LSB of bytes */
257 int incr; /* direction to move pstartbyte */
258 const unsigned char* pendbyte; /* MSB of bytes */
259 size_t numsignificantbytes; /* number of bytes that matter */
260 size_t ndigits; /* number of Python long digits */
261 PyLongObject* v; /* result */
262 int idigit = 0; /* next free index in v->ob_digit */
263
264 if (n == 0)
265 return PyLong_FromLong(0L);
266
267 if (little_endian) {
268 pstartbyte = bytes;
269 pendbyte = bytes + n - 1;
270 incr = 1;
271 }
272 else {
273 pstartbyte = bytes + n - 1;
274 pendbyte = bytes;
275 incr = -1;
276 }
277
278 if (is_signed)
279 is_signed = *pendbyte >= 0x80;
280
281 /* Compute numsignificantbytes. This consists of finding the most
282 significant byte. Leading 0 bytes are insignficant if the number
283 is positive, and leading 0xff bytes if negative. */
284 {
285 size_t i;
286 const unsigned char* p = pendbyte;
287 const int pincr = -incr; /* search MSB to LSB */
288 const unsigned char insignficant = is_signed ? 0xff : 0x00;
289
290 for (i = 0; i < n; ++i, p += pincr) {
291 if (*p != insignficant)
292 break;
293 }
294 numsignificantbytes = n - i;
295 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
296 actually has 2 significant bytes. OTOH, 0xff0001 ==
297 -0x00ffff, so we wouldn't *need* to bump it there; but we
298 do for 0xffff = -0x0001. To be safe without bothering to
299 check every case, bump it regardless. */
300 if (is_signed && numsignificantbytes < n)
301 ++numsignificantbytes;
302 }
303
304 /* How many Python long digits do we need? We have
305 8*numsignificantbytes bits, and each Python long digit has SHIFT
306 bits, so it's the ceiling of the quotient. */
307 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
308 if (ndigits > (size_t)INT_MAX)
309 return PyErr_NoMemory();
310 v = _PyLong_New((int)ndigits);
311 if (v == NULL)
312 return NULL;
313
314 /* Copy the bits over. The tricky parts are computing 2's-comp on
315 the fly for signed numbers, and dealing with the mismatch between
316 8-bit bytes and (probably) 15-bit Python digits.*/
317 {
318 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000319 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000320 twodigits accum = 0; /* sliding register */
321 unsigned int accumbits = 0; /* number of bits in accum */
322 const unsigned char* p = pstartbyte;
323
324 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000325 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000326 /* Compute correction for 2's comp, if needed. */
327 if (is_signed) {
328 thisbyte = (0xff ^ thisbyte) + carry;
329 carry = thisbyte >> 8;
330 thisbyte &= 0xff;
331 }
332 /* Because we're going LSB to MSB, thisbyte is
333 more significant than what's already in accum,
334 so needs to be prepended to accum. */
335 accum |= thisbyte << accumbits;
336 accumbits += 8;
337 if (accumbits >= SHIFT) {
338 /* There's enough to fill a Python digit. */
339 assert(idigit < (int)ndigits);
340 v->ob_digit[idigit] = (digit)(accum & MASK);
341 ++idigit;
342 accum >>= SHIFT;
343 accumbits -= SHIFT;
344 assert(accumbits < SHIFT);
345 }
346 }
347 assert(accumbits < SHIFT);
348 if (accumbits) {
349 assert(idigit < (int)ndigits);
350 v->ob_digit[idigit] = (digit)accum;
351 ++idigit;
352 }
353 }
354
355 v->ob_size = is_signed ? -idigit : idigit;
356 return (PyObject *)long_normalize(v);
357}
358
359int
360_PyLong_AsByteArray(PyLongObject* v,
361 unsigned char* bytes, size_t n,
362 int little_endian, int is_signed)
363{
364 int i; /* index into v->ob_digit */
365 int ndigits; /* |v->ob_size| */
366 twodigits accum; /* sliding register */
367 unsigned int accumbits; /* # bits in accum */
368 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
369 twodigits carry; /* for computing 2's-comp */
370 size_t j; /* # bytes filled */
371 unsigned char* p; /* pointer to next byte in bytes */
372 int pincr; /* direction to move p */
373
374 assert(v != NULL && PyLong_Check(v));
375
376 if (v->ob_size < 0) {
377 ndigits = -(v->ob_size);
378 if (!is_signed) {
379 PyErr_SetString(PyExc_TypeError,
380 "can't convert negative long to unsigned");
381 return -1;
382 }
383 do_twos_comp = 1;
384 }
385 else {
386 ndigits = v->ob_size;
387 do_twos_comp = 0;
388 }
389
390 if (little_endian) {
391 p = bytes;
392 pincr = 1;
393 }
394 else {
395 p = bytes + n - 1;
396 pincr = -1;
397 }
398
Tim Peters898cf852001-06-13 20:50:08 +0000399 /* Copy over all the Python digits.
400 It's crucial that every Python digit except for the MSD contribute
401 exactly SHIFT bits to the total, so first assert that the long is
402 normalized. */
403 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000404 j = 0;
405 accum = 0;
406 accumbits = 0;
407 carry = do_twos_comp ? 1 : 0;
408 for (i = 0; i < ndigits; ++i) {
409 twodigits thisdigit = v->ob_digit[i];
410 if (do_twos_comp) {
411 thisdigit = (thisdigit ^ MASK) + carry;
412 carry = thisdigit >> SHIFT;
413 thisdigit &= MASK;
414 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000415 /* Because we're going LSB to MSB, thisdigit is more
416 significant than what's already in accum, so needs to be
417 prepended to accum. */
418 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000419 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000420
Tim Petersede05092001-06-14 08:53:38 +0000421 /* The most-significant digit may be (probably is) at least
422 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000423 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000424 /* Count # of sign bits -- they needn't be stored,
425 * although for signed conversion we need later to
426 * make sure at least one sign bit gets stored.
427 * First shift conceptual sign bit to real sign bit.
428 */
429 stwodigits s = (stwodigits)(thisdigit <<
430 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000431 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000432 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000433 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000434 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000435 }
Tim Petersede05092001-06-14 08:53:38 +0000436 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000437 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000438
Tim Peters2a9b3672001-06-11 21:23:58 +0000439 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000440 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000441 if (j >= n)
442 goto Overflow;
443 ++j;
444 *p = (unsigned char)(accum & 0xff);
445 p += pincr;
446 accumbits -= 8;
447 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000448 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000449 }
450
451 /* Store the straggler (if any). */
452 assert(accumbits < 8);
453 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000454 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000455 if (j >= n)
456 goto Overflow;
457 ++j;
458 if (do_twos_comp) {
459 /* Fill leading bits of the byte with sign bits
460 (appropriately pretending that the long had an
461 infinite supply of sign bits). */
462 accum |= (~(twodigits)0) << accumbits;
463 }
464 *p = (unsigned char)(accum & 0xff);
465 p += pincr;
466 }
Tim Peters05607ad2001-06-13 21:01:27 +0000467 else if (j == n && n > 0 && is_signed) {
468 /* The main loop filled the byte array exactly, so the code
469 just above didn't get to ensure there's a sign bit, and the
470 loop below wouldn't add one either. Make sure a sign bit
471 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000472 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000473 int sign_bit_set = msb >= 0x80;
474 assert(accumbits == 0);
475 if (sign_bit_set == do_twos_comp)
476 return 0;
477 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000478 goto Overflow;
479 }
Tim Peters05607ad2001-06-13 21:01:27 +0000480
481 /* Fill remaining bytes with copies of the sign bit. */
482 {
483 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
484 for ( ; j < n; ++j, p += pincr)
485 *p = signbyte;
486 }
487
Tim Peters2a9b3672001-06-11 21:23:58 +0000488 return 0;
489
490Overflow:
491 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
492 return -1;
493
494}
495
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000496double
497_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
498{
499/* NBITS_WANTED should be > the number of bits in a double's precision,
500 but small enough so that 2**NBITS_WANTED is within the normal double
501 range. nbitsneeded is set to 1 less than that because the most-significant
502 Python digit contains at least 1 significant bit, but we don't want to
503 bother counting them (catering to the worst case cheaply).
504
505 57 is one more than VAX-D double precision; I (Tim) don't know of a double
506 format with more precision than that; it's 1 larger so that we add in at
507 least one round bit to stand in for the ignored least-significant bits.
508*/
509#define NBITS_WANTED 57
510 PyLongObject *v;
511 double x;
512 const double multiplier = (double)(1L << SHIFT);
513 int i, sign;
514 int nbitsneeded;
515
516 if (vv == NULL || !PyLong_Check(vv)) {
517 PyErr_BadInternalCall();
518 return -1;
519 }
520 v = (PyLongObject *)vv;
521 i = v->ob_size;
522 sign = 1;
523 if (i < 0) {
524 sign = -1;
525 i = -(i);
526 }
527 else if (i == 0) {
528 *exponent = 0;
529 return 0.0;
530 }
531 --i;
532 x = (double)v->ob_digit[i];
533 nbitsneeded = NBITS_WANTED - 1;
534 /* Invariant: i Python digits remain unaccounted for. */
535 while (i > 0 && nbitsneeded > 0) {
536 --i;
537 x = x * multiplier + (double)v->ob_digit[i];
538 nbitsneeded -= SHIFT;
539 }
540 /* There are i digits we didn't shift in. Pretending they're all
541 zeroes, the true value is x * 2**(i*SHIFT). */
542 *exponent = i;
543 assert(x > 0.0);
544 return x * sign;
545#undef NBITS_WANTED
546}
547
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000548/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000549
550double
Tim Peters9f688bf2000-07-07 15:53:28 +0000551PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000552{
Tim Peters9fffa3e2001-09-04 05:14:19 +0000553 int e;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000554 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000555
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 if (vv == NULL || !PyLong_Check(vv)) {
557 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000558 return -1;
559 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000560 x = _PyLong_AsScaledDouble(vv, &e);
561 if (x == -1.0 && PyErr_Occurred())
562 return -1.0;
563 if (e > INT_MAX / SHIFT)
564 goto overflow;
565 errno = 0;
566 x = ldexp(x, e * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000567 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000568 goto overflow;
569 return x;
570
571overflow:
572 PyErr_SetString(PyExc_OverflowError,
573 "long int too large to convert to float");
574 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000575}
576
Guido van Rossum78694d91998-09-18 14:14:13 +0000577/* Create a new long (or int) object from a C pointer */
578
579PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000580PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000581{
Tim Peters70128a12001-06-16 08:48:40 +0000582#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000583 return PyInt_FromLong((long)p);
584#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000585
Tim Peters70128a12001-06-16 08:48:40 +0000586#ifndef HAVE_LONG_LONG
587# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
588#endif
589#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
590# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
591#endif
592 /* optimize null pointers */
593 if (p == NULL)
594 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000595 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000596
597#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000598}
599
600/* Get a C pointer from a long object (or an int object in some cases) */
601
602void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000603PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000604{
605 /* This function will allow int or long objects. If vv is neither,
606 then the PyLong_AsLong*() functions will raise the exception:
607 PyExc_SystemError, "bad argument to internal function"
608 */
Tim Peters70128a12001-06-16 08:48:40 +0000609#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000610 long x;
611
Tim Peters70128a12001-06-16 08:48:40 +0000612 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000613 x = PyInt_AS_LONG(vv);
614 else
615 x = PyLong_AsLong(vv);
616#else
Tim Peters70128a12001-06-16 08:48:40 +0000617
618#ifndef HAVE_LONG_LONG
619# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
620#endif
621#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
622# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
623#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000624 LONG_LONG x;
625
Tim Peters70128a12001-06-16 08:48:40 +0000626 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000627 x = PyInt_AS_LONG(vv);
628 else
629 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000630
631#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000632
633 if (x == -1 && PyErr_Occurred())
634 return NULL;
635 return (void *)x;
636}
637
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000638#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000639
640/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
641 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000642 */
643
Tim Peterscf37dfc2001-06-14 18:42:50 +0000644#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000645
646/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000647
648PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000649PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000650{
Tim Petersd1a7da62001-06-13 00:35:57 +0000651 LONG_LONG bytes = ival;
652 int one = 1;
653 return _PyLong_FromByteArray(
654 (unsigned char *)&bytes,
655 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000656}
657
Tim Petersd1a7da62001-06-13 00:35:57 +0000658/* Create a new long int object from a C unsigned LONG_LONG int. */
659
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000660PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000661PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000662{
Tim Petersd1a7da62001-06-13 00:35:57 +0000663 unsigned LONG_LONG bytes = ival;
664 int one = 1;
665 return _PyLong_FromByteArray(
666 (unsigned char *)&bytes,
667 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000668}
669
Guido van Rossum3293b071998-08-25 16:07:15 +0000670/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000671 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000672
Guido van Rossum3293b071998-08-25 16:07:15 +0000673LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000674PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000675{
Tim Petersd1a7da62001-06-13 00:35:57 +0000676 LONG_LONG bytes;
677 int one = 1;
678 int res;
679
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000680 if (vv == NULL || !PyLong_Check(vv)) {
681 PyErr_BadInternalCall();
682 return -1;
683 }
684
Tim Petersd1a7da62001-06-13 00:35:57 +0000685 res = _PyLong_AsByteArray(
686 (PyLongObject *)vv, (unsigned char *)&bytes,
687 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000688
Tim Peters9cb0c382001-06-13 20:45:17 +0000689 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000690}
691
Tim Petersd1a7da62001-06-13 00:35:57 +0000692/* Get a C unsigned LONG_LONG int from a long int object.
693 Return -1 and set an error if overflow occurs. */
694
Guido van Rossum3293b071998-08-25 16:07:15 +0000695unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000696PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000697{
Tim Petersd1a7da62001-06-13 00:35:57 +0000698 unsigned LONG_LONG bytes;
699 int one = 1;
700 int res;
701
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000702 if (vv == NULL || !PyLong_Check(vv)) {
703 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000704 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000705 }
706
Tim Petersd1a7da62001-06-13 00:35:57 +0000707 res = _PyLong_AsByteArray(
708 (PyLongObject *)vv, (unsigned char *)&bytes,
709 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000710
Tim Peters9cb0c382001-06-13 20:45:17 +0000711 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000712}
Tim Petersd1a7da62001-06-13 00:35:57 +0000713
714#undef IS_LITTLE_ENDIAN
715
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000716#endif /* HAVE_LONG_LONG */
717
Neil Schemenauerba872e22001-01-04 01:46:03 +0000718
719static int
720convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
721 if (PyLong_Check(v)) {
722 *a = (PyLongObject *) v;
723 Py_INCREF(v);
724 }
725 else if (PyInt_Check(v)) {
726 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
727 }
728 else {
729 return 0;
730 }
731 if (PyLong_Check(w)) {
732 *b = (PyLongObject *) w;
733 Py_INCREF(w);
734 }
735 else if (PyInt_Check(w)) {
736 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
737 }
738 else {
739 Py_DECREF(*a);
740 return 0;
741 }
742 return 1;
743}
744
745#define CONVERT_BINOP(v, w, a, b) \
746 if (!convert_binop(v, w, a, b)) { \
747 Py_INCREF(Py_NotImplemented); \
748 return Py_NotImplemented; \
749 }
750
751
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000752/* Multiply by a single digit, ignoring the sign. */
753
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000755mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000756{
757 return muladd1(a, n, (digit)0);
758}
759
760/* Multiply by a single digit and add a single digit, ignoring the sign. */
761
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000762static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000763muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000764{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000765 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000767 twodigits carry = extra;
768 int i;
769
770 if (z == NULL)
771 return NULL;
772 for (i = 0; i < size_a; ++i) {
773 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000774 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000775 carry >>= SHIFT;
776 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000777 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000778 return long_normalize(z);
779}
780
Tim Peters212e6142001-07-14 12:23:19 +0000781/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
782 in pout, and returning the remainder. pin and pout point at the LSD.
783 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
784 long_format, but that should be done with great care since longs are
785 immutable. */
786
787static digit
788inplace_divrem1(digit *pout, digit *pin, int size, digit n)
789{
790 twodigits rem = 0;
791
792 assert(n > 0 && n <= MASK);
793 pin += size;
794 pout += size;
795 while (--size >= 0) {
796 digit hi;
797 rem = (rem << SHIFT) + *--pin;
798 *--pout = hi = (digit)(rem / n);
799 rem -= hi * n;
800 }
801 return (digit)rem;
802}
803
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000804/* Divide a long integer by a digit, returning both the quotient
805 (as function result) and the remainder (through *prem).
806 The sign of a is ignored; n should not be zero. */
807
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000808static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000809divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000810{
Tim Peters212e6142001-07-14 12:23:19 +0000811 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000812 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000813
814 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000815 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000816 if (z == NULL)
817 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000818 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000819 return long_normalize(z);
820}
821
822/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000823 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000824 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000825
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000826static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000827long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000828{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000829 register PyLongObject *a = (PyLongObject *)aa;
830 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000831 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000832 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000833 char *p;
834 int bits;
835 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000836
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 if (a == NULL || !PyLong_Check(a)) {
838 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000839 return NULL;
840 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000841 assert(base >= 2 && base <= 36);
842
843 /* Compute a rough upper bound for the length of the string */
844 i = base;
845 bits = 0;
846 while (i > 1) {
847 ++bits;
848 i >>= 1;
849 }
Fred Drake121ee271999-12-23 15:41:28 +0000850 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000851 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000852 if (str == NULL)
853 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000855 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000856 if (addL)
857 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000858 if (a->ob_size < 0)
859 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000860
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000861 if (a->ob_size == 0) {
862 *--p = '0';
863 }
864 else if ((base & (base - 1)) == 0) {
865 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000866 twodigits accum = 0;
867 int accumbits = 0; /* # of bits in accum */
868 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000869 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000870 while ((i >>= 1) > 1)
871 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000872
873 for (i = 0; i < size_a; ++i) {
874 accum |= a->ob_digit[i] << accumbits;
875 accumbits += SHIFT;
876 assert(accumbits >= basebits);
877 do {
878 char digit = (char)(accum & (base - 1));
879 digit += (digit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000880 assert(p > PyString_AS_STRING(str));
Tim Peters586b2e32001-07-15 09:11:14 +0000881 *--p = digit;
882 accumbits -= basebits;
883 accum >>= basebits;
884 } while (i < size_a-1 ? accumbits >= basebits :
885 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000886 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000887 }
888 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000889 /* Not 0, and base not a power of 2. Divide repeatedly by
890 base, but for speed use the highest power of base that
891 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000892 int size = size_a;
893 digit *pin = a->ob_digit;
894 PyLongObject *scratch;
895 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000896 digit powbase = base; /* powbase == base ** power */
897 int power = 1;
898 for (;;) {
899 unsigned long newpow = powbase * (unsigned long)base;
900 if (newpow >> SHIFT) /* doesn't fit in a digit */
901 break;
902 powbase = (digit)newpow;
903 ++power;
904 }
Tim Peters212e6142001-07-14 12:23:19 +0000905
906 /* Get a scratch area for repeated division. */
907 scratch = _PyLong_New(size);
908 if (scratch == NULL) {
909 Py_DECREF(str);
910 return NULL;
911 }
912
913 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000914 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000915 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000916 digit rem = inplace_divrem1(scratch->ob_digit,
917 pin, size, powbase);
918 pin = scratch->ob_digit; /* no need to use a again */
919 if (pin[size - 1] == 0)
920 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000921 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +0000922 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000923 Py_DECREF(str);
924 return NULL;
925 })
Tim Peters212e6142001-07-14 12:23:19 +0000926
927 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000928 assert(ntostore > 0);
929 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000930 digit nextrem = (digit)(rem / base);
931 char c = (char)(rem - nextrem * base);
932 assert(p > PyString_AS_STRING(str));
933 c += (c < 10) ? '0' : 'A'-10;
934 *--p = c;
935 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000936 --ntostore;
937 /* Termination is a bit delicate: must not
938 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +0000939 remaining quotient and rem are both 0. */
940 } while (ntostore && (size || rem));
941 } while (size != 0);
942 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000943 }
944
Guido van Rossum2c475421992-08-14 15:13:07 +0000945 if (base == 8) {
946 if (size_a != 0)
947 *--p = '0';
948 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000949 else if (base == 16) {
950 *--p = 'x';
951 *--p = '0';
952 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000953 else if (base != 10) {
954 *--p = '#';
955 *--p = '0' + base%10;
956 if (base > 10)
957 *--p = '0' + base/10;
958 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000959 if (sign)
960 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 if (p != PyString_AS_STRING(str)) {
962 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000963 assert(p > q);
964 do {
965 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000966 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967 _PyString_Resize((PyObject **)&str,
968 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000969 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000971}
972
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000973PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000974PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000975{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000976 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000977 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000979
Guido van Rossum472c04f1996-12-05 21:57:21 +0000980 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000981 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000982 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000983 return NULL;
984 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000985 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000986 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000987 if (*str == '+')
988 ++str;
989 else if (*str == '-') {
990 ++str;
991 sign = -1;
992 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000993 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000994 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000995 if (base == 0) {
996 if (str[0] != '0')
997 base = 10;
998 else if (str[1] == 'x' || str[1] == 'X')
999 base = 16;
1000 else
1001 base = 8;
1002 }
1003 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1004 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001005 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +00001006 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001007 for ( ; z != NULL; ++str) {
1008 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001010
1011 if (*str <= '9')
1012 k = *str - '0';
1013 else if (*str >= 'a')
1014 k = *str - 'a' + 10;
1015 else if (*str >= 'A')
1016 k = *str - 'A' + 10;
1017 if (k < 0 || k >= base)
1018 break;
1019 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001021 z = temp;
1022 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001023 if (z == NULL)
1024 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001025 if (str == start)
1026 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001027 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001028 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001029 if (*str == 'L' || *str == 'l')
1030 str++;
1031 while (*str && isspace(Py_CHARMASK(*str)))
1032 str++;
1033 if (*str != '\0')
1034 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001035 if (pend)
1036 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001037 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001038
1039 onError:
1040 PyErr_Format(PyExc_ValueError,
1041 "invalid literal for long(): %.200s", orig_str);
1042 Py_XDECREF(z);
1043 return NULL;
1044}
1045
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001046#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001047PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001048PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001049{
1050 char buffer[256];
1051
1052 if (length >= sizeof(buffer)) {
1053 PyErr_SetString(PyExc_ValueError,
1054 "long() literal too large to convert");
1055 return NULL;
1056 }
1057 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
1058 return NULL;
1059
1060 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001061}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001062#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001063
Tim Peters9f688bf2000-07-07 15:53:28 +00001064/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001066 (PyLongObject *, PyLongObject *, PyLongObject **);
1067static PyObject *long_pos(PyLongObject *);
1068static int long_divrem(PyLongObject *, PyLongObject *,
1069 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001070
1071/* Long division with remainder, top-level routine */
1072
Guido van Rossume32e0141992-01-19 16:31:05 +00001073static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001074long_divrem(PyLongObject *a, PyLongObject *b,
1075 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001076{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001077 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001079
1080 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001081 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001082 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001083 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001084 }
1085 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001086 (size_a == size_b &&
1087 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001088 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001089 *pdiv = _PyLong_New(0);
1090 Py_INCREF(a);
1091 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001092 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001093 }
1094 if (size_b == 1) {
1095 digit rem = 0;
1096 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001097 if (z == NULL)
1098 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001100 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001101 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001102 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001103 if (z == NULL)
1104 return -1;
1105 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001106 /* Set the signs.
1107 The quotient z has the sign of a*b;
1108 the remainder r has the sign of a,
1109 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001110 if ((a->ob_size < 0) != (b->ob_size < 0))
1111 z->ob_size = -(z->ob_size);
1112 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1113 (*prem)->ob_size = -((*prem)->ob_size);
1114 *pdiv = z;
1115 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001116}
1117
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001118/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001119
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001120static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001121x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001122{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001123 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001124 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001125 PyLongObject *v = mul1(v1, d);
1126 PyLongObject *w = mul1(w1, d);
1127 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001128 int j, k;
1129
1130 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001131 Py_XDECREF(v);
1132 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001133 return NULL;
1134 }
1135
1136 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001137 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001138 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001139
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001140 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001142
1143 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1144 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1145 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001146 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001147 int i;
1148
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001149 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001150 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001151 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001152 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001153 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001154 if (vj == w->ob_digit[size_w-1])
1155 q = MASK;
1156 else
1157 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1158 w->ob_digit[size_w-1];
1159
1160 while (w->ob_digit[size_w-2]*q >
1161 ((
1162 ((twodigits)vj << SHIFT)
1163 + v->ob_digit[j-1]
1164 - q*w->ob_digit[size_w-1]
1165 ) << SHIFT)
1166 + v->ob_digit[j-2])
1167 --q;
1168
1169 for (i = 0; i < size_w && i+k < size_v; ++i) {
1170 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001171 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001172 carry += v->ob_digit[i+k] - z
1173 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001174 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001175 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1176 carry, SHIFT);
1177 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001178 }
1179
1180 if (i+k < size_v) {
1181 carry += v->ob_digit[i+k];
1182 v->ob_digit[i+k] = 0;
1183 }
1184
1185 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001186 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001187 else {
1188 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001189 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001190 carry = 0;
1191 for (i = 0; i < size_w && i+k < size_v; ++i) {
1192 carry += v->ob_digit[i+k] + w->ob_digit[i];
1193 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001194 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1195 BASE_TWODIGITS_TYPE,
1196 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001197 }
1198 }
1199 } /* for j, k */
1200
Guido van Rossumc206c761995-01-10 15:23:19 +00001201 if (a == NULL)
1202 *prem = NULL;
1203 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001204 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001205 *prem = divrem1(v, d, &d);
1206 /* d receives the (unused) remainder */
1207 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001208 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001209 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001210 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001211 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212 Py_DECREF(v);
1213 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001214 return a;
1215}
1216
1217/* Methods */
1218
1219static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001220long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001221{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001222 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001223}
1224
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001225static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001226long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001227{
Fred Drake121ee271999-12-23 15:41:28 +00001228 return long_format(v, 10, 1);
1229}
1230
1231static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001232long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001233{
1234 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001235}
1236
1237static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001238long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001239{
1240 int sign;
1241
Guido van Rossumc6913e71991-11-19 20:26:46 +00001242 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001243 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001244 sign = 0;
1245 else
1246 sign = a->ob_size - b->ob_size;
1247 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001248 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001249 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001250 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1251 ;
1252 if (i < 0)
1253 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001254 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001255 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001256 if (a->ob_size < 0)
1257 sign = -sign;
1258 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001259 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001260 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001261}
1262
Guido van Rossum9bfef441993-03-29 10:43:31 +00001263static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001264long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001265{
1266 long x;
1267 int i, sign;
1268
1269 /* This is designed so that Python ints and longs with the
1270 same value hash to the same value, otherwise comparisons
1271 of mapping keys will turn out weird */
1272 i = v->ob_size;
1273 sign = 1;
1274 x = 0;
1275 if (i < 0) {
1276 sign = -1;
1277 i = -(i);
1278 }
1279 while (--i >= 0) {
1280 /* Force a 32-bit circular shift */
1281 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1282 x += v->ob_digit[i];
1283 }
1284 x = x * sign;
1285 if (x == -1)
1286 x = -2;
1287 return x;
1288}
1289
1290
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001291/* Add the absolute values of two long integers. */
1292
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001293static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001294x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001295{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001296 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001297 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001298 int i;
1299 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001300
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001301 /* Ensure a is the larger of the two: */
1302 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303 { PyLongObject *temp = a; a = b; b = temp; }
1304 { int size_temp = size_a;
1305 size_a = size_b;
1306 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001307 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001309 if (z == NULL)
1310 return NULL;
1311 for (i = 0; i < size_b; ++i) {
1312 carry += a->ob_digit[i] + b->ob_digit[i];
1313 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001314 carry >>= SHIFT;
1315 }
1316 for (; i < size_a; ++i) {
1317 carry += a->ob_digit[i];
1318 z->ob_digit[i] = carry & MASK;
1319 carry >>= SHIFT;
1320 }
1321 z->ob_digit[i] = carry;
1322 return long_normalize(z);
1323}
1324
1325/* Subtract the absolute values of two integers. */
1326
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001328x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001329{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001330 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001332 int i;
1333 int sign = 1;
1334 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001335
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001336 /* Ensure a is the larger of the two: */
1337 if (size_a < size_b) {
1338 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 { PyLongObject *temp = a; a = b; b = temp; }
1340 { int size_temp = size_a;
1341 size_a = size_b;
1342 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001343 }
1344 else if (size_a == size_b) {
1345 /* Find highest digit where a and b differ: */
1346 i = size_a;
1347 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1348 ;
1349 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001351 if (a->ob_digit[i] < b->ob_digit[i]) {
1352 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001354 }
1355 size_a = size_b = i+1;
1356 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001357 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001358 if (z == NULL)
1359 return NULL;
1360 for (i = 0; i < size_b; ++i) {
1361 /* The following assumes unsigned arithmetic
1362 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001363 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001364 z->ob_digit[i] = borrow & MASK;
1365 borrow >>= SHIFT;
1366 borrow &= 1; /* Keep only one sign bit */
1367 }
1368 for (; i < size_a; ++i) {
1369 borrow = a->ob_digit[i] - borrow;
1370 z->ob_digit[i] = borrow & MASK;
1371 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001372 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001373 }
1374 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001375 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001376 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001377 return long_normalize(z);
1378}
1379
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001380static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001381long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001382{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001383 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001384
Neil Schemenauerba872e22001-01-04 01:46:03 +00001385 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1386
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001387 if (a->ob_size < 0) {
1388 if (b->ob_size < 0) {
1389 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001390 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001391 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001392 }
1393 else
1394 z = x_sub(b, a);
1395 }
1396 else {
1397 if (b->ob_size < 0)
1398 z = x_sub(a, b);
1399 else
1400 z = x_add(a, b);
1401 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001402 Py_DECREF(a);
1403 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001404 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001405}
1406
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001407static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001408long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001409{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001410 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001411
Neil Schemenauerba872e22001-01-04 01:46:03 +00001412 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1413
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001414 if (a->ob_size < 0) {
1415 if (b->ob_size < 0)
1416 z = x_sub(a, b);
1417 else
1418 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001419 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001420 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001421 }
1422 else {
1423 if (b->ob_size < 0)
1424 z = x_add(a, b);
1425 else
1426 z = x_sub(a, b);
1427 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001428 Py_DECREF(a);
1429 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001430 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001431}
1432
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001434long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001435{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001436 /* sequence * long */
1437 long n = PyLong_AsLong((PyObject *) w);
1438 if (n == -1 && PyErr_Occurred())
1439 return NULL;
1440 else
1441 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1442}
1443
1444static PyObject *
1445long_mul(PyLongObject *v, PyLongObject *w)
1446{
1447 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001448 int size_a;
1449 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001450 int i;
1451
Neil Schemenauerba872e22001-01-04 01:46:03 +00001452 if (v->ob_type->tp_as_sequence &&
1453 v->ob_type->tp_as_sequence->sq_repeat) {
1454 return long_repeat((PyObject *)v, w);
1455 }
1456 else if (w->ob_type->tp_as_sequence &&
1457 w->ob_type->tp_as_sequence->sq_repeat) {
1458 return long_repeat((PyObject *)w, v);
1459 }
1460
1461 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1462
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001463 size_a = ABS(a->ob_size);
1464 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001465 if (size_a > size_b) {
1466 /* we are faster with the small object on the left */
1467 int hold_sa = size_a;
1468 PyLongObject *hold_a = a;
1469 size_a = size_b;
1470 size_b = hold_sa;
1471 a = b;
1472 b = hold_a;
1473 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001474 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001475 if (z == NULL) {
1476 Py_DECREF(a);
1477 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001478 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001479 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001480 for (i = 0; i < z->ob_size; ++i)
1481 z->ob_digit[i] = 0;
1482 for (i = 0; i < size_a; ++i) {
1483 twodigits carry = 0;
1484 twodigits f = a->ob_digit[i];
1485 int j;
1486
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001487 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001488 Py_DECREF(a);
1489 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001490 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001491 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001492 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001493 for (j = 0; j < size_b; ++j) {
1494 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001495 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001496 carry >>= SHIFT;
1497 }
1498 for (; carry != 0; ++j) {
1499 assert(i+j < z->ob_size);
1500 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001501 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001502 carry >>= SHIFT;
1503 }
1504 }
1505 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001506 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001507 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001508 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001509 Py_DECREF(a);
1510 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001511 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001512}
1513
Guido van Rossume32e0141992-01-19 16:31:05 +00001514/* The / and % operators are now defined in terms of divmod().
1515 The expression a mod b has the value a - b*floor(a/b).
1516 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001517 |a| by |b|, with the sign of a. This is also expressed
1518 as a - b*trunc(a/b), if trunc truncates towards zero.
1519 Some examples:
1520 a b a rem b a mod b
1521 13 10 3 3
1522 -13 10 -3 7
1523 13 -10 3 -7
1524 -13 -10 -3 -3
1525 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001526 have different signs. We then subtract one from the 'div'
1527 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001528
Guido van Rossume32e0141992-01-19 16:31:05 +00001529static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001530l_divmod(PyLongObject *v, PyLongObject *w,
1531 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001532{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001533 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001534
1535 if (long_divrem(v, w, &div, &mod) < 0)
1536 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001537 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1538 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001539 PyLongObject *temp;
1540 PyLongObject *one;
1541 temp = (PyLongObject *) long_add(mod, w);
1542 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001543 mod = temp;
1544 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001545 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001546 return -1;
1547 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001548 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001549 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001550 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1551 Py_DECREF(mod);
1552 Py_DECREF(div);
1553 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001554 return -1;
1555 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001556 Py_DECREF(one);
1557 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001558 div = temp;
1559 }
1560 *pdiv = div;
1561 *pmod = mod;
1562 return 0;
1563}
1564
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001565static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001566long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001567{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001568 PyLongObject *a, *b, *div, *mod;
1569
1570 CONVERT_BINOP(v, w, &a, &b);
1571
1572 if (l_divmod(a, b, &div, &mod) < 0) {
1573 Py_DECREF(a);
1574 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001575 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001576 }
1577 Py_DECREF(a);
1578 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001579 Py_DECREF(mod);
1580 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001581}
1582
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001583static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001584long_classic_div(PyObject *v, PyObject *w)
1585{
1586 PyLongObject *a, *b, *div, *mod;
1587
1588 CONVERT_BINOP(v, w, &a, &b);
1589
1590 if (Py_DivisionWarningFlag &&
1591 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1592 div = NULL;
1593 else if (l_divmod(a, b, &div, &mod) < 0)
1594 div = NULL;
1595 else
1596 Py_DECREF(mod);
1597
1598 Py_DECREF(a);
1599 Py_DECREF(b);
1600 return (PyObject *)div;
1601}
1602
1603static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00001604long_true_divide(PyObject *v, PyObject *w)
1605{
Tim Peterse2a60002001-09-04 06:17:36 +00001606 PyLongObject *a, *b;
1607 double ad, bd;
1608 int aexp, bexp;
1609
1610 CONVERT_BINOP(v, w, &a, &b);
1611 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
1612 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
1613 if ((ad == -1.0 || bd == -1.0) && PyErr_Occurred())
1614 return NULL;
1615
1616 if (bd == 0.0) {
1617 PyErr_SetString(PyExc_ZeroDivisionError,
1618 "long division or modulo by zero");
1619 return NULL;
1620 }
1621
1622 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
1623 ad /= bd; /* overflow/underflow impossible here */
1624 aexp -= bexp;
1625 if (aexp > INT_MAX / SHIFT)
1626 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00001627 else if (aexp < -(INT_MAX / SHIFT))
1628 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00001629 errno = 0;
1630 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00001631 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00001632 goto overflow;
1633 return PyFloat_FromDouble(ad);
1634
1635overflow:
1636 PyErr_SetString(PyExc_OverflowError,
1637 "long/long too large for a float");
1638 return NULL;
1639
Tim Peters20dab9f2001-09-04 05:31:47 +00001640}
1641
1642static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001643long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001644{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001645 PyLongObject *a, *b, *div, *mod;
1646
1647 CONVERT_BINOP(v, w, &a, &b);
1648
1649 if (l_divmod(a, b, &div, &mod) < 0) {
1650 Py_DECREF(a);
1651 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001652 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001653 }
1654 Py_DECREF(a);
1655 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001656 Py_DECREF(div);
1657 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001658}
1659
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001660static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001661long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001662{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001663 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001664 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001665
1666 CONVERT_BINOP(v, w, &a, &b);
1667
1668 if (l_divmod(a, b, &div, &mod) < 0) {
1669 Py_DECREF(a);
1670 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001671 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001672 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001673 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001674 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001675 PyTuple_SetItem(z, 0, (PyObject *) div);
1676 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001677 }
1678 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001679 Py_DECREF(div);
1680 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001681 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001682 Py_DECREF(a);
1683 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001684 return z;
1685}
1686
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001687static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001688long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001689{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001690 PyLongObject *a, *b;
1691 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001692 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001693 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001694
1695 CONVERT_BINOP(v, w, &a, &b);
1696 if (PyLong_Check(x) || Py_None == x) {
1697 c = x;
1698 Py_INCREF(x);
1699 }
1700 else if (PyInt_Check(x)) {
1701 c = PyLong_FromLong(PyInt_AS_LONG(x));
1702 }
1703 else {
1704 Py_DECREF(a);
1705 Py_DECREF(b);
1706 Py_INCREF(Py_NotImplemented);
1707 return Py_NotImplemented;
1708 }
Tim Peters4c483c42001-09-05 06:24:58 +00001709
1710 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
1711 PyErr_SetString(PyExc_ValueError,
1712 "pow() 3rd argument cannot be 0");
1713 z = NULL;
1714 goto error;
1715 }
1716
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001717 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001718 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001719 Py_DECREF(a);
1720 Py_DECREF(b);
1721 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00001722 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00001723 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
1724 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00001725 return NULL;
1726 }
1727 /* Return a float. This works because we know that
1728 this calls float_pow() which converts its
1729 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001730 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001731 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001732 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001733 for (i = 0; i < size_b; ++i) {
1734 digit bi = b->ob_digit[i];
1735 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001736
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001737 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001738 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001739
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001740 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001741 temp = (PyLongObject *)long_mul(z, a);
1742 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001743 if (c!=Py_None && temp!=NULL) {
1744 if (l_divmod(temp,(PyLongObject *)c,
1745 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001746 Py_DECREF(temp);
1747 z = NULL;
1748 goto error;
1749 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001750 Py_XDECREF(div);
1751 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001752 temp = mod;
1753 }
1754 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001755 if (z == NULL)
1756 break;
1757 }
1758 bi >>= 1;
1759 if (bi == 0 && i+1 == size_b)
1760 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001761 temp = (PyLongObject *)long_mul(a, a);
1762 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001763 if (c!=Py_None && temp!=NULL) {
1764 if (l_divmod(temp, (PyLongObject *)c, &div,
1765 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001766 Py_DECREF(temp);
1767 z = NULL;
1768 goto error;
1769 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001770 Py_XDECREF(div);
1771 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001772 temp = mod;
1773 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001774 a = temp;
1775 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001776 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001777 z = NULL;
1778 break;
1779 }
1780 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001781 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001782 break;
1783 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001784 if (c!=Py_None && z!=NULL) {
1785 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001786 Py_DECREF(z);
1787 z = NULL;
1788 }
1789 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001790 Py_XDECREF(div);
1791 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001792 z = mod;
1793 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001794 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001795 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001796 Py_XDECREF(a);
1797 Py_DECREF(b);
1798 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001799 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001800}
1801
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001802static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001803long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001804{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001805 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001806 PyLongObject *x;
1807 PyLongObject *w;
1808 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001809 if (w == NULL)
1810 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001811 x = (PyLongObject *) long_add(v, w);
1812 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001813 if (x == NULL)
1814 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00001815 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001816 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001817}
1818
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001819static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001820long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001821{
Tim Peters69c2de32001-09-11 22:31:33 +00001822 if (PyLong_CheckExact(v)) {
1823 Py_INCREF(v);
1824 return (PyObject *)v;
1825 }
1826 else
1827 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001828}
1829
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001830static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001831long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001832{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001833 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001834 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001835 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001836 Py_INCREF(v);
1837 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001838 }
Tim Peters69c2de32001-09-11 22:31:33 +00001839 z = (PyLongObject *)_PyLong_Copy(v);
1840 if (z != NULL)
1841 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001842 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001843}
1844
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001845static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001846long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001847{
1848 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001849 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00001850 else
1851 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001852}
1853
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001854static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001855long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001856{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001857 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001858}
1859
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001860static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001861long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001862{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001863 PyLongObject *a, *b;
1864 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001865 long shiftby;
1866 int newsize, wordshift, loshift, hishift, i, j;
1867 digit lomask, himask;
1868
Neil Schemenauerba872e22001-01-04 01:46:03 +00001869 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1870
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001871 if (a->ob_size < 0) {
1872 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001873 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001874 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001875 if (a1 == NULL)
1876 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001877 a2 = (PyLongObject *) long_rshift(a1, b);
1878 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001879 if (a2 == NULL)
1880 goto rshift_error;
1881 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001882 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001883 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001884 else {
1885
1886 shiftby = PyLong_AsLong((PyObject *)b);
1887 if (shiftby == -1L && PyErr_Occurred())
1888 goto rshift_error;
1889 if (shiftby < 0) {
1890 PyErr_SetString(PyExc_ValueError,
1891 "negative shift count");
1892 goto rshift_error;
1893 }
1894 wordshift = shiftby / SHIFT;
1895 newsize = ABS(a->ob_size) - wordshift;
1896 if (newsize <= 0) {
1897 z = _PyLong_New(0);
1898 Py_DECREF(a);
1899 Py_DECREF(b);
1900 return (PyObject *)z;
1901 }
1902 loshift = shiftby % SHIFT;
1903 hishift = SHIFT - loshift;
1904 lomask = ((digit)1 << hishift) - 1;
1905 himask = MASK ^ lomask;
1906 z = _PyLong_New(newsize);
1907 if (z == NULL)
1908 goto rshift_error;
1909 if (a->ob_size < 0)
1910 z->ob_size = -(z->ob_size);
1911 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1912 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1913 if (i+1 < newsize)
1914 z->ob_digit[i] |=
1915 (a->ob_digit[j+1] << hishift) & himask;
1916 }
1917 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001918 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001919rshift_error:
1920 Py_DECREF(a);
1921 Py_DECREF(b);
1922 return (PyObject *) z;
1923
Guido van Rossumc6913e71991-11-19 20:26:46 +00001924}
1925
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001926static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001927long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001928{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001929 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001930 PyLongObject *a, *b;
1931 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001932 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001933 int oldsize, newsize, wordshift, remshift, i, j;
1934 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001935
Neil Schemenauerba872e22001-01-04 01:46:03 +00001936 CONVERT_BINOP(v, w, &a, &b);
1937
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001938 shiftby = PyLong_AsLong((PyObject *)b);
1939 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001940 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001941 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001942 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001943 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001944 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001945 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001946 PyErr_SetString(PyExc_ValueError,
1947 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001948 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001949 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001950 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1951 wordshift = (int)shiftby / SHIFT;
1952 remshift = (int)shiftby - wordshift * SHIFT;
1953
1954 oldsize = ABS(a->ob_size);
1955 newsize = oldsize + wordshift;
1956 if (remshift)
1957 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001958 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001959 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001960 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001961 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001962 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001963 for (i = 0; i < wordshift; i++)
1964 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001965 accum = 0;
1966 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1967 accum |= a->ob_digit[j] << remshift;
1968 z->ob_digit[i] = (digit)(accum & MASK);
1969 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001970 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001971 if (remshift)
1972 z->ob_digit[newsize-1] = (digit)accum;
1973 else
1974 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001975 z = long_normalize(z);
1976lshift_error:
1977 Py_DECREF(a);
1978 Py_DECREF(b);
1979 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001980}
1981
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001982
1983/* Bitwise and/xor/or operations */
1984
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001985#define MAX(x, y) ((x) < (y) ? (y) : (x))
1986#define MIN(x, y) ((x) > (y) ? (y) : (x))
1987
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001988static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001989long_bitwise(PyLongObject *a,
1990 int op, /* '&', '|', '^' */
1991 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001992{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001993 digit maska, maskb; /* 0 or MASK */
1994 int negz;
1995 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001996 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001997 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001998 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001999 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002000
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002001 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002002 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002003 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002004 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002005 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002006 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002007 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002008 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002009 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002010 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002011 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002012 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002013 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002014 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002015 maskb = 0;
2016 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00002017
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002018 negz = 0;
2019 switch (op) {
2020 case '^':
2021 if (maska != maskb) {
2022 maska ^= MASK;
2023 negz = -1;
2024 }
2025 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002026 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002027 if (maska && maskb) {
2028 op = '|';
2029 maska ^= MASK;
2030 maskb ^= MASK;
2031 negz = -1;
2032 }
2033 break;
2034 case '|':
2035 if (maska || maskb) {
2036 op = '&';
2037 maska ^= MASK;
2038 maskb ^= MASK;
2039 negz = -1;
2040 }
2041 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002042 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002043
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002044 /* JRH: The original logic here was to allocate the result value (z)
2045 as the longer of the two operands. However, there are some cases
2046 where the result is guaranteed to be shorter than that: AND of two
2047 positives, OR of two negatives: use the shorter number. AND with
2048 mixed signs: use the positive number. OR with mixed signs: use the
2049 negative number. After the transformations above, op will be '&'
2050 iff one of these cases applies, and mask will be non-0 for operands
2051 whose length should be ignored.
2052 */
2053
2054 size_a = a->ob_size;
2055 size_b = b->ob_size;
2056 size_z = op == '&'
2057 ? (maska
2058 ? size_b
2059 : (maskb ? size_a : MIN(size_a, size_b)))
2060 : MAX(size_a, size_b);
2061 z = _PyLong_New(size_z);
2062 if (a == NULL || b == NULL || z == NULL) {
2063 Py_XDECREF(a);
2064 Py_XDECREF(b);
2065 Py_XDECREF(z);
2066 return NULL;
2067 }
2068
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002069 for (i = 0; i < size_z; ++i) {
2070 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2071 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2072 switch (op) {
2073 case '&': z->ob_digit[i] = diga & digb; break;
2074 case '|': z->ob_digit[i] = diga | digb; break;
2075 case '^': z->ob_digit[i] = diga ^ digb; break;
2076 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002077 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002078
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002079 Py_DECREF(a);
2080 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002081 z = long_normalize(z);
2082 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002083 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002084 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002085 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002086 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002087}
2088
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002089static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002090long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002091{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002092 PyLongObject *a, *b;
2093 PyObject *c;
2094 CONVERT_BINOP(v, w, &a, &b);
2095 c = long_bitwise(a, '&', b);
2096 Py_DECREF(a);
2097 Py_DECREF(b);
2098 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002099}
2100
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002101static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002102long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002103{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002104 PyLongObject *a, *b;
2105 PyObject *c;
2106 CONVERT_BINOP(v, w, &a, &b);
2107 c = long_bitwise(a, '^', b);
2108 Py_DECREF(a);
2109 Py_DECREF(b);
2110 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002111}
2112
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002113static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002114long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002115{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002116 PyLongObject *a, *b;
2117 PyObject *c;
2118 CONVERT_BINOP(v, w, &a, &b);
2119 c = long_bitwise(a, '|', b);
2120 Py_DECREF(a);
2121 Py_DECREF(b);
2122 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002123}
2124
Guido van Rossum234f9421993-06-17 12:35:49 +00002125static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002126long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002127{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002128 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002129 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002130 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002131 return 0;
2132 }
2133 return 1; /* Can't do it */
2134}
2135
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002136static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002137long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002138{
2139 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002140 x = PyLong_AsLong(v);
2141 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002142 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002143 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002144}
2145
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002146static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002147long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002148{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002149 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002150 return v;
2151}
2152
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002153static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002154long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002155{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002156 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002157 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002158 if (result == -1.0 && PyErr_Occurred())
2159 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002160 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002161}
2162
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002163static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002164long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002165{
Fred Drake121ee271999-12-23 15:41:28 +00002166 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002167}
2168
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002169static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002170long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002171{
Fred Drake121ee271999-12-23 15:41:28 +00002172 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002173}
Guido van Rossumbef14172001-08-29 15:47:46 +00002174staticforward PyObject *
2175long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002176
Tim Peters6d6c1a32001-08-02 04:15:00 +00002177static PyObject *
2178long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2179{
2180 PyObject *x = NULL;
2181 int base = -909; /* unlikely! */
2182 static char *kwlist[] = {"x", "base", 0};
2183
Guido van Rossumbef14172001-08-29 15:47:46 +00002184 if (type != &PyLong_Type)
2185 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002186 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2187 &x, &base))
2188 return NULL;
2189 if (x == NULL)
2190 return PyLong_FromLong(0L);
2191 if (base == -909)
2192 return PyNumber_Long(x);
2193 else if (PyString_Check(x))
2194 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002195#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002196 else if (PyUnicode_Check(x))
2197 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2198 PyUnicode_GET_SIZE(x),
2199 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002200#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002201 else {
2202 PyErr_SetString(PyExc_TypeError,
2203 "long() can't convert non-string with explicit base");
2204 return NULL;
2205 }
2206}
2207
Guido van Rossumbef14172001-08-29 15:47:46 +00002208/* Wimpy, slow approach to tp_new calls for subtypes of long:
2209 first create a regular long from whatever arguments we got,
2210 then allocate a subtype instance and initialize it from
2211 the regular long. The regular long is then thrown away.
2212*/
2213static PyObject *
2214long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2215{
2216 PyLongObject *tmp, *new;
2217 int i, n;
2218
2219 assert(PyType_IsSubtype(type, &PyLong_Type));
2220 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2221 if (tmp == NULL)
2222 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002223 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002224 n = tmp->ob_size;
2225 if (n < 0)
2226 n = -n;
2227 new = (PyLongObject *)type->tp_alloc(type, n);
2228 if (new == NULL)
2229 return NULL;
2230 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002231 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002232 for (i = 0; i < n; i++)
2233 new->ob_digit[i] = tmp->ob_digit[i];
2234 Py_DECREF(tmp);
2235 return (PyObject *)new;
2236}
2237
Tim Peters6d6c1a32001-08-02 04:15:00 +00002238static char long_doc[] =
2239"long(x[, base]) -> integer\n\
2240\n\
2241Convert a string or number to a long integer, if possible. A floating\n\
2242point argument will be truncated towards zero (this does not include a\n\
2243string representation of a floating point number!) When converting a\n\
2244string, use the optional base. It is an error to supply a base when\n\
2245converting a non-string.";
2246
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002247static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002248 (binaryfunc) long_add, /*nb_add*/
2249 (binaryfunc) long_sub, /*nb_subtract*/
2250 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002251 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002252 (binaryfunc) long_mod, /*nb_remainder*/
2253 (binaryfunc) long_divmod, /*nb_divmod*/
2254 (ternaryfunc) long_pow, /*nb_power*/
2255 (unaryfunc) long_neg, /*nb_negative*/
2256 (unaryfunc) long_pos, /*tp_positive*/
2257 (unaryfunc) long_abs, /*tp_absolute*/
2258 (inquiry) long_nonzero, /*tp_nonzero*/
2259 (unaryfunc) long_invert, /*nb_invert*/
2260 (binaryfunc) long_lshift, /*nb_lshift*/
2261 (binaryfunc) long_rshift, /*nb_rshift*/
2262 (binaryfunc) long_and, /*nb_and*/
2263 (binaryfunc) long_xor, /*nb_xor*/
2264 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002265 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002266 (unaryfunc) long_int, /*nb_int*/
2267 (unaryfunc) long_long, /*nb_long*/
2268 (unaryfunc) long_float, /*nb_float*/
2269 (unaryfunc) long_oct, /*nb_oct*/
2270 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002271 0, /* nb_inplace_add */
2272 0, /* nb_inplace_subtract */
2273 0, /* nb_inplace_multiply */
2274 0, /* nb_inplace_divide */
2275 0, /* nb_inplace_remainder */
2276 0, /* nb_inplace_power */
2277 0, /* nb_inplace_lshift */
2278 0, /* nb_inplace_rshift */
2279 0, /* nb_inplace_and */
2280 0, /* nb_inplace_xor */
2281 0, /* nb_inplace_or */
2282 (binaryfunc)long_div, /* nb_floor_divide */
2283 long_true_divide, /* nb_true_divide */
2284 0, /* nb_inplace_floor_divide */
2285 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002286};
2287
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002288PyTypeObject PyLong_Type = {
2289 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002290 0, /* ob_size */
2291 "long", /* tp_name */
2292 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2293 sizeof(digit), /* tp_itemsize */
2294 (destructor)long_dealloc, /* tp_dealloc */
2295 0, /* tp_print */
2296 0, /* tp_getattr */
2297 0, /* tp_setattr */
2298 (cmpfunc)long_compare, /* tp_compare */
2299 (reprfunc)long_repr, /* tp_repr */
2300 &long_as_number, /* tp_as_number */
2301 0, /* tp_as_sequence */
2302 0, /* tp_as_mapping */
2303 (hashfunc)long_hash, /* tp_hash */
2304 0, /* tp_call */
2305 (reprfunc)long_str, /* tp_str */
2306 PyObject_GenericGetAttr, /* tp_getattro */
2307 0, /* tp_setattro */
2308 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002309 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2310 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002311 long_doc, /* tp_doc */
2312 0, /* tp_traverse */
2313 0, /* tp_clear */
2314 0, /* tp_richcompare */
2315 0, /* tp_weaklistoffset */
2316 0, /* tp_iter */
2317 0, /* tp_iternext */
2318 0, /* tp_methods */
2319 0, /* tp_members */
2320 0, /* tp_getset */
2321 0, /* tp_base */
2322 0, /* tp_dict */
2323 0, /* tp_descr_get */
2324 0, /* tp_descr_set */
2325 0, /* tp_dictoffset */
2326 0, /* tp_init */
2327 0, /* tp_alloc */
2328 long_new, /* tp_new */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002329};