blob: 53ae5ed6bd237ffa39e995c96d083c22f37d7c36 [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 Rossumedcc38a1991-05-05 20:09:44 +00009#include <assert.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000010#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011
Guido van Rossume32e0141992-01-19 16:31:05 +000012#define ABS(x) ((x) < 0 ? -(x) : (x))
13
14/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000015static PyLongObject *long_normalize(PyLongObject *);
16static PyLongObject *mul1(PyLongObject *, wdigit);
17static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
18static PyLongObject *divrem1(PyLongObject *, wdigit, digit *);
19static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000020
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000021static int ticker; /* XXX Could be shared with ceval? */
22
Guido van Rossumc0b618a1997-05-02 03:12:38 +000023#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000024 if (--ticker < 0) { \
25 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000026 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000027 }
28
Guido van Rossumedcc38a1991-05-05 20:09:44 +000029/* Normalize (remove leading zeros from) a long int object.
30 Doesn't attempt to free the storage--in most cases, due to the nature
31 of the algorithms used, this could save at most be one word anyway. */
32
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000034long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000035{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000036 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000037 register int i = j;
38
39 while (i > 0 && v->ob_digit[i-1] == 0)
40 --i;
41 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000042 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000043 return v;
44}
45
46/* Allocate a new long int object with size digits.
47 Return NULL and set exception if we run out of memory. */
48
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000050_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000051{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000053}
54
55/* Create a new long int object from a C long int */
56
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000058PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000059{
Tim Petersce9de2f2001-06-14 04:56:19 +000060 PyLongObject *v;
61 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
62 int ndigits = 0;
63 int negative = 0;
64
65 if (ival < 0) {
66 ival = -ival;
67 negative = 1;
68 }
69
70 /* Count the number of Python digits.
71 We used to pick 5 ("big enough for anything"), but that's a
72 waste of time and space given that 5*15 = 75 bits are rarely
73 needed. */
74 t = (unsigned long)ival;
75 while (t) {
76 ++ndigits;
77 t >>= SHIFT;
78 }
79 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000080 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +000081 digit *p = v->ob_digit;
82 v->ob_size = negative ? -ndigits : ndigits;
83 t = (unsigned long)ival;
84 while (t) {
85 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000086 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000087 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000088 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000090}
91
Guido van Rossum53756b11997-01-03 17:14:46 +000092/* Create a new long int object from a C unsigned long int */
93
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000095PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +000096{
Tim Petersce9de2f2001-06-14 04:56:19 +000097 PyLongObject *v;
98 unsigned long t;
99 int ndigits = 0;
100
101 /* Count the number of Python digits. */
102 t = (unsigned long)ival;
103 while (t) {
104 ++ndigits;
105 t >>= SHIFT;
106 }
107 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000108 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000109 digit *p = v->ob_digit;
110 v->ob_size = ndigits;
111 while (ival) {
112 *p++ = (digit)(ival & MASK);
113 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000114 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000115 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000117}
118
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000119/* Create a new long int object from a C double */
120
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000123{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000124 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000125 double frac;
126 int i, ndig, expo, neg;
127 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000128 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000129 PyErr_SetString(PyExc_OverflowError,
130 "cannot convert float infinity to long");
131 return NULL;
132 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000133 if (dval < 0.0) {
134 neg = 1;
135 dval = -dval;
136 }
137 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
138 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000140 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000142 if (v == NULL)
143 return NULL;
144 frac = ldexp(frac, (expo-1) % SHIFT + 1);
145 for (i = ndig; --i >= 0; ) {
146 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000147 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000148 frac = frac - (double)bits;
149 frac = ldexp(frac, SHIFT);
150 }
151 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000152 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000153 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000154}
155
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000156/* Get a C long int from a long int object.
157 Returns -1 and sets an error condition if overflow occurs. */
158
159long
Tim Peters9f688bf2000-07-07 15:53:28 +0000160PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000161{
Guido van Rossumf7531811998-05-26 14:33:37 +0000162 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000164 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000165 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000166
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 if (vv == NULL || !PyLong_Check(vv)) {
168 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000169 return -1;
170 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000172 i = v->ob_size;
173 sign = 1;
174 x = 0;
175 if (i < 0) {
176 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000177 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000178 }
179 while (--i >= 0) {
180 prev = x;
181 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000182 if ((x >> SHIFT) != prev)
183 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000184 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000185 /* Haven't lost any bits, but if the sign bit is set we're in
186 * trouble *unless* this is the min negative number. So,
187 * trouble iff sign bit set && (positive || some bit set other
188 * than the sign bit).
189 */
190 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
191 goto overflow;
192 return (long)x * sign;
193
194 overflow:
195 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000196 "long int too large to convert");
Guido van Rossumf7531811998-05-26 14:33:37 +0000197 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000198}
199
Guido van Rossum53756b11997-01-03 17:14:46 +0000200/* Get a C long int from a long int object.
201 Returns -1 and sets an error condition if overflow occurs. */
202
203unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000204PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000205{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000207 unsigned long x, prev;
208 int i;
209
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 if (vv == NULL || !PyLong_Check(vv)) {
211 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000212 return (unsigned long) -1;
213 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000215 i = v->ob_size;
216 x = 0;
217 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000218 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000219 "can't convert negative value to unsigned long");
220 return (unsigned long) -1;
221 }
222 while (--i >= 0) {
223 prev = x;
224 x = (x << SHIFT) + v->ob_digit[i];
225 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000227 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000228 return (unsigned long) -1;
229 }
230 }
231 return x;
232}
233
Tim Peters2a9b3672001-06-11 21:23:58 +0000234PyObject *
235_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
236 int little_endian, int is_signed)
237{
238 const unsigned char* pstartbyte;/* LSB of bytes */
239 int incr; /* direction to move pstartbyte */
240 const unsigned char* pendbyte; /* MSB of bytes */
241 size_t numsignificantbytes; /* number of bytes that matter */
242 size_t ndigits; /* number of Python long digits */
243 PyLongObject* v; /* result */
244 int idigit = 0; /* next free index in v->ob_digit */
245
246 if (n == 0)
247 return PyLong_FromLong(0L);
248
249 if (little_endian) {
250 pstartbyte = bytes;
251 pendbyte = bytes + n - 1;
252 incr = 1;
253 }
254 else {
255 pstartbyte = bytes + n - 1;
256 pendbyte = bytes;
257 incr = -1;
258 }
259
260 if (is_signed)
261 is_signed = *pendbyte >= 0x80;
262
263 /* Compute numsignificantbytes. This consists of finding the most
264 significant byte. Leading 0 bytes are insignficant if the number
265 is positive, and leading 0xff bytes if negative. */
266 {
267 size_t i;
268 const unsigned char* p = pendbyte;
269 const int pincr = -incr; /* search MSB to LSB */
270 const unsigned char insignficant = is_signed ? 0xff : 0x00;
271
272 for (i = 0; i < n; ++i, p += pincr) {
273 if (*p != insignficant)
274 break;
275 }
276 numsignificantbytes = n - i;
277 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
278 actually has 2 significant bytes. OTOH, 0xff0001 ==
279 -0x00ffff, so we wouldn't *need* to bump it there; but we
280 do for 0xffff = -0x0001. To be safe without bothering to
281 check every case, bump it regardless. */
282 if (is_signed && numsignificantbytes < n)
283 ++numsignificantbytes;
284 }
285
286 /* How many Python long digits do we need? We have
287 8*numsignificantbytes bits, and each Python long digit has SHIFT
288 bits, so it's the ceiling of the quotient. */
289 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
290 if (ndigits > (size_t)INT_MAX)
291 return PyErr_NoMemory();
292 v = _PyLong_New((int)ndigits);
293 if (v == NULL)
294 return NULL;
295
296 /* Copy the bits over. The tricky parts are computing 2's-comp on
297 the fly for signed numbers, and dealing with the mismatch between
298 8-bit bytes and (probably) 15-bit Python digits.*/
299 {
300 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000301 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000302 twodigits accum = 0; /* sliding register */
303 unsigned int accumbits = 0; /* number of bits in accum */
304 const unsigned char* p = pstartbyte;
305
306 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000307 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000308 /* Compute correction for 2's comp, if needed. */
309 if (is_signed) {
310 thisbyte = (0xff ^ thisbyte) + carry;
311 carry = thisbyte >> 8;
312 thisbyte &= 0xff;
313 }
314 /* Because we're going LSB to MSB, thisbyte is
315 more significant than what's already in accum,
316 so needs to be prepended to accum. */
317 accum |= thisbyte << accumbits;
318 accumbits += 8;
319 if (accumbits >= SHIFT) {
320 /* There's enough to fill a Python digit. */
321 assert(idigit < (int)ndigits);
322 v->ob_digit[idigit] = (digit)(accum & MASK);
323 ++idigit;
324 accum >>= SHIFT;
325 accumbits -= SHIFT;
326 assert(accumbits < SHIFT);
327 }
328 }
329 assert(accumbits < SHIFT);
330 if (accumbits) {
331 assert(idigit < (int)ndigits);
332 v->ob_digit[idigit] = (digit)accum;
333 ++idigit;
334 }
335 }
336
337 v->ob_size = is_signed ? -idigit : idigit;
338 return (PyObject *)long_normalize(v);
339}
340
341int
342_PyLong_AsByteArray(PyLongObject* v,
343 unsigned char* bytes, size_t n,
344 int little_endian, int is_signed)
345{
346 int i; /* index into v->ob_digit */
347 int ndigits; /* |v->ob_size| */
348 twodigits accum; /* sliding register */
349 unsigned int accumbits; /* # bits in accum */
350 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
351 twodigits carry; /* for computing 2's-comp */
352 size_t j; /* # bytes filled */
353 unsigned char* p; /* pointer to next byte in bytes */
354 int pincr; /* direction to move p */
355
356 assert(v != NULL && PyLong_Check(v));
357
358 if (v->ob_size < 0) {
359 ndigits = -(v->ob_size);
360 if (!is_signed) {
361 PyErr_SetString(PyExc_TypeError,
362 "can't convert negative long to unsigned");
363 return -1;
364 }
365 do_twos_comp = 1;
366 }
367 else {
368 ndigits = v->ob_size;
369 do_twos_comp = 0;
370 }
371
372 if (little_endian) {
373 p = bytes;
374 pincr = 1;
375 }
376 else {
377 p = bytes + n - 1;
378 pincr = -1;
379 }
380
Tim Peters898cf852001-06-13 20:50:08 +0000381 /* Copy over all the Python digits.
382 It's crucial that every Python digit except for the MSD contribute
383 exactly SHIFT bits to the total, so first assert that the long is
384 normalized. */
385 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000386 j = 0;
387 accum = 0;
388 accumbits = 0;
389 carry = do_twos_comp ? 1 : 0;
390 for (i = 0; i < ndigits; ++i) {
391 twodigits thisdigit = v->ob_digit[i];
392 if (do_twos_comp) {
393 thisdigit = (thisdigit ^ MASK) + carry;
394 carry = thisdigit >> SHIFT;
395 thisdigit &= MASK;
396 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000397 /* Because we're going LSB to MSB, thisdigit is more
398 significant than what's already in accum, so needs to be
399 prepended to accum. */
400 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000401 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000402
Tim Petersede05092001-06-14 08:53:38 +0000403 /* The most-significant digit may be (probably is) at least
404 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000405 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000406 /* Count # of sign bits -- they needn't be stored,
407 * although for signed conversion we need later to
408 * make sure at least one sign bit gets stored.
409 * First shift conceptual sign bit to real sign bit.
410 */
411 stwodigits s = (stwodigits)(thisdigit <<
412 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000413 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000414 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000415 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000416 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000417 }
Tim Petersede05092001-06-14 08:53:38 +0000418 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000419 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000420
Tim Peters2a9b3672001-06-11 21:23:58 +0000421 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000422 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000423 if (j >= n)
424 goto Overflow;
425 ++j;
426 *p = (unsigned char)(accum & 0xff);
427 p += pincr;
428 accumbits -= 8;
429 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000430 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000431 }
432
433 /* Store the straggler (if any). */
434 assert(accumbits < 8);
435 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000436 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000437 if (j >= n)
438 goto Overflow;
439 ++j;
440 if (do_twos_comp) {
441 /* Fill leading bits of the byte with sign bits
442 (appropriately pretending that the long had an
443 infinite supply of sign bits). */
444 accum |= (~(twodigits)0) << accumbits;
445 }
446 *p = (unsigned char)(accum & 0xff);
447 p += pincr;
448 }
Tim Peters05607ad2001-06-13 21:01:27 +0000449 else if (j == n && n > 0 && is_signed) {
450 /* The main loop filled the byte array exactly, so the code
451 just above didn't get to ensure there's a sign bit, and the
452 loop below wouldn't add one either. Make sure a sign bit
453 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000454 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000455 int sign_bit_set = msb >= 0x80;
456 assert(accumbits == 0);
457 if (sign_bit_set == do_twos_comp)
458 return 0;
459 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000460 goto Overflow;
461 }
Tim Peters05607ad2001-06-13 21:01:27 +0000462
463 /* Fill remaining bytes with copies of the sign bit. */
464 {
465 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
466 for ( ; j < n; ++j, p += pincr)
467 *p = signbyte;
468 }
469
Tim Peters2a9b3672001-06-11 21:23:58 +0000470 return 0;
471
472Overflow:
473 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
474 return -1;
475
476}
477
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000478/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000479
480double
Tim Peters9f688bf2000-07-07 15:53:28 +0000481PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000482{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000484 double x;
485 double multiplier = (double) (1L << SHIFT);
486 int i, sign;
487
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 if (vv == NULL || !PyLong_Check(vv)) {
489 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000490 return -1;
491 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000493 i = v->ob_size;
494 sign = 1;
495 x = 0.0;
496 if (i < 0) {
497 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000498 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000499 }
500 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000501 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000502 }
503 return x * sign;
504}
505
Guido van Rossum78694d91998-09-18 14:14:13 +0000506/* Create a new long (or int) object from a C pointer */
507
508PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000509PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000510{
Tim Peters70128a12001-06-16 08:48:40 +0000511#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000512 return PyInt_FromLong((long)p);
513#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000514
Tim Peters70128a12001-06-16 08:48:40 +0000515#ifndef HAVE_LONG_LONG
516# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
517#endif
518#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
519# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
520#endif
521 /* optimize null pointers */
522 if (p == NULL)
523 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000524 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000525
526#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000527}
528
529/* Get a C pointer from a long object (or an int object in some cases) */
530
531void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000532PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000533{
534 /* This function will allow int or long objects. If vv is neither,
535 then the PyLong_AsLong*() functions will raise the exception:
536 PyExc_SystemError, "bad argument to internal function"
537 */
Tim Peters70128a12001-06-16 08:48:40 +0000538#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000539 long x;
540
Tim Peters70128a12001-06-16 08:48:40 +0000541 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000542 x = PyInt_AS_LONG(vv);
543 else
544 x = PyLong_AsLong(vv);
545#else
Tim Peters70128a12001-06-16 08:48:40 +0000546
547#ifndef HAVE_LONG_LONG
548# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
549#endif
550#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
551# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
552#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000553 LONG_LONG x;
554
Tim Peters70128a12001-06-16 08:48:40 +0000555 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000556 x = PyInt_AS_LONG(vv);
557 else
558 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000559
560#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000561
562 if (x == -1 && PyErr_Occurred())
563 return NULL;
564 return (void *)x;
565}
566
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000567#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000568
569/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
570 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000571 */
572
Tim Peterscf37dfc2001-06-14 18:42:50 +0000573#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000574
575/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000576
577PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000578PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000579{
Tim Petersd1a7da62001-06-13 00:35:57 +0000580 LONG_LONG bytes = ival;
581 int one = 1;
582 return _PyLong_FromByteArray(
583 (unsigned char *)&bytes,
584 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000585}
586
Tim Petersd1a7da62001-06-13 00:35:57 +0000587/* Create a new long int object from a C unsigned LONG_LONG int. */
588
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000589PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000590PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000591{
Tim Petersd1a7da62001-06-13 00:35:57 +0000592 unsigned LONG_LONG bytes = ival;
593 int one = 1;
594 return _PyLong_FromByteArray(
595 (unsigned char *)&bytes,
596 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000597}
598
Guido van Rossum3293b071998-08-25 16:07:15 +0000599/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000600 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000601
Guido van Rossum3293b071998-08-25 16:07:15 +0000602LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000603PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000604{
Tim Petersd1a7da62001-06-13 00:35:57 +0000605 LONG_LONG bytes;
606 int one = 1;
607 int res;
608
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000609 if (vv == NULL || !PyLong_Check(vv)) {
610 PyErr_BadInternalCall();
611 return -1;
612 }
613
Tim Petersd1a7da62001-06-13 00:35:57 +0000614 res = _PyLong_AsByteArray(
615 (PyLongObject *)vv, (unsigned char *)&bytes,
616 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000617
Tim Peters9cb0c382001-06-13 20:45:17 +0000618 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000619}
620
Tim Petersd1a7da62001-06-13 00:35:57 +0000621/* Get a C unsigned LONG_LONG int from a long int object.
622 Return -1 and set an error if overflow occurs. */
623
Guido van Rossum3293b071998-08-25 16:07:15 +0000624unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000625PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000626{
Tim Petersd1a7da62001-06-13 00:35:57 +0000627 unsigned LONG_LONG bytes;
628 int one = 1;
629 int res;
630
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000631 if (vv == NULL || !PyLong_Check(vv)) {
632 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000633 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000634 }
635
Tim Petersd1a7da62001-06-13 00:35:57 +0000636 res = _PyLong_AsByteArray(
637 (PyLongObject *)vv, (unsigned char *)&bytes,
638 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000639
Tim Peters9cb0c382001-06-13 20:45:17 +0000640 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000641}
Tim Petersd1a7da62001-06-13 00:35:57 +0000642
643#undef IS_LITTLE_ENDIAN
644
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000645#endif /* HAVE_LONG_LONG */
646
Neil Schemenauerba872e22001-01-04 01:46:03 +0000647
648static int
649convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
650 if (PyLong_Check(v)) {
651 *a = (PyLongObject *) v;
652 Py_INCREF(v);
653 }
654 else if (PyInt_Check(v)) {
655 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
656 }
657 else {
658 return 0;
659 }
660 if (PyLong_Check(w)) {
661 *b = (PyLongObject *) w;
662 Py_INCREF(w);
663 }
664 else if (PyInt_Check(w)) {
665 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
666 }
667 else {
668 Py_DECREF(*a);
669 return 0;
670 }
671 return 1;
672}
673
674#define CONVERT_BINOP(v, w, a, b) \
675 if (!convert_binop(v, w, a, b)) { \
676 Py_INCREF(Py_NotImplemented); \
677 return Py_NotImplemented; \
678 }
679
680
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000681/* Multiply by a single digit, ignoring the sign. */
682
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000684mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000685{
686 return muladd1(a, n, (digit)0);
687}
688
689/* Multiply by a single digit and add a single digit, ignoring the sign. */
690
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000692muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000693{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000694 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000696 twodigits carry = extra;
697 int i;
698
699 if (z == NULL)
700 return NULL;
701 for (i = 0; i < size_a; ++i) {
702 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000703 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000704 carry >>= SHIFT;
705 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000706 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000707 return long_normalize(z);
708}
709
710/* Divide a long integer by a digit, returning both the quotient
711 (as function result) and the remainder (through *prem).
712 The sign of a is ignored; n should not be zero. */
713
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000715divrem1(PyLongObject *a, wdigit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000716{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000717 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000719 int i;
720 twodigits rem = 0;
721
722 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000724 if (z == NULL)
725 return NULL;
726 for (i = size; --i >= 0; ) {
727 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000728 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000729 rem %= n;
730 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000731 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000732 return long_normalize(z);
733}
734
735/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000736 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000737 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000738
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000740long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000741{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000742 register PyLongObject *a = (PyLongObject *)aa;
743 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000744 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000745 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000746 char *p;
747 int bits;
748 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000749
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000750 if (a == NULL || !PyLong_Check(a)) {
751 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000752 return NULL;
753 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000754 assert(base >= 2 && base <= 36);
755
756 /* Compute a rough upper bound for the length of the string */
757 i = base;
758 bits = 0;
759 while (i > 1) {
760 ++bits;
761 i >>= 1;
762 }
Fred Drake121ee271999-12-23 15:41:28 +0000763 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000765 if (str == NULL)
766 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000768 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000769 if (addL)
770 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000771 if (a->ob_size < 0)
772 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000773
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000774 if (a->ob_size == 0) {
775 *--p = '0';
776 }
777 else if ((base & (base - 1)) == 0) {
778 /* JRH: special case for power-of-2 bases */
779 twodigits temp = a->ob_digit[0];
780 int bitsleft = SHIFT;
781 int rem;
782 int last = abs(a->ob_size);
783 int basebits = 1;
784 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000785 while ((i >>= 1) > 1)
786 ++basebits;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000787
788 i = 0;
789 for (;;) {
790 while (bitsleft >= basebits) {
791 if ((temp == 0) && (i >= last - 1)) break;
792 rem = temp & (base - 1);
793 if (rem < 10)
794 rem += '0';
795 else
796 rem += 'A' - 10;
797 assert(p > PyString_AS_STRING(str));
798 *--p = (char) rem;
799 bitsleft -= basebits;
800 temp >>= basebits;
801 }
802 if (++i >= last) {
803 if (temp == 0) break;
804 bitsleft = 99;
805 /* loop again to pick up final digits */
806 }
807 else {
808 temp = (a->ob_digit[i] << bitsleft) | temp;
809 bitsleft += SHIFT;
810 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000811 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000812 }
813 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000814 /* Not 0, and base not a power of 2. Divide repeatedly by
815 base, but for speed use the highest power of base that
816 fits in a digit. */
817 digit powbase = base; /* powbase == base ** power */
818 int power = 1;
819 for (;;) {
820 unsigned long newpow = powbase * (unsigned long)base;
821 if (newpow >> SHIFT) /* doesn't fit in a digit */
822 break;
823 powbase = (digit)newpow;
824 ++power;
825 }
826
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000827 Py_INCREF(a);
828 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000829 int ntostore = power;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000830 digit rem;
Tim Petersfad225f2001-07-13 02:59:26 +0000831 PyLongObject *temp = divrem1(a, powbase, &rem);
832 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000833 if (temp == NULL) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000834 Py_DECREF(str);
835 return NULL;
836 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000837 a = temp;
838 SIGCHECK({
839 Py_DECREF(a);
840 Py_DECREF(str);
841 return NULL;
842 })
Tim Petersfad225f2001-07-13 02:59:26 +0000843 while (--ntostore >= 0) {
844 digit nextrem = (digit)(rem / base);
845 char c = (char)(rem - nextrem * base);
846 assert(p > PyString_AS_STRING(str));
847 c += (c < 10) ? '0' : 'A'-10;
848 *--p = c;
849 rem = nextrem;
850 if (a->ob_size == 0 && rem == 0)
851 break; /* skip leading zeroes */
852 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000853 } while (ABS(a->ob_size) != 0);
854 Py_DECREF(a);
855 }
856
Guido van Rossum2c475421992-08-14 15:13:07 +0000857 if (base == 8) {
858 if (size_a != 0)
859 *--p = '0';
860 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000861 else if (base == 16) {
862 *--p = 'x';
863 *--p = '0';
864 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000865 else if (base != 10) {
866 *--p = '#';
867 *--p = '0' + base%10;
868 if (base > 10)
869 *--p = '0' + base/10;
870 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000871 if (sign)
872 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873 if (p != PyString_AS_STRING(str)) {
874 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000875 assert(p > q);
876 do {
877 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000878 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000879 _PyString_Resize((PyObject **)&str,
880 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000881 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000883}
884
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000886PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000887{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000888 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000889 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000890 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000891
Guido van Rossum472c04f1996-12-05 21:57:21 +0000892 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000894 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000895 return NULL;
896 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000897 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000898 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000899 if (*str == '+')
900 ++str;
901 else if (*str == '-') {
902 ++str;
903 sign = -1;
904 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000905 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000906 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000907 if (base == 0) {
908 if (str[0] != '0')
909 base = 10;
910 else if (str[1] == 'x' || str[1] == 'X')
911 base = 16;
912 else
913 base = 8;
914 }
915 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
916 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000917 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000918 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000919 for ( ; z != NULL; ++str) {
920 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000921 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000922
923 if (*str <= '9')
924 k = *str - '0';
925 else if (*str >= 'a')
926 k = *str - 'a' + 10;
927 else if (*str >= 'A')
928 k = *str - 'A' + 10;
929 if (k < 0 || k >= base)
930 break;
931 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000933 z = temp;
934 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000935 if (z == NULL)
936 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000937 if (str == start)
938 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000939 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000940 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000941 if (*str == 'L' || *str == 'l')
942 str++;
943 while (*str && isspace(Py_CHARMASK(*str)))
944 str++;
945 if (*str != '\0')
946 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000947 if (pend)
948 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000950
951 onError:
952 PyErr_Format(PyExc_ValueError,
953 "invalid literal for long(): %.200s", orig_str);
954 Py_XDECREF(z);
955 return NULL;
956}
957
958PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000959PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000960{
961 char buffer[256];
962
963 if (length >= sizeof(buffer)) {
964 PyErr_SetString(PyExc_ValueError,
965 "long() literal too large to convert");
966 return NULL;
967 }
968 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
969 return NULL;
970
971 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000972}
973
Tim Peters9f688bf2000-07-07 15:53:28 +0000974/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +0000976 (PyLongObject *, PyLongObject *, PyLongObject **);
977static PyObject *long_pos(PyLongObject *);
978static int long_divrem(PyLongObject *, PyLongObject *,
979 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000980
981/* Long division with remainder, top-level routine */
982
Guido van Rossume32e0141992-01-19 16:31:05 +0000983static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000984long_divrem(PyLongObject *a, PyLongObject *b,
985 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000986{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000987 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000988 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000989
990 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000991 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000992 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +0000993 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000994 }
995 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000996 (size_a == size_b &&
997 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000998 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999 *pdiv = _PyLong_New(0);
1000 Py_INCREF(a);
1001 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001002 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001003 }
1004 if (size_b == 1) {
1005 digit rem = 0;
1006 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001007 if (z == NULL)
1008 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001010 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001011 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001012 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001013 if (z == NULL)
1014 return -1;
1015 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001016 /* Set the signs.
1017 The quotient z has the sign of a*b;
1018 the remainder r has the sign of a,
1019 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001020 if ((a->ob_size < 0) != (b->ob_size < 0))
1021 z->ob_size = -(z->ob_size);
1022 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1023 (*prem)->ob_size = -((*prem)->ob_size);
1024 *pdiv = z;
1025 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001026}
1027
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001028/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001029
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001030static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001031x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001032{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001033 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001034 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001035 PyLongObject *v = mul1(v1, d);
1036 PyLongObject *w = mul1(w1, d);
1037 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001038 int j, k;
1039
1040 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041 Py_XDECREF(v);
1042 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001043 return NULL;
1044 }
1045
1046 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001047 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001048 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001049
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001050 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001051 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001052
1053 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1054 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1055 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001056 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001057 int i;
1058
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001059 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001060 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001061 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001062 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001063 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001064 if (vj == w->ob_digit[size_w-1])
1065 q = MASK;
1066 else
1067 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1068 w->ob_digit[size_w-1];
1069
1070 while (w->ob_digit[size_w-2]*q >
1071 ((
1072 ((twodigits)vj << SHIFT)
1073 + v->ob_digit[j-1]
1074 - q*w->ob_digit[size_w-1]
1075 ) << SHIFT)
1076 + v->ob_digit[j-2])
1077 --q;
1078
1079 for (i = 0; i < size_w && i+k < size_v; ++i) {
1080 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001081 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001082 carry += v->ob_digit[i+k] - z
1083 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001084 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001085 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1086 carry, SHIFT);
1087 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001088 }
1089
1090 if (i+k < size_v) {
1091 carry += v->ob_digit[i+k];
1092 v->ob_digit[i+k] = 0;
1093 }
1094
1095 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001096 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001097 else {
1098 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001099 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001100 carry = 0;
1101 for (i = 0; i < size_w && i+k < size_v; ++i) {
1102 carry += v->ob_digit[i+k] + w->ob_digit[i];
1103 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001104 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1105 BASE_TWODIGITS_TYPE,
1106 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001107 }
1108 }
1109 } /* for j, k */
1110
Guido van Rossumc206c761995-01-10 15:23:19 +00001111 if (a == NULL)
1112 *prem = NULL;
1113 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001114 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001115 *prem = divrem1(v, d, &d);
1116 /* d receives the (unused) remainder */
1117 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001118 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001119 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001120 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001121 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001122 Py_DECREF(v);
1123 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001124 return a;
1125}
1126
1127/* Methods */
1128
1129static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001130long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001131{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001132 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001133}
1134
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001136long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001137{
Fred Drake121ee271999-12-23 15:41:28 +00001138 return long_format(v, 10, 1);
1139}
1140
1141static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001142long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001143{
1144 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001145}
1146
1147static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001148long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001149{
1150 int sign;
1151
Guido van Rossumc6913e71991-11-19 20:26:46 +00001152 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001153 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001154 sign = 0;
1155 else
1156 sign = a->ob_size - b->ob_size;
1157 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001158 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001159 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001160 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1161 ;
1162 if (i < 0)
1163 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001164 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001165 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001166 if (a->ob_size < 0)
1167 sign = -sign;
1168 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001169 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001170 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001171}
1172
Guido van Rossum9bfef441993-03-29 10:43:31 +00001173static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001174long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001175{
1176 long x;
1177 int i, sign;
1178
1179 /* This is designed so that Python ints and longs with the
1180 same value hash to the same value, otherwise comparisons
1181 of mapping keys will turn out weird */
1182 i = v->ob_size;
1183 sign = 1;
1184 x = 0;
1185 if (i < 0) {
1186 sign = -1;
1187 i = -(i);
1188 }
1189 while (--i >= 0) {
1190 /* Force a 32-bit circular shift */
1191 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1192 x += v->ob_digit[i];
1193 }
1194 x = x * sign;
1195 if (x == -1)
1196 x = -2;
1197 return x;
1198}
1199
1200
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001201/* Add the absolute values of two long integers. */
1202
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001204x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001205{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001206 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001207 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001208 int i;
1209 digit carry = 0;
1210
1211 /* Ensure a is the larger of the two: */
1212 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001213 { PyLongObject *temp = a; a = b; b = temp; }
1214 { int size_temp = size_a;
1215 size_a = size_b;
1216 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001217 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001218 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001219 if (z == NULL)
1220 return NULL;
1221 for (i = 0; i < size_b; ++i) {
1222 carry += a->ob_digit[i] + b->ob_digit[i];
1223 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001224 carry >>= SHIFT;
1225 }
1226 for (; i < size_a; ++i) {
1227 carry += a->ob_digit[i];
1228 z->ob_digit[i] = carry & MASK;
1229 carry >>= SHIFT;
1230 }
1231 z->ob_digit[i] = carry;
1232 return long_normalize(z);
1233}
1234
1235/* Subtract the absolute values of two integers. */
1236
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001237static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001238x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001239{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001240 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001241 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001242 int i;
1243 int sign = 1;
1244 digit borrow = 0;
1245
1246 /* Ensure a is the larger of the two: */
1247 if (size_a < size_b) {
1248 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001249 { PyLongObject *temp = a; a = b; b = temp; }
1250 { int size_temp = size_a;
1251 size_a = size_b;
1252 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001253 }
1254 else if (size_a == size_b) {
1255 /* Find highest digit where a and b differ: */
1256 i = size_a;
1257 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1258 ;
1259 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001260 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001261 if (a->ob_digit[i] < b->ob_digit[i]) {
1262 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001264 }
1265 size_a = size_b = i+1;
1266 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001267 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001268 if (z == NULL)
1269 return NULL;
1270 for (i = 0; i < size_b; ++i) {
1271 /* The following assumes unsigned arithmetic
1272 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001273 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001274 z->ob_digit[i] = borrow & MASK;
1275 borrow >>= SHIFT;
1276 borrow &= 1; /* Keep only one sign bit */
1277 }
1278 for (; i < size_a; ++i) {
1279 borrow = a->ob_digit[i] - borrow;
1280 z->ob_digit[i] = borrow & MASK;
1281 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001282 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001283 }
1284 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001285 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001286 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001287 return long_normalize(z);
1288}
1289
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001291long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001292{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001293 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001294
Neil Schemenauerba872e22001-01-04 01:46:03 +00001295 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1296
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001297 if (a->ob_size < 0) {
1298 if (b->ob_size < 0) {
1299 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001300 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001301 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001302 }
1303 else
1304 z = x_sub(b, a);
1305 }
1306 else {
1307 if (b->ob_size < 0)
1308 z = x_sub(a, b);
1309 else
1310 z = x_add(a, b);
1311 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001312 Py_DECREF(a);
1313 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001314 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001315}
1316
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001318long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001319{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001320 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001321
Neil Schemenauerba872e22001-01-04 01:46:03 +00001322 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1323
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001324 if (a->ob_size < 0) {
1325 if (b->ob_size < 0)
1326 z = x_sub(a, b);
1327 else
1328 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001329 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001330 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001331 }
1332 else {
1333 if (b->ob_size < 0)
1334 z = x_add(a, b);
1335 else
1336 z = x_sub(a, b);
1337 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001338 Py_DECREF(a);
1339 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001341}
1342
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001343static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001344long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001345{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001346 /* sequence * long */
1347 long n = PyLong_AsLong((PyObject *) w);
1348 if (n == -1 && PyErr_Occurred())
1349 return NULL;
1350 else
1351 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1352}
1353
1354static PyObject *
1355long_mul(PyLongObject *v, PyLongObject *w)
1356{
1357 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001358 int size_a;
1359 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001360 int i;
1361
Neil Schemenauerba872e22001-01-04 01:46:03 +00001362 if (v->ob_type->tp_as_sequence &&
1363 v->ob_type->tp_as_sequence->sq_repeat) {
1364 return long_repeat((PyObject *)v, w);
1365 }
1366 else if (w->ob_type->tp_as_sequence &&
1367 w->ob_type->tp_as_sequence->sq_repeat) {
1368 return long_repeat((PyObject *)w, v);
1369 }
1370
1371 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1372
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001373 size_a = ABS(a->ob_size);
1374 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001375 if (size_a > size_b) {
1376 /* we are faster with the small object on the left */
1377 int hold_sa = size_a;
1378 PyLongObject *hold_a = a;
1379 size_a = size_b;
1380 size_b = hold_sa;
1381 a = b;
1382 b = hold_a;
1383 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001384 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001385 if (z == NULL) {
1386 Py_DECREF(a);
1387 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001388 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001389 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001390 for (i = 0; i < z->ob_size; ++i)
1391 z->ob_digit[i] = 0;
1392 for (i = 0; i < size_a; ++i) {
1393 twodigits carry = 0;
1394 twodigits f = a->ob_digit[i];
1395 int j;
1396
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001397 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001398 Py_DECREF(a);
1399 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001401 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001402 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001403 for (j = 0; j < size_b; ++j) {
1404 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001405 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001406 carry >>= SHIFT;
1407 }
1408 for (; carry != 0; ++j) {
1409 assert(i+j < z->ob_size);
1410 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001411 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001412 carry >>= SHIFT;
1413 }
1414 }
1415 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001416 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001417 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001418 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001419 Py_DECREF(a);
1420 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001421 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001422}
1423
Guido van Rossume32e0141992-01-19 16:31:05 +00001424/* The / and % operators are now defined in terms of divmod().
1425 The expression a mod b has the value a - b*floor(a/b).
1426 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001427 |a| by |b|, with the sign of a. This is also expressed
1428 as a - b*trunc(a/b), if trunc truncates towards zero.
1429 Some examples:
1430 a b a rem b a mod b
1431 13 10 3 3
1432 -13 10 -3 7
1433 13 -10 3 -7
1434 -13 -10 -3 -3
1435 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001436 have different signs. We then subtract one from the 'div'
1437 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001438
Guido van Rossume32e0141992-01-19 16:31:05 +00001439static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001440l_divmod(PyLongObject *v, PyLongObject *w,
1441 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001442{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001444
1445 if (long_divrem(v, w, &div, &mod) < 0)
1446 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001447 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1448 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001449 PyLongObject *temp;
1450 PyLongObject *one;
1451 temp = (PyLongObject *) long_add(mod, w);
1452 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001453 mod = temp;
1454 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001456 return -1;
1457 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001459 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001460 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1461 Py_DECREF(mod);
1462 Py_DECREF(div);
1463 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001464 return -1;
1465 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466 Py_DECREF(one);
1467 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001468 div = temp;
1469 }
1470 *pdiv = div;
1471 *pmod = mod;
1472 return 0;
1473}
1474
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001475static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001476long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001477{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001478 PyLongObject *a, *b, *div, *mod;
1479
1480 CONVERT_BINOP(v, w, &a, &b);
1481
1482 if (l_divmod(a, b, &div, &mod) < 0) {
1483 Py_DECREF(a);
1484 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001485 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001486 }
1487 Py_DECREF(a);
1488 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001489 Py_DECREF(mod);
1490 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001491}
1492
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001493static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001494long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001495{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001496 PyLongObject *a, *b, *div, *mod;
1497
1498 CONVERT_BINOP(v, w, &a, &b);
1499
1500 if (l_divmod(a, b, &div, &mod) < 0) {
1501 Py_DECREF(a);
1502 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001503 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001504 }
1505 Py_DECREF(a);
1506 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001507 Py_DECREF(div);
1508 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001509}
1510
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001511static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001512long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001513{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001514 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001515 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001516
1517 CONVERT_BINOP(v, w, &a, &b);
1518
1519 if (l_divmod(a, b, &div, &mod) < 0) {
1520 Py_DECREF(a);
1521 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001522 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001523 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001524 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001525 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001526 PyTuple_SetItem(z, 0, (PyObject *) div);
1527 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001528 }
1529 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001530 Py_DECREF(div);
1531 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001532 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001533 Py_DECREF(a);
1534 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001535 return z;
1536}
1537
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001538static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001539long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001540{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001541 PyLongObject *a, *b;
1542 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001544 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001545
1546 CONVERT_BINOP(v, w, &a, &b);
1547 if (PyLong_Check(x) || Py_None == x) {
1548 c = x;
1549 Py_INCREF(x);
1550 }
1551 else if (PyInt_Check(x)) {
1552 c = PyLong_FromLong(PyInt_AS_LONG(x));
1553 }
1554 else {
1555 Py_DECREF(a);
1556 Py_DECREF(b);
1557 Py_INCREF(Py_NotImplemented);
1558 return Py_NotImplemented;
1559 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001560
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001561 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001562 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001563 /* Return a float. This works because we know that
1564 this calls float_pow() which converts its
1565 arguments to double. */
1566 Py_DECREF(a);
1567 Py_DECREF(b);
1568 Py_DECREF(c);
1569 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001570 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001571 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001572 for (i = 0; i < size_b; ++i) {
1573 digit bi = b->ob_digit[i];
1574 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001575
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001576 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001577 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001578
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001579 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001580 temp = (PyLongObject *)long_mul(z, a);
1581 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001582 if (c!=Py_None && temp!=NULL) {
1583 if (l_divmod(temp,(PyLongObject *)c,
1584 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001585 Py_DECREF(temp);
1586 z = NULL;
1587 goto error;
1588 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001589 Py_XDECREF(div);
1590 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001591 temp = mod;
1592 }
1593 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001594 if (z == NULL)
1595 break;
1596 }
1597 bi >>= 1;
1598 if (bi == 0 && i+1 == size_b)
1599 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001600 temp = (PyLongObject *)long_mul(a, a);
1601 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001602 if (c!=Py_None && temp!=NULL) {
1603 if (l_divmod(temp, (PyLongObject *)c, &div,
1604 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001605 Py_DECREF(temp);
1606 z = NULL;
1607 goto error;
1608 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001609 Py_XDECREF(div);
1610 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001611 temp = mod;
1612 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001613 a = temp;
1614 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001615 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001616 z = NULL;
1617 break;
1618 }
1619 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001620 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001621 break;
1622 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001623 if (c!=Py_None && z!=NULL) {
1624 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001625 Py_DECREF(z);
1626 z = NULL;
1627 }
1628 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001629 Py_XDECREF(div);
1630 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001631 z = mod;
1632 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001633 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001634 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001635 Py_XDECREF(a);
1636 Py_DECREF(b);
1637 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001638 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001639}
1640
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001641static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001642long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001643{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001644 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001645 PyLongObject *x;
1646 PyLongObject *w;
1647 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001648 if (w == NULL)
1649 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001650 x = (PyLongObject *) long_add(v, w);
1651 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001652 if (x == NULL)
1653 return NULL;
1654 if (x->ob_size != 0)
1655 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001656 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001657}
1658
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001660long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001661{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001662 Py_INCREF(v);
1663 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001664}
1665
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001666static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001667long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001668{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001669 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001670 int i, n;
1671 n = ABS(v->ob_size);
1672 if (n == 0) {
1673 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001674 Py_INCREF(v);
1675 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001676 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001677 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001678 if (z == NULL)
1679 return NULL;
1680 for (i = 0; i < n; i++)
1681 z->ob_digit[i] = v->ob_digit[i];
1682 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001683 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001684}
1685
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001686static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001687long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001688{
1689 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001690 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001691 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001692 Py_INCREF(v);
1693 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001694 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001695}
1696
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001697static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001698long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001699{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001700 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001701}
1702
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001703static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001704long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001705{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001706 PyLongObject *a, *b;
1707 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001708 long shiftby;
1709 int newsize, wordshift, loshift, hishift, i, j;
1710 digit lomask, himask;
1711
Neil Schemenauerba872e22001-01-04 01:46:03 +00001712 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1713
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001714 if (a->ob_size < 0) {
1715 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001716 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001717 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001718 if (a1 == NULL)
1719 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001720 a2 = (PyLongObject *) long_rshift(a1, b);
1721 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001722 if (a2 == NULL)
1723 goto rshift_error;
1724 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001725 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001726 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001727 else {
1728
1729 shiftby = PyLong_AsLong((PyObject *)b);
1730 if (shiftby == -1L && PyErr_Occurred())
1731 goto rshift_error;
1732 if (shiftby < 0) {
1733 PyErr_SetString(PyExc_ValueError,
1734 "negative shift count");
1735 goto rshift_error;
1736 }
1737 wordshift = shiftby / SHIFT;
1738 newsize = ABS(a->ob_size) - wordshift;
1739 if (newsize <= 0) {
1740 z = _PyLong_New(0);
1741 Py_DECREF(a);
1742 Py_DECREF(b);
1743 return (PyObject *)z;
1744 }
1745 loshift = shiftby % SHIFT;
1746 hishift = SHIFT - loshift;
1747 lomask = ((digit)1 << hishift) - 1;
1748 himask = MASK ^ lomask;
1749 z = _PyLong_New(newsize);
1750 if (z == NULL)
1751 goto rshift_error;
1752 if (a->ob_size < 0)
1753 z->ob_size = -(z->ob_size);
1754 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1755 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1756 if (i+1 < newsize)
1757 z->ob_digit[i] |=
1758 (a->ob_digit[j+1] << hishift) & himask;
1759 }
1760 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001761 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001762rshift_error:
1763 Py_DECREF(a);
1764 Py_DECREF(b);
1765 return (PyObject *) z;
1766
Guido van Rossumc6913e71991-11-19 20:26:46 +00001767}
1768
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001769static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001770long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001771{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001772 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001773 PyLongObject *a, *b;
1774 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001775 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001776 int oldsize, newsize, wordshift, remshift, i, j;
1777 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001778
Neil Schemenauerba872e22001-01-04 01:46:03 +00001779 CONVERT_BINOP(v, w, &a, &b);
1780
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001781 shiftby = PyLong_AsLong((PyObject *)b);
1782 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001783 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001784 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001785 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001786 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001787 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001788 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001789 PyErr_SetString(PyExc_ValueError,
1790 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001791 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001792 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001793 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1794 wordshift = (int)shiftby / SHIFT;
1795 remshift = (int)shiftby - wordshift * SHIFT;
1796
1797 oldsize = ABS(a->ob_size);
1798 newsize = oldsize + wordshift;
1799 if (remshift)
1800 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001801 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001802 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001803 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001804 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001805 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001806 for (i = 0; i < wordshift; i++)
1807 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001808 accum = 0;
1809 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1810 accum |= a->ob_digit[j] << remshift;
1811 z->ob_digit[i] = (digit)(accum & MASK);
1812 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001813 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001814 if (remshift)
1815 z->ob_digit[newsize-1] = (digit)accum;
1816 else
1817 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001818 z = long_normalize(z);
1819lshift_error:
1820 Py_DECREF(a);
1821 Py_DECREF(b);
1822 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001823}
1824
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001825
1826/* Bitwise and/xor/or operations */
1827
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001828#define MAX(x, y) ((x) < (y) ? (y) : (x))
1829#define MIN(x, y) ((x) > (y) ? (y) : (x))
1830
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001831static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001832long_bitwise(PyLongObject *a,
1833 int op, /* '&', '|', '^' */
1834 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001835{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001836 digit maska, maskb; /* 0 or MASK */
1837 int negz;
1838 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001839 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001840 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001841 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001842 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001843
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001844 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001845 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001846 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001847 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001848 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001849 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001850 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001851 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001852 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001853 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001854 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001855 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001856 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001857 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001858 maskb = 0;
1859 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001860
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001861 negz = 0;
1862 switch (op) {
1863 case '^':
1864 if (maska != maskb) {
1865 maska ^= MASK;
1866 negz = -1;
1867 }
1868 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001869 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001870 if (maska && maskb) {
1871 op = '|';
1872 maska ^= MASK;
1873 maskb ^= MASK;
1874 negz = -1;
1875 }
1876 break;
1877 case '|':
1878 if (maska || maskb) {
1879 op = '&';
1880 maska ^= MASK;
1881 maskb ^= MASK;
1882 negz = -1;
1883 }
1884 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001885 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001886
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001887 /* JRH: The original logic here was to allocate the result value (z)
1888 as the longer of the two operands. However, there are some cases
1889 where the result is guaranteed to be shorter than that: AND of two
1890 positives, OR of two negatives: use the shorter number. AND with
1891 mixed signs: use the positive number. OR with mixed signs: use the
1892 negative number. After the transformations above, op will be '&'
1893 iff one of these cases applies, and mask will be non-0 for operands
1894 whose length should be ignored.
1895 */
1896
1897 size_a = a->ob_size;
1898 size_b = b->ob_size;
1899 size_z = op == '&'
1900 ? (maska
1901 ? size_b
1902 : (maskb ? size_a : MIN(size_a, size_b)))
1903 : MAX(size_a, size_b);
1904 z = _PyLong_New(size_z);
1905 if (a == NULL || b == NULL || z == NULL) {
1906 Py_XDECREF(a);
1907 Py_XDECREF(b);
1908 Py_XDECREF(z);
1909 return NULL;
1910 }
1911
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001912 for (i = 0; i < size_z; ++i) {
1913 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1914 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1915 switch (op) {
1916 case '&': z->ob_digit[i] = diga & digb; break;
1917 case '|': z->ob_digit[i] = diga | digb; break;
1918 case '^': z->ob_digit[i] = diga ^ digb; break;
1919 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001920 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001921
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001922 Py_DECREF(a);
1923 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001924 z = long_normalize(z);
1925 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001926 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001927 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001928 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001929 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001930}
1931
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001932static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001933long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001934{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001935 PyLongObject *a, *b;
1936 PyObject *c;
1937 CONVERT_BINOP(v, w, &a, &b);
1938 c = long_bitwise(a, '&', b);
1939 Py_DECREF(a);
1940 Py_DECREF(b);
1941 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001942}
1943
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001944static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001945long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001946{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001947 PyLongObject *a, *b;
1948 PyObject *c;
1949 CONVERT_BINOP(v, w, &a, &b);
1950 c = long_bitwise(a, '^', b);
1951 Py_DECREF(a);
1952 Py_DECREF(b);
1953 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001954}
1955
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001956static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001957long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001958{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001959 PyLongObject *a, *b;
1960 PyObject *c;
1961 CONVERT_BINOP(v, w, &a, &b);
1962 c = long_bitwise(a, '|', b);
1963 Py_DECREF(a);
1964 Py_DECREF(b);
1965 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001966}
1967
Guido van Rossum234f9421993-06-17 12:35:49 +00001968static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001969long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001970{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001971 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001972 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001973 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001974 return 0;
1975 }
1976 return 1; /* Can't do it */
1977}
1978
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001979static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001980long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001981{
1982 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001983 x = PyLong_AsLong(v);
1984 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001985 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001986 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001987}
1988
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001989static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001990long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001991{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001992 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001993 return v;
1994}
1995
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001996static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001997long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001998{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001999 double result;
2000 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002001 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00002002 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002003 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002004}
2005
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002006static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002007long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002008{
Fred Drake121ee271999-12-23 15:41:28 +00002009 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002010}
2011
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002012static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002013long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002014{
Fred Drake121ee271999-12-23 15:41:28 +00002015 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002016}
2017
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002018static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002019 (binaryfunc) long_add, /*nb_add*/
2020 (binaryfunc) long_sub, /*nb_subtract*/
2021 (binaryfunc) long_mul, /*nb_multiply*/
2022 (binaryfunc) long_div, /*nb_divide*/
2023 (binaryfunc) long_mod, /*nb_remainder*/
2024 (binaryfunc) long_divmod, /*nb_divmod*/
2025 (ternaryfunc) long_pow, /*nb_power*/
2026 (unaryfunc) long_neg, /*nb_negative*/
2027 (unaryfunc) long_pos, /*tp_positive*/
2028 (unaryfunc) long_abs, /*tp_absolute*/
2029 (inquiry) long_nonzero, /*tp_nonzero*/
2030 (unaryfunc) long_invert, /*nb_invert*/
2031 (binaryfunc) long_lshift, /*nb_lshift*/
2032 (binaryfunc) long_rshift, /*nb_rshift*/
2033 (binaryfunc) long_and, /*nb_and*/
2034 (binaryfunc) long_xor, /*nb_xor*/
2035 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002036 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002037 (unaryfunc) long_int, /*nb_int*/
2038 (unaryfunc) long_long, /*nb_long*/
2039 (unaryfunc) long_float, /*nb_float*/
2040 (unaryfunc) long_oct, /*nb_oct*/
2041 (unaryfunc) long_hex, /*nb_hex*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00002042 0, /*nb_inplace_add*/
2043 0, /*nb_inplace_subtract*/
2044 0, /*nb_inplace_multiply*/
2045 0, /*nb_inplace_divide*/
2046 0, /*nb_inplace_remainder*/
2047 0, /*nb_inplace_power*/
2048 0, /*nb_inplace_lshift*/
2049 0, /*nb_inplace_rshift*/
2050 0, /*nb_inplace_and*/
2051 0, /*nb_inplace_xor*/
2052 0, /*nb_inplace_or*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002053};
2054
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002055PyTypeObject PyLong_Type = {
2056 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002057 0,
2058 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002059 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002060 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00002061 (destructor)long_dealloc, /*tp_dealloc*/
2062 0, /*tp_print*/
2063 0, /*tp_getattr*/
2064 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002065 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002066 (reprfunc)long_repr, /*tp_repr*/
2067 &long_as_number, /*tp_as_number*/
2068 0, /*tp_as_sequence*/
2069 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002070 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002071 0, /*tp_call*/
2072 (reprfunc)long_str, /*tp_str*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00002073 0, /*tp_getattro*/
2074 0, /*tp_setattro*/
2075 0, /*tp_as_buffer*/
Guido van Rossum6fd867b2001-01-17 15:33:18 +00002076 Py_TPFLAGS_CHECKTYPES /*tp_flags*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002077};