blob: fb6d78e54483e08c3e08e420d304b2b500a1e26e [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{
Guido van Rossum472c04f1996-12-05 21:57:21 +000060 /* Assume a C long fits in at most 5 'digits' */
61 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 PyLongObject *v = _PyLong_New(5);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000063 if (v != NULL) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000064 unsigned long t = ival;
65 int i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000066 if (ival < 0) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000067 t = -ival;
Guido van Rossum4c260ff1992-01-14 18:36:43 +000068 v->ob_size = -(v->ob_size);
Guido van Rossum472c04f1996-12-05 21:57:21 +000069 }
70 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +000071 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000072 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000073 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000074 v = long_normalize(v);
75 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000076 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000077}
78
Guido van Rossum53756b11997-01-03 17:14:46 +000079/* Create a new long int object from a C unsigned long int */
80
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000082PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +000083{
84 /* Assume a C long fits in at most 5 'digits' */
85 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 PyLongObject *v = _PyLong_New(5);
Guido van Rossum53756b11997-01-03 17:14:46 +000087 if (v != NULL) {
88 unsigned long t = ival;
89 int i;
90 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +000091 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum53756b11997-01-03 17:14:46 +000092 t >>= SHIFT;
93 }
94 v = long_normalize(v);
95 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +000097}
98
Guido van Rossum149e9ea1991-06-03 10:58:24 +000099/* Create a new long int object from a C double */
100
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000103{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000104 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000105 double frac;
106 int i, ndig, expo, neg;
107 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000108 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000109 PyErr_SetString(PyExc_OverflowError,
110 "cannot convert float infinity to long");
111 return NULL;
112 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000113 if (dval < 0.0) {
114 neg = 1;
115 dval = -dval;
116 }
117 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
118 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000120 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000122 if (v == NULL)
123 return NULL;
124 frac = ldexp(frac, (expo-1) % SHIFT + 1);
125 for (i = ndig; --i >= 0; ) {
126 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000127 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000128 frac = frac - (double)bits;
129 frac = ldexp(frac, SHIFT);
130 }
131 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000132 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000134}
135
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000136/* Get a C long int from a long int object.
137 Returns -1 and sets an error condition if overflow occurs. */
138
139long
Tim Peters9f688bf2000-07-07 15:53:28 +0000140PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000141{
Guido van Rossumf7531811998-05-26 14:33:37 +0000142 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000144 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000145 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000146
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 if (vv == NULL || !PyLong_Check(vv)) {
148 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000149 return -1;
150 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000152 i = v->ob_size;
153 sign = 1;
154 x = 0;
155 if (i < 0) {
156 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000157 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000158 }
159 while (--i >= 0) {
160 prev = x;
161 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000162 if ((x >> SHIFT) != prev)
163 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000164 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000165 /* Haven't lost any bits, but if the sign bit is set we're in
166 * trouble *unless* this is the min negative number. So,
167 * trouble iff sign bit set && (positive || some bit set other
168 * than the sign bit).
169 */
170 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
171 goto overflow;
172 return (long)x * sign;
173
174 overflow:
175 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000176 "long int too large to convert");
Guido van Rossumf7531811998-05-26 14:33:37 +0000177 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000178}
179
Guido van Rossum53756b11997-01-03 17:14:46 +0000180/* Get a C long int from a long int object.
181 Returns -1 and sets an error condition if overflow occurs. */
182
183unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000184PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000185{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000187 unsigned long x, prev;
188 int i;
189
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190 if (vv == NULL || !PyLong_Check(vv)) {
191 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000192 return (unsigned long) -1;
193 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000195 i = v->ob_size;
196 x = 0;
197 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000199 "can't convert negative value to unsigned long");
200 return (unsigned long) -1;
201 }
202 while (--i >= 0) {
203 prev = x;
204 x = (x << SHIFT) + v->ob_digit[i];
205 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000207 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000208 return (unsigned long) -1;
209 }
210 }
211 return x;
212}
213
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000214/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000215
216double
Tim Peters9f688bf2000-07-07 15:53:28 +0000217PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000218{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000219 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000220 double x;
221 double multiplier = (double) (1L << SHIFT);
222 int i, sign;
223
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224 if (vv == NULL || !PyLong_Check(vv)) {
225 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000226 return -1;
227 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000229 i = v->ob_size;
230 sign = 1;
231 x = 0.0;
232 if (i < 0) {
233 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000234 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000235 }
236 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000237 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000238 }
239 return x * sign;
240}
241
Guido van Rossum78694d91998-09-18 14:14:13 +0000242/* Create a new long (or int) object from a C pointer */
243
244PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000245PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000246{
247#if SIZEOF_VOID_P == SIZEOF_LONG
248 return PyInt_FromLong((long)p);
249#else
250 /* optimize null pointers */
251 if ( p == NULL )
252 return PyInt_FromLong(0);
253
254 /* we can assume that HAVE_LONG_LONG is true. if not, then the
255 configuration process should have bailed (having big pointers
256 without long longs seems non-sensical) */
257 return PyLong_FromLongLong((LONG_LONG)p);
258#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
259}
260
261/* Get a C pointer from a long object (or an int object in some cases) */
262
263void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000264PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000265{
266 /* This function will allow int or long objects. If vv is neither,
267 then the PyLong_AsLong*() functions will raise the exception:
268 PyExc_SystemError, "bad argument to internal function"
269 */
270
271#if SIZEOF_VOID_P == SIZEOF_LONG
272 long x;
273
274 if ( PyInt_Check(vv) )
275 x = PyInt_AS_LONG(vv);
276 else
277 x = PyLong_AsLong(vv);
278#else
279 /* we can assume that HAVE_LONG_LONG is true. if not, then the
280 configuration process should have bailed (having big pointers
281 without long longs seems non-sensical) */
282 LONG_LONG x;
283
284 if ( PyInt_Check(vv) )
285 x = PyInt_AS_LONG(vv);
286 else
287 x = PyLong_AsLongLong(vv);
288#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
289
290 if (x == -1 && PyErr_Occurred())
291 return NULL;
292 return (void *)x;
293}
294
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000295#ifdef HAVE_LONG_LONG
296/*
Guido van Rossum3293b071998-08-25 16:07:15 +0000297 * LONG_LONG support by Chris Herborth (chrish@qnx.com)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000298 *
299 * For better or worse :-), I tried to follow the coding style already
300 * here.
301 */
302
Guido van Rossum3293b071998-08-25 16:07:15 +0000303/* Create a new long int object from a C LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000304
305PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000306PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000307{
308#if SIZEOF_LONG_LONG == SIZEOF_LONG
309 /* In case the compiler is faking it. */
310 return PyLong_FromLong( (long)ival );
311#else
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000312 if ((LONG_LONG)LONG_MIN <= ival && ival <= (LONG_LONG)LONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000313 return PyLong_FromLong( (long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000314 }
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000315 else if (0 <= ival && ival <= (unsigned LONG_LONG)ULONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000316 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000317 }
318 else {
Guido van Rossum3293b071998-08-25 16:07:15 +0000319 /* Assume a C LONG_LONG fits in at most 10 'digits'.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000320 * Should be OK if we're assuming long fits in 5.
321 */
322 PyLongObject *v = _PyLong_New(10);
323
324 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000325 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000326 int i;
327 if (ival < 0) {
328 t = -ival;
329 v->ob_size = -(v->ob_size);
330 }
331
332 for (i = 0; i < 10; i++) {
333 v->ob_digit[i] = (digit) (t & MASK);
334 t >>= SHIFT;
335 }
336
337 v = long_normalize(v);
338 }
339
340 return (PyObject *)v;
341 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000342#endif
343}
344
Guido van Rossum3293b071998-08-25 16:07:15 +0000345/* Create a new long int object from a C unsigned LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000346PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000347PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000348{
349#if SIZEOF_LONG_LONG == SIZEOF_LONG
350 /* In case the compiler is faking it. */
351 return PyLong_FromUnsignedLong( (unsigned long)ival );
352#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000353 if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000354 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000355 }
356 else {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000357 /* Assume a C long fits in at most 10 'digits'. */
358 PyLongObject *v = _PyLong_New(10);
359
360 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000361 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000362 int i;
363 for (i = 0; i < 10; i++) {
364 v->ob_digit[i] = (digit) (t & MASK);
365 t >>= SHIFT;
366 }
367
368 v = long_normalize(v);
369 }
370
371 return (PyObject *)v;
372 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000373#endif
374}
375
Guido van Rossum3293b071998-08-25 16:07:15 +0000376/* Get a C LONG_LONG int from a long int object.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000377 Returns -1 and sets an error condition if overflow occurs. */
378
Guido van Rossum3293b071998-08-25 16:07:15 +0000379LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000380PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000381{
382#if SIZEOF_LONG_LONG == SIZEOF_LONG
383 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000384 return (LONG_LONG)PyLong_AsLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000385#else
386 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000387 LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000388 int i, sign;
389
390 if (vv == NULL || !PyLong_Check(vv)) {
391 PyErr_BadInternalCall();
392 return -1;
393 }
394
395 v = (PyLongObject *)vv;
396 i = v->ob_size;
397 sign = 1;
398 x = 0;
399
400 if (i < 0) {
401 sign = -1;
402 i = -(i);
403 }
404
405 while (--i >= 0) {
406 prev = x;
407 x = (x << SHIFT) + v->ob_digit[i];
408 if ((x >> SHIFT) != prev) {
409 PyErr_SetString(PyExc_OverflowError,
410 "long int too long to convert");
411 return -1;
412 }
413 }
414
415 return x * sign;
416#endif
417}
418
Guido van Rossum3293b071998-08-25 16:07:15 +0000419unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000420PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000421{
422#if SIZEOF_LONG_LONG == 4
423 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000424 return (unsigned LONG_LONG)PyLong_AsUnsignedLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000425#else
426 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000427 unsigned LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000428 int i;
429
430 if (vv == NULL || !PyLong_Check(vv)) {
431 PyErr_BadInternalCall();
Guido van Rossum3293b071998-08-25 16:07:15 +0000432 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000433 }
434
435 v = (PyLongObject *)vv;
436 i = v->ob_size;
437 x = 0;
438
439 if (i < 0) {
440 PyErr_SetString(PyExc_OverflowError,
441 "can't convert negative value to unsigned long");
Guido van Rossum3293b071998-08-25 16:07:15 +0000442 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000443 }
444
445 while (--i >= 0) {
446 prev = x;
447 x = (x << SHIFT) + v->ob_digit[i];
448 if ((x >> SHIFT) != prev) {
449 PyErr_SetString(PyExc_OverflowError,
450 "long int too long to convert");
Guido van Rossum3293b071998-08-25 16:07:15 +0000451 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000452 }
453 }
454
455 return x;
456#endif
457}
458#endif /* HAVE_LONG_LONG */
459
Neil Schemenauerba872e22001-01-04 01:46:03 +0000460
461static int
462convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
463 if (PyLong_Check(v)) {
464 *a = (PyLongObject *) v;
465 Py_INCREF(v);
466 }
467 else if (PyInt_Check(v)) {
468 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
469 }
470 else {
471 return 0;
472 }
473 if (PyLong_Check(w)) {
474 *b = (PyLongObject *) w;
475 Py_INCREF(w);
476 }
477 else if (PyInt_Check(w)) {
478 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
479 }
480 else {
481 Py_DECREF(*a);
482 return 0;
483 }
484 return 1;
485}
486
487#define CONVERT_BINOP(v, w, a, b) \
488 if (!convert_binop(v, w, a, b)) { \
489 Py_INCREF(Py_NotImplemented); \
490 return Py_NotImplemented; \
491 }
492
493
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000494/* Multiply by a single digit, ignoring the sign. */
495
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000497mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000498{
499 return muladd1(a, n, (digit)0);
500}
501
502/* Multiply by a single digit and add a single digit, ignoring the sign. */
503
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000505muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000506{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000507 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000509 twodigits carry = extra;
510 int i;
511
512 if (z == NULL)
513 return NULL;
514 for (i = 0; i < size_a; ++i) {
515 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000516 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000517 carry >>= SHIFT;
518 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000519 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000520 return long_normalize(z);
521}
522
523/* Divide a long integer by a digit, returning both the quotient
524 (as function result) and the remainder (through *prem).
525 The sign of a is ignored; n should not be zero. */
526
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000528divrem1(PyLongObject *a, wdigit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000529{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000530 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000532 int i;
533 twodigits rem = 0;
534
535 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000536 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000537 if (z == NULL)
538 return NULL;
539 for (i = size; --i >= 0; ) {
540 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000541 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000542 rem %= n;
543 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000544 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000545 return long_normalize(z);
546}
547
548/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000549 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000550 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000551
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000552static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000553long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000554{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 register PyLongObject *a = (PyLongObject *)aa;
556 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000557 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000558 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000559 char *p;
560 int bits;
561 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000562
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 if (a == NULL || !PyLong_Check(a)) {
564 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000565 return NULL;
566 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000567 assert(base >= 2 && base <= 36);
568
569 /* Compute a rough upper bound for the length of the string */
570 i = base;
571 bits = 0;
572 while (i > 1) {
573 ++bits;
574 i >>= 1;
575 }
Fred Drake121ee271999-12-23 15:41:28 +0000576 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000578 if (str == NULL)
579 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000581 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000582 if (addL)
583 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000584 if (a->ob_size < 0)
585 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000586
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000587 if (a->ob_size == 0) {
588 *--p = '0';
589 }
590 else if ((base & (base - 1)) == 0) {
591 /* JRH: special case for power-of-2 bases */
592 twodigits temp = a->ob_digit[0];
593 int bitsleft = SHIFT;
594 int rem;
595 int last = abs(a->ob_size);
596 int basebits = 1;
597 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000598 while ((i >>= 1) > 1)
599 ++basebits;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000600
601 i = 0;
602 for (;;) {
603 while (bitsleft >= basebits) {
604 if ((temp == 0) && (i >= last - 1)) break;
605 rem = temp & (base - 1);
606 if (rem < 10)
607 rem += '0';
608 else
609 rem += 'A' - 10;
610 assert(p > PyString_AS_STRING(str));
611 *--p = (char) rem;
612 bitsleft -= basebits;
613 temp >>= basebits;
614 }
615 if (++i >= last) {
616 if (temp == 0) break;
617 bitsleft = 99;
618 /* loop again to pick up final digits */
619 }
620 else {
621 temp = (a->ob_digit[i] << bitsleft) | temp;
622 bitsleft += SHIFT;
623 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000624 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000625 }
626 else {
627 Py_INCREF(a);
628 do {
629 digit rem;
630 PyLongObject *temp = divrem1(a, (digit)base, &rem);
631 if (temp == NULL) {
632 Py_DECREF(a);
633 Py_DECREF(str);
634 return NULL;
635 }
636 if (rem < 10)
637 rem += '0';
638 else
639 rem += 'A'-10;
640 assert(p > PyString_AS_STRING(str));
641 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000643 a = temp;
644 SIGCHECK({
645 Py_DECREF(a);
646 Py_DECREF(str);
647 return NULL;
648 })
649 } while (ABS(a->ob_size) != 0);
650 Py_DECREF(a);
651 }
652
Guido van Rossum2c475421992-08-14 15:13:07 +0000653 if (base == 8) {
654 if (size_a != 0)
655 *--p = '0';
656 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000657 else if (base == 16) {
658 *--p = 'x';
659 *--p = '0';
660 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000661 else if (base != 10) {
662 *--p = '#';
663 *--p = '0' + base%10;
664 if (base > 10)
665 *--p = '0' + base/10;
666 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000667 if (sign)
668 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000669 if (p != PyString_AS_STRING(str)) {
670 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000671 assert(p > q);
672 do {
673 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000674 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 _PyString_Resize((PyObject **)&str,
676 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000677 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000679}
680
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000682PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000683{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000684 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000685 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000686 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000687
Guido van Rossum472c04f1996-12-05 21:57:21 +0000688 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000690 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000691 return NULL;
692 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000693 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000694 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000695 if (*str == '+')
696 ++str;
697 else if (*str == '-') {
698 ++str;
699 sign = -1;
700 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000701 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000702 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000703 if (base == 0) {
704 if (str[0] != '0')
705 base = 10;
706 else if (str[1] == 'x' || str[1] == 'X')
707 base = 16;
708 else
709 base = 8;
710 }
711 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
712 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000714 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000715 for ( ; z != NULL; ++str) {
716 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000717 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000718
719 if (*str <= '9')
720 k = *str - '0';
721 else if (*str >= 'a')
722 k = *str - 'a' + 10;
723 else if (*str >= 'A')
724 k = *str - 'A' + 10;
725 if (k < 0 || k >= base)
726 break;
727 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000729 z = temp;
730 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000731 if (z == NULL)
732 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000733 if (str == start)
734 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000735 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000736 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000737 if (*str == 'L' || *str == 'l')
738 str++;
739 while (*str && isspace(Py_CHARMASK(*str)))
740 str++;
741 if (*str != '\0')
742 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000743 if (pend)
744 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000746
747 onError:
748 PyErr_Format(PyExc_ValueError,
749 "invalid literal for long(): %.200s", orig_str);
750 Py_XDECREF(z);
751 return NULL;
752}
753
754PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000755PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000756{
757 char buffer[256];
758
759 if (length >= sizeof(buffer)) {
760 PyErr_SetString(PyExc_ValueError,
761 "long() literal too large to convert");
762 return NULL;
763 }
764 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
765 return NULL;
766
767 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000768}
769
Tim Peters9f688bf2000-07-07 15:53:28 +0000770/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000771static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +0000772 (PyLongObject *, PyLongObject *, PyLongObject **);
773static PyObject *long_pos(PyLongObject *);
774static int long_divrem(PyLongObject *, PyLongObject *,
775 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000776
777/* Long division with remainder, top-level routine */
778
Guido van Rossume32e0141992-01-19 16:31:05 +0000779static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000780long_divrem(PyLongObject *a, PyLongObject *b,
781 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000782{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000783 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000785
786 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000787 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000788 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +0000789 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000790 }
791 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000792 (size_a == size_b &&
793 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000794 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000795 *pdiv = _PyLong_New(0);
796 Py_INCREF(a);
797 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000798 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000799 }
800 if (size_b == 1) {
801 digit rem = 0;
802 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000803 if (z == NULL)
804 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000806 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000807 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000808 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000809 if (z == NULL)
810 return -1;
811 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000812 /* Set the signs.
813 The quotient z has the sign of a*b;
814 the remainder r has the sign of a,
815 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000816 if ((a->ob_size < 0) != (b->ob_size < 0))
817 z->ob_size = -(z->ob_size);
818 if (a->ob_size < 0 && (*prem)->ob_size != 0)
819 (*prem)->ob_size = -((*prem)->ob_size);
820 *pdiv = z;
821 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000822}
823
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000824/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000825
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000826static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000827x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000828{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000829 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000830 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 PyLongObject *v = mul1(v1, d);
832 PyLongObject *w = mul1(w1, d);
833 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000834 int j, k;
835
836 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 Py_XDECREF(v);
838 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000839 return NULL;
840 }
841
842 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000843 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000844 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000845
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000846 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000847 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000848
849 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
850 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
851 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000852 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000853 int i;
854
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000855 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000857 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000858 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000859 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000860 if (vj == w->ob_digit[size_w-1])
861 q = MASK;
862 else
863 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
864 w->ob_digit[size_w-1];
865
866 while (w->ob_digit[size_w-2]*q >
867 ((
868 ((twodigits)vj << SHIFT)
869 + v->ob_digit[j-1]
870 - q*w->ob_digit[size_w-1]
871 ) << SHIFT)
872 + v->ob_digit[j-2])
873 --q;
874
875 for (i = 0; i < size_w && i+k < size_v; ++i) {
876 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000877 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000878 carry += v->ob_digit[i+k] - z
879 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000880 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +0000881 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
882 carry, SHIFT);
883 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000884 }
885
886 if (i+k < size_v) {
887 carry += v->ob_digit[i+k];
888 v->ob_digit[i+k] = 0;
889 }
890
891 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000892 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000893 else {
894 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000895 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000896 carry = 0;
897 for (i = 0; i < size_w && i+k < size_v; ++i) {
898 carry += v->ob_digit[i+k] + w->ob_digit[i];
899 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +0000900 carry = Py_ARITHMETIC_RIGHT_SHIFT(
901 BASE_TWODIGITS_TYPE,
902 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000903 }
904 }
905 } /* for j, k */
906
Guido van Rossumc206c761995-01-10 15:23:19 +0000907 if (a == NULL)
908 *prem = NULL;
909 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000910 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000911 *prem = divrem1(v, d, &d);
912 /* d receives the (unused) remainder */
913 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000914 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000915 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000916 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000917 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 Py_DECREF(v);
919 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000920 return a;
921}
922
923/* Methods */
924
925static void
Tim Peters9f688bf2000-07-07 15:53:28 +0000926long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000927{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000928 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000929}
930
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000932long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000933{
Fred Drake121ee271999-12-23 15:41:28 +0000934 return long_format(v, 10, 1);
935}
936
937static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000938long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +0000939{
940 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000941}
942
943static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000944long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000945{
946 int sign;
947
Guido van Rossumc6913e71991-11-19 20:26:46 +0000948 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000949 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +0000950 sign = 0;
951 else
952 sign = a->ob_size - b->ob_size;
953 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000954 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000955 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000956 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
957 ;
958 if (i < 0)
959 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000960 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000961 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000962 if (a->ob_size < 0)
963 sign = -sign;
964 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000965 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000966 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000967}
968
Neil Schemenauerba872e22001-01-04 01:46:03 +0000969/* Needed for the new style number compare slots */
970static PyObject *
971long_cmp(PyObject *v, PyObject *w)
972{
973 PyLongObject *a, *b;
974 int c;
975 CONVERT_BINOP(v, w, &a, &b);
976 c = long_compare(a, b);
977 Py_DECREF(a);
978 Py_DECREF(b);
979 return PyInt_FromLong(c);
980}
981
Guido van Rossum9bfef441993-03-29 10:43:31 +0000982static long
Tim Peters9f688bf2000-07-07 15:53:28 +0000983long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000984{
985 long x;
986 int i, sign;
987
988 /* This is designed so that Python ints and longs with the
989 same value hash to the same value, otherwise comparisons
990 of mapping keys will turn out weird */
991 i = v->ob_size;
992 sign = 1;
993 x = 0;
994 if (i < 0) {
995 sign = -1;
996 i = -(i);
997 }
998 while (--i >= 0) {
999 /* Force a 32-bit circular shift */
1000 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1001 x += v->ob_digit[i];
1002 }
1003 x = x * sign;
1004 if (x == -1)
1005 x = -2;
1006 return x;
1007}
1008
1009
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001010/* Add the absolute values of two long integers. */
1011
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001012static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001013x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001014{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001015 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001017 int i;
1018 digit carry = 0;
1019
1020 /* Ensure a is the larger of the two: */
1021 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001022 { PyLongObject *temp = a; a = b; b = temp; }
1023 { int size_temp = size_a;
1024 size_a = size_b;
1025 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001026 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001028 if (z == NULL)
1029 return NULL;
1030 for (i = 0; i < size_b; ++i) {
1031 carry += a->ob_digit[i] + b->ob_digit[i];
1032 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001033 carry >>= SHIFT;
1034 }
1035 for (; i < size_a; ++i) {
1036 carry += a->ob_digit[i];
1037 z->ob_digit[i] = carry & MASK;
1038 carry >>= SHIFT;
1039 }
1040 z->ob_digit[i] = carry;
1041 return long_normalize(z);
1042}
1043
1044/* Subtract the absolute values of two integers. */
1045
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001047x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001048{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001049 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001051 int i;
1052 int sign = 1;
1053 digit borrow = 0;
1054
1055 /* Ensure a is the larger of the two: */
1056 if (size_a < size_b) {
1057 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058 { PyLongObject *temp = a; a = b; b = temp; }
1059 { int size_temp = size_a;
1060 size_a = size_b;
1061 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001062 }
1063 else if (size_a == size_b) {
1064 /* Find highest digit where a and b differ: */
1065 i = size_a;
1066 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1067 ;
1068 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001070 if (a->ob_digit[i] < b->ob_digit[i]) {
1071 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001072 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001073 }
1074 size_a = size_b = i+1;
1075 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001076 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001077 if (z == NULL)
1078 return NULL;
1079 for (i = 0; i < size_b; ++i) {
1080 /* The following assumes unsigned arithmetic
1081 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001082 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001083 z->ob_digit[i] = borrow & MASK;
1084 borrow >>= SHIFT;
1085 borrow &= 1; /* Keep only one sign bit */
1086 }
1087 for (; i < size_a; ++i) {
1088 borrow = a->ob_digit[i] - borrow;
1089 z->ob_digit[i] = borrow & MASK;
1090 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001091 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001092 }
1093 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001094 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001095 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001096 return long_normalize(z);
1097}
1098
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001100long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001101{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001102 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001103
Neil Schemenauerba872e22001-01-04 01:46:03 +00001104 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1105
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001106 if (a->ob_size < 0) {
1107 if (b->ob_size < 0) {
1108 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001109 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001110 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001111 }
1112 else
1113 z = x_sub(b, a);
1114 }
1115 else {
1116 if (b->ob_size < 0)
1117 z = x_sub(a, b);
1118 else
1119 z = x_add(a, b);
1120 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001121 Py_DECREF(a);
1122 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001123 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001124}
1125
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001126static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001127long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001128{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001129 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001130
Neil Schemenauerba872e22001-01-04 01:46:03 +00001131 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1132
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001133 if (a->ob_size < 0) {
1134 if (b->ob_size < 0)
1135 z = x_sub(a, b);
1136 else
1137 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001138 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001139 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001140 }
1141 else {
1142 if (b->ob_size < 0)
1143 z = x_add(a, b);
1144 else
1145 z = x_sub(a, b);
1146 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001147 Py_DECREF(a);
1148 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001149 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001150}
1151
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001152static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001153long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001154{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001155 /* sequence * long */
1156 long n = PyLong_AsLong((PyObject *) w);
1157 if (n == -1 && PyErr_Occurred())
1158 return NULL;
1159 else
1160 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1161}
1162
1163static PyObject *
1164long_mul(PyLongObject *v, PyLongObject *w)
1165{
1166 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001167 int size_a;
1168 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001169 int i;
1170
Neil Schemenauerba872e22001-01-04 01:46:03 +00001171 if (v->ob_type->tp_as_sequence &&
1172 v->ob_type->tp_as_sequence->sq_repeat) {
1173 return long_repeat((PyObject *)v, w);
1174 }
1175 else if (w->ob_type->tp_as_sequence &&
1176 w->ob_type->tp_as_sequence->sq_repeat) {
1177 return long_repeat((PyObject *)w, v);
1178 }
1179
1180 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1181
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001182 size_a = ABS(a->ob_size);
1183 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001184 if (size_a > size_b) {
1185 /* we are faster with the small object on the left */
1186 int hold_sa = size_a;
1187 PyLongObject *hold_a = a;
1188 size_a = size_b;
1189 size_b = hold_sa;
1190 a = b;
1191 b = hold_a;
1192 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001193 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001194 if (z == NULL) {
1195 Py_DECREF(a);
1196 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001197 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001198 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001199 for (i = 0; i < z->ob_size; ++i)
1200 z->ob_digit[i] = 0;
1201 for (i = 0; i < size_a; ++i) {
1202 twodigits carry = 0;
1203 twodigits f = a->ob_digit[i];
1204 int j;
1205
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001206 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001207 Py_DECREF(a);
1208 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001209 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001210 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001211 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001212 for (j = 0; j < size_b; ++j) {
1213 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001214 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001215 carry >>= SHIFT;
1216 }
1217 for (; carry != 0; ++j) {
1218 assert(i+j < z->ob_size);
1219 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001220 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001221 carry >>= SHIFT;
1222 }
1223 }
1224 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001225 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001226 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001227 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001228 Py_DECREF(a);
1229 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001231}
1232
Guido van Rossume32e0141992-01-19 16:31:05 +00001233/* The / and % operators are now defined in terms of divmod().
1234 The expression a mod b has the value a - b*floor(a/b).
1235 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001236 |a| by |b|, with the sign of a. This is also expressed
1237 as a - b*trunc(a/b), if trunc truncates towards zero.
1238 Some examples:
1239 a b a rem b a mod b
1240 13 10 3 3
1241 -13 10 -3 7
1242 13 -10 3 -7
1243 -13 -10 -3 -3
1244 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001245 have different signs. We then subtract one from the 'div'
1246 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001247
Guido van Rossume32e0141992-01-19 16:31:05 +00001248static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001249l_divmod(PyLongObject *v, PyLongObject *w,
1250 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001251{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001252 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001253
1254 if (long_divrem(v, w, &div, &mod) < 0)
1255 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001256 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1257 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001258 PyLongObject *temp;
1259 PyLongObject *one;
1260 temp = (PyLongObject *) long_add(mod, w);
1261 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001262 mod = temp;
1263 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001264 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001265 return -1;
1266 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001267 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001268 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001269 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1270 Py_DECREF(mod);
1271 Py_DECREF(div);
1272 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001273 return -1;
1274 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001275 Py_DECREF(one);
1276 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001277 div = temp;
1278 }
1279 *pdiv = div;
1280 *pmod = mod;
1281 return 0;
1282}
1283
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001285long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001286{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001287 PyLongObject *a, *b, *div, *mod;
1288
1289 CONVERT_BINOP(v, w, &a, &b);
1290
1291 if (l_divmod(a, b, &div, &mod) < 0) {
1292 Py_DECREF(a);
1293 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001294 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001295 }
1296 Py_DECREF(a);
1297 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001298 Py_DECREF(mod);
1299 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001300}
1301
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001303long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001304{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001305 PyLongObject *a, *b, *div, *mod;
1306
1307 CONVERT_BINOP(v, w, &a, &b);
1308
1309 if (l_divmod(a, b, &div, &mod) < 0) {
1310 Py_DECREF(a);
1311 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001312 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001313 }
1314 Py_DECREF(a);
1315 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001316 Py_DECREF(div);
1317 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001318}
1319
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001320static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001321long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001322{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001323 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001324 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001325
1326 CONVERT_BINOP(v, w, &a, &b);
1327
1328 if (l_divmod(a, b, &div, &mod) < 0) {
1329 Py_DECREF(a);
1330 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001331 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001332 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001334 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335 PyTuple_SetItem(z, 0, (PyObject *) div);
1336 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001337 }
1338 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 Py_DECREF(div);
1340 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001341 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001342 Py_DECREF(a);
1343 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001344 return z;
1345}
1346
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001348long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001349{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001350 PyLongObject *a, *b;
1351 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001352 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001353 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001354
1355 CONVERT_BINOP(v, w, &a, &b);
1356 if (PyLong_Check(x) || Py_None == x) {
1357 c = x;
1358 Py_INCREF(x);
1359 }
1360 else if (PyInt_Check(x)) {
1361 c = PyLong_FromLong(PyInt_AS_LONG(x));
1362 }
1363 else {
1364 Py_DECREF(a);
1365 Py_DECREF(b);
1366 Py_INCREF(Py_NotImplemented);
1367 return Py_NotImplemented;
1368 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001369
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001370 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001371 if (size_b < 0) {
Tim Petersc54d1902000-10-06 00:36:09 +00001372 if (a->ob_size)
1373 PyErr_SetString(PyExc_ValueError,
1374 "long integer to a negative power");
1375 else
1376 PyErr_SetString(PyExc_ZeroDivisionError,
1377 "zero to a negative power");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001378 z = NULL;
1379 goto error;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001380 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001381 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001382 for (i = 0; i < size_b; ++i) {
1383 digit bi = b->ob_digit[i];
1384 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001385
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001386 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001388
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001389 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001390 temp = (PyLongObject *)long_mul(z, a);
1391 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001392 if (c!=Py_None && temp!=NULL) {
1393 if (l_divmod(temp,(PyLongObject *)c,
1394 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001395 Py_DECREF(temp);
1396 z = NULL;
1397 goto error;
1398 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001399 Py_XDECREF(div);
1400 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001401 temp = mod;
1402 }
1403 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001404 if (z == NULL)
1405 break;
1406 }
1407 bi >>= 1;
1408 if (bi == 0 && i+1 == size_b)
1409 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001410 temp = (PyLongObject *)long_mul(a, a);
1411 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001412 if (c!=Py_None && temp!=NULL) {
1413 if (l_divmod(temp, (PyLongObject *)c, &div,
1414 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001415 Py_DECREF(temp);
1416 z = NULL;
1417 goto error;
1418 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419 Py_XDECREF(div);
1420 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001421 temp = mod;
1422 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001423 a = temp;
1424 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001425 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001426 z = NULL;
1427 break;
1428 }
1429 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001430 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001431 break;
1432 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001433 if (c!=Py_None && z!=NULL) {
1434 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001435 Py_DECREF(z);
1436 z = NULL;
1437 }
1438 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001439 Py_XDECREF(div);
1440 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001441 z = mod;
1442 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001443 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001444 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001445 Py_XDECREF(a);
1446 Py_DECREF(b);
1447 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001448 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001449}
1450
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001451static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001452long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001453{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001454 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455 PyLongObject *x;
1456 PyLongObject *w;
1457 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001458 if (w == NULL)
1459 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001460 x = (PyLongObject *) long_add(v, w);
1461 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001462 if (x == NULL)
1463 return NULL;
1464 if (x->ob_size != 0)
1465 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001467}
1468
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001469static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001470long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001471{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001472 Py_INCREF(v);
1473 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001474}
1475
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001476static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001477long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001478{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001479 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001480 int i, n;
1481 n = ABS(v->ob_size);
1482 if (n == 0) {
1483 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001484 Py_INCREF(v);
1485 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001486 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001487 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001488 if (z == NULL)
1489 return NULL;
1490 for (i = 0; i < n; i++)
1491 z->ob_digit[i] = v->ob_digit[i];
1492 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001493 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001494}
1495
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001496static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001497long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001498{
1499 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001500 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001501 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001502 Py_INCREF(v);
1503 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001504 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001505}
1506
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001507static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001508long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001509{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001510 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001511}
1512
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001513static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001514long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001515{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001516 PyLongObject *a, *b;
1517 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001518 long shiftby;
1519 int newsize, wordshift, loshift, hishift, i, j;
1520 digit lomask, himask;
1521
Neil Schemenauerba872e22001-01-04 01:46:03 +00001522 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1523
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001524 if (a->ob_size < 0) {
1525 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001526 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001527 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001528 if (a1 == NULL)
1529 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001530 a2 = (PyLongObject *) long_rshift(a1, b);
1531 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001532 if (a2 == NULL)
1533 goto rshift_error;
1534 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001535 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001536 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001537 else {
1538
1539 shiftby = PyLong_AsLong((PyObject *)b);
1540 if (shiftby == -1L && PyErr_Occurred())
1541 goto rshift_error;
1542 if (shiftby < 0) {
1543 PyErr_SetString(PyExc_ValueError,
1544 "negative shift count");
1545 goto rshift_error;
1546 }
1547 wordshift = shiftby / SHIFT;
1548 newsize = ABS(a->ob_size) - wordshift;
1549 if (newsize <= 0) {
1550 z = _PyLong_New(0);
1551 Py_DECREF(a);
1552 Py_DECREF(b);
1553 return (PyObject *)z;
1554 }
1555 loshift = shiftby % SHIFT;
1556 hishift = SHIFT - loshift;
1557 lomask = ((digit)1 << hishift) - 1;
1558 himask = MASK ^ lomask;
1559 z = _PyLong_New(newsize);
1560 if (z == NULL)
1561 goto rshift_error;
1562 if (a->ob_size < 0)
1563 z->ob_size = -(z->ob_size);
1564 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1565 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1566 if (i+1 < newsize)
1567 z->ob_digit[i] |=
1568 (a->ob_digit[j+1] << hishift) & himask;
1569 }
1570 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001571 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001572rshift_error:
1573 Py_DECREF(a);
1574 Py_DECREF(b);
1575 return (PyObject *) z;
1576
Guido van Rossumc6913e71991-11-19 20:26:46 +00001577}
1578
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001579static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001580long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001581{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001582 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001583 PyLongObject *a, *b;
1584 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001585 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001586 int oldsize, newsize, wordshift, remshift, i, j;
1587 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001588
Neil Schemenauerba872e22001-01-04 01:46:03 +00001589 CONVERT_BINOP(v, w, &a, &b);
1590
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001591 shiftby = PyLong_AsLong((PyObject *)b);
1592 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001593 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001594 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001595 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001596 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001597 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001598 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001599 PyErr_SetString(PyExc_ValueError,
1600 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001601 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001602 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001603 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1604 wordshift = (int)shiftby / SHIFT;
1605 remshift = (int)shiftby - wordshift * SHIFT;
1606
1607 oldsize = ABS(a->ob_size);
1608 newsize = oldsize + wordshift;
1609 if (remshift)
1610 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001611 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001612 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001613 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001614 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001615 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001616 for (i = 0; i < wordshift; i++)
1617 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001618 accum = 0;
1619 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1620 accum |= a->ob_digit[j] << remshift;
1621 z->ob_digit[i] = (digit)(accum & MASK);
1622 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001623 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001624 if (remshift)
1625 z->ob_digit[newsize-1] = (digit)accum;
1626 else
1627 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001628 z = long_normalize(z);
1629lshift_error:
1630 Py_DECREF(a);
1631 Py_DECREF(b);
1632 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001633}
1634
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001635
1636/* Bitwise and/xor/or operations */
1637
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001638#define MAX(x, y) ((x) < (y) ? (y) : (x))
1639#define MIN(x, y) ((x) > (y) ? (y) : (x))
1640
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001641static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001642long_bitwise(PyLongObject *a,
1643 int op, /* '&', '|', '^' */
1644 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001645{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001646 digit maska, maskb; /* 0 or MASK */
1647 int negz;
1648 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001649 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001650 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001651 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001652 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001653
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001654 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001655 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001656 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001657 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001658 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001660 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001661 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001662 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001663 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001664 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001665 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001666 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001667 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001668 maskb = 0;
1669 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001670
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001671 negz = 0;
1672 switch (op) {
1673 case '^':
1674 if (maska != maskb) {
1675 maska ^= MASK;
1676 negz = -1;
1677 }
1678 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001679 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001680 if (maska && maskb) {
1681 op = '|';
1682 maska ^= MASK;
1683 maskb ^= MASK;
1684 negz = -1;
1685 }
1686 break;
1687 case '|':
1688 if (maska || maskb) {
1689 op = '&';
1690 maska ^= MASK;
1691 maskb ^= MASK;
1692 negz = -1;
1693 }
1694 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001695 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001696
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001697 /* JRH: The original logic here was to allocate the result value (z)
1698 as the longer of the two operands. However, there are some cases
1699 where the result is guaranteed to be shorter than that: AND of two
1700 positives, OR of two negatives: use the shorter number. AND with
1701 mixed signs: use the positive number. OR with mixed signs: use the
1702 negative number. After the transformations above, op will be '&'
1703 iff one of these cases applies, and mask will be non-0 for operands
1704 whose length should be ignored.
1705 */
1706
1707 size_a = a->ob_size;
1708 size_b = b->ob_size;
1709 size_z = op == '&'
1710 ? (maska
1711 ? size_b
1712 : (maskb ? size_a : MIN(size_a, size_b)))
1713 : MAX(size_a, size_b);
1714 z = _PyLong_New(size_z);
1715 if (a == NULL || b == NULL || z == NULL) {
1716 Py_XDECREF(a);
1717 Py_XDECREF(b);
1718 Py_XDECREF(z);
1719 return NULL;
1720 }
1721
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001722 for (i = 0; i < size_z; ++i) {
1723 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1724 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1725 switch (op) {
1726 case '&': z->ob_digit[i] = diga & digb; break;
1727 case '|': z->ob_digit[i] = diga | digb; break;
1728 case '^': z->ob_digit[i] = diga ^ digb; break;
1729 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001730 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001731
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001732 Py_DECREF(a);
1733 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001734 z = long_normalize(z);
1735 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001736 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001737 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001738 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001739 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001740}
1741
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001742static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001743long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001744{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001745 PyLongObject *a, *b;
1746 PyObject *c;
1747 CONVERT_BINOP(v, w, &a, &b);
1748 c = long_bitwise(a, '&', b);
1749 Py_DECREF(a);
1750 Py_DECREF(b);
1751 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001752}
1753
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001754static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001755long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001756{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001757 PyLongObject *a, *b;
1758 PyObject *c;
1759 CONVERT_BINOP(v, w, &a, &b);
1760 c = long_bitwise(a, '^', b);
1761 Py_DECREF(a);
1762 Py_DECREF(b);
1763 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001764}
1765
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001766static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001767long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001768{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001769 PyLongObject *a, *b;
1770 PyObject *c;
1771 CONVERT_BINOP(v, w, &a, &b);
1772 c = long_bitwise(a, '|', b);
1773 Py_DECREF(a);
1774 Py_DECREF(b);
1775 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001776}
1777
Guido van Rossum234f9421993-06-17 12:35:49 +00001778static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001779long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001780{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001781 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001782 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001783 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001784 return 0;
1785 }
1786 return 1; /* Can't do it */
1787}
1788
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001789static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001790long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001791{
1792 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001793 x = PyLong_AsLong(v);
1794 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001795 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001796 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001797}
1798
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001799static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001800long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001801{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001802 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001803 return v;
1804}
1805
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001806static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001807long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001808{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001809 double result;
1810 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001811 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001812 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001813 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001814}
1815
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001816static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001817long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001818{
Fred Drake121ee271999-12-23 15:41:28 +00001819 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001820}
1821
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001822static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001823long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001824{
Fred Drake121ee271999-12-23 15:41:28 +00001825 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001826}
1827
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001828static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00001829 (binaryfunc) long_add, /*nb_add*/
1830 (binaryfunc) long_sub, /*nb_subtract*/
1831 (binaryfunc) long_mul, /*nb_multiply*/
1832 (binaryfunc) long_div, /*nb_divide*/
1833 (binaryfunc) long_mod, /*nb_remainder*/
1834 (binaryfunc) long_divmod, /*nb_divmod*/
1835 (ternaryfunc) long_pow, /*nb_power*/
1836 (unaryfunc) long_neg, /*nb_negative*/
1837 (unaryfunc) long_pos, /*tp_positive*/
1838 (unaryfunc) long_abs, /*tp_absolute*/
1839 (inquiry) long_nonzero, /*tp_nonzero*/
1840 (unaryfunc) long_invert, /*nb_invert*/
1841 (binaryfunc) long_lshift, /*nb_lshift*/
1842 (binaryfunc) long_rshift, /*nb_rshift*/
1843 (binaryfunc) long_and, /*nb_and*/
1844 (binaryfunc) long_xor, /*nb_xor*/
1845 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001846 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001847 (unaryfunc) long_int, /*nb_int*/
1848 (unaryfunc) long_long, /*nb_long*/
1849 (unaryfunc) long_float, /*nb_float*/
1850 (unaryfunc) long_oct, /*nb_oct*/
1851 (unaryfunc) long_hex, /*nb_hex*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00001852 0, /*nb_inplace_add*/
1853 0, /*nb_inplace_subtract*/
1854 0, /*nb_inplace_multiply*/
1855 0, /*nb_inplace_divide*/
1856 0, /*nb_inplace_remainder*/
1857 0, /*nb_inplace_power*/
1858 0, /*nb_inplace_lshift*/
1859 0, /*nb_inplace_rshift*/
1860 0, /*nb_inplace_and*/
1861 0, /*nb_inplace_xor*/
1862 0, /*nb_inplace_or*/
1863
1864 /* New style slots */
1865 (binaryfunc) long_cmp, /*nb_cmp*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001866};
1867
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001868PyTypeObject PyLong_Type = {
1869 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001870 0,
1871 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001872 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001873 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00001874 (destructor)long_dealloc, /*tp_dealloc*/
1875 0, /*tp_print*/
1876 0, /*tp_getattr*/
1877 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001878 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001879 (reprfunc)long_repr, /*tp_repr*/
1880 &long_as_number, /*tp_as_number*/
1881 0, /*tp_as_sequence*/
1882 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001883 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001884 0, /*tp_call*/
1885 (reprfunc)long_str, /*tp_str*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00001886 0, /*tp_getattro*/
1887 0, /*tp_setattro*/
1888 0, /*tp_as_buffer*/
1889 Py_TPFLAGS_NEWSTYLENUMBER /*tp_flags*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001890};