blob: e7626651c2046cd3102884d66314cb0c44e4d57d [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
Guido van Rossum9bfef441993-03-29 10:43:31 +0000969static long
Tim Peters9f688bf2000-07-07 15:53:28 +0000970long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000971{
972 long x;
973 int i, sign;
974
975 /* This is designed so that Python ints and longs with the
976 same value hash to the same value, otherwise comparisons
977 of mapping keys will turn out weird */
978 i = v->ob_size;
979 sign = 1;
980 x = 0;
981 if (i < 0) {
982 sign = -1;
983 i = -(i);
984 }
985 while (--i >= 0) {
986 /* Force a 32-bit circular shift */
987 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
988 x += v->ob_digit[i];
989 }
990 x = x * sign;
991 if (x == -1)
992 x = -2;
993 return x;
994}
995
996
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000997/* Add the absolute values of two long integers. */
998
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001000x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001001{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001002 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001004 int i;
1005 digit carry = 0;
1006
1007 /* Ensure a is the larger of the two: */
1008 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 { PyLongObject *temp = a; a = b; b = temp; }
1010 { int size_temp = size_a;
1011 size_a = size_b;
1012 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001013 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001014 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001015 if (z == NULL)
1016 return NULL;
1017 for (i = 0; i < size_b; ++i) {
1018 carry += a->ob_digit[i] + b->ob_digit[i];
1019 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001020 carry >>= SHIFT;
1021 }
1022 for (; i < size_a; ++i) {
1023 carry += a->ob_digit[i];
1024 z->ob_digit[i] = carry & MASK;
1025 carry >>= SHIFT;
1026 }
1027 z->ob_digit[i] = carry;
1028 return long_normalize(z);
1029}
1030
1031/* Subtract the absolute values of two integers. */
1032
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001034x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001035{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001036 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001037 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001038 int i;
1039 int sign = 1;
1040 digit borrow = 0;
1041
1042 /* Ensure a is the larger of the two: */
1043 if (size_a < size_b) {
1044 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 { PyLongObject *temp = a; a = b; b = temp; }
1046 { int size_temp = size_a;
1047 size_a = size_b;
1048 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001049 }
1050 else if (size_a == size_b) {
1051 /* Find highest digit where a and b differ: */
1052 i = size_a;
1053 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1054 ;
1055 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001057 if (a->ob_digit[i] < b->ob_digit[i]) {
1058 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001060 }
1061 size_a = size_b = i+1;
1062 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001063 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001064 if (z == NULL)
1065 return NULL;
1066 for (i = 0; i < size_b; ++i) {
1067 /* The following assumes unsigned arithmetic
1068 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001069 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001070 z->ob_digit[i] = borrow & MASK;
1071 borrow >>= SHIFT;
1072 borrow &= 1; /* Keep only one sign bit */
1073 }
1074 for (; i < size_a; ++i) {
1075 borrow = a->ob_digit[i] - borrow;
1076 z->ob_digit[i] = borrow & MASK;
1077 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001078 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001079 }
1080 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001081 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001082 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001083 return long_normalize(z);
1084}
1085
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001087long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001088{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001089 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001090
Neil Schemenauerba872e22001-01-04 01:46:03 +00001091 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1092
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001093 if (a->ob_size < 0) {
1094 if (b->ob_size < 0) {
1095 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001096 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001097 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001098 }
1099 else
1100 z = x_sub(b, a);
1101 }
1102 else {
1103 if (b->ob_size < 0)
1104 z = x_sub(a, b);
1105 else
1106 z = x_add(a, b);
1107 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001108 Py_DECREF(a);
1109 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001110 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001111}
1112
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001113static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001114long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001115{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001116 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001117
Neil Schemenauerba872e22001-01-04 01:46:03 +00001118 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1119
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001120 if (a->ob_size < 0) {
1121 if (b->ob_size < 0)
1122 z = x_sub(a, b);
1123 else
1124 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001125 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001126 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001127 }
1128 else {
1129 if (b->ob_size < 0)
1130 z = x_add(a, b);
1131 else
1132 z = x_sub(a, b);
1133 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001134 Py_DECREF(a);
1135 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001136 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001137}
1138
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001139static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001140long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001141{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001142 /* sequence * long */
1143 long n = PyLong_AsLong((PyObject *) w);
1144 if (n == -1 && PyErr_Occurred())
1145 return NULL;
1146 else
1147 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1148}
1149
1150static PyObject *
1151long_mul(PyLongObject *v, PyLongObject *w)
1152{
1153 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001154 int size_a;
1155 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001156 int i;
1157
Neil Schemenauerba872e22001-01-04 01:46:03 +00001158 if (v->ob_type->tp_as_sequence &&
1159 v->ob_type->tp_as_sequence->sq_repeat) {
1160 return long_repeat((PyObject *)v, w);
1161 }
1162 else if (w->ob_type->tp_as_sequence &&
1163 w->ob_type->tp_as_sequence->sq_repeat) {
1164 return long_repeat((PyObject *)w, v);
1165 }
1166
1167 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1168
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001169 size_a = ABS(a->ob_size);
1170 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001171 if (size_a > size_b) {
1172 /* we are faster with the small object on the left */
1173 int hold_sa = size_a;
1174 PyLongObject *hold_a = a;
1175 size_a = size_b;
1176 size_b = hold_sa;
1177 a = b;
1178 b = hold_a;
1179 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001180 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001181 if (z == NULL) {
1182 Py_DECREF(a);
1183 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001184 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001185 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001186 for (i = 0; i < z->ob_size; ++i)
1187 z->ob_digit[i] = 0;
1188 for (i = 0; i < size_a; ++i) {
1189 twodigits carry = 0;
1190 twodigits f = a->ob_digit[i];
1191 int j;
1192
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001193 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001194 Py_DECREF(a);
1195 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001196 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001197 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001198 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001199 for (j = 0; j < size_b; ++j) {
1200 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001201 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001202 carry >>= SHIFT;
1203 }
1204 for (; carry != 0; ++j) {
1205 assert(i+j < z->ob_size);
1206 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001207 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001208 carry >>= SHIFT;
1209 }
1210 }
1211 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001212 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001213 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001214 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001215 Py_DECREF(a);
1216 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001217 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001218}
1219
Guido van Rossume32e0141992-01-19 16:31:05 +00001220/* The / and % operators are now defined in terms of divmod().
1221 The expression a mod b has the value a - b*floor(a/b).
1222 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001223 |a| by |b|, with the sign of a. This is also expressed
1224 as a - b*trunc(a/b), if trunc truncates towards zero.
1225 Some examples:
1226 a b a rem b a mod b
1227 13 10 3 3
1228 -13 10 -3 7
1229 13 -10 3 -7
1230 -13 -10 -3 -3
1231 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001232 have different signs. We then subtract one from the 'div'
1233 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001234
Guido van Rossume32e0141992-01-19 16:31:05 +00001235static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001236l_divmod(PyLongObject *v, PyLongObject *w,
1237 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001238{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001240
1241 if (long_divrem(v, w, &div, &mod) < 0)
1242 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001243 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1244 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001245 PyLongObject *temp;
1246 PyLongObject *one;
1247 temp = (PyLongObject *) long_add(mod, w);
1248 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001249 mod = temp;
1250 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001252 return -1;
1253 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001255 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1257 Py_DECREF(mod);
1258 Py_DECREF(div);
1259 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001260 return -1;
1261 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001262 Py_DECREF(one);
1263 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001264 div = temp;
1265 }
1266 *pdiv = div;
1267 *pmod = mod;
1268 return 0;
1269}
1270
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001272long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001273{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001274 PyLongObject *a, *b, *div, *mod;
1275
1276 CONVERT_BINOP(v, w, &a, &b);
1277
1278 if (l_divmod(a, b, &div, &mod) < 0) {
1279 Py_DECREF(a);
1280 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001281 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001282 }
1283 Py_DECREF(a);
1284 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 Py_DECREF(mod);
1286 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001287}
1288
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001289static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001290long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001291{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001292 PyLongObject *a, *b, *div, *mod;
1293
1294 CONVERT_BINOP(v, w, &a, &b);
1295
1296 if (l_divmod(a, b, &div, &mod) < 0) {
1297 Py_DECREF(a);
1298 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001299 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001300 }
1301 Py_DECREF(a);
1302 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303 Py_DECREF(div);
1304 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001305}
1306
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001308long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001309{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001310 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001312
1313 CONVERT_BINOP(v, w, &a, &b);
1314
1315 if (l_divmod(a, b, &div, &mod) < 0) {
1316 Py_DECREF(a);
1317 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001318 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001319 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001320 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001321 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001322 PyTuple_SetItem(z, 0, (PyObject *) div);
1323 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001324 }
1325 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 Py_DECREF(div);
1327 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001328 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001329 Py_DECREF(a);
1330 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001331 return z;
1332}
1333
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001335long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001336{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001337 PyLongObject *a, *b;
1338 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001340 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001341
1342 CONVERT_BINOP(v, w, &a, &b);
1343 if (PyLong_Check(x) || Py_None == x) {
1344 c = x;
1345 Py_INCREF(x);
1346 }
1347 else if (PyInt_Check(x)) {
1348 c = PyLong_FromLong(PyInt_AS_LONG(x));
1349 }
1350 else {
1351 Py_DECREF(a);
1352 Py_DECREF(b);
1353 Py_INCREF(Py_NotImplemented);
1354 return Py_NotImplemented;
1355 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001356
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001357 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001358 if (size_b < 0) {
Tim Petersc54d1902000-10-06 00:36:09 +00001359 if (a->ob_size)
1360 PyErr_SetString(PyExc_ValueError,
1361 "long integer to a negative power");
1362 else
1363 PyErr_SetString(PyExc_ZeroDivisionError,
1364 "zero to a negative power");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001365 z = NULL;
1366 goto error;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001367 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001368 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001369 for (i = 0; i < size_b; ++i) {
1370 digit bi = b->ob_digit[i];
1371 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001372
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001373 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001374 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001375
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001376 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001377 temp = (PyLongObject *)long_mul(z, a);
1378 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001379 if (c!=Py_None && temp!=NULL) {
1380 if (l_divmod(temp,(PyLongObject *)c,
1381 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001382 Py_DECREF(temp);
1383 z = NULL;
1384 goto error;
1385 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001386 Py_XDECREF(div);
1387 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001388 temp = mod;
1389 }
1390 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001391 if (z == NULL)
1392 break;
1393 }
1394 bi >>= 1;
1395 if (bi == 0 && i+1 == size_b)
1396 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001397 temp = (PyLongObject *)long_mul(a, a);
1398 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001399 if (c!=Py_None && temp!=NULL) {
1400 if (l_divmod(temp, (PyLongObject *)c, &div,
1401 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001402 Py_DECREF(temp);
1403 z = NULL;
1404 goto error;
1405 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406 Py_XDECREF(div);
1407 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001408 temp = mod;
1409 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001410 a = temp;
1411 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001412 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001413 z = NULL;
1414 break;
1415 }
1416 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001417 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001418 break;
1419 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001420 if (c!=Py_None && z!=NULL) {
1421 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001422 Py_DECREF(z);
1423 z = NULL;
1424 }
1425 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001426 Py_XDECREF(div);
1427 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001428 z = mod;
1429 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001430 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001431 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001432 Py_XDECREF(a);
1433 Py_DECREF(b);
1434 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001435 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001436}
1437
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001439long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001440{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001441 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442 PyLongObject *x;
1443 PyLongObject *w;
1444 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001445 if (w == NULL)
1446 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001447 x = (PyLongObject *) long_add(v, w);
1448 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001449 if (x == NULL)
1450 return NULL;
1451 if (x->ob_size != 0)
1452 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001453 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001454}
1455
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001456static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001457long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001458{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001459 Py_INCREF(v);
1460 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001461}
1462
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001463static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001464long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001465{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001467 int i, n;
1468 n = ABS(v->ob_size);
1469 if (n == 0) {
1470 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001471 Py_INCREF(v);
1472 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001473 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001474 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001475 if (z == NULL)
1476 return NULL;
1477 for (i = 0; i < n; i++)
1478 z->ob_digit[i] = v->ob_digit[i];
1479 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001480 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001481}
1482
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001483static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001484long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001485{
1486 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001487 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001488 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001489 Py_INCREF(v);
1490 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001491 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001492}
1493
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001494static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001495long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001496{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001497 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001498}
1499
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001500static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001501long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001502{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001503 PyLongObject *a, *b;
1504 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001505 long shiftby;
1506 int newsize, wordshift, loshift, hishift, i, j;
1507 digit lomask, himask;
1508
Neil Schemenauerba872e22001-01-04 01:46:03 +00001509 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1510
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001511 if (a->ob_size < 0) {
1512 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001513 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001514 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001515 if (a1 == NULL)
1516 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001517 a2 = (PyLongObject *) long_rshift(a1, b);
1518 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001519 if (a2 == NULL)
1520 goto rshift_error;
1521 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001522 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001523 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001524 else {
1525
1526 shiftby = PyLong_AsLong((PyObject *)b);
1527 if (shiftby == -1L && PyErr_Occurred())
1528 goto rshift_error;
1529 if (shiftby < 0) {
1530 PyErr_SetString(PyExc_ValueError,
1531 "negative shift count");
1532 goto rshift_error;
1533 }
1534 wordshift = shiftby / SHIFT;
1535 newsize = ABS(a->ob_size) - wordshift;
1536 if (newsize <= 0) {
1537 z = _PyLong_New(0);
1538 Py_DECREF(a);
1539 Py_DECREF(b);
1540 return (PyObject *)z;
1541 }
1542 loshift = shiftby % SHIFT;
1543 hishift = SHIFT - loshift;
1544 lomask = ((digit)1 << hishift) - 1;
1545 himask = MASK ^ lomask;
1546 z = _PyLong_New(newsize);
1547 if (z == NULL)
1548 goto rshift_error;
1549 if (a->ob_size < 0)
1550 z->ob_size = -(z->ob_size);
1551 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1552 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1553 if (i+1 < newsize)
1554 z->ob_digit[i] |=
1555 (a->ob_digit[j+1] << hishift) & himask;
1556 }
1557 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001558 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001559rshift_error:
1560 Py_DECREF(a);
1561 Py_DECREF(b);
1562 return (PyObject *) z;
1563
Guido van Rossumc6913e71991-11-19 20:26:46 +00001564}
1565
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001566static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001567long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001568{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001569 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001570 PyLongObject *a, *b;
1571 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001572 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001573 int oldsize, newsize, wordshift, remshift, i, j;
1574 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001575
Neil Schemenauerba872e22001-01-04 01:46:03 +00001576 CONVERT_BINOP(v, w, &a, &b);
1577
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001578 shiftby = PyLong_AsLong((PyObject *)b);
1579 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001580 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001581 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001583 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001584 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001585 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001586 PyErr_SetString(PyExc_ValueError,
1587 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001588 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001589 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001590 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1591 wordshift = (int)shiftby / SHIFT;
1592 remshift = (int)shiftby - wordshift * SHIFT;
1593
1594 oldsize = ABS(a->ob_size);
1595 newsize = oldsize + wordshift;
1596 if (remshift)
1597 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001598 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001599 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001600 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001601 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001602 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001603 for (i = 0; i < wordshift; i++)
1604 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001605 accum = 0;
1606 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1607 accum |= a->ob_digit[j] << remshift;
1608 z->ob_digit[i] = (digit)(accum & MASK);
1609 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001610 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001611 if (remshift)
1612 z->ob_digit[newsize-1] = (digit)accum;
1613 else
1614 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001615 z = long_normalize(z);
1616lshift_error:
1617 Py_DECREF(a);
1618 Py_DECREF(b);
1619 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001620}
1621
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001622
1623/* Bitwise and/xor/or operations */
1624
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001625#define MAX(x, y) ((x) < (y) ? (y) : (x))
1626#define MIN(x, y) ((x) > (y) ? (y) : (x))
1627
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001628static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001629long_bitwise(PyLongObject *a,
1630 int op, /* '&', '|', '^' */
1631 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001632{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001633 digit maska, maskb; /* 0 or MASK */
1634 int negz;
1635 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001636 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001637 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001638 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001640
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001641 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001642 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001643 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001644 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001645 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001646 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001647 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001648 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001649 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001650 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001651 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001652 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001653 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001654 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001655 maskb = 0;
1656 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001657
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001658 negz = 0;
1659 switch (op) {
1660 case '^':
1661 if (maska != maskb) {
1662 maska ^= MASK;
1663 negz = -1;
1664 }
1665 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001666 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001667 if (maska && maskb) {
1668 op = '|';
1669 maska ^= MASK;
1670 maskb ^= MASK;
1671 negz = -1;
1672 }
1673 break;
1674 case '|':
1675 if (maska || maskb) {
1676 op = '&';
1677 maska ^= MASK;
1678 maskb ^= MASK;
1679 negz = -1;
1680 }
1681 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001682 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001683
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001684 /* JRH: The original logic here was to allocate the result value (z)
1685 as the longer of the two operands. However, there are some cases
1686 where the result is guaranteed to be shorter than that: AND of two
1687 positives, OR of two negatives: use the shorter number. AND with
1688 mixed signs: use the positive number. OR with mixed signs: use the
1689 negative number. After the transformations above, op will be '&'
1690 iff one of these cases applies, and mask will be non-0 for operands
1691 whose length should be ignored.
1692 */
1693
1694 size_a = a->ob_size;
1695 size_b = b->ob_size;
1696 size_z = op == '&'
1697 ? (maska
1698 ? size_b
1699 : (maskb ? size_a : MIN(size_a, size_b)))
1700 : MAX(size_a, size_b);
1701 z = _PyLong_New(size_z);
1702 if (a == NULL || b == NULL || z == NULL) {
1703 Py_XDECREF(a);
1704 Py_XDECREF(b);
1705 Py_XDECREF(z);
1706 return NULL;
1707 }
1708
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001709 for (i = 0; i < size_z; ++i) {
1710 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1711 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1712 switch (op) {
1713 case '&': z->ob_digit[i] = diga & digb; break;
1714 case '|': z->ob_digit[i] = diga | digb; break;
1715 case '^': z->ob_digit[i] = diga ^ digb; break;
1716 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001717 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001718
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001719 Py_DECREF(a);
1720 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001721 z = long_normalize(z);
1722 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001723 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001724 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001725 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001726 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001727}
1728
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001729static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001730long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001731{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001732 PyLongObject *a, *b;
1733 PyObject *c;
1734 CONVERT_BINOP(v, w, &a, &b);
1735 c = long_bitwise(a, '&', b);
1736 Py_DECREF(a);
1737 Py_DECREF(b);
1738 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001739}
1740
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001741static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001742long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001743{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001744 PyLongObject *a, *b;
1745 PyObject *c;
1746 CONVERT_BINOP(v, w, &a, &b);
1747 c = long_bitwise(a, '^', b);
1748 Py_DECREF(a);
1749 Py_DECREF(b);
1750 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001751}
1752
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001753static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001754long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001755{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001756 PyLongObject *a, *b;
1757 PyObject *c;
1758 CONVERT_BINOP(v, w, &a, &b);
1759 c = long_bitwise(a, '|', b);
1760 Py_DECREF(a);
1761 Py_DECREF(b);
1762 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001763}
1764
Guido van Rossum234f9421993-06-17 12:35:49 +00001765static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001766long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001767{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001768 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001769 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001770 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001771 return 0;
1772 }
1773 return 1; /* Can't do it */
1774}
1775
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001776static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001777long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001778{
1779 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001780 x = PyLong_AsLong(v);
1781 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001782 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001783 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001784}
1785
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001786static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001787long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001788{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001789 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001790 return v;
1791}
1792
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001793static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001794long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001795{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001796 double result;
1797 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001798 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001799 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001800 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001801}
1802
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001803static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001804long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001805{
Fred Drake121ee271999-12-23 15:41:28 +00001806 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001807}
1808
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001809static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001810long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001811{
Fred Drake121ee271999-12-23 15:41:28 +00001812 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001813}
1814
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001815static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00001816 (binaryfunc) long_add, /*nb_add*/
1817 (binaryfunc) long_sub, /*nb_subtract*/
1818 (binaryfunc) long_mul, /*nb_multiply*/
1819 (binaryfunc) long_div, /*nb_divide*/
1820 (binaryfunc) long_mod, /*nb_remainder*/
1821 (binaryfunc) long_divmod, /*nb_divmod*/
1822 (ternaryfunc) long_pow, /*nb_power*/
1823 (unaryfunc) long_neg, /*nb_negative*/
1824 (unaryfunc) long_pos, /*tp_positive*/
1825 (unaryfunc) long_abs, /*tp_absolute*/
1826 (inquiry) long_nonzero, /*tp_nonzero*/
1827 (unaryfunc) long_invert, /*nb_invert*/
1828 (binaryfunc) long_lshift, /*nb_lshift*/
1829 (binaryfunc) long_rshift, /*nb_rshift*/
1830 (binaryfunc) long_and, /*nb_and*/
1831 (binaryfunc) long_xor, /*nb_xor*/
1832 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001833 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001834 (unaryfunc) long_int, /*nb_int*/
1835 (unaryfunc) long_long, /*nb_long*/
1836 (unaryfunc) long_float, /*nb_float*/
1837 (unaryfunc) long_oct, /*nb_oct*/
1838 (unaryfunc) long_hex, /*nb_hex*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00001839 0, /*nb_inplace_add*/
1840 0, /*nb_inplace_subtract*/
1841 0, /*nb_inplace_multiply*/
1842 0, /*nb_inplace_divide*/
1843 0, /*nb_inplace_remainder*/
1844 0, /*nb_inplace_power*/
1845 0, /*nb_inplace_lshift*/
1846 0, /*nb_inplace_rshift*/
1847 0, /*nb_inplace_and*/
1848 0, /*nb_inplace_xor*/
1849 0, /*nb_inplace_or*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001850};
1851
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001852PyTypeObject PyLong_Type = {
1853 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001854 0,
1855 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001856 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001857 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00001858 (destructor)long_dealloc, /*tp_dealloc*/
1859 0, /*tp_print*/
1860 0, /*tp_getattr*/
1861 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001862 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001863 (reprfunc)long_repr, /*tp_repr*/
1864 &long_as_number, /*tp_as_number*/
1865 0, /*tp_as_sequence*/
1866 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001867 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001868 0, /*tp_call*/
1869 (reprfunc)long_str, /*tp_str*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00001870 0, /*tp_getattro*/
1871 0, /*tp_setattro*/
1872 0, /*tp_as_buffer*/
Guido van Rossum6fd867b2001-01-17 15:33:18 +00001873 Py_TPFLAGS_CHECKTYPES /*tp_flags*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001874};