blob: 5141d533c7edb0343d82a765ef4db48e32ab752a [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)) {
Guido van Rossum7e35d572001-09-15 03:14:32 +0000186 if (vv != NULL && PyInt_Check(vv))
187 return PyInt_AsLong(vv);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000189 return -1;
190 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000192 i = v->ob_size;
193 sign = 1;
194 x = 0;
195 if (i < 0) {
196 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000197 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000198 }
199 while (--i >= 0) {
200 prev = x;
201 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000202 if ((x >> SHIFT) != prev)
203 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000204 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000205 /* Haven't lost any bits, but if the sign bit is set we're in
206 * trouble *unless* this is the min negative number. So,
207 * trouble iff sign bit set && (positive || some bit set other
208 * than the sign bit).
209 */
210 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
211 goto overflow;
212 return (long)x * sign;
213
214 overflow:
215 PyErr_SetString(PyExc_OverflowError,
Skip Montanarobafedec2001-09-13 19:05:30 +0000216 "long int too large to convert to int");
Guido van Rossumf7531811998-05-26 14:33:37 +0000217 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000218}
219
Guido van Rossum53756b11997-01-03 17:14:46 +0000220/* Get a C long int from a long int object.
221 Returns -1 and sets an error condition if overflow occurs. */
222
223unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000224PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000225{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000227 unsigned long x, prev;
228 int i;
229
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 if (vv == NULL || !PyLong_Check(vv)) {
231 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000232 return (unsigned long) -1;
233 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000235 i = v->ob_size;
236 x = 0;
237 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000238 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000239 "can't convert negative value to unsigned long");
240 return (unsigned long) -1;
241 }
242 while (--i >= 0) {
243 prev = x;
244 x = (x << SHIFT) + v->ob_digit[i];
245 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000247 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000248 return (unsigned long) -1;
249 }
250 }
251 return x;
252}
253
Tim Peters2a9b3672001-06-11 21:23:58 +0000254PyObject *
255_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
256 int little_endian, int is_signed)
257{
258 const unsigned char* pstartbyte;/* LSB of bytes */
259 int incr; /* direction to move pstartbyte */
260 const unsigned char* pendbyte; /* MSB of bytes */
261 size_t numsignificantbytes; /* number of bytes that matter */
262 size_t ndigits; /* number of Python long digits */
263 PyLongObject* v; /* result */
264 int idigit = 0; /* next free index in v->ob_digit */
265
266 if (n == 0)
267 return PyLong_FromLong(0L);
268
269 if (little_endian) {
270 pstartbyte = bytes;
271 pendbyte = bytes + n - 1;
272 incr = 1;
273 }
274 else {
275 pstartbyte = bytes + n - 1;
276 pendbyte = bytes;
277 incr = -1;
278 }
279
280 if (is_signed)
281 is_signed = *pendbyte >= 0x80;
282
283 /* Compute numsignificantbytes. This consists of finding the most
284 significant byte. Leading 0 bytes are insignficant if the number
285 is positive, and leading 0xff bytes if negative. */
286 {
287 size_t i;
288 const unsigned char* p = pendbyte;
289 const int pincr = -incr; /* search MSB to LSB */
290 const unsigned char insignficant = is_signed ? 0xff : 0x00;
291
292 for (i = 0; i < n; ++i, p += pincr) {
293 if (*p != insignficant)
294 break;
295 }
296 numsignificantbytes = n - i;
297 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
298 actually has 2 significant bytes. OTOH, 0xff0001 ==
299 -0x00ffff, so we wouldn't *need* to bump it there; but we
300 do for 0xffff = -0x0001. To be safe without bothering to
301 check every case, bump it regardless. */
302 if (is_signed && numsignificantbytes < n)
303 ++numsignificantbytes;
304 }
305
306 /* How many Python long digits do we need? We have
307 8*numsignificantbytes bits, and each Python long digit has SHIFT
308 bits, so it's the ceiling of the quotient. */
309 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
310 if (ndigits > (size_t)INT_MAX)
311 return PyErr_NoMemory();
312 v = _PyLong_New((int)ndigits);
313 if (v == NULL)
314 return NULL;
315
316 /* Copy the bits over. The tricky parts are computing 2's-comp on
317 the fly for signed numbers, and dealing with the mismatch between
318 8-bit bytes and (probably) 15-bit Python digits.*/
319 {
320 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000321 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000322 twodigits accum = 0; /* sliding register */
323 unsigned int accumbits = 0; /* number of bits in accum */
324 const unsigned char* p = pstartbyte;
325
326 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000327 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000328 /* Compute correction for 2's comp, if needed. */
329 if (is_signed) {
330 thisbyte = (0xff ^ thisbyte) + carry;
331 carry = thisbyte >> 8;
332 thisbyte &= 0xff;
333 }
334 /* Because we're going LSB to MSB, thisbyte is
335 more significant than what's already in accum,
336 so needs to be prepended to accum. */
337 accum |= thisbyte << accumbits;
338 accumbits += 8;
339 if (accumbits >= SHIFT) {
340 /* There's enough to fill a Python digit. */
341 assert(idigit < (int)ndigits);
342 v->ob_digit[idigit] = (digit)(accum & MASK);
343 ++idigit;
344 accum >>= SHIFT;
345 accumbits -= SHIFT;
346 assert(accumbits < SHIFT);
347 }
348 }
349 assert(accumbits < SHIFT);
350 if (accumbits) {
351 assert(idigit < (int)ndigits);
352 v->ob_digit[idigit] = (digit)accum;
353 ++idigit;
354 }
355 }
356
357 v->ob_size = is_signed ? -idigit : idigit;
358 return (PyObject *)long_normalize(v);
359}
360
361int
362_PyLong_AsByteArray(PyLongObject* v,
363 unsigned char* bytes, size_t n,
364 int little_endian, int is_signed)
365{
366 int i; /* index into v->ob_digit */
367 int ndigits; /* |v->ob_size| */
368 twodigits accum; /* sliding register */
369 unsigned int accumbits; /* # bits in accum */
370 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
371 twodigits carry; /* for computing 2's-comp */
372 size_t j; /* # bytes filled */
373 unsigned char* p; /* pointer to next byte in bytes */
374 int pincr; /* direction to move p */
375
376 assert(v != NULL && PyLong_Check(v));
377
378 if (v->ob_size < 0) {
379 ndigits = -(v->ob_size);
380 if (!is_signed) {
381 PyErr_SetString(PyExc_TypeError,
382 "can't convert negative long to unsigned");
383 return -1;
384 }
385 do_twos_comp = 1;
386 }
387 else {
388 ndigits = v->ob_size;
389 do_twos_comp = 0;
390 }
391
392 if (little_endian) {
393 p = bytes;
394 pincr = 1;
395 }
396 else {
397 p = bytes + n - 1;
398 pincr = -1;
399 }
400
Tim Peters898cf852001-06-13 20:50:08 +0000401 /* Copy over all the Python digits.
402 It's crucial that every Python digit except for the MSD contribute
403 exactly SHIFT bits to the total, so first assert that the long is
404 normalized. */
405 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000406 j = 0;
407 accum = 0;
408 accumbits = 0;
409 carry = do_twos_comp ? 1 : 0;
410 for (i = 0; i < ndigits; ++i) {
411 twodigits thisdigit = v->ob_digit[i];
412 if (do_twos_comp) {
413 thisdigit = (thisdigit ^ MASK) + carry;
414 carry = thisdigit >> SHIFT;
415 thisdigit &= MASK;
416 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000417 /* Because we're going LSB to MSB, thisdigit is more
418 significant than what's already in accum, so needs to be
419 prepended to accum. */
420 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000421 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000422
Tim Petersede05092001-06-14 08:53:38 +0000423 /* The most-significant digit may be (probably is) at least
424 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000425 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000426 /* Count # of sign bits -- they needn't be stored,
427 * although for signed conversion we need later to
428 * make sure at least one sign bit gets stored.
429 * First shift conceptual sign bit to real sign bit.
430 */
431 stwodigits s = (stwodigits)(thisdigit <<
432 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000433 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000434 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000435 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000436 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000437 }
Tim Petersede05092001-06-14 08:53:38 +0000438 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000439 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000440
Tim Peters2a9b3672001-06-11 21:23:58 +0000441 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000442 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000443 if (j >= n)
444 goto Overflow;
445 ++j;
446 *p = (unsigned char)(accum & 0xff);
447 p += pincr;
448 accumbits -= 8;
449 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000450 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000451 }
452
453 /* Store the straggler (if any). */
454 assert(accumbits < 8);
455 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000456 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000457 if (j >= n)
458 goto Overflow;
459 ++j;
460 if (do_twos_comp) {
461 /* Fill leading bits of the byte with sign bits
462 (appropriately pretending that the long had an
463 infinite supply of sign bits). */
464 accum |= (~(twodigits)0) << accumbits;
465 }
466 *p = (unsigned char)(accum & 0xff);
467 p += pincr;
468 }
Tim Peters05607ad2001-06-13 21:01:27 +0000469 else if (j == n && n > 0 && is_signed) {
470 /* The main loop filled the byte array exactly, so the code
471 just above didn't get to ensure there's a sign bit, and the
472 loop below wouldn't add one either. Make sure a sign bit
473 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000474 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000475 int sign_bit_set = msb >= 0x80;
476 assert(accumbits == 0);
477 if (sign_bit_set == do_twos_comp)
478 return 0;
479 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000480 goto Overflow;
481 }
Tim Peters05607ad2001-06-13 21:01:27 +0000482
483 /* Fill remaining bytes with copies of the sign bit. */
484 {
485 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
486 for ( ; j < n; ++j, p += pincr)
487 *p = signbyte;
488 }
489
Tim Peters2a9b3672001-06-11 21:23:58 +0000490 return 0;
491
492Overflow:
493 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
494 return -1;
495
496}
497
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000498double
499_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
500{
501/* NBITS_WANTED should be > the number of bits in a double's precision,
502 but small enough so that 2**NBITS_WANTED is within the normal double
503 range. nbitsneeded is set to 1 less than that because the most-significant
504 Python digit contains at least 1 significant bit, but we don't want to
505 bother counting them (catering to the worst case cheaply).
506
507 57 is one more than VAX-D double precision; I (Tim) don't know of a double
508 format with more precision than that; it's 1 larger so that we add in at
509 least one round bit to stand in for the ignored least-significant bits.
510*/
511#define NBITS_WANTED 57
512 PyLongObject *v;
513 double x;
514 const double multiplier = (double)(1L << SHIFT);
515 int i, sign;
516 int nbitsneeded;
517
518 if (vv == NULL || !PyLong_Check(vv)) {
519 PyErr_BadInternalCall();
520 return -1;
521 }
522 v = (PyLongObject *)vv;
523 i = v->ob_size;
524 sign = 1;
525 if (i < 0) {
526 sign = -1;
527 i = -(i);
528 }
529 else if (i == 0) {
530 *exponent = 0;
531 return 0.0;
532 }
533 --i;
534 x = (double)v->ob_digit[i];
535 nbitsneeded = NBITS_WANTED - 1;
536 /* Invariant: i Python digits remain unaccounted for. */
537 while (i > 0 && nbitsneeded > 0) {
538 --i;
539 x = x * multiplier + (double)v->ob_digit[i];
540 nbitsneeded -= SHIFT;
541 }
542 /* There are i digits we didn't shift in. Pretending they're all
543 zeroes, the true value is x * 2**(i*SHIFT). */
544 *exponent = i;
545 assert(x > 0.0);
546 return x * sign;
547#undef NBITS_WANTED
548}
549
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000550/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000551
552double
Tim Peters9f688bf2000-07-07 15:53:28 +0000553PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000554{
Tim Peters9fffa3e2001-09-04 05:14:19 +0000555 int e;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000556 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000557
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 if (vv == NULL || !PyLong_Check(vv)) {
559 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000560 return -1;
561 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000562 x = _PyLong_AsScaledDouble(vv, &e);
563 if (x == -1.0 && PyErr_Occurred())
564 return -1.0;
565 if (e > INT_MAX / SHIFT)
566 goto overflow;
567 errno = 0;
568 x = ldexp(x, e * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000569 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000570 goto overflow;
571 return x;
572
573overflow:
574 PyErr_SetString(PyExc_OverflowError,
575 "long int too large to convert to float");
576 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000577}
578
Guido van Rossum78694d91998-09-18 14:14:13 +0000579/* Create a new long (or int) object from a C pointer */
580
581PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000582PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000583{
Tim Peters70128a12001-06-16 08:48:40 +0000584#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000585 return PyInt_FromLong((long)p);
586#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000587
Tim Peters70128a12001-06-16 08:48:40 +0000588#ifndef HAVE_LONG_LONG
589# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
590#endif
591#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
592# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
593#endif
594 /* optimize null pointers */
595 if (p == NULL)
596 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000597 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000598
599#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000600}
601
602/* Get a C pointer from a long object (or an int object in some cases) */
603
604void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000605PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000606{
607 /* This function will allow int or long objects. If vv is neither,
608 then the PyLong_AsLong*() functions will raise the exception:
609 PyExc_SystemError, "bad argument to internal function"
610 */
Tim Peters70128a12001-06-16 08:48:40 +0000611#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000612 long x;
613
Tim Peters70128a12001-06-16 08:48:40 +0000614 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000615 x = PyInt_AS_LONG(vv);
616 else
617 x = PyLong_AsLong(vv);
618#else
Tim Peters70128a12001-06-16 08:48:40 +0000619
620#ifndef HAVE_LONG_LONG
621# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
622#endif
623#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
624# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
625#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000626 LONG_LONG x;
627
Tim Peters70128a12001-06-16 08:48:40 +0000628 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000629 x = PyInt_AS_LONG(vv);
630 else
631 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000632
633#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000634
635 if (x == -1 && PyErr_Occurred())
636 return NULL;
637 return (void *)x;
638}
639
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000640#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000641
642/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
643 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000644 */
645
Tim Peterscf37dfc2001-06-14 18:42:50 +0000646#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000647
648/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000649
650PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000651PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000652{
Tim Petersd1a7da62001-06-13 00:35:57 +0000653 LONG_LONG bytes = ival;
654 int one = 1;
655 return _PyLong_FromByteArray(
656 (unsigned char *)&bytes,
657 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000658}
659
Tim Petersd1a7da62001-06-13 00:35:57 +0000660/* Create a new long int object from a C unsigned LONG_LONG int. */
661
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000662PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000663PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000664{
Tim Petersd1a7da62001-06-13 00:35:57 +0000665 unsigned LONG_LONG bytes = ival;
666 int one = 1;
667 return _PyLong_FromByteArray(
668 (unsigned char *)&bytes,
669 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000670}
671
Guido van Rossum3293b071998-08-25 16:07:15 +0000672/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000673 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000674
Guido van Rossum3293b071998-08-25 16:07:15 +0000675LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000676PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000677{
Tim Petersd1a7da62001-06-13 00:35:57 +0000678 LONG_LONG bytes;
679 int one = 1;
680 int res;
681
Tim Petersd38b1c72001-09-30 05:09:37 +0000682 if (vv == NULL) {
683 PyErr_BadInternalCall();
684 return -1;
685 }
686 if (!PyLong_Check(vv)) {
687 if (PyInt_Check(vv))
688 return (LONG_LONG)PyInt_AsLong(vv);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000689 PyErr_BadInternalCall();
690 return -1;
691 }
692
Tim Petersd1a7da62001-06-13 00:35:57 +0000693 res = _PyLong_AsByteArray(
694 (PyLongObject *)vv, (unsigned char *)&bytes,
695 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000696
Tim Peters9cb0c382001-06-13 20:45:17 +0000697 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000698}
699
Tim Petersd1a7da62001-06-13 00:35:57 +0000700/* Get a C unsigned LONG_LONG int from a long int object.
701 Return -1 and set an error if overflow occurs. */
702
Guido van Rossum3293b071998-08-25 16:07:15 +0000703unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000704PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000705{
Tim Petersd1a7da62001-06-13 00:35:57 +0000706 unsigned LONG_LONG bytes;
707 int one = 1;
708 int res;
709
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000710 if (vv == NULL || !PyLong_Check(vv)) {
711 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000712 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000713 }
714
Tim Petersd1a7da62001-06-13 00:35:57 +0000715 res = _PyLong_AsByteArray(
716 (PyLongObject *)vv, (unsigned char *)&bytes,
717 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000718
Tim Peters9cb0c382001-06-13 20:45:17 +0000719 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000720}
Tim Petersd1a7da62001-06-13 00:35:57 +0000721
722#undef IS_LITTLE_ENDIAN
723
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000724#endif /* HAVE_LONG_LONG */
725
Neil Schemenauerba872e22001-01-04 01:46:03 +0000726
727static int
728convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
729 if (PyLong_Check(v)) {
730 *a = (PyLongObject *) v;
731 Py_INCREF(v);
732 }
733 else if (PyInt_Check(v)) {
734 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
735 }
736 else {
737 return 0;
738 }
739 if (PyLong_Check(w)) {
740 *b = (PyLongObject *) w;
741 Py_INCREF(w);
742 }
743 else if (PyInt_Check(w)) {
744 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
745 }
746 else {
747 Py_DECREF(*a);
748 return 0;
749 }
750 return 1;
751}
752
753#define CONVERT_BINOP(v, w, a, b) \
754 if (!convert_binop(v, w, a, b)) { \
755 Py_INCREF(Py_NotImplemented); \
756 return Py_NotImplemented; \
757 }
758
759
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000760/* Multiply by a single digit, ignoring the sign. */
761
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000762static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000763mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000764{
765 return muladd1(a, n, (digit)0);
766}
767
768/* Multiply by a single digit and add a single digit, ignoring the sign. */
769
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000771muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000772{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000773 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000774 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000775 twodigits carry = extra;
776 int i;
777
778 if (z == NULL)
779 return NULL;
780 for (i = 0; i < size_a; ++i) {
781 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000782 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000783 carry >>= SHIFT;
784 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000785 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000786 return long_normalize(z);
787}
788
Tim Peters212e6142001-07-14 12:23:19 +0000789/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
790 in pout, and returning the remainder. pin and pout point at the LSD.
791 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
792 long_format, but that should be done with great care since longs are
793 immutable. */
794
795static digit
796inplace_divrem1(digit *pout, digit *pin, int size, digit n)
797{
798 twodigits rem = 0;
799
800 assert(n > 0 && n <= MASK);
801 pin += size;
802 pout += size;
803 while (--size >= 0) {
804 digit hi;
805 rem = (rem << SHIFT) + *--pin;
806 *--pout = hi = (digit)(rem / n);
807 rem -= hi * n;
808 }
809 return (digit)rem;
810}
811
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000812/* Divide a long integer by a digit, returning both the quotient
813 (as function result) and the remainder (through *prem).
814 The sign of a is ignored; n should not be zero. */
815
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000817divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000818{
Tim Peters212e6142001-07-14 12:23:19 +0000819 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000820 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000821
822 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000824 if (z == NULL)
825 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000826 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000827 return long_normalize(z);
828}
829
830/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000831 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000832 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000833
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000835long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000836{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 register PyLongObject *a = (PyLongObject *)aa;
838 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000839 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000840 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000841 char *p;
842 int bits;
843 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000844
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000845 if (a == NULL || !PyLong_Check(a)) {
846 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000847 return NULL;
848 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000849 assert(base >= 2 && base <= 36);
850
851 /* Compute a rough upper bound for the length of the string */
852 i = base;
853 bits = 0;
854 while (i > 1) {
855 ++bits;
856 i >>= 1;
857 }
Fred Drake121ee271999-12-23 15:41:28 +0000858 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000859 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000860 if (str == NULL)
861 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000863 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000864 if (addL)
865 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000866 if (a->ob_size < 0)
867 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000868
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000869 if (a->ob_size == 0) {
870 *--p = '0';
871 }
872 else if ((base & (base - 1)) == 0) {
873 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000874 twodigits accum = 0;
875 int accumbits = 0; /* # of bits in accum */
876 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000877 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000878 while ((i >>= 1) > 1)
879 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000880
881 for (i = 0; i < size_a; ++i) {
882 accum |= a->ob_digit[i] << accumbits;
883 accumbits += SHIFT;
884 assert(accumbits >= basebits);
885 do {
886 char digit = (char)(accum & (base - 1));
887 digit += (digit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000888 assert(p > PyString_AS_STRING(str));
Tim Peters586b2e32001-07-15 09:11:14 +0000889 *--p = digit;
890 accumbits -= basebits;
891 accum >>= basebits;
892 } while (i < size_a-1 ? accumbits >= basebits :
893 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000894 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000895 }
896 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000897 /* Not 0, and base not a power of 2. Divide repeatedly by
898 base, but for speed use the highest power of base that
899 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000900 int size = size_a;
901 digit *pin = a->ob_digit;
902 PyLongObject *scratch;
903 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000904 digit powbase = base; /* powbase == base ** power */
905 int power = 1;
906 for (;;) {
907 unsigned long newpow = powbase * (unsigned long)base;
908 if (newpow >> SHIFT) /* doesn't fit in a digit */
909 break;
910 powbase = (digit)newpow;
911 ++power;
912 }
Tim Peters212e6142001-07-14 12:23:19 +0000913
914 /* Get a scratch area for repeated division. */
915 scratch = _PyLong_New(size);
916 if (scratch == NULL) {
917 Py_DECREF(str);
918 return NULL;
919 }
920
921 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000922 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000923 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000924 digit rem = inplace_divrem1(scratch->ob_digit,
925 pin, size, powbase);
926 pin = scratch->ob_digit; /* no need to use a again */
927 if (pin[size - 1] == 0)
928 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000929 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +0000930 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000931 Py_DECREF(str);
932 return NULL;
933 })
Tim Peters212e6142001-07-14 12:23:19 +0000934
935 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000936 assert(ntostore > 0);
937 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000938 digit nextrem = (digit)(rem / base);
939 char c = (char)(rem - nextrem * base);
940 assert(p > PyString_AS_STRING(str));
941 c += (c < 10) ? '0' : 'A'-10;
942 *--p = c;
943 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000944 --ntostore;
945 /* Termination is a bit delicate: must not
946 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +0000947 remaining quotient and rem are both 0. */
948 } while (ntostore && (size || rem));
949 } while (size != 0);
950 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000951 }
952
Guido van Rossum2c475421992-08-14 15:13:07 +0000953 if (base == 8) {
954 if (size_a != 0)
955 *--p = '0';
956 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000957 else if (base == 16) {
958 *--p = 'x';
959 *--p = '0';
960 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000961 else if (base != 10) {
962 *--p = '#';
963 *--p = '0' + base%10;
964 if (base > 10)
965 *--p = '0' + base/10;
966 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000967 if (sign)
968 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 if (p != PyString_AS_STRING(str)) {
970 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000971 assert(p > q);
972 do {
973 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000974 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 _PyString_Resize((PyObject **)&str,
976 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000977 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000979}
980
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000981PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000982PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000983{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000984 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000985 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000986 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000987
Guido van Rossum472c04f1996-12-05 21:57:21 +0000988 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000990 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000991 return NULL;
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 (*str == '+')
996 ++str;
997 else if (*str == '-') {
998 ++str;
999 sign = -1;
1000 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001001 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001002 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001003 if (base == 0) {
1004 if (str[0] != '0')
1005 base = 10;
1006 else if (str[1] == 'x' || str[1] == 'X')
1007 base = 16;
1008 else
1009 base = 8;
1010 }
1011 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1012 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +00001014 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001015 for ( ; z != NULL; ++str) {
1016 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001018
1019 if (*str <= '9')
1020 k = *str - '0';
1021 else if (*str >= 'a')
1022 k = *str - 'a' + 10;
1023 else if (*str >= 'A')
1024 k = *str - 'A' + 10;
1025 if (k < 0 || k >= base)
1026 break;
1027 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001029 z = temp;
1030 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001031 if (z == NULL)
1032 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001033 if (str == start)
1034 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001035 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001036 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001037 if (*str == 'L' || *str == 'l')
1038 str++;
1039 while (*str && isspace(Py_CHARMASK(*str)))
1040 str++;
1041 if (*str != '\0')
1042 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001043 if (pend)
1044 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001046
1047 onError:
1048 PyErr_Format(PyExc_ValueError,
1049 "invalid literal for long(): %.200s", orig_str);
1050 Py_XDECREF(z);
1051 return NULL;
1052}
1053
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001054#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001055PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001056PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001057{
1058 char buffer[256];
1059
1060 if (length >= sizeof(buffer)) {
1061 PyErr_SetString(PyExc_ValueError,
1062 "long() literal too large to convert");
1063 return NULL;
1064 }
1065 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
1066 return NULL;
1067
1068 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001069}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001070#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001071
Tim Peters9f688bf2000-07-07 15:53:28 +00001072/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001073static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001074 (PyLongObject *, PyLongObject *, PyLongObject **);
1075static PyObject *long_pos(PyLongObject *);
1076static int long_divrem(PyLongObject *, PyLongObject *,
1077 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001078
1079/* Long division with remainder, top-level routine */
1080
Guido van Rossume32e0141992-01-19 16:31:05 +00001081static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001082long_divrem(PyLongObject *a, PyLongObject *b,
1083 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001084{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001085 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001087
1088 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001089 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001090 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001091 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001092 }
1093 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001094 (size_a == size_b &&
1095 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001096 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001097 *pdiv = _PyLong_New(0);
1098 Py_INCREF(a);
1099 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001100 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001101 }
1102 if (size_b == 1) {
1103 digit rem = 0;
1104 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001105 if (z == NULL)
1106 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001107 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001108 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001109 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001110 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001111 if (z == NULL)
1112 return -1;
1113 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001114 /* Set the signs.
1115 The quotient z has the sign of a*b;
1116 the remainder r has the sign of a,
1117 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001118 if ((a->ob_size < 0) != (b->ob_size < 0))
1119 z->ob_size = -(z->ob_size);
1120 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1121 (*prem)->ob_size = -((*prem)->ob_size);
1122 *pdiv = z;
1123 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001124}
1125
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001126/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001127
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001128static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001129x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001130{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001131 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001132 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133 PyLongObject *v = mul1(v1, d);
1134 PyLongObject *w = mul1(w1, d);
1135 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001136 int j, k;
1137
1138 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001139 Py_XDECREF(v);
1140 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001141 return NULL;
1142 }
1143
1144 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001145 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001146 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001147
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001148 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001149 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001150
1151 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1152 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1153 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001154 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001155 int i;
1156
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001157 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001158 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001159 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001160 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001161 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001162 if (vj == w->ob_digit[size_w-1])
1163 q = MASK;
1164 else
1165 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1166 w->ob_digit[size_w-1];
1167
1168 while (w->ob_digit[size_w-2]*q >
1169 ((
1170 ((twodigits)vj << SHIFT)
1171 + v->ob_digit[j-1]
1172 - q*w->ob_digit[size_w-1]
1173 ) << SHIFT)
1174 + v->ob_digit[j-2])
1175 --q;
1176
1177 for (i = 0; i < size_w && i+k < size_v; ++i) {
1178 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001179 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001180 carry += v->ob_digit[i+k] - z
1181 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001182 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001183 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1184 carry, SHIFT);
1185 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001186 }
1187
1188 if (i+k < size_v) {
1189 carry += v->ob_digit[i+k];
1190 v->ob_digit[i+k] = 0;
1191 }
1192
1193 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001194 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001195 else {
1196 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001197 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001198 carry = 0;
1199 for (i = 0; i < size_w && i+k < size_v; ++i) {
1200 carry += v->ob_digit[i+k] + w->ob_digit[i];
1201 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001202 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1203 BASE_TWODIGITS_TYPE,
1204 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001205 }
1206 }
1207 } /* for j, k */
1208
Guido van Rossumc206c761995-01-10 15:23:19 +00001209 if (a == NULL)
1210 *prem = NULL;
1211 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001212 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001213 *prem = divrem1(v, d, &d);
1214 /* d receives the (unused) remainder */
1215 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001217 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001218 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001219 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220 Py_DECREF(v);
1221 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001222 return a;
1223}
1224
1225/* Methods */
1226
1227static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001228long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001229{
Guido van Rossum9475a232001-10-05 20:51:39 +00001230 v->ob_type->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001231}
1232
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001233static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001234long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001235{
Fred Drake121ee271999-12-23 15:41:28 +00001236 return long_format(v, 10, 1);
1237}
1238
1239static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001240long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001241{
1242 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001243}
1244
1245static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001246long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001247{
1248 int sign;
1249
Guido van Rossumc6913e71991-11-19 20:26:46 +00001250 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001251 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001252 sign = 0;
1253 else
1254 sign = a->ob_size - b->ob_size;
1255 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001256 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001257 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001258 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1259 ;
1260 if (i < 0)
1261 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001262 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001263 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001264 if (a->ob_size < 0)
1265 sign = -sign;
1266 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001267 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001268 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001269}
1270
Guido van Rossum9bfef441993-03-29 10:43:31 +00001271static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001272long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001273{
1274 long x;
1275 int i, sign;
1276
1277 /* This is designed so that Python ints and longs with the
1278 same value hash to the same value, otherwise comparisons
1279 of mapping keys will turn out weird */
1280 i = v->ob_size;
1281 sign = 1;
1282 x = 0;
1283 if (i < 0) {
1284 sign = -1;
1285 i = -(i);
1286 }
1287 while (--i >= 0) {
1288 /* Force a 32-bit circular shift */
1289 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1290 x += v->ob_digit[i];
1291 }
1292 x = x * sign;
1293 if (x == -1)
1294 x = -2;
1295 return x;
1296}
1297
1298
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001299/* Add the absolute values of two long integers. */
1300
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001301static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001302x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001303{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001304 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001306 int i;
1307 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001308
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001309 /* Ensure a is the larger of the two: */
1310 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311 { PyLongObject *temp = a; a = b; b = temp; }
1312 { int size_temp = size_a;
1313 size_a = size_b;
1314 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001315 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001316 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001317 if (z == NULL)
1318 return NULL;
1319 for (i = 0; i < size_b; ++i) {
1320 carry += a->ob_digit[i] + b->ob_digit[i];
1321 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001322 carry >>= SHIFT;
1323 }
1324 for (; i < size_a; ++i) {
1325 carry += a->ob_digit[i];
1326 z->ob_digit[i] = carry & MASK;
1327 carry >>= SHIFT;
1328 }
1329 z->ob_digit[i] = carry;
1330 return long_normalize(z);
1331}
1332
1333/* Subtract the absolute values of two integers. */
1334
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001336x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001337{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001338 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001340 int i;
1341 int sign = 1;
1342 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001343
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001344 /* Ensure a is the larger of the two: */
1345 if (size_a < size_b) {
1346 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347 { PyLongObject *temp = a; a = b; b = temp; }
1348 { int size_temp = size_a;
1349 size_a = size_b;
1350 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001351 }
1352 else if (size_a == size_b) {
1353 /* Find highest digit where a and b differ: */
1354 i = size_a;
1355 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1356 ;
1357 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001359 if (a->ob_digit[i] < b->ob_digit[i]) {
1360 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001362 }
1363 size_a = size_b = i+1;
1364 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001365 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001366 if (z == NULL)
1367 return NULL;
1368 for (i = 0; i < size_b; ++i) {
1369 /* The following assumes unsigned arithmetic
1370 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001371 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001372 z->ob_digit[i] = borrow & MASK;
1373 borrow >>= SHIFT;
1374 borrow &= 1; /* Keep only one sign bit */
1375 }
1376 for (; i < size_a; ++i) {
1377 borrow = a->ob_digit[i] - borrow;
1378 z->ob_digit[i] = borrow & MASK;
1379 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001380 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001381 }
1382 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001383 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001384 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001385 return long_normalize(z);
1386}
1387
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001388static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001389long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001390{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001391 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001392
Neil Schemenauerba872e22001-01-04 01:46:03 +00001393 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1394
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001395 if (a->ob_size < 0) {
1396 if (b->ob_size < 0) {
1397 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001398 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001399 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001400 }
1401 else
1402 z = x_sub(b, a);
1403 }
1404 else {
1405 if (b->ob_size < 0)
1406 z = x_sub(a, b);
1407 else
1408 z = x_add(a, b);
1409 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001410 Py_DECREF(a);
1411 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001412 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001413}
1414
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001416long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001417{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001418 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001419
Neil Schemenauerba872e22001-01-04 01:46:03 +00001420 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1421
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001422 if (a->ob_size < 0) {
1423 if (b->ob_size < 0)
1424 z = x_sub(a, b);
1425 else
1426 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001427 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001428 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001429 }
1430 else {
1431 if (b->ob_size < 0)
1432 z = x_add(a, b);
1433 else
1434 z = x_sub(a, b);
1435 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001436 Py_DECREF(a);
1437 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001439}
1440
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001441static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001442long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001443{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001444 /* sequence * long */
1445 long n = PyLong_AsLong((PyObject *) w);
1446 if (n == -1 && PyErr_Occurred())
1447 return NULL;
1448 else
1449 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1450}
1451
1452static PyObject *
1453long_mul(PyLongObject *v, PyLongObject *w)
1454{
1455 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001456 int size_a;
1457 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001458 int i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001459
Guido van Rossum7e35d572001-09-15 03:14:32 +00001460 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
1461 if (!PyLong_Check(v) &&
1462 v->ob_type->tp_as_sequence &&
1463 v->ob_type->tp_as_sequence->sq_repeat)
1464 return long_repeat((PyObject *)v, w);
1465 if (!PyLong_Check(w) &&
1466 w->ob_type->tp_as_sequence &&
1467 w->ob_type->tp_as_sequence->sq_repeat)
1468 return long_repeat((PyObject *)w, v);
1469 Py_INCREF(Py_NotImplemented);
1470 return Py_NotImplemented;
1471 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001472
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001473 size_a = ABS(a->ob_size);
1474 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001475 if (size_a > size_b) {
1476 /* we are faster with the small object on the left */
1477 int hold_sa = size_a;
1478 PyLongObject *hold_a = a;
1479 size_a = size_b;
1480 size_b = hold_sa;
1481 a = b;
1482 b = hold_a;
1483 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001484 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001485 if (z == NULL) {
1486 Py_DECREF(a);
1487 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001488 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001489 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001490 for (i = 0; i < z->ob_size; ++i)
1491 z->ob_digit[i] = 0;
1492 for (i = 0; i < size_a; ++i) {
1493 twodigits carry = 0;
1494 twodigits f = a->ob_digit[i];
1495 int j;
1496
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001497 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001498 Py_DECREF(a);
1499 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001500 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001501 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001502 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001503 for (j = 0; j < size_b; ++j) {
1504 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001505 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001506 carry >>= SHIFT;
1507 }
1508 for (; carry != 0; ++j) {
1509 assert(i+j < z->ob_size);
1510 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001511 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001512 carry >>= SHIFT;
1513 }
1514 }
1515 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001516 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001517 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001518 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001519 Py_DECREF(a);
1520 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001521 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001522}
1523
Guido van Rossume32e0141992-01-19 16:31:05 +00001524/* The / and % operators are now defined in terms of divmod().
1525 The expression a mod b has the value a - b*floor(a/b).
1526 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001527 |a| by |b|, with the sign of a. This is also expressed
1528 as a - b*trunc(a/b), if trunc truncates towards zero.
1529 Some examples:
1530 a b a rem b a mod b
1531 13 10 3 3
1532 -13 10 -3 7
1533 13 -10 3 -7
1534 -13 -10 -3 -3
1535 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001536 have different signs. We then subtract one from the 'div'
1537 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001538
Guido van Rossume32e0141992-01-19 16:31:05 +00001539static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001540l_divmod(PyLongObject *v, PyLongObject *w,
1541 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001542{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001544
1545 if (long_divrem(v, w, &div, &mod) < 0)
1546 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001547 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1548 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001549 PyLongObject *temp;
1550 PyLongObject *one;
1551 temp = (PyLongObject *) long_add(mod, w);
1552 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001553 mod = temp;
1554 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001555 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001556 return -1;
1557 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001558 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001559 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001560 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1561 Py_DECREF(mod);
1562 Py_DECREF(div);
1563 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001564 return -1;
1565 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001566 Py_DECREF(one);
1567 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001568 div = temp;
1569 }
1570 *pdiv = div;
1571 *pmod = mod;
1572 return 0;
1573}
1574
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001575static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001576long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001577{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001578 PyLongObject *a, *b, *div, *mod;
1579
1580 CONVERT_BINOP(v, w, &a, &b);
1581
1582 if (l_divmod(a, b, &div, &mod) < 0) {
1583 Py_DECREF(a);
1584 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001585 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001586 }
1587 Py_DECREF(a);
1588 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001589 Py_DECREF(mod);
1590 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001591}
1592
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001593static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001594long_classic_div(PyObject *v, PyObject *w)
1595{
1596 PyLongObject *a, *b, *div, *mod;
1597
1598 CONVERT_BINOP(v, w, &a, &b);
1599
1600 if (Py_DivisionWarningFlag &&
1601 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1602 div = NULL;
1603 else if (l_divmod(a, b, &div, &mod) < 0)
1604 div = NULL;
1605 else
1606 Py_DECREF(mod);
1607
1608 Py_DECREF(a);
1609 Py_DECREF(b);
1610 return (PyObject *)div;
1611}
1612
1613static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00001614long_true_divide(PyObject *v, PyObject *w)
1615{
Tim Peterse2a60002001-09-04 06:17:36 +00001616 PyLongObject *a, *b;
1617 double ad, bd;
1618 int aexp, bexp;
1619
1620 CONVERT_BINOP(v, w, &a, &b);
1621 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
1622 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
1623 if ((ad == -1.0 || bd == -1.0) && PyErr_Occurred())
1624 return NULL;
1625
1626 if (bd == 0.0) {
1627 PyErr_SetString(PyExc_ZeroDivisionError,
1628 "long division or modulo by zero");
1629 return NULL;
1630 }
1631
1632 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
1633 ad /= bd; /* overflow/underflow impossible here */
1634 aexp -= bexp;
1635 if (aexp > INT_MAX / SHIFT)
1636 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00001637 else if (aexp < -(INT_MAX / SHIFT))
1638 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00001639 errno = 0;
1640 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00001641 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00001642 goto overflow;
1643 return PyFloat_FromDouble(ad);
1644
1645overflow:
1646 PyErr_SetString(PyExc_OverflowError,
1647 "long/long too large for a float");
1648 return NULL;
1649
Tim Peters20dab9f2001-09-04 05:31:47 +00001650}
1651
1652static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001653long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001654{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001655 PyLongObject *a, *b, *div, *mod;
1656
1657 CONVERT_BINOP(v, w, &a, &b);
1658
1659 if (l_divmod(a, b, &div, &mod) < 0) {
1660 Py_DECREF(a);
1661 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001662 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001663 }
1664 Py_DECREF(a);
1665 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001666 Py_DECREF(div);
1667 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001668}
1669
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001670static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001671long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001672{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001673 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001674 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001675
1676 CONVERT_BINOP(v, w, &a, &b);
1677
1678 if (l_divmod(a, b, &div, &mod) < 0) {
1679 Py_DECREF(a);
1680 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001681 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001682 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001683 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001684 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001685 PyTuple_SetItem(z, 0, (PyObject *) div);
1686 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001687 }
1688 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001689 Py_DECREF(div);
1690 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001691 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001692 Py_DECREF(a);
1693 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001694 return z;
1695}
1696
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001697static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001698long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001699{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001700 PyLongObject *a, *b;
1701 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001702 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001703 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001704
1705 CONVERT_BINOP(v, w, &a, &b);
1706 if (PyLong_Check(x) || Py_None == x) {
1707 c = x;
1708 Py_INCREF(x);
1709 }
1710 else if (PyInt_Check(x)) {
1711 c = PyLong_FromLong(PyInt_AS_LONG(x));
1712 }
1713 else {
1714 Py_DECREF(a);
1715 Py_DECREF(b);
1716 Py_INCREF(Py_NotImplemented);
1717 return Py_NotImplemented;
1718 }
Tim Peters4c483c42001-09-05 06:24:58 +00001719
1720 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
1721 PyErr_SetString(PyExc_ValueError,
1722 "pow() 3rd argument cannot be 0");
1723 z = NULL;
1724 goto error;
1725 }
1726
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001727 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001728 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001729 Py_DECREF(a);
1730 Py_DECREF(b);
1731 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00001732 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00001733 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
1734 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00001735 return NULL;
1736 }
1737 /* Return a float. This works because we know that
1738 this calls float_pow() which converts its
1739 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001740 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001741 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001742 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001743 for (i = 0; i < size_b; ++i) {
1744 digit bi = b->ob_digit[i];
1745 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001746
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001747 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001748 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001749
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001750 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001751 temp = (PyLongObject *)long_mul(z, a);
1752 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001753 if (c!=Py_None && temp!=NULL) {
1754 if (l_divmod(temp,(PyLongObject *)c,
1755 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001756 Py_DECREF(temp);
1757 z = NULL;
1758 goto error;
1759 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001760 Py_XDECREF(div);
1761 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001762 temp = mod;
1763 }
1764 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001765 if (z == NULL)
1766 break;
1767 }
1768 bi >>= 1;
1769 if (bi == 0 && i+1 == size_b)
1770 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001771 temp = (PyLongObject *)long_mul(a, a);
1772 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001773 if (c!=Py_None && temp!=NULL) {
1774 if (l_divmod(temp, (PyLongObject *)c, &div,
1775 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001776 Py_DECREF(temp);
1777 z = NULL;
1778 goto error;
1779 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001780 Py_XDECREF(div);
1781 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001782 temp = mod;
1783 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001784 a = temp;
1785 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001786 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001787 z = NULL;
1788 break;
1789 }
1790 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001791 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001792 break;
1793 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001794 if (c!=Py_None && z!=NULL) {
1795 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001796 Py_DECREF(z);
1797 z = NULL;
1798 }
1799 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001800 Py_XDECREF(div);
1801 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001802 z = mod;
1803 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001804 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001805 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001806 Py_XDECREF(a);
1807 Py_DECREF(b);
1808 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001809 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001810}
1811
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001812static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001813long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001814{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001815 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001816 PyLongObject *x;
1817 PyLongObject *w;
1818 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001819 if (w == NULL)
1820 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001821 x = (PyLongObject *) long_add(v, w);
1822 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001823 if (x == NULL)
1824 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00001825 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001826 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001827}
1828
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001829static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001830long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001831{
Tim Peters69c2de32001-09-11 22:31:33 +00001832 if (PyLong_CheckExact(v)) {
1833 Py_INCREF(v);
1834 return (PyObject *)v;
1835 }
1836 else
1837 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001838}
1839
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001840static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001841long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001842{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001843 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001844 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001845 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001846 Py_INCREF(v);
1847 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001848 }
Tim Peters69c2de32001-09-11 22:31:33 +00001849 z = (PyLongObject *)_PyLong_Copy(v);
1850 if (z != NULL)
1851 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001852 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001853}
1854
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001855static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001856long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001857{
1858 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001859 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00001860 else
1861 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001862}
1863
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001864static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001865long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001866{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001867 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001868}
1869
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001870static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001871long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001872{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001873 PyLongObject *a, *b;
1874 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001875 long shiftby;
1876 int newsize, wordshift, loshift, hishift, i, j;
1877 digit lomask, himask;
1878
Neil Schemenauerba872e22001-01-04 01:46:03 +00001879 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1880
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001881 if (a->ob_size < 0) {
1882 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001883 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001884 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001885 if (a1 == NULL)
1886 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001887 a2 = (PyLongObject *) long_rshift(a1, b);
1888 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001889 if (a2 == NULL)
1890 goto rshift_error;
1891 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001892 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001893 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001894 else {
1895
1896 shiftby = PyLong_AsLong((PyObject *)b);
1897 if (shiftby == -1L && PyErr_Occurred())
1898 goto rshift_error;
1899 if (shiftby < 0) {
1900 PyErr_SetString(PyExc_ValueError,
1901 "negative shift count");
1902 goto rshift_error;
1903 }
1904 wordshift = shiftby / SHIFT;
1905 newsize = ABS(a->ob_size) - wordshift;
1906 if (newsize <= 0) {
1907 z = _PyLong_New(0);
1908 Py_DECREF(a);
1909 Py_DECREF(b);
1910 return (PyObject *)z;
1911 }
1912 loshift = shiftby % SHIFT;
1913 hishift = SHIFT - loshift;
1914 lomask = ((digit)1 << hishift) - 1;
1915 himask = MASK ^ lomask;
1916 z = _PyLong_New(newsize);
1917 if (z == NULL)
1918 goto rshift_error;
1919 if (a->ob_size < 0)
1920 z->ob_size = -(z->ob_size);
1921 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1922 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1923 if (i+1 < newsize)
1924 z->ob_digit[i] |=
1925 (a->ob_digit[j+1] << hishift) & himask;
1926 }
1927 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001928 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001929rshift_error:
1930 Py_DECREF(a);
1931 Py_DECREF(b);
1932 return (PyObject *) z;
1933
Guido van Rossumc6913e71991-11-19 20:26:46 +00001934}
1935
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001936static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001937long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001938{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001939 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001940 PyLongObject *a, *b;
1941 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001942 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001943 int oldsize, newsize, wordshift, remshift, i, j;
1944 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001945
Neil Schemenauerba872e22001-01-04 01:46:03 +00001946 CONVERT_BINOP(v, w, &a, &b);
1947
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001948 shiftby = PyLong_AsLong((PyObject *)b);
1949 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001950 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001951 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001952 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001953 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001954 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001955 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001956 PyErr_SetString(PyExc_ValueError,
1957 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001958 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001959 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001960 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1961 wordshift = (int)shiftby / SHIFT;
1962 remshift = (int)shiftby - wordshift * SHIFT;
1963
1964 oldsize = ABS(a->ob_size);
1965 newsize = oldsize + wordshift;
1966 if (remshift)
1967 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001968 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001969 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001970 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001971 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001972 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001973 for (i = 0; i < wordshift; i++)
1974 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001975 accum = 0;
1976 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1977 accum |= a->ob_digit[j] << remshift;
1978 z->ob_digit[i] = (digit)(accum & MASK);
1979 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001980 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001981 if (remshift)
1982 z->ob_digit[newsize-1] = (digit)accum;
1983 else
1984 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001985 z = long_normalize(z);
1986lshift_error:
1987 Py_DECREF(a);
1988 Py_DECREF(b);
1989 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001990}
1991
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001992
1993/* Bitwise and/xor/or operations */
1994
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001995#define MAX(x, y) ((x) < (y) ? (y) : (x))
1996#define MIN(x, y) ((x) > (y) ? (y) : (x))
1997
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001998static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001999long_bitwise(PyLongObject *a,
2000 int op, /* '&', '|', '^' */
2001 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002002{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002003 digit maska, maskb; /* 0 or MASK */
2004 int negz;
2005 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002006 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002007 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002008 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002009 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002010
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002011 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002012 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002013 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002014 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002015 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002016 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002017 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002018 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002019 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002020 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002021 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002022 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002023 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002024 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002025 maskb = 0;
2026 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00002027
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002028 negz = 0;
2029 switch (op) {
2030 case '^':
2031 if (maska != maskb) {
2032 maska ^= MASK;
2033 negz = -1;
2034 }
2035 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002036 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002037 if (maska && maskb) {
2038 op = '|';
2039 maska ^= MASK;
2040 maskb ^= MASK;
2041 negz = -1;
2042 }
2043 break;
2044 case '|':
2045 if (maska || maskb) {
2046 op = '&';
2047 maska ^= MASK;
2048 maskb ^= MASK;
2049 negz = -1;
2050 }
2051 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002052 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002053
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002054 /* JRH: The original logic here was to allocate the result value (z)
2055 as the longer of the two operands. However, there are some cases
2056 where the result is guaranteed to be shorter than that: AND of two
2057 positives, OR of two negatives: use the shorter number. AND with
2058 mixed signs: use the positive number. OR with mixed signs: use the
2059 negative number. After the transformations above, op will be '&'
2060 iff one of these cases applies, and mask will be non-0 for operands
2061 whose length should be ignored.
2062 */
2063
2064 size_a = a->ob_size;
2065 size_b = b->ob_size;
2066 size_z = op == '&'
2067 ? (maska
2068 ? size_b
2069 : (maskb ? size_a : MIN(size_a, size_b)))
2070 : MAX(size_a, size_b);
2071 z = _PyLong_New(size_z);
2072 if (a == NULL || b == NULL || z == NULL) {
2073 Py_XDECREF(a);
2074 Py_XDECREF(b);
2075 Py_XDECREF(z);
2076 return NULL;
2077 }
2078
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002079 for (i = 0; i < size_z; ++i) {
2080 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2081 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2082 switch (op) {
2083 case '&': z->ob_digit[i] = diga & digb; break;
2084 case '|': z->ob_digit[i] = diga | digb; break;
2085 case '^': z->ob_digit[i] = diga ^ digb; break;
2086 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002087 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002088
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002089 Py_DECREF(a);
2090 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002091 z = long_normalize(z);
2092 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002093 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002094 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002095 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002096 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002097}
2098
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002099static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002100long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002101{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002102 PyLongObject *a, *b;
2103 PyObject *c;
2104 CONVERT_BINOP(v, w, &a, &b);
2105 c = long_bitwise(a, '&', b);
2106 Py_DECREF(a);
2107 Py_DECREF(b);
2108 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002109}
2110
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002111static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002112long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002113{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002114 PyLongObject *a, *b;
2115 PyObject *c;
2116 CONVERT_BINOP(v, w, &a, &b);
2117 c = long_bitwise(a, '^', b);
2118 Py_DECREF(a);
2119 Py_DECREF(b);
2120 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002121}
2122
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002123static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002124long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002125{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002126 PyLongObject *a, *b;
2127 PyObject *c;
2128 CONVERT_BINOP(v, w, &a, &b);
2129 c = long_bitwise(a, '|', b);
2130 Py_DECREF(a);
2131 Py_DECREF(b);
2132 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002133}
2134
Guido van Rossum234f9421993-06-17 12:35:49 +00002135static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002136long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002137{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002138 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002139 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002140 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002141 return 0;
2142 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002143 else if (PyLong_Check(*pw)) {
2144 Py_INCREF(*pv);
2145 Py_INCREF(*pw);
2146 return 0;
2147 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002148 return 1; /* Can't do it */
2149}
2150
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002151static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002152long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002153{
2154 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002155 x = PyLong_AsLong(v);
2156 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002157 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002158 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002159}
2160
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002161static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002162long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002163{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002164 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002165 return v;
2166}
2167
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002168static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002169long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002170{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002171 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002172 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002173 if (result == -1.0 && PyErr_Occurred())
2174 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002175 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002176}
2177
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002178static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002179long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002180{
Fred Drake121ee271999-12-23 15:41:28 +00002181 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002182}
2183
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002184static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002185long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002186{
Fred Drake121ee271999-12-23 15:41:28 +00002187 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002188}
Guido van Rossumbef14172001-08-29 15:47:46 +00002189staticforward PyObject *
2190long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002191
Tim Peters6d6c1a32001-08-02 04:15:00 +00002192static PyObject *
2193long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2194{
2195 PyObject *x = NULL;
2196 int base = -909; /* unlikely! */
2197 static char *kwlist[] = {"x", "base", 0};
2198
Guido van Rossumbef14172001-08-29 15:47:46 +00002199 if (type != &PyLong_Type)
2200 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002201 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2202 &x, &base))
2203 return NULL;
2204 if (x == NULL)
2205 return PyLong_FromLong(0L);
2206 if (base == -909)
2207 return PyNumber_Long(x);
2208 else if (PyString_Check(x))
2209 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002210#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002211 else if (PyUnicode_Check(x))
2212 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2213 PyUnicode_GET_SIZE(x),
2214 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002215#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002216 else {
2217 PyErr_SetString(PyExc_TypeError,
2218 "long() can't convert non-string with explicit base");
2219 return NULL;
2220 }
2221}
2222
Guido van Rossumbef14172001-08-29 15:47:46 +00002223/* Wimpy, slow approach to tp_new calls for subtypes of long:
2224 first create a regular long from whatever arguments we got,
2225 then allocate a subtype instance and initialize it from
2226 the regular long. The regular long is then thrown away.
2227*/
2228static PyObject *
2229long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2230{
2231 PyLongObject *tmp, *new;
2232 int i, n;
2233
2234 assert(PyType_IsSubtype(type, &PyLong_Type));
2235 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2236 if (tmp == NULL)
2237 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002238 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002239 n = tmp->ob_size;
2240 if (n < 0)
2241 n = -n;
2242 new = (PyLongObject *)type->tp_alloc(type, n);
2243 if (new == NULL)
2244 return NULL;
2245 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002246 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002247 for (i = 0; i < n; i++)
2248 new->ob_digit[i] = tmp->ob_digit[i];
2249 Py_DECREF(tmp);
2250 return (PyObject *)new;
2251}
2252
Tim Peters6d6c1a32001-08-02 04:15:00 +00002253static char long_doc[] =
2254"long(x[, base]) -> integer\n\
2255\n\
2256Convert a string or number to a long integer, if possible. A floating\n\
2257point argument will be truncated towards zero (this does not include a\n\
2258string representation of a floating point number!) When converting a\n\
2259string, use the optional base. It is an error to supply a base when\n\
2260converting a non-string.";
2261
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002262static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002263 (binaryfunc) long_add, /*nb_add*/
2264 (binaryfunc) long_sub, /*nb_subtract*/
2265 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002266 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002267 (binaryfunc) long_mod, /*nb_remainder*/
2268 (binaryfunc) long_divmod, /*nb_divmod*/
2269 (ternaryfunc) long_pow, /*nb_power*/
2270 (unaryfunc) long_neg, /*nb_negative*/
2271 (unaryfunc) long_pos, /*tp_positive*/
2272 (unaryfunc) long_abs, /*tp_absolute*/
2273 (inquiry) long_nonzero, /*tp_nonzero*/
2274 (unaryfunc) long_invert, /*nb_invert*/
2275 (binaryfunc) long_lshift, /*nb_lshift*/
2276 (binaryfunc) long_rshift, /*nb_rshift*/
2277 (binaryfunc) long_and, /*nb_and*/
2278 (binaryfunc) long_xor, /*nb_xor*/
2279 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002280 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002281 (unaryfunc) long_int, /*nb_int*/
2282 (unaryfunc) long_long, /*nb_long*/
2283 (unaryfunc) long_float, /*nb_float*/
2284 (unaryfunc) long_oct, /*nb_oct*/
2285 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002286 0, /* nb_inplace_add */
2287 0, /* nb_inplace_subtract */
2288 0, /* nb_inplace_multiply */
2289 0, /* nb_inplace_divide */
2290 0, /* nb_inplace_remainder */
2291 0, /* nb_inplace_power */
2292 0, /* nb_inplace_lshift */
2293 0, /* nb_inplace_rshift */
2294 0, /* nb_inplace_and */
2295 0, /* nb_inplace_xor */
2296 0, /* nb_inplace_or */
2297 (binaryfunc)long_div, /* nb_floor_divide */
2298 long_true_divide, /* nb_true_divide */
2299 0, /* nb_inplace_floor_divide */
2300 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002301};
2302
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002303PyTypeObject PyLong_Type = {
2304 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002305 0, /* ob_size */
2306 "long", /* tp_name */
2307 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2308 sizeof(digit), /* tp_itemsize */
2309 (destructor)long_dealloc, /* tp_dealloc */
2310 0, /* tp_print */
2311 0, /* tp_getattr */
2312 0, /* tp_setattr */
2313 (cmpfunc)long_compare, /* tp_compare */
2314 (reprfunc)long_repr, /* tp_repr */
2315 &long_as_number, /* tp_as_number */
2316 0, /* tp_as_sequence */
2317 0, /* tp_as_mapping */
2318 (hashfunc)long_hash, /* tp_hash */
2319 0, /* tp_call */
2320 (reprfunc)long_str, /* tp_str */
2321 PyObject_GenericGetAttr, /* tp_getattro */
2322 0, /* tp_setattro */
2323 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002324 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2325 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002326 long_doc, /* tp_doc */
2327 0, /* tp_traverse */
2328 0, /* tp_clear */
2329 0, /* tp_richcompare */
2330 0, /* tp_weaklistoffset */
2331 0, /* tp_iter */
2332 0, /* tp_iternext */
2333 0, /* tp_methods */
2334 0, /* tp_members */
2335 0, /* tp_getset */
2336 0, /* tp_base */
2337 0, /* tp_dict */
2338 0, /* tp_descr_get */
2339 0, /* tp_descr_set */
2340 0, /* tp_dictoffset */
2341 0, /* tp_init */
2342 0, /* tp_alloc */
2343 long_new, /* tp_new */
Guido van Rossum9475a232001-10-05 20:51:39 +00002344 _PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002345};