blob: 8f7d9e4f8412e49234e19d7b830d180d4f78469a [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
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000682 if (vv == NULL || !PyLong_Check(vv)) {
683 PyErr_BadInternalCall();
684 return -1;
685 }
686
Tim Petersd1a7da62001-06-13 00:35:57 +0000687 res = _PyLong_AsByteArray(
688 (PyLongObject *)vv, (unsigned char *)&bytes,
689 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000690
Tim Peters9cb0c382001-06-13 20:45:17 +0000691 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000692}
693
Tim Petersd1a7da62001-06-13 00:35:57 +0000694/* Get a C unsigned LONG_LONG int from a long int object.
695 Return -1 and set an error if overflow occurs. */
696
Guido van Rossum3293b071998-08-25 16:07:15 +0000697unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000698PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000699{
Tim Petersd1a7da62001-06-13 00:35:57 +0000700 unsigned LONG_LONG bytes;
701 int one = 1;
702 int res;
703
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000704 if (vv == NULL || !PyLong_Check(vv)) {
705 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000706 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000707 }
708
Tim Petersd1a7da62001-06-13 00:35:57 +0000709 res = _PyLong_AsByteArray(
710 (PyLongObject *)vv, (unsigned char *)&bytes,
711 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000712
Tim Peters9cb0c382001-06-13 20:45:17 +0000713 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000714}
Tim Petersd1a7da62001-06-13 00:35:57 +0000715
716#undef IS_LITTLE_ENDIAN
717
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000718#endif /* HAVE_LONG_LONG */
719
Neil Schemenauerba872e22001-01-04 01:46:03 +0000720
721static int
722convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
723 if (PyLong_Check(v)) {
724 *a = (PyLongObject *) v;
725 Py_INCREF(v);
726 }
727 else if (PyInt_Check(v)) {
728 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
729 }
730 else {
731 return 0;
732 }
733 if (PyLong_Check(w)) {
734 *b = (PyLongObject *) w;
735 Py_INCREF(w);
736 }
737 else if (PyInt_Check(w)) {
738 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
739 }
740 else {
741 Py_DECREF(*a);
742 return 0;
743 }
744 return 1;
745}
746
747#define CONVERT_BINOP(v, w, a, b) \
748 if (!convert_binop(v, w, a, b)) { \
749 Py_INCREF(Py_NotImplemented); \
750 return Py_NotImplemented; \
751 }
752
753
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000754/* Multiply by a single digit, ignoring the sign. */
755
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000757mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000758{
759 return muladd1(a, n, (digit)0);
760}
761
762/* Multiply by a single digit and add a single digit, ignoring the sign. */
763
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000765muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000766{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000767 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000769 twodigits carry = extra;
770 int i;
771
772 if (z == NULL)
773 return NULL;
774 for (i = 0; i < size_a; ++i) {
775 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000776 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000777 carry >>= SHIFT;
778 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000779 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000780 return long_normalize(z);
781}
782
Tim Peters212e6142001-07-14 12:23:19 +0000783/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
784 in pout, and returning the remainder. pin and pout point at the LSD.
785 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
786 long_format, but that should be done with great care since longs are
787 immutable. */
788
789static digit
790inplace_divrem1(digit *pout, digit *pin, int size, digit n)
791{
792 twodigits rem = 0;
793
794 assert(n > 0 && n <= MASK);
795 pin += size;
796 pout += size;
797 while (--size >= 0) {
798 digit hi;
799 rem = (rem << SHIFT) + *--pin;
800 *--pout = hi = (digit)(rem / n);
801 rem -= hi * n;
802 }
803 return (digit)rem;
804}
805
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000806/* Divide a long integer by a digit, returning both the quotient
807 (as function result) and the remainder (through *prem).
808 The sign of a is ignored; n should not be zero. */
809
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000811divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000812{
Tim Peters212e6142001-07-14 12:23:19 +0000813 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000814 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000815
816 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000818 if (z == NULL)
819 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000820 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000821 return long_normalize(z);
822}
823
824/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000825 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000826 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000827
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000828static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000829long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000830{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 register PyLongObject *a = (PyLongObject *)aa;
832 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000833 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000834 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000835 char *p;
836 int bits;
837 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000838
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 if (a == NULL || !PyLong_Check(a)) {
840 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000841 return NULL;
842 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000843 assert(base >= 2 && base <= 36);
844
845 /* Compute a rough upper bound for the length of the string */
846 i = base;
847 bits = 0;
848 while (i > 1) {
849 ++bits;
850 i >>= 1;
851 }
Fred Drake121ee271999-12-23 15:41:28 +0000852 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000854 if (str == NULL)
855 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000857 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000858 if (addL)
859 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000860 if (a->ob_size < 0)
861 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000862
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000863 if (a->ob_size == 0) {
864 *--p = '0';
865 }
866 else if ((base & (base - 1)) == 0) {
867 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000868 twodigits accum = 0;
869 int accumbits = 0; /* # of bits in accum */
870 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000871 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000872 while ((i >>= 1) > 1)
873 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000874
875 for (i = 0; i < size_a; ++i) {
876 accum |= a->ob_digit[i] << accumbits;
877 accumbits += SHIFT;
878 assert(accumbits >= basebits);
879 do {
880 char digit = (char)(accum & (base - 1));
881 digit += (digit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000882 assert(p > PyString_AS_STRING(str));
Tim Peters586b2e32001-07-15 09:11:14 +0000883 *--p = digit;
884 accumbits -= basebits;
885 accum >>= basebits;
886 } while (i < size_a-1 ? accumbits >= basebits :
887 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000888 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000889 }
890 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000891 /* Not 0, and base not a power of 2. Divide repeatedly by
892 base, but for speed use the highest power of base that
893 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000894 int size = size_a;
895 digit *pin = a->ob_digit;
896 PyLongObject *scratch;
897 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000898 digit powbase = base; /* powbase == base ** power */
899 int power = 1;
900 for (;;) {
901 unsigned long newpow = powbase * (unsigned long)base;
902 if (newpow >> SHIFT) /* doesn't fit in a digit */
903 break;
904 powbase = (digit)newpow;
905 ++power;
906 }
Tim Peters212e6142001-07-14 12:23:19 +0000907
908 /* Get a scratch area for repeated division. */
909 scratch = _PyLong_New(size);
910 if (scratch == NULL) {
911 Py_DECREF(str);
912 return NULL;
913 }
914
915 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000916 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000917 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000918 digit rem = inplace_divrem1(scratch->ob_digit,
919 pin, size, powbase);
920 pin = scratch->ob_digit; /* no need to use a again */
921 if (pin[size - 1] == 0)
922 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000923 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +0000924 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000925 Py_DECREF(str);
926 return NULL;
927 })
Tim Peters212e6142001-07-14 12:23:19 +0000928
929 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000930 assert(ntostore > 0);
931 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000932 digit nextrem = (digit)(rem / base);
933 char c = (char)(rem - nextrem * base);
934 assert(p > PyString_AS_STRING(str));
935 c += (c < 10) ? '0' : 'A'-10;
936 *--p = c;
937 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000938 --ntostore;
939 /* Termination is a bit delicate: must not
940 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +0000941 remaining quotient and rem are both 0. */
942 } while (ntostore && (size || rem));
943 } while (size != 0);
944 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000945 }
946
Guido van Rossum2c475421992-08-14 15:13:07 +0000947 if (base == 8) {
948 if (size_a != 0)
949 *--p = '0';
950 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000951 else if (base == 16) {
952 *--p = 'x';
953 *--p = '0';
954 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000955 else if (base != 10) {
956 *--p = '#';
957 *--p = '0' + base%10;
958 if (base > 10)
959 *--p = '0' + base/10;
960 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000961 if (sign)
962 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 if (p != PyString_AS_STRING(str)) {
964 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000965 assert(p > q);
966 do {
967 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000968 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 _PyString_Resize((PyObject **)&str,
970 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000971 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000973}
974
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000976PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000977{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000978 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000979 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000980 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000981
Guido van Rossum472c04f1996-12-05 21:57:21 +0000982 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000983 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000984 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000985 return NULL;
986 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000987 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000988 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000989 if (*str == '+')
990 ++str;
991 else if (*str == '-') {
992 ++str;
993 sign = -1;
994 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000995 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000996 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000997 if (base == 0) {
998 if (str[0] != '0')
999 base = 10;
1000 else if (str[1] == 'x' || str[1] == 'X')
1001 base = 16;
1002 else
1003 base = 8;
1004 }
1005 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1006 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001007 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +00001008 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001009 for ( ; z != NULL; ++str) {
1010 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001012
1013 if (*str <= '9')
1014 k = *str - '0';
1015 else if (*str >= 'a')
1016 k = *str - 'a' + 10;
1017 else if (*str >= 'A')
1018 k = *str - 'A' + 10;
1019 if (k < 0 || k >= base)
1020 break;
1021 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001022 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001023 z = temp;
1024 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001025 if (z == NULL)
1026 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001027 if (str == start)
1028 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001029 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001030 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001031 if (*str == 'L' || *str == 'l')
1032 str++;
1033 while (*str && isspace(Py_CHARMASK(*str)))
1034 str++;
1035 if (*str != '\0')
1036 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001037 if (pend)
1038 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001039 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001040
1041 onError:
1042 PyErr_Format(PyExc_ValueError,
1043 "invalid literal for long(): %.200s", orig_str);
1044 Py_XDECREF(z);
1045 return NULL;
1046}
1047
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001048#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001049PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001050PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001051{
1052 char buffer[256];
1053
1054 if (length >= sizeof(buffer)) {
1055 PyErr_SetString(PyExc_ValueError,
1056 "long() literal too large to convert");
1057 return NULL;
1058 }
1059 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
1060 return NULL;
1061
1062 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001063}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001064#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001065
Tim Peters9f688bf2000-07-07 15:53:28 +00001066/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001067static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001068 (PyLongObject *, PyLongObject *, PyLongObject **);
1069static PyObject *long_pos(PyLongObject *);
1070static int long_divrem(PyLongObject *, PyLongObject *,
1071 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001072
1073/* Long division with remainder, top-level routine */
1074
Guido van Rossume32e0141992-01-19 16:31:05 +00001075static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001076long_divrem(PyLongObject *a, PyLongObject *b,
1077 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001078{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001079 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001081
1082 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001083 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001084 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001085 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001086 }
1087 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001088 (size_a == size_b &&
1089 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001090 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001091 *pdiv = _PyLong_New(0);
1092 Py_INCREF(a);
1093 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001094 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001095 }
1096 if (size_b == 1) {
1097 digit rem = 0;
1098 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001099 if (z == NULL)
1100 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001102 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001103 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001104 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001105 if (z == NULL)
1106 return -1;
1107 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001108 /* Set the signs.
1109 The quotient z has the sign of a*b;
1110 the remainder r has the sign of a,
1111 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001112 if ((a->ob_size < 0) != (b->ob_size < 0))
1113 z->ob_size = -(z->ob_size);
1114 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1115 (*prem)->ob_size = -((*prem)->ob_size);
1116 *pdiv = z;
1117 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001118}
1119
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001120/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001121
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001122static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001123x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001124{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001125 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001126 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001127 PyLongObject *v = mul1(v1, d);
1128 PyLongObject *w = mul1(w1, d);
1129 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001130 int j, k;
1131
1132 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133 Py_XDECREF(v);
1134 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001135 return NULL;
1136 }
1137
1138 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001139 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001140 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001141
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001142 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001144
1145 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1146 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1147 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001148 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001149 int i;
1150
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001151 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001152 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001153 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001154 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001155 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001156 if (vj == w->ob_digit[size_w-1])
1157 q = MASK;
1158 else
1159 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1160 w->ob_digit[size_w-1];
1161
1162 while (w->ob_digit[size_w-2]*q >
1163 ((
1164 ((twodigits)vj << SHIFT)
1165 + v->ob_digit[j-1]
1166 - q*w->ob_digit[size_w-1]
1167 ) << SHIFT)
1168 + v->ob_digit[j-2])
1169 --q;
1170
1171 for (i = 0; i < size_w && i+k < size_v; ++i) {
1172 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001173 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174 carry += v->ob_digit[i+k] - z
1175 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001176 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001177 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1178 carry, SHIFT);
1179 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001180 }
1181
1182 if (i+k < size_v) {
1183 carry += v->ob_digit[i+k];
1184 v->ob_digit[i+k] = 0;
1185 }
1186
1187 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001188 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001189 else {
1190 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001191 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001192 carry = 0;
1193 for (i = 0; i < size_w && i+k < size_v; ++i) {
1194 carry += v->ob_digit[i+k] + w->ob_digit[i];
1195 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001196 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1197 BASE_TWODIGITS_TYPE,
1198 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001199 }
1200 }
1201 } /* for j, k */
1202
Guido van Rossumc206c761995-01-10 15:23:19 +00001203 if (a == NULL)
1204 *prem = NULL;
1205 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001206 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001207 *prem = divrem1(v, d, &d);
1208 /* d receives the (unused) remainder */
1209 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001211 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001212 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001213 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001214 Py_DECREF(v);
1215 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001216 return a;
1217}
1218
1219/* Methods */
1220
1221static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001222long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001223{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001224 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001225}
1226
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001227static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001228long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001229{
Fred Drake121ee271999-12-23 15:41:28 +00001230 return long_format(v, 10, 1);
1231}
1232
1233static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001234long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001235{
1236 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001237}
1238
1239static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001240long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001241{
1242 int sign;
1243
Guido van Rossumc6913e71991-11-19 20:26:46 +00001244 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001245 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001246 sign = 0;
1247 else
1248 sign = a->ob_size - b->ob_size;
1249 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001250 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001251 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001252 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1253 ;
1254 if (i < 0)
1255 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001256 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001257 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001258 if (a->ob_size < 0)
1259 sign = -sign;
1260 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001261 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001262 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001263}
1264
Guido van Rossum9bfef441993-03-29 10:43:31 +00001265static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001266long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001267{
1268 long x;
1269 int i, sign;
1270
1271 /* This is designed so that Python ints and longs with the
1272 same value hash to the same value, otherwise comparisons
1273 of mapping keys will turn out weird */
1274 i = v->ob_size;
1275 sign = 1;
1276 x = 0;
1277 if (i < 0) {
1278 sign = -1;
1279 i = -(i);
1280 }
1281 while (--i >= 0) {
1282 /* Force a 32-bit circular shift */
1283 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1284 x += v->ob_digit[i];
1285 }
1286 x = x * sign;
1287 if (x == -1)
1288 x = -2;
1289 return x;
1290}
1291
1292
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001293/* Add the absolute values of two long integers. */
1294
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001295static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001296x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001297{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001298 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001299 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001300 int i;
1301 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001302
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001303 /* Ensure a is the larger of the two: */
1304 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 { PyLongObject *temp = a; a = b; b = temp; }
1306 { int size_temp = size_a;
1307 size_a = size_b;
1308 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001309 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001310 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001311 if (z == NULL)
1312 return NULL;
1313 for (i = 0; i < size_b; ++i) {
1314 carry += a->ob_digit[i] + b->ob_digit[i];
1315 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001316 carry >>= SHIFT;
1317 }
1318 for (; i < size_a; ++i) {
1319 carry += a->ob_digit[i];
1320 z->ob_digit[i] = carry & MASK;
1321 carry >>= SHIFT;
1322 }
1323 z->ob_digit[i] = carry;
1324 return long_normalize(z);
1325}
1326
1327/* Subtract the absolute values of two integers. */
1328
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001329static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001330x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001331{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001332 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001334 int i;
1335 int sign = 1;
1336 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001337
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001338 /* Ensure a is the larger of the two: */
1339 if (size_a < size_b) {
1340 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001341 { PyLongObject *temp = a; a = b; b = temp; }
1342 { int size_temp = size_a;
1343 size_a = size_b;
1344 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001345 }
1346 else if (size_a == size_b) {
1347 /* Find highest digit where a and b differ: */
1348 i = size_a;
1349 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1350 ;
1351 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001352 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001353 if (a->ob_digit[i] < b->ob_digit[i]) {
1354 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001355 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001356 }
1357 size_a = size_b = i+1;
1358 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001360 if (z == NULL)
1361 return NULL;
1362 for (i = 0; i < size_b; ++i) {
1363 /* The following assumes unsigned arithmetic
1364 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001365 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001366 z->ob_digit[i] = borrow & MASK;
1367 borrow >>= SHIFT;
1368 borrow &= 1; /* Keep only one sign bit */
1369 }
1370 for (; i < size_a; ++i) {
1371 borrow = a->ob_digit[i] - borrow;
1372 z->ob_digit[i] = borrow & MASK;
1373 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001374 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001375 }
1376 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001377 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001378 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001379 return long_normalize(z);
1380}
1381
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001383long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001384{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001385 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001386
Neil Schemenauerba872e22001-01-04 01:46:03 +00001387 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1388
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001389 if (a->ob_size < 0) {
1390 if (b->ob_size < 0) {
1391 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001392 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001393 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001394 }
1395 else
1396 z = x_sub(b, a);
1397 }
1398 else {
1399 if (b->ob_size < 0)
1400 z = x_sub(a, b);
1401 else
1402 z = x_add(a, b);
1403 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001404 Py_DECREF(a);
1405 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001407}
1408
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001409static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001410long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001411{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001412 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001413
Neil Schemenauerba872e22001-01-04 01:46:03 +00001414 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1415
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001416 if (a->ob_size < 0) {
1417 if (b->ob_size < 0)
1418 z = x_sub(a, b);
1419 else
1420 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001421 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001422 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001423 }
1424 else {
1425 if (b->ob_size < 0)
1426 z = x_add(a, b);
1427 else
1428 z = x_sub(a, b);
1429 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001430 Py_DECREF(a);
1431 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001432 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001433}
1434
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001435static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001436long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001437{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001438 /* sequence * long */
1439 long n = PyLong_AsLong((PyObject *) w);
1440 if (n == -1 && PyErr_Occurred())
1441 return NULL;
1442 else
1443 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1444}
1445
1446static PyObject *
1447long_mul(PyLongObject *v, PyLongObject *w)
1448{
1449 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001450 int size_a;
1451 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001452 int i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001453
Guido van Rossum7e35d572001-09-15 03:14:32 +00001454 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
1455 if (!PyLong_Check(v) &&
1456 v->ob_type->tp_as_sequence &&
1457 v->ob_type->tp_as_sequence->sq_repeat)
1458 return long_repeat((PyObject *)v, w);
1459 if (!PyLong_Check(w) &&
1460 w->ob_type->tp_as_sequence &&
1461 w->ob_type->tp_as_sequence->sq_repeat)
1462 return long_repeat((PyObject *)w, v);
1463 Py_INCREF(Py_NotImplemented);
1464 return Py_NotImplemented;
1465 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001466
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001467 size_a = ABS(a->ob_size);
1468 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001469 if (size_a > size_b) {
1470 /* we are faster with the small object on the left */
1471 int hold_sa = size_a;
1472 PyLongObject *hold_a = a;
1473 size_a = size_b;
1474 size_b = hold_sa;
1475 a = b;
1476 b = hold_a;
1477 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001478 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001479 if (z == NULL) {
1480 Py_DECREF(a);
1481 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001482 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001483 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001484 for (i = 0; i < z->ob_size; ++i)
1485 z->ob_digit[i] = 0;
1486 for (i = 0; i < size_a; ++i) {
1487 twodigits carry = 0;
1488 twodigits f = a->ob_digit[i];
1489 int j;
1490
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001491 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001492 Py_DECREF(a);
1493 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001494 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001495 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001496 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001497 for (j = 0; j < size_b; ++j) {
1498 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001499 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001500 carry >>= SHIFT;
1501 }
1502 for (; carry != 0; ++j) {
1503 assert(i+j < z->ob_size);
1504 carry += z->ob_digit[i+j];
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 }
1509 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001510 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001511 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001512 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001513 Py_DECREF(a);
1514 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001515 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001516}
1517
Guido van Rossume32e0141992-01-19 16:31:05 +00001518/* The / and % operators are now defined in terms of divmod().
1519 The expression a mod b has the value a - b*floor(a/b).
1520 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001521 |a| by |b|, with the sign of a. This is also expressed
1522 as a - b*trunc(a/b), if trunc truncates towards zero.
1523 Some examples:
1524 a b a rem b a mod b
1525 13 10 3 3
1526 -13 10 -3 7
1527 13 -10 3 -7
1528 -13 -10 -3 -3
1529 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001530 have different signs. We then subtract one from the 'div'
1531 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001532
Guido van Rossume32e0141992-01-19 16:31:05 +00001533static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001534l_divmod(PyLongObject *v, PyLongObject *w,
1535 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001536{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001537 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001538
1539 if (long_divrem(v, w, &div, &mod) < 0)
1540 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001541 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1542 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543 PyLongObject *temp;
1544 PyLongObject *one;
1545 temp = (PyLongObject *) long_add(mod, w);
1546 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001547 mod = temp;
1548 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001549 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001550 return -1;
1551 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001552 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001553 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001554 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1555 Py_DECREF(mod);
1556 Py_DECREF(div);
1557 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001558 return -1;
1559 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001560 Py_DECREF(one);
1561 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001562 div = temp;
1563 }
1564 *pdiv = div;
1565 *pmod = mod;
1566 return 0;
1567}
1568
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001570long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001571{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001572 PyLongObject *a, *b, *div, *mod;
1573
1574 CONVERT_BINOP(v, w, &a, &b);
1575
1576 if (l_divmod(a, b, &div, &mod) < 0) {
1577 Py_DECREF(a);
1578 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001579 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001580 }
1581 Py_DECREF(a);
1582 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001583 Py_DECREF(mod);
1584 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001585}
1586
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001587static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00001588long_classic_div(PyObject *v, PyObject *w)
1589{
1590 PyLongObject *a, *b, *div, *mod;
1591
1592 CONVERT_BINOP(v, w, &a, &b);
1593
1594 if (Py_DivisionWarningFlag &&
1595 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
1596 div = NULL;
1597 else if (l_divmod(a, b, &div, &mod) < 0)
1598 div = NULL;
1599 else
1600 Py_DECREF(mod);
1601
1602 Py_DECREF(a);
1603 Py_DECREF(b);
1604 return (PyObject *)div;
1605}
1606
1607static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00001608long_true_divide(PyObject *v, PyObject *w)
1609{
Tim Peterse2a60002001-09-04 06:17:36 +00001610 PyLongObject *a, *b;
1611 double ad, bd;
1612 int aexp, bexp;
1613
1614 CONVERT_BINOP(v, w, &a, &b);
1615 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
1616 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
1617 if ((ad == -1.0 || bd == -1.0) && PyErr_Occurred())
1618 return NULL;
1619
1620 if (bd == 0.0) {
1621 PyErr_SetString(PyExc_ZeroDivisionError,
1622 "long division or modulo by zero");
1623 return NULL;
1624 }
1625
1626 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
1627 ad /= bd; /* overflow/underflow impossible here */
1628 aexp -= bexp;
1629 if (aexp > INT_MAX / SHIFT)
1630 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00001631 else if (aexp < -(INT_MAX / SHIFT))
1632 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00001633 errno = 0;
1634 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00001635 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00001636 goto overflow;
1637 return PyFloat_FromDouble(ad);
1638
1639overflow:
1640 PyErr_SetString(PyExc_OverflowError,
1641 "long/long too large for a float");
1642 return NULL;
1643
Tim Peters20dab9f2001-09-04 05:31:47 +00001644}
1645
1646static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001647long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001648{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001649 PyLongObject *a, *b, *div, *mod;
1650
1651 CONVERT_BINOP(v, w, &a, &b);
1652
1653 if (l_divmod(a, b, &div, &mod) < 0) {
1654 Py_DECREF(a);
1655 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001656 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001657 }
1658 Py_DECREF(a);
1659 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001660 Py_DECREF(div);
1661 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001662}
1663
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001664static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001665long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001666{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001667 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001668 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001669
1670 CONVERT_BINOP(v, w, &a, &b);
1671
1672 if (l_divmod(a, b, &div, &mod) < 0) {
1673 Py_DECREF(a);
1674 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001675 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001676 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001677 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001678 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001679 PyTuple_SetItem(z, 0, (PyObject *) div);
1680 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001681 }
1682 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001683 Py_DECREF(div);
1684 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001685 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001686 Py_DECREF(a);
1687 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001688 return z;
1689}
1690
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001691static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001692long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001693{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001694 PyLongObject *a, *b;
1695 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001696 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001697 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001698
1699 CONVERT_BINOP(v, w, &a, &b);
1700 if (PyLong_Check(x) || Py_None == x) {
1701 c = x;
1702 Py_INCREF(x);
1703 }
1704 else if (PyInt_Check(x)) {
1705 c = PyLong_FromLong(PyInt_AS_LONG(x));
1706 }
1707 else {
1708 Py_DECREF(a);
1709 Py_DECREF(b);
1710 Py_INCREF(Py_NotImplemented);
1711 return Py_NotImplemented;
1712 }
Tim Peters4c483c42001-09-05 06:24:58 +00001713
1714 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
1715 PyErr_SetString(PyExc_ValueError,
1716 "pow() 3rd argument cannot be 0");
1717 z = NULL;
1718 goto error;
1719 }
1720
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001721 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001722 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001723 Py_DECREF(a);
1724 Py_DECREF(b);
1725 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00001726 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00001727 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
1728 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00001729 return NULL;
1730 }
1731 /* Return a float. This works because we know that
1732 this calls float_pow() which converts its
1733 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001734 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001735 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001736 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001737 for (i = 0; i < size_b; ++i) {
1738 digit bi = b->ob_digit[i];
1739 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001740
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001741 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001742 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001743
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001744 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001745 temp = (PyLongObject *)long_mul(z, a);
1746 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001747 if (c!=Py_None && temp!=NULL) {
1748 if (l_divmod(temp,(PyLongObject *)c,
1749 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001750 Py_DECREF(temp);
1751 z = NULL;
1752 goto error;
1753 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001754 Py_XDECREF(div);
1755 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001756 temp = mod;
1757 }
1758 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001759 if (z == NULL)
1760 break;
1761 }
1762 bi >>= 1;
1763 if (bi == 0 && i+1 == size_b)
1764 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001765 temp = (PyLongObject *)long_mul(a, a);
1766 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001767 if (c!=Py_None && temp!=NULL) {
1768 if (l_divmod(temp, (PyLongObject *)c, &div,
1769 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001770 Py_DECREF(temp);
1771 z = NULL;
1772 goto error;
1773 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001774 Py_XDECREF(div);
1775 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001776 temp = mod;
1777 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001778 a = temp;
1779 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001780 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001781 z = NULL;
1782 break;
1783 }
1784 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001785 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001786 break;
1787 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001788 if (c!=Py_None && z!=NULL) {
1789 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001790 Py_DECREF(z);
1791 z = NULL;
1792 }
1793 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001794 Py_XDECREF(div);
1795 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001796 z = mod;
1797 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001798 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001799 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001800 Py_XDECREF(a);
1801 Py_DECREF(b);
1802 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001803 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001804}
1805
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001806static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001807long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001808{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001809 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001810 PyLongObject *x;
1811 PyLongObject *w;
1812 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001813 if (w == NULL)
1814 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001815 x = (PyLongObject *) long_add(v, w);
1816 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001817 if (x == NULL)
1818 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00001819 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001820 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001821}
1822
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001823static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001824long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001825{
Tim Peters69c2de32001-09-11 22:31:33 +00001826 if (PyLong_CheckExact(v)) {
1827 Py_INCREF(v);
1828 return (PyObject *)v;
1829 }
1830 else
1831 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001832}
1833
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001834static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001835long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001836{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001837 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001838 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001839 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001840 Py_INCREF(v);
1841 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001842 }
Tim Peters69c2de32001-09-11 22:31:33 +00001843 z = (PyLongObject *)_PyLong_Copy(v);
1844 if (z != NULL)
1845 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001846 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001847}
1848
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001849static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001850long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001851{
1852 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001853 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00001854 else
1855 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001856}
1857
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001858static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001859long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001860{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001861 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001862}
1863
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001864static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001865long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001866{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001867 PyLongObject *a, *b;
1868 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001869 long shiftby;
1870 int newsize, wordshift, loshift, hishift, i, j;
1871 digit lomask, himask;
1872
Neil Schemenauerba872e22001-01-04 01:46:03 +00001873 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1874
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001875 if (a->ob_size < 0) {
1876 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001877 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001878 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001879 if (a1 == NULL)
1880 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001881 a2 = (PyLongObject *) long_rshift(a1, b);
1882 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001883 if (a2 == NULL)
1884 goto rshift_error;
1885 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001886 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001887 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001888 else {
1889
1890 shiftby = PyLong_AsLong((PyObject *)b);
1891 if (shiftby == -1L && PyErr_Occurred())
1892 goto rshift_error;
1893 if (shiftby < 0) {
1894 PyErr_SetString(PyExc_ValueError,
1895 "negative shift count");
1896 goto rshift_error;
1897 }
1898 wordshift = shiftby / SHIFT;
1899 newsize = ABS(a->ob_size) - wordshift;
1900 if (newsize <= 0) {
1901 z = _PyLong_New(0);
1902 Py_DECREF(a);
1903 Py_DECREF(b);
1904 return (PyObject *)z;
1905 }
1906 loshift = shiftby % SHIFT;
1907 hishift = SHIFT - loshift;
1908 lomask = ((digit)1 << hishift) - 1;
1909 himask = MASK ^ lomask;
1910 z = _PyLong_New(newsize);
1911 if (z == NULL)
1912 goto rshift_error;
1913 if (a->ob_size < 0)
1914 z->ob_size = -(z->ob_size);
1915 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1916 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1917 if (i+1 < newsize)
1918 z->ob_digit[i] |=
1919 (a->ob_digit[j+1] << hishift) & himask;
1920 }
1921 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001922 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001923rshift_error:
1924 Py_DECREF(a);
1925 Py_DECREF(b);
1926 return (PyObject *) z;
1927
Guido van Rossumc6913e71991-11-19 20:26:46 +00001928}
1929
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001930static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001931long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001932{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001933 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001934 PyLongObject *a, *b;
1935 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001936 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001937 int oldsize, newsize, wordshift, remshift, i, j;
1938 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001939
Neil Schemenauerba872e22001-01-04 01:46:03 +00001940 CONVERT_BINOP(v, w, &a, &b);
1941
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001942 shiftby = PyLong_AsLong((PyObject *)b);
1943 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001944 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001945 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001946 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001947 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001948 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001949 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001950 PyErr_SetString(PyExc_ValueError,
1951 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001952 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001953 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001954 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1955 wordshift = (int)shiftby / SHIFT;
1956 remshift = (int)shiftby - wordshift * SHIFT;
1957
1958 oldsize = ABS(a->ob_size);
1959 newsize = oldsize + wordshift;
1960 if (remshift)
1961 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001962 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001963 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001964 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001965 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001966 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001967 for (i = 0; i < wordshift; i++)
1968 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001969 accum = 0;
1970 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1971 accum |= a->ob_digit[j] << remshift;
1972 z->ob_digit[i] = (digit)(accum & MASK);
1973 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001974 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001975 if (remshift)
1976 z->ob_digit[newsize-1] = (digit)accum;
1977 else
1978 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001979 z = long_normalize(z);
1980lshift_error:
1981 Py_DECREF(a);
1982 Py_DECREF(b);
1983 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001984}
1985
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001986
1987/* Bitwise and/xor/or operations */
1988
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001989#define MAX(x, y) ((x) < (y) ? (y) : (x))
1990#define MIN(x, y) ((x) > (y) ? (y) : (x))
1991
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001992static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001993long_bitwise(PyLongObject *a,
1994 int op, /* '&', '|', '^' */
1995 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001996{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001997 digit maska, maskb; /* 0 or MASK */
1998 int negz;
1999 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002000 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002001 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002002 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002003 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002004
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002005 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002006 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002007 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002008 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002009 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002010 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002011 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002012 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002013 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002014 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002015 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002016 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002017 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002018 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002019 maskb = 0;
2020 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00002021
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002022 negz = 0;
2023 switch (op) {
2024 case '^':
2025 if (maska != maskb) {
2026 maska ^= MASK;
2027 negz = -1;
2028 }
2029 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002030 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002031 if (maska && maskb) {
2032 op = '|';
2033 maska ^= MASK;
2034 maskb ^= MASK;
2035 negz = -1;
2036 }
2037 break;
2038 case '|':
2039 if (maska || maskb) {
2040 op = '&';
2041 maska ^= MASK;
2042 maskb ^= MASK;
2043 negz = -1;
2044 }
2045 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002046 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002047
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002048 /* JRH: The original logic here was to allocate the result value (z)
2049 as the longer of the two operands. However, there are some cases
2050 where the result is guaranteed to be shorter than that: AND of two
2051 positives, OR of two negatives: use the shorter number. AND with
2052 mixed signs: use the positive number. OR with mixed signs: use the
2053 negative number. After the transformations above, op will be '&'
2054 iff one of these cases applies, and mask will be non-0 for operands
2055 whose length should be ignored.
2056 */
2057
2058 size_a = a->ob_size;
2059 size_b = b->ob_size;
2060 size_z = op == '&'
2061 ? (maska
2062 ? size_b
2063 : (maskb ? size_a : MIN(size_a, size_b)))
2064 : MAX(size_a, size_b);
2065 z = _PyLong_New(size_z);
2066 if (a == NULL || b == NULL || z == NULL) {
2067 Py_XDECREF(a);
2068 Py_XDECREF(b);
2069 Py_XDECREF(z);
2070 return NULL;
2071 }
2072
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002073 for (i = 0; i < size_z; ++i) {
2074 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2075 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2076 switch (op) {
2077 case '&': z->ob_digit[i] = diga & digb; break;
2078 case '|': z->ob_digit[i] = diga | digb; break;
2079 case '^': z->ob_digit[i] = diga ^ digb; break;
2080 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002081 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002082
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002083 Py_DECREF(a);
2084 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002085 z = long_normalize(z);
2086 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002087 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002088 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002089 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002090 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002091}
2092
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002093static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002094long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002095{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002096 PyLongObject *a, *b;
2097 PyObject *c;
2098 CONVERT_BINOP(v, w, &a, &b);
2099 c = long_bitwise(a, '&', b);
2100 Py_DECREF(a);
2101 Py_DECREF(b);
2102 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002103}
2104
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002105static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002106long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002107{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002108 PyLongObject *a, *b;
2109 PyObject *c;
2110 CONVERT_BINOP(v, w, &a, &b);
2111 c = long_bitwise(a, '^', b);
2112 Py_DECREF(a);
2113 Py_DECREF(b);
2114 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002115}
2116
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002117static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002118long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002119{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002120 PyLongObject *a, *b;
2121 PyObject *c;
2122 CONVERT_BINOP(v, w, &a, &b);
2123 c = long_bitwise(a, '|', b);
2124 Py_DECREF(a);
2125 Py_DECREF(b);
2126 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002127}
2128
Guido van Rossum234f9421993-06-17 12:35:49 +00002129static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002130long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002131{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002132 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002133 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002134 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002135 return 0;
2136 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002137 else if (PyLong_Check(*pw)) {
2138 Py_INCREF(*pv);
2139 Py_INCREF(*pw);
2140 return 0;
2141 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002142 return 1; /* Can't do it */
2143}
2144
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002145static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002146long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002147{
2148 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002149 x = PyLong_AsLong(v);
2150 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002151 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002152 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002153}
2154
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002155static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002156long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002157{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002158 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002159 return v;
2160}
2161
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002162static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002163long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002164{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002165 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002166 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002167 if (result == -1.0 && PyErr_Occurred())
2168 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002169 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002170}
2171
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002172static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002173long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002174{
Fred Drake121ee271999-12-23 15:41:28 +00002175 return long_format(v, 8, 1);
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_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002180{
Fred Drake121ee271999-12-23 15:41:28 +00002181 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002182}
Guido van Rossumbef14172001-08-29 15:47:46 +00002183staticforward PyObject *
2184long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002185
Tim Peters6d6c1a32001-08-02 04:15:00 +00002186static PyObject *
2187long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2188{
2189 PyObject *x = NULL;
2190 int base = -909; /* unlikely! */
2191 static char *kwlist[] = {"x", "base", 0};
2192
Guido van Rossumbef14172001-08-29 15:47:46 +00002193 if (type != &PyLong_Type)
2194 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002195 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2196 &x, &base))
2197 return NULL;
2198 if (x == NULL)
2199 return PyLong_FromLong(0L);
2200 if (base == -909)
2201 return PyNumber_Long(x);
2202 else if (PyString_Check(x))
2203 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002204#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002205 else if (PyUnicode_Check(x))
2206 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2207 PyUnicode_GET_SIZE(x),
2208 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002209#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002210 else {
2211 PyErr_SetString(PyExc_TypeError,
2212 "long() can't convert non-string with explicit base");
2213 return NULL;
2214 }
2215}
2216
Guido van Rossumbef14172001-08-29 15:47:46 +00002217/* Wimpy, slow approach to tp_new calls for subtypes of long:
2218 first create a regular long from whatever arguments we got,
2219 then allocate a subtype instance and initialize it from
2220 the regular long. The regular long is then thrown away.
2221*/
2222static PyObject *
2223long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2224{
2225 PyLongObject *tmp, *new;
2226 int i, n;
2227
2228 assert(PyType_IsSubtype(type, &PyLong_Type));
2229 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2230 if (tmp == NULL)
2231 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002232 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002233 n = tmp->ob_size;
2234 if (n < 0)
2235 n = -n;
2236 new = (PyLongObject *)type->tp_alloc(type, n);
2237 if (new == NULL)
2238 return NULL;
2239 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002240 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002241 for (i = 0; i < n; i++)
2242 new->ob_digit[i] = tmp->ob_digit[i];
2243 Py_DECREF(tmp);
2244 return (PyObject *)new;
2245}
2246
Tim Peters6d6c1a32001-08-02 04:15:00 +00002247static char long_doc[] =
2248"long(x[, base]) -> integer\n\
2249\n\
2250Convert a string or number to a long integer, if possible. A floating\n\
2251point argument will be truncated towards zero (this does not include a\n\
2252string representation of a floating point number!) When converting a\n\
2253string, use the optional base. It is an error to supply a base when\n\
2254converting a non-string.";
2255
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002256static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002257 (binaryfunc) long_add, /*nb_add*/
2258 (binaryfunc) long_sub, /*nb_subtract*/
2259 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002260 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002261 (binaryfunc) long_mod, /*nb_remainder*/
2262 (binaryfunc) long_divmod, /*nb_divmod*/
2263 (ternaryfunc) long_pow, /*nb_power*/
2264 (unaryfunc) long_neg, /*nb_negative*/
2265 (unaryfunc) long_pos, /*tp_positive*/
2266 (unaryfunc) long_abs, /*tp_absolute*/
2267 (inquiry) long_nonzero, /*tp_nonzero*/
2268 (unaryfunc) long_invert, /*nb_invert*/
2269 (binaryfunc) long_lshift, /*nb_lshift*/
2270 (binaryfunc) long_rshift, /*nb_rshift*/
2271 (binaryfunc) long_and, /*nb_and*/
2272 (binaryfunc) long_xor, /*nb_xor*/
2273 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002274 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002275 (unaryfunc) long_int, /*nb_int*/
2276 (unaryfunc) long_long, /*nb_long*/
2277 (unaryfunc) long_float, /*nb_float*/
2278 (unaryfunc) long_oct, /*nb_oct*/
2279 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002280 0, /* nb_inplace_add */
2281 0, /* nb_inplace_subtract */
2282 0, /* nb_inplace_multiply */
2283 0, /* nb_inplace_divide */
2284 0, /* nb_inplace_remainder */
2285 0, /* nb_inplace_power */
2286 0, /* nb_inplace_lshift */
2287 0, /* nb_inplace_rshift */
2288 0, /* nb_inplace_and */
2289 0, /* nb_inplace_xor */
2290 0, /* nb_inplace_or */
2291 (binaryfunc)long_div, /* nb_floor_divide */
2292 long_true_divide, /* nb_true_divide */
2293 0, /* nb_inplace_floor_divide */
2294 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002295};
2296
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002297PyTypeObject PyLong_Type = {
2298 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002299 0, /* ob_size */
2300 "long", /* tp_name */
2301 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2302 sizeof(digit), /* tp_itemsize */
2303 (destructor)long_dealloc, /* tp_dealloc */
2304 0, /* tp_print */
2305 0, /* tp_getattr */
2306 0, /* tp_setattr */
2307 (cmpfunc)long_compare, /* tp_compare */
2308 (reprfunc)long_repr, /* tp_repr */
2309 &long_as_number, /* tp_as_number */
2310 0, /* tp_as_sequence */
2311 0, /* tp_as_mapping */
2312 (hashfunc)long_hash, /* tp_hash */
2313 0, /* tp_call */
2314 (reprfunc)long_str, /* tp_str */
2315 PyObject_GenericGetAttr, /* tp_getattro */
2316 0, /* tp_setattro */
2317 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002318 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2319 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002320 long_doc, /* tp_doc */
2321 0, /* tp_traverse */
2322 0, /* tp_clear */
2323 0, /* tp_richcompare */
2324 0, /* tp_weaklistoffset */
2325 0, /* tp_iter */
2326 0, /* tp_iternext */
2327 0, /* tp_methods */
2328 0, /* tp_members */
2329 0, /* tp_getset */
2330 0, /* tp_base */
2331 0, /* tp_dict */
2332 0, /* tp_descr_get */
2333 0, /* tp_descr_set */
2334 0, /* tp_dictoffset */
2335 0, /* tp_init */
2336 0, /* tp_alloc */
2337 long_new, /* tp_new */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002338};