blob: b9cc9242ec2c5de1baa65c3b4ee5baf8d15a93cf [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 Petersc8a6b9b2001-07-14 11:01:28 +0000843 assert(ntostore > 0);
844 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000845 digit nextrem = (digit)(rem / base);
846 char c = (char)(rem - nextrem * base);
847 assert(p > PyString_AS_STRING(str));
848 c += (c < 10) ? '0' : 'A'-10;
849 *--p = c;
850 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000851 --ntostore;
852 /* Termination is a bit delicate: must not
853 store leading zeroes, so must get out if
854 a and rem are both 0 now. */
855 } while (ntostore && (a->ob_size || rem));
856 } while (a->ob_size != 0);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000857 Py_DECREF(a);
858 }
859
Guido van Rossum2c475421992-08-14 15:13:07 +0000860 if (base == 8) {
861 if (size_a != 0)
862 *--p = '0';
863 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000864 else if (base == 16) {
865 *--p = 'x';
866 *--p = '0';
867 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000868 else if (base != 10) {
869 *--p = '#';
870 *--p = '0' + base%10;
871 if (base > 10)
872 *--p = '0' + base/10;
873 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000874 if (sign)
875 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 if (p != PyString_AS_STRING(str)) {
877 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000878 assert(p > q);
879 do {
880 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000881 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882 _PyString_Resize((PyObject **)&str,
883 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000884 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000886}
887
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000889PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000890{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000891 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000892 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000894
Guido van Rossum472c04f1996-12-05 21:57:21 +0000895 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000897 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000898 return NULL;
899 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000900 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000901 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000902 if (*str == '+')
903 ++str;
904 else if (*str == '-') {
905 ++str;
906 sign = -1;
907 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000908 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000909 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000910 if (base == 0) {
911 if (str[0] != '0')
912 base = 10;
913 else if (str[1] == 'x' || str[1] == 'X')
914 base = 16;
915 else
916 base = 8;
917 }
918 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
919 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000920 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000921 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000922 for ( ; z != NULL; ++str) {
923 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000924 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000925
926 if (*str <= '9')
927 k = *str - '0';
928 else if (*str >= 'a')
929 k = *str - 'a' + 10;
930 else if (*str >= 'A')
931 k = *str - 'A' + 10;
932 if (k < 0 || k >= base)
933 break;
934 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000936 z = temp;
937 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000938 if (z == NULL)
939 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000940 if (str == start)
941 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000942 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000943 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000944 if (*str == 'L' || *str == 'l')
945 str++;
946 while (*str && isspace(Py_CHARMASK(*str)))
947 str++;
948 if (*str != '\0')
949 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000950 if (pend)
951 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000953
954 onError:
955 PyErr_Format(PyExc_ValueError,
956 "invalid literal for long(): %.200s", orig_str);
957 Py_XDECREF(z);
958 return NULL;
959}
960
961PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000962PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000963{
964 char buffer[256];
965
966 if (length >= sizeof(buffer)) {
967 PyErr_SetString(PyExc_ValueError,
968 "long() literal too large to convert");
969 return NULL;
970 }
971 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
972 return NULL;
973
974 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000975}
976
Tim Peters9f688bf2000-07-07 15:53:28 +0000977/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +0000979 (PyLongObject *, PyLongObject *, PyLongObject **);
980static PyObject *long_pos(PyLongObject *);
981static int long_divrem(PyLongObject *, PyLongObject *,
982 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000983
984/* Long division with remainder, top-level routine */
985
Guido van Rossume32e0141992-01-19 16:31:05 +0000986static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000987long_divrem(PyLongObject *a, PyLongObject *b,
988 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000989{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000990 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000992
993 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000994 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000995 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +0000996 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000997 }
998 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000999 (size_a == size_b &&
1000 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001001 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 *pdiv = _PyLong_New(0);
1003 Py_INCREF(a);
1004 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001005 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001006 }
1007 if (size_b == 1) {
1008 digit rem = 0;
1009 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001010 if (z == NULL)
1011 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001012 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001013 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001014 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001015 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001016 if (z == NULL)
1017 return -1;
1018 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001019 /* Set the signs.
1020 The quotient z has the sign of a*b;
1021 the remainder r has the sign of a,
1022 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001023 if ((a->ob_size < 0) != (b->ob_size < 0))
1024 z->ob_size = -(z->ob_size);
1025 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1026 (*prem)->ob_size = -((*prem)->ob_size);
1027 *pdiv = z;
1028 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001029}
1030
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001031/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001032
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001034x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001035{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001036 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001037 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 PyLongObject *v = mul1(v1, d);
1039 PyLongObject *w = mul1(w1, d);
1040 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001041 int j, k;
1042
1043 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001044 Py_XDECREF(v);
1045 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001046 return NULL;
1047 }
1048
1049 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001050 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001051 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001052
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001053 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001054 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001055
1056 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1057 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1058 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001059 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001060 int i;
1061
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001062 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001063 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001064 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001065 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001066 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001067 if (vj == w->ob_digit[size_w-1])
1068 q = MASK;
1069 else
1070 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1071 w->ob_digit[size_w-1];
1072
1073 while (w->ob_digit[size_w-2]*q >
1074 ((
1075 ((twodigits)vj << SHIFT)
1076 + v->ob_digit[j-1]
1077 - q*w->ob_digit[size_w-1]
1078 ) << SHIFT)
1079 + v->ob_digit[j-2])
1080 --q;
1081
1082 for (i = 0; i < size_w && i+k < size_v; ++i) {
1083 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001084 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085 carry += v->ob_digit[i+k] - z
1086 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001087 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001088 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1089 carry, SHIFT);
1090 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001091 }
1092
1093 if (i+k < size_v) {
1094 carry += v->ob_digit[i+k];
1095 v->ob_digit[i+k] = 0;
1096 }
1097
1098 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001099 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001100 else {
1101 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001102 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001103 carry = 0;
1104 for (i = 0; i < size_w && i+k < size_v; ++i) {
1105 carry += v->ob_digit[i+k] + w->ob_digit[i];
1106 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001107 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1108 BASE_TWODIGITS_TYPE,
1109 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001110 }
1111 }
1112 } /* for j, k */
1113
Guido van Rossumc206c761995-01-10 15:23:19 +00001114 if (a == NULL)
1115 *prem = NULL;
1116 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001117 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001118 *prem = divrem1(v, d, &d);
1119 /* d receives the (unused) remainder */
1120 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001122 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001123 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001124 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001125 Py_DECREF(v);
1126 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001127 return a;
1128}
1129
1130/* Methods */
1131
1132static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001133long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001134{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001135 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001136}
1137
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001138static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001139long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001140{
Fred Drake121ee271999-12-23 15:41:28 +00001141 return long_format(v, 10, 1);
1142}
1143
1144static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001145long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001146{
1147 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001148}
1149
1150static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001151long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001152{
1153 int sign;
1154
Guido van Rossumc6913e71991-11-19 20:26:46 +00001155 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001156 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001157 sign = 0;
1158 else
1159 sign = a->ob_size - b->ob_size;
1160 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001161 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001162 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001163 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1164 ;
1165 if (i < 0)
1166 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001167 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001168 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001169 if (a->ob_size < 0)
1170 sign = -sign;
1171 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001172 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001173 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001174}
1175
Guido van Rossum9bfef441993-03-29 10:43:31 +00001176static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001177long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001178{
1179 long x;
1180 int i, sign;
1181
1182 /* This is designed so that Python ints and longs with the
1183 same value hash to the same value, otherwise comparisons
1184 of mapping keys will turn out weird */
1185 i = v->ob_size;
1186 sign = 1;
1187 x = 0;
1188 if (i < 0) {
1189 sign = -1;
1190 i = -(i);
1191 }
1192 while (--i >= 0) {
1193 /* Force a 32-bit circular shift */
1194 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1195 x += v->ob_digit[i];
1196 }
1197 x = x * sign;
1198 if (x == -1)
1199 x = -2;
1200 return x;
1201}
1202
1203
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001204/* Add the absolute values of two long integers. */
1205
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001206static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001207x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001208{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001209 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001211 int i;
1212 digit carry = 0;
1213
1214 /* Ensure a is the larger of the two: */
1215 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 { PyLongObject *temp = a; a = b; b = temp; }
1217 { int size_temp = size_a;
1218 size_a = size_b;
1219 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001220 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001222 if (z == NULL)
1223 return NULL;
1224 for (i = 0; i < size_b; ++i) {
1225 carry += a->ob_digit[i] + b->ob_digit[i];
1226 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001227 carry >>= SHIFT;
1228 }
1229 for (; i < size_a; ++i) {
1230 carry += a->ob_digit[i];
1231 z->ob_digit[i] = carry & MASK;
1232 carry >>= SHIFT;
1233 }
1234 z->ob_digit[i] = carry;
1235 return long_normalize(z);
1236}
1237
1238/* Subtract the absolute values of two integers. */
1239
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001240static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001241x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001242{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001243 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001244 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001245 int i;
1246 int sign = 1;
1247 digit borrow = 0;
1248
1249 /* Ensure a is the larger of the two: */
1250 if (size_a < size_b) {
1251 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001252 { PyLongObject *temp = a; a = b; b = temp; }
1253 { int size_temp = size_a;
1254 size_a = size_b;
1255 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001256 }
1257 else if (size_a == size_b) {
1258 /* Find highest digit where a and b differ: */
1259 i = size_a;
1260 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1261 ;
1262 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001264 if (a->ob_digit[i] < b->ob_digit[i]) {
1265 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001266 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001267 }
1268 size_a = size_b = i+1;
1269 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001270 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001271 if (z == NULL)
1272 return NULL;
1273 for (i = 0; i < size_b; ++i) {
1274 /* The following assumes unsigned arithmetic
1275 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001276 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001277 z->ob_digit[i] = borrow & MASK;
1278 borrow >>= SHIFT;
1279 borrow &= 1; /* Keep only one sign bit */
1280 }
1281 for (; i < size_a; ++i) {
1282 borrow = a->ob_digit[i] - borrow;
1283 z->ob_digit[i] = borrow & MASK;
1284 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001285 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001286 }
1287 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001288 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001289 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001290 return long_normalize(z);
1291}
1292
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001293static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001294long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001295{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001296 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001297
Neil Schemenauerba872e22001-01-04 01:46:03 +00001298 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1299
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001300 if (a->ob_size < 0) {
1301 if (b->ob_size < 0) {
1302 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001303 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001304 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001305 }
1306 else
1307 z = x_sub(b, a);
1308 }
1309 else {
1310 if (b->ob_size < 0)
1311 z = x_sub(a, b);
1312 else
1313 z = x_add(a, b);
1314 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001315 Py_DECREF(a);
1316 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001318}
1319
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001320static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001321long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001322{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001323 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001324
Neil Schemenauerba872e22001-01-04 01:46:03 +00001325 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1326
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001327 if (a->ob_size < 0) {
1328 if (b->ob_size < 0)
1329 z = x_sub(a, b);
1330 else
1331 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001332 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001333 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001334 }
1335 else {
1336 if (b->ob_size < 0)
1337 z = x_add(a, b);
1338 else
1339 z = x_sub(a, b);
1340 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001341 Py_DECREF(a);
1342 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001343 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001344}
1345
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001347long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001348{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001349 /* sequence * long */
1350 long n = PyLong_AsLong((PyObject *) w);
1351 if (n == -1 && PyErr_Occurred())
1352 return NULL;
1353 else
1354 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1355}
1356
1357static PyObject *
1358long_mul(PyLongObject *v, PyLongObject *w)
1359{
1360 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001361 int size_a;
1362 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001363 int i;
1364
Neil Schemenauerba872e22001-01-04 01:46:03 +00001365 if (v->ob_type->tp_as_sequence &&
1366 v->ob_type->tp_as_sequence->sq_repeat) {
1367 return long_repeat((PyObject *)v, w);
1368 }
1369 else if (w->ob_type->tp_as_sequence &&
1370 w->ob_type->tp_as_sequence->sq_repeat) {
1371 return long_repeat((PyObject *)w, v);
1372 }
1373
1374 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1375
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001376 size_a = ABS(a->ob_size);
1377 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001378 if (size_a > size_b) {
1379 /* we are faster with the small object on the left */
1380 int hold_sa = size_a;
1381 PyLongObject *hold_a = a;
1382 size_a = size_b;
1383 size_b = hold_sa;
1384 a = b;
1385 b = hold_a;
1386 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001388 if (z == NULL) {
1389 Py_DECREF(a);
1390 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001391 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001392 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001393 for (i = 0; i < z->ob_size; ++i)
1394 z->ob_digit[i] = 0;
1395 for (i = 0; i < size_a; ++i) {
1396 twodigits carry = 0;
1397 twodigits f = a->ob_digit[i];
1398 int j;
1399
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001400 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001401 Py_DECREF(a);
1402 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001403 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001404 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001405 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001406 for (j = 0; j < size_b; ++j) {
1407 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001408 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001409 carry >>= SHIFT;
1410 }
1411 for (; carry != 0; ++j) {
1412 assert(i+j < z->ob_size);
1413 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001414 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001415 carry >>= SHIFT;
1416 }
1417 }
1418 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001419 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001420 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001421 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001422 Py_DECREF(a);
1423 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001424 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001425}
1426
Guido van Rossume32e0141992-01-19 16:31:05 +00001427/* The / and % operators are now defined in terms of divmod().
1428 The expression a mod b has the value a - b*floor(a/b).
1429 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001430 |a| by |b|, with the sign of a. This is also expressed
1431 as a - b*trunc(a/b), if trunc truncates towards zero.
1432 Some examples:
1433 a b a rem b a mod b
1434 13 10 3 3
1435 -13 10 -3 7
1436 13 -10 3 -7
1437 -13 -10 -3 -3
1438 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001439 have different signs. We then subtract one from the 'div'
1440 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001441
Guido van Rossume32e0141992-01-19 16:31:05 +00001442static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001443l_divmod(PyLongObject *v, PyLongObject *w,
1444 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001445{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001447
1448 if (long_divrem(v, w, &div, &mod) < 0)
1449 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001450 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1451 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452 PyLongObject *temp;
1453 PyLongObject *one;
1454 temp = (PyLongObject *) long_add(mod, w);
1455 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001456 mod = temp;
1457 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001459 return -1;
1460 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001462 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001463 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1464 Py_DECREF(mod);
1465 Py_DECREF(div);
1466 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001467 return -1;
1468 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001469 Py_DECREF(one);
1470 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001471 div = temp;
1472 }
1473 *pdiv = div;
1474 *pmod = mod;
1475 return 0;
1476}
1477
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001478static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001479long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001480{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001481 PyLongObject *a, *b, *div, *mod;
1482
1483 CONVERT_BINOP(v, w, &a, &b);
1484
1485 if (l_divmod(a, b, &div, &mod) < 0) {
1486 Py_DECREF(a);
1487 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001488 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001489 }
1490 Py_DECREF(a);
1491 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001492 Py_DECREF(mod);
1493 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001494}
1495
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001496static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001497long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001498{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001499 PyLongObject *a, *b, *div, *mod;
1500
1501 CONVERT_BINOP(v, w, &a, &b);
1502
1503 if (l_divmod(a, b, &div, &mod) < 0) {
1504 Py_DECREF(a);
1505 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001506 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001507 }
1508 Py_DECREF(a);
1509 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001510 Py_DECREF(div);
1511 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001512}
1513
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001514static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001515long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001516{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001517 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001518 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001519
1520 CONVERT_BINOP(v, w, &a, &b);
1521
1522 if (l_divmod(a, b, &div, &mod) < 0) {
1523 Py_DECREF(a);
1524 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001525 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001526 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001527 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001528 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001529 PyTuple_SetItem(z, 0, (PyObject *) div);
1530 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001531 }
1532 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001533 Py_DECREF(div);
1534 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001535 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001536 Py_DECREF(a);
1537 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001538 return z;
1539}
1540
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001541static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001542long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001543{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001544 PyLongObject *a, *b;
1545 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001546 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001547 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001548
1549 CONVERT_BINOP(v, w, &a, &b);
1550 if (PyLong_Check(x) || Py_None == x) {
1551 c = x;
1552 Py_INCREF(x);
1553 }
1554 else if (PyInt_Check(x)) {
1555 c = PyLong_FromLong(PyInt_AS_LONG(x));
1556 }
1557 else {
1558 Py_DECREF(a);
1559 Py_DECREF(b);
1560 Py_INCREF(Py_NotImplemented);
1561 return Py_NotImplemented;
1562 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001563
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001564 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001565 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001566 /* Return a float. This works because we know that
1567 this calls float_pow() which converts its
1568 arguments to double. */
1569 Py_DECREF(a);
1570 Py_DECREF(b);
1571 Py_DECREF(c);
1572 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001573 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001575 for (i = 0; i < size_b; ++i) {
1576 digit bi = b->ob_digit[i];
1577 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001578
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001579 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001580 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001581
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001582 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001583 temp = (PyLongObject *)long_mul(z, a);
1584 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001585 if (c!=Py_None && temp!=NULL) {
1586 if (l_divmod(temp,(PyLongObject *)c,
1587 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001588 Py_DECREF(temp);
1589 z = NULL;
1590 goto error;
1591 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001592 Py_XDECREF(div);
1593 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001594 temp = mod;
1595 }
1596 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001597 if (z == NULL)
1598 break;
1599 }
1600 bi >>= 1;
1601 if (bi == 0 && i+1 == size_b)
1602 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001603 temp = (PyLongObject *)long_mul(a, a);
1604 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001605 if (c!=Py_None && temp!=NULL) {
1606 if (l_divmod(temp, (PyLongObject *)c, &div,
1607 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001608 Py_DECREF(temp);
1609 z = NULL;
1610 goto error;
1611 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001612 Py_XDECREF(div);
1613 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001614 temp = mod;
1615 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001616 a = temp;
1617 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001618 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001619 z = NULL;
1620 break;
1621 }
1622 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001623 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001624 break;
1625 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001626 if (c!=Py_None && z!=NULL) {
1627 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001628 Py_DECREF(z);
1629 z = NULL;
1630 }
1631 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001632 Py_XDECREF(div);
1633 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001634 z = mod;
1635 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001636 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001637 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001638 Py_XDECREF(a);
1639 Py_DECREF(b);
1640 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001641 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001642}
1643
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001644static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001645long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001646{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001647 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001648 PyLongObject *x;
1649 PyLongObject *w;
1650 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001651 if (w == NULL)
1652 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001653 x = (PyLongObject *) long_add(v, w);
1654 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001655 if (x == NULL)
1656 return NULL;
1657 if (x->ob_size != 0)
1658 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001660}
1661
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001662static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001663long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001664{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001665 Py_INCREF(v);
1666 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001667}
1668
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001669static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001670long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001671{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001672 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001673 int i, n;
1674 n = ABS(v->ob_size);
1675 if (n == 0) {
1676 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001677 Py_INCREF(v);
1678 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001679 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001680 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001681 if (z == NULL)
1682 return NULL;
1683 for (i = 0; i < n; i++)
1684 z->ob_digit[i] = v->ob_digit[i];
1685 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001686 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001687}
1688
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001689static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001690long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001691{
1692 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001693 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001694 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001695 Py_INCREF(v);
1696 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001697 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001698}
1699
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001700static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001701long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001702{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001703 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001704}
1705
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001706static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001707long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001708{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001709 PyLongObject *a, *b;
1710 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001711 long shiftby;
1712 int newsize, wordshift, loshift, hishift, i, j;
1713 digit lomask, himask;
1714
Neil Schemenauerba872e22001-01-04 01:46:03 +00001715 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1716
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001717 if (a->ob_size < 0) {
1718 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001719 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001720 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001721 if (a1 == NULL)
1722 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001723 a2 = (PyLongObject *) long_rshift(a1, b);
1724 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001725 if (a2 == NULL)
1726 goto rshift_error;
1727 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001728 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001729 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001730 else {
1731
1732 shiftby = PyLong_AsLong((PyObject *)b);
1733 if (shiftby == -1L && PyErr_Occurred())
1734 goto rshift_error;
1735 if (shiftby < 0) {
1736 PyErr_SetString(PyExc_ValueError,
1737 "negative shift count");
1738 goto rshift_error;
1739 }
1740 wordshift = shiftby / SHIFT;
1741 newsize = ABS(a->ob_size) - wordshift;
1742 if (newsize <= 0) {
1743 z = _PyLong_New(0);
1744 Py_DECREF(a);
1745 Py_DECREF(b);
1746 return (PyObject *)z;
1747 }
1748 loshift = shiftby % SHIFT;
1749 hishift = SHIFT - loshift;
1750 lomask = ((digit)1 << hishift) - 1;
1751 himask = MASK ^ lomask;
1752 z = _PyLong_New(newsize);
1753 if (z == NULL)
1754 goto rshift_error;
1755 if (a->ob_size < 0)
1756 z->ob_size = -(z->ob_size);
1757 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1758 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1759 if (i+1 < newsize)
1760 z->ob_digit[i] |=
1761 (a->ob_digit[j+1] << hishift) & himask;
1762 }
1763 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001764 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001765rshift_error:
1766 Py_DECREF(a);
1767 Py_DECREF(b);
1768 return (PyObject *) z;
1769
Guido van Rossumc6913e71991-11-19 20:26:46 +00001770}
1771
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001772static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001773long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001774{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001775 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001776 PyLongObject *a, *b;
1777 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001778 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001779 int oldsize, newsize, wordshift, remshift, i, j;
1780 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001781
Neil Schemenauerba872e22001-01-04 01:46:03 +00001782 CONVERT_BINOP(v, w, &a, &b);
1783
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001784 shiftby = PyLong_AsLong((PyObject *)b);
1785 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001786 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001787 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001788 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001789 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001790 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001791 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001792 PyErr_SetString(PyExc_ValueError,
1793 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001794 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001795 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001796 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1797 wordshift = (int)shiftby / SHIFT;
1798 remshift = (int)shiftby - wordshift * SHIFT;
1799
1800 oldsize = ABS(a->ob_size);
1801 newsize = oldsize + wordshift;
1802 if (remshift)
1803 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001804 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001805 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001806 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001807 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001808 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001809 for (i = 0; i < wordshift; i++)
1810 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001811 accum = 0;
1812 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1813 accum |= a->ob_digit[j] << remshift;
1814 z->ob_digit[i] = (digit)(accum & MASK);
1815 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001816 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001817 if (remshift)
1818 z->ob_digit[newsize-1] = (digit)accum;
1819 else
1820 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001821 z = long_normalize(z);
1822lshift_error:
1823 Py_DECREF(a);
1824 Py_DECREF(b);
1825 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001826}
1827
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001828
1829/* Bitwise and/xor/or operations */
1830
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001831#define MAX(x, y) ((x) < (y) ? (y) : (x))
1832#define MIN(x, y) ((x) > (y) ? (y) : (x))
1833
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001834static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001835long_bitwise(PyLongObject *a,
1836 int op, /* '&', '|', '^' */
1837 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001838{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001839 digit maska, maskb; /* 0 or MASK */
1840 int negz;
1841 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001842 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001843 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001844 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001845 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001846
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001847 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001848 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001849 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001850 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001851 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001852 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001853 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001854 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001855 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001856 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001857 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001858 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001859 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001860 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001861 maskb = 0;
1862 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001863
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001864 negz = 0;
1865 switch (op) {
1866 case '^':
1867 if (maska != maskb) {
1868 maska ^= MASK;
1869 negz = -1;
1870 }
1871 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001872 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001873 if (maska && maskb) {
1874 op = '|';
1875 maska ^= MASK;
1876 maskb ^= MASK;
1877 negz = -1;
1878 }
1879 break;
1880 case '|':
1881 if (maska || maskb) {
1882 op = '&';
1883 maska ^= MASK;
1884 maskb ^= MASK;
1885 negz = -1;
1886 }
1887 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001888 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001889
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001890 /* JRH: The original logic here was to allocate the result value (z)
1891 as the longer of the two operands. However, there are some cases
1892 where the result is guaranteed to be shorter than that: AND of two
1893 positives, OR of two negatives: use the shorter number. AND with
1894 mixed signs: use the positive number. OR with mixed signs: use the
1895 negative number. After the transformations above, op will be '&'
1896 iff one of these cases applies, and mask will be non-0 for operands
1897 whose length should be ignored.
1898 */
1899
1900 size_a = a->ob_size;
1901 size_b = b->ob_size;
1902 size_z = op == '&'
1903 ? (maska
1904 ? size_b
1905 : (maskb ? size_a : MIN(size_a, size_b)))
1906 : MAX(size_a, size_b);
1907 z = _PyLong_New(size_z);
1908 if (a == NULL || b == NULL || z == NULL) {
1909 Py_XDECREF(a);
1910 Py_XDECREF(b);
1911 Py_XDECREF(z);
1912 return NULL;
1913 }
1914
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001915 for (i = 0; i < size_z; ++i) {
1916 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1917 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1918 switch (op) {
1919 case '&': z->ob_digit[i] = diga & digb; break;
1920 case '|': z->ob_digit[i] = diga | digb; break;
1921 case '^': z->ob_digit[i] = diga ^ digb; break;
1922 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001923 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001924
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001925 Py_DECREF(a);
1926 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001927 z = long_normalize(z);
1928 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001929 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001930 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001931 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001932 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001933}
1934
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001935static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001936long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001937{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001938 PyLongObject *a, *b;
1939 PyObject *c;
1940 CONVERT_BINOP(v, w, &a, &b);
1941 c = long_bitwise(a, '&', b);
1942 Py_DECREF(a);
1943 Py_DECREF(b);
1944 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001945}
1946
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001947static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001948long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001949{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001950 PyLongObject *a, *b;
1951 PyObject *c;
1952 CONVERT_BINOP(v, w, &a, &b);
1953 c = long_bitwise(a, '^', b);
1954 Py_DECREF(a);
1955 Py_DECREF(b);
1956 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001957}
1958
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001959static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001960long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001961{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001962 PyLongObject *a, *b;
1963 PyObject *c;
1964 CONVERT_BINOP(v, w, &a, &b);
1965 c = long_bitwise(a, '|', b);
1966 Py_DECREF(a);
1967 Py_DECREF(b);
1968 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001969}
1970
Guido van Rossum234f9421993-06-17 12:35:49 +00001971static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001972long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001973{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001974 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001975 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001976 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001977 return 0;
1978 }
1979 return 1; /* Can't do it */
1980}
1981
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001982static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001983long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001984{
1985 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001986 x = PyLong_AsLong(v);
1987 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001988 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001989 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001990}
1991
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001992static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001993long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001994{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001995 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001996 return v;
1997}
1998
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001999static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002000long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002001{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002002 double result;
2003 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002004 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00002005 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002006 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002007}
2008
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002009static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002010long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002011{
Fred Drake121ee271999-12-23 15:41:28 +00002012 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002013}
2014
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002015static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002016long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002017{
Fred Drake121ee271999-12-23 15:41:28 +00002018 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002019}
2020
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002021static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002022 (binaryfunc) long_add, /*nb_add*/
2023 (binaryfunc) long_sub, /*nb_subtract*/
2024 (binaryfunc) long_mul, /*nb_multiply*/
2025 (binaryfunc) long_div, /*nb_divide*/
2026 (binaryfunc) long_mod, /*nb_remainder*/
2027 (binaryfunc) long_divmod, /*nb_divmod*/
2028 (ternaryfunc) long_pow, /*nb_power*/
2029 (unaryfunc) long_neg, /*nb_negative*/
2030 (unaryfunc) long_pos, /*tp_positive*/
2031 (unaryfunc) long_abs, /*tp_absolute*/
2032 (inquiry) long_nonzero, /*tp_nonzero*/
2033 (unaryfunc) long_invert, /*nb_invert*/
2034 (binaryfunc) long_lshift, /*nb_lshift*/
2035 (binaryfunc) long_rshift, /*nb_rshift*/
2036 (binaryfunc) long_and, /*nb_and*/
2037 (binaryfunc) long_xor, /*nb_xor*/
2038 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002039 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002040 (unaryfunc) long_int, /*nb_int*/
2041 (unaryfunc) long_long, /*nb_long*/
2042 (unaryfunc) long_float, /*nb_float*/
2043 (unaryfunc) long_oct, /*nb_oct*/
2044 (unaryfunc) long_hex, /*nb_hex*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00002045 0, /*nb_inplace_add*/
2046 0, /*nb_inplace_subtract*/
2047 0, /*nb_inplace_multiply*/
2048 0, /*nb_inplace_divide*/
2049 0, /*nb_inplace_remainder*/
2050 0, /*nb_inplace_power*/
2051 0, /*nb_inplace_lshift*/
2052 0, /*nb_inplace_rshift*/
2053 0, /*nb_inplace_and*/
2054 0, /*nb_inplace_xor*/
2055 0, /*nb_inplace_or*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002056};
2057
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002058PyTypeObject PyLong_Type = {
2059 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002060 0,
2061 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002062 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002063 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00002064 (destructor)long_dealloc, /*tp_dealloc*/
2065 0, /*tp_print*/
2066 0, /*tp_getattr*/
2067 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002068 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002069 (reprfunc)long_repr, /*tp_repr*/
2070 &long_as_number, /*tp_as_number*/
2071 0, /*tp_as_sequence*/
2072 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002073 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002074 0, /*tp_call*/
2075 (reprfunc)long_str, /*tp_str*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00002076 0, /*tp_getattro*/
2077 0, /*tp_setattro*/
2078 0, /*tp_as_buffer*/
Guido van Rossum6fd867b2001-01-17 15:33:18 +00002079 Py_TPFLAGS_CHECKTYPES /*tp_flags*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002080};