blob: c67d48fb976628e49d893184df6875e31a4bc587 [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumedcc38a1991-05-05 20:09:44 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumedcc38a1991-05-05 20:09:44 +00009******************************************************************/
10
11/* Long (arbitrary precision) integer object implementation */
12
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000013/* XXX The functional organization of this file is terrible */
14
Guido van Rossumc0b618a1997-05-02 03:12:38 +000015#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +000016#include "longintrepr.h"
Guido van Rossum687ec181995-03-04 22:43:47 +000017#include "mymath.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +000018
Guido van Rossumedcc38a1991-05-05 20:09:44 +000019#include <assert.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000020#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000021
Guido van Rossume32e0141992-01-19 16:31:05 +000022#define ABS(x) ((x) < 0 ? -(x) : (x))
23
24/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000025static PyLongObject *long_normalize Py_PROTO((PyLongObject *));
26static PyLongObject *mul1 Py_PROTO((PyLongObject *, wdigit));
27static PyLongObject *muladd1 Py_PROTO((PyLongObject *, wdigit, wdigit));
28static PyLongObject *divrem1 Py_PROTO((PyLongObject *, wdigit, digit *));
Fred Drake121ee271999-12-23 15:41:28 +000029static PyObject *long_format Py_PROTO((PyObject *aa, int base, int addL));
Guido van Rossume32e0141992-01-19 16:31:05 +000030
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000031static int ticker; /* XXX Could be shared with ceval? */
32
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000034 if (--ticker < 0) { \
35 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000036 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000037 }
38
Guido van Rossumedcc38a1991-05-05 20:09:44 +000039/* Normalize (remove leading zeros from) a long int object.
40 Doesn't attempt to free the storage--in most cases, due to the nature
41 of the algorithms used, this could save at most be one word anyway. */
42
Guido van Rossumc0b618a1997-05-02 03:12:38 +000043static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +000044long_normalize(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000046{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000047 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000048 register int i = j;
49
50 while (i > 0 && v->ob_digit[i-1] == 0)
51 --i;
52 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000053 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000054 return v;
55}
56
57/* Allocate a new long int object with size digits.
58 Return NULL and set exception if we run out of memory. */
59
Guido van Rossumc0b618a1997-05-02 03:12:38 +000060PyLongObject *
61_PyLong_New(size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000062 int size;
63{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000065}
66
67/* Create a new long int object from a C long int */
68
Guido van Rossumc0b618a1997-05-02 03:12:38 +000069PyObject *
70PyLong_FromLong(ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000071 long ival;
72{
Guido van Rossum472c04f1996-12-05 21:57:21 +000073 /* Assume a C long fits in at most 5 'digits' */
74 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075 PyLongObject *v = _PyLong_New(5);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000076 if (v != NULL) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000077 unsigned long t = ival;
78 int i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000079 if (ival < 0) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000080 t = -ival;
Guido van Rossum4c260ff1992-01-14 18:36:43 +000081 v->ob_size = -(v->ob_size);
Guido van Rossum472c04f1996-12-05 21:57:21 +000082 }
83 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +000084 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000085 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000087 v = long_normalize(v);
88 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000090}
91
Guido van Rossum53756b11997-01-03 17:14:46 +000092/* Create a new long int object from a C unsigned long int */
93
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094PyObject *
Guido van Rossum53756b11997-01-03 17:14:46 +000095PyLong_FromUnsignedLong(ival)
96 unsigned long ival;
97{
98 /* Assume a C long fits in at most 5 'digits' */
99 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 PyLongObject *v = _PyLong_New(5);
Guido van Rossum53756b11997-01-03 17:14:46 +0000101 if (v != NULL) {
102 unsigned long t = ival;
103 int i;
104 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000105 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum53756b11997-01-03 17:14:46 +0000106 t >>= SHIFT;
107 }
108 v = long_normalize(v);
109 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000111}
112
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000113/* Create a new long int object from a C double */
114
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyObject *
Guido van Rossum687ec181995-03-04 22:43:47 +0000116#ifdef MPW
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000117PyLong_FromDouble(double dval)
Guido van Rossum687ec181995-03-04 22:43:47 +0000118#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119PyLong_FromDouble(dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000120 double dval;
Guido van Rossum687ec181995-03-04 22:43:47 +0000121#endif /* MPW */
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000122{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000124 double frac;
125 int i, ndig, expo, neg;
126 neg = 0;
Guido van Rossum1a23c241999-09-27 17:11:52 +0000127 if (dval && dval * 0.5 == dval) {
128 PyErr_SetString(PyExc_OverflowError,
129 "cannot convert float infinity to long");
130 return NULL;
131 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000132 if (dval < 0.0) {
133 neg = 1;
134 dval = -dval;
135 }
136 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
137 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000139 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000141 if (v == NULL)
142 return NULL;
143 frac = ldexp(frac, (expo-1) % SHIFT + 1);
144 for (i = ndig; --i >= 0; ) {
145 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000146 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000147 frac = frac - (double)bits;
148 frac = ldexp(frac, SHIFT);
149 }
150 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000151 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000153}
154
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000155/* Get a C long int from a long int object.
156 Returns -1 and sets an error condition if overflow occurs. */
157
158long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159PyLong_AsLong(vv)
160 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000161{
Guido van Rossumf7531811998-05-26 14:33:37 +0000162 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000164 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000165 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000166
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 if (vv == NULL || !PyLong_Check(vv)) {
168 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000169 return -1;
170 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000172 i = v->ob_size;
173 sign = 1;
174 x = 0;
175 if (i < 0) {
176 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000177 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000178 }
179 while (--i >= 0) {
180 prev = x;
181 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000182 if ((x >> SHIFT) != prev)
183 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000184 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000185 /* Haven't lost any bits, but if the sign bit is set we're in
186 * trouble *unless* this is the min negative number. So,
187 * trouble iff sign bit set && (positive || some bit set other
188 * than the sign bit).
189 */
190 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
191 goto overflow;
192 return (long)x * sign;
193
194 overflow:
195 PyErr_SetString(PyExc_OverflowError,
196 "long int too long to convert");
197 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000198}
199
Guido van Rossum53756b11997-01-03 17:14:46 +0000200/* Get a C long int from a long int object.
201 Returns -1 and sets an error condition if overflow occurs. */
202
203unsigned long
204PyLong_AsUnsignedLong(vv)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 PyObject *vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000206{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000208 unsigned long x, prev;
209 int i;
210
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000211 if (vv == NULL || !PyLong_Check(vv)) {
212 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000213 return (unsigned long) -1;
214 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000216 i = v->ob_size;
217 x = 0;
218 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000219 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000220 "can't convert negative value to unsigned long");
221 return (unsigned long) -1;
222 }
223 while (--i >= 0) {
224 prev = x;
225 x = (x << SHIFT) + v->ob_digit[i];
226 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000228 "long int too long to convert");
229 return (unsigned long) -1;
230 }
231 }
232 return x;
233}
234
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000235/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000236
237double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000238PyLong_AsDouble(vv)
239 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000240{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000242 double x;
243 double multiplier = (double) (1L << SHIFT);
244 int i, sign;
245
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246 if (vv == NULL || !PyLong_Check(vv)) {
247 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000248 return -1;
249 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000250 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000251 i = v->ob_size;
252 sign = 1;
253 x = 0.0;
254 if (i < 0) {
255 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000256 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000257 }
258 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000259 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000260 }
261 return x * sign;
262}
263
Guido van Rossum78694d91998-09-18 14:14:13 +0000264/* Create a new long (or int) object from a C pointer */
265
266PyObject *
267PyLong_FromVoidPtr(p)
268 void *p;
269{
270#if SIZEOF_VOID_P == SIZEOF_LONG
271 return PyInt_FromLong((long)p);
272#else
273 /* optimize null pointers */
274 if ( p == NULL )
275 return PyInt_FromLong(0);
276
277 /* we can assume that HAVE_LONG_LONG is true. if not, then the
278 configuration process should have bailed (having big pointers
279 without long longs seems non-sensical) */
280 return PyLong_FromLongLong((LONG_LONG)p);
281#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
282}
283
284/* Get a C pointer from a long object (or an int object in some cases) */
285
286void *
287PyLong_AsVoidPtr(vv)
288 PyObject *vv;
289{
290 /* This function will allow int or long objects. If vv is neither,
291 then the PyLong_AsLong*() functions will raise the exception:
292 PyExc_SystemError, "bad argument to internal function"
293 */
294
295#if SIZEOF_VOID_P == SIZEOF_LONG
296 long x;
297
298 if ( PyInt_Check(vv) )
299 x = PyInt_AS_LONG(vv);
300 else
301 x = PyLong_AsLong(vv);
302#else
303 /* we can assume that HAVE_LONG_LONG is true. if not, then the
304 configuration process should have bailed (having big pointers
305 without long longs seems non-sensical) */
306 LONG_LONG x;
307
308 if ( PyInt_Check(vv) )
309 x = PyInt_AS_LONG(vv);
310 else
311 x = PyLong_AsLongLong(vv);
312#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
313
314 if (x == -1 && PyErr_Occurred())
315 return NULL;
316 return (void *)x;
317}
318
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000319#ifdef HAVE_LONG_LONG
320/*
Guido van Rossum3293b071998-08-25 16:07:15 +0000321 * LONG_LONG support by Chris Herborth (chrish@qnx.com)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000322 *
323 * For better or worse :-), I tried to follow the coding style already
324 * here.
325 */
326
Guido van Rossum3293b071998-08-25 16:07:15 +0000327/* Create a new long int object from a C LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000328
329PyObject *
330PyLong_FromLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000331 LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000332{
333#if SIZEOF_LONG_LONG == SIZEOF_LONG
334 /* In case the compiler is faking it. */
335 return PyLong_FromLong( (long)ival );
336#else
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000337 if ((LONG_LONG)LONG_MIN <= ival && ival <= (LONG_LONG)LONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000338 return PyLong_FromLong( (long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000339 }
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000340 else if (0 <= ival && ival <= (unsigned LONG_LONG)ULONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000341 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000342 }
343 else {
Guido van Rossum3293b071998-08-25 16:07:15 +0000344 /* Assume a C LONG_LONG fits in at most 10 'digits'.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000345 * Should be OK if we're assuming long fits in 5.
346 */
347 PyLongObject *v = _PyLong_New(10);
348
349 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000350 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000351 int i;
352 if (ival < 0) {
353 t = -ival;
354 v->ob_size = -(v->ob_size);
355 }
356
357 for (i = 0; i < 10; i++) {
358 v->ob_digit[i] = (digit) (t & MASK);
359 t >>= SHIFT;
360 }
361
362 v = long_normalize(v);
363 }
364
365 return (PyObject *)v;
366 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000367#endif
368}
369
Guido van Rossum3293b071998-08-25 16:07:15 +0000370/* Create a new long int object from a C unsigned LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000371PyObject *
372PyLong_FromUnsignedLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000373 unsigned LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000374{
375#if SIZEOF_LONG_LONG == SIZEOF_LONG
376 /* In case the compiler is faking it. */
377 return PyLong_FromUnsignedLong( (unsigned long)ival );
378#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000379 if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000380 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000381 }
382 else {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000383 /* Assume a C long fits in at most 10 'digits'. */
384 PyLongObject *v = _PyLong_New(10);
385
386 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000387 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000388 int i;
389 for (i = 0; i < 10; i++) {
390 v->ob_digit[i] = (digit) (t & MASK);
391 t >>= SHIFT;
392 }
393
394 v = long_normalize(v);
395 }
396
397 return (PyObject *)v;
398 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000399#endif
400}
401
Guido van Rossum3293b071998-08-25 16:07:15 +0000402/* Get a C LONG_LONG int from a long int object.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000403 Returns -1 and sets an error condition if overflow occurs. */
404
Guido van Rossum3293b071998-08-25 16:07:15 +0000405LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000406PyLong_AsLongLong(vv)
407 PyObject *vv;
408{
409#if SIZEOF_LONG_LONG == SIZEOF_LONG
410 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000411 return (LONG_LONG)PyLong_AsLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000412#else
413 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000414 LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000415 int i, sign;
416
417 if (vv == NULL || !PyLong_Check(vv)) {
418 PyErr_BadInternalCall();
419 return -1;
420 }
421
422 v = (PyLongObject *)vv;
423 i = v->ob_size;
424 sign = 1;
425 x = 0;
426
427 if (i < 0) {
428 sign = -1;
429 i = -(i);
430 }
431
432 while (--i >= 0) {
433 prev = x;
434 x = (x << SHIFT) + v->ob_digit[i];
435 if ((x >> SHIFT) != prev) {
436 PyErr_SetString(PyExc_OverflowError,
437 "long int too long to convert");
438 return -1;
439 }
440 }
441
442 return x * sign;
443#endif
444}
445
Guido van Rossum3293b071998-08-25 16:07:15 +0000446unsigned LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000447PyLong_AsUnsignedLongLong(vv)
448 PyObject *vv;
449{
450#if SIZEOF_LONG_LONG == 4
451 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000452 return (unsigned LONG_LONG)PyLong_AsUnsignedLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000453#else
454 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000455 unsigned LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000456 int i;
457
458 if (vv == NULL || !PyLong_Check(vv)) {
459 PyErr_BadInternalCall();
Guido van Rossum3293b071998-08-25 16:07:15 +0000460 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000461 }
462
463 v = (PyLongObject *)vv;
464 i = v->ob_size;
465 x = 0;
466
467 if (i < 0) {
468 PyErr_SetString(PyExc_OverflowError,
469 "can't convert negative value to unsigned long");
Guido van Rossum3293b071998-08-25 16:07:15 +0000470 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000471 }
472
473 while (--i >= 0) {
474 prev = x;
475 x = (x << SHIFT) + v->ob_digit[i];
476 if ((x >> SHIFT) != prev) {
477 PyErr_SetString(PyExc_OverflowError,
478 "long int too long to convert");
Guido van Rossum3293b071998-08-25 16:07:15 +0000479 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000480 }
481 }
482
483 return x;
484#endif
485}
486#endif /* HAVE_LONG_LONG */
487
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000488/* Multiply by a single digit, ignoring the sign. */
489
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000491mul1(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000493 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000494{
495 return muladd1(a, n, (digit)0);
496}
497
498/* Multiply by a single digit and add a single digit, ignoring the sign. */
499
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000500static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000501muladd1(a, n, extra)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000503 wdigit n;
504 wdigit extra;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000505{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000506 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000508 twodigits carry = extra;
509 int i;
510
511 if (z == NULL)
512 return NULL;
513 for (i = 0; i < size_a; ++i) {
514 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000515 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000516 carry >>= SHIFT;
517 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000518 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000519 return long_normalize(z);
520}
521
522/* Divide a long integer by a digit, returning both the quotient
523 (as function result) and the remainder (through *prem).
524 The sign of a is ignored; n should not be zero. */
525
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000526static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000527divrem1(a, n, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000529 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000530 digit *prem;
531{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000532 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000534 int i;
535 twodigits rem = 0;
536
537 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000539 if (z == NULL)
540 return NULL;
541 for (i = size; --i >= 0; ) {
542 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000543 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000544 rem %= n;
545 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000546 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000547 return long_normalize(z);
548}
549
550/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000551 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000552 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000553
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554static PyObject *
Fred Drake121ee271999-12-23 15:41:28 +0000555long_format(aa, base, addL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 PyObject *aa;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000557 int base;
Fred Drake121ee271999-12-23 15:41:28 +0000558 int addL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000559{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 register PyLongObject *a = (PyLongObject *)aa;
561 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000562 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000563 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000564 char *p;
565 int bits;
566 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000567
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568 if (a == NULL || !PyLong_Check(a)) {
569 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000570 return NULL;
571 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000572 assert(base >= 2 && base <= 36);
573
574 /* Compute a rough upper bound for the length of the string */
575 i = base;
576 bits = 0;
577 while (i > 1) {
578 ++bits;
579 i >>= 1;
580 }
Fred Drake121ee271999-12-23 15:41:28 +0000581 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000583 if (str == NULL)
584 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000586 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000587 if (addL)
588 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000589 if (a->ob_size < 0)
590 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000591
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000592 if (a->ob_size == 0) {
593 *--p = '0';
594 }
595 else if ((base & (base - 1)) == 0) {
596 /* JRH: special case for power-of-2 bases */
597 twodigits temp = a->ob_digit[0];
598 int bitsleft = SHIFT;
599 int rem;
600 int last = abs(a->ob_size);
601 int basebits = 1;
602 i = base;
603 while ((i >>= 1) > 1) ++basebits;
604
605 i = 0;
606 for (;;) {
607 while (bitsleft >= basebits) {
608 if ((temp == 0) && (i >= last - 1)) break;
609 rem = temp & (base - 1);
610 if (rem < 10)
611 rem += '0';
612 else
613 rem += 'A' - 10;
614 assert(p > PyString_AS_STRING(str));
615 *--p = (char) rem;
616 bitsleft -= basebits;
617 temp >>= basebits;
618 }
619 if (++i >= last) {
620 if (temp == 0) break;
621 bitsleft = 99;
622 /* loop again to pick up final digits */
623 }
624 else {
625 temp = (a->ob_digit[i] << bitsleft) | temp;
626 bitsleft += SHIFT;
627 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000628 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000629 }
630 else {
631 Py_INCREF(a);
632 do {
633 digit rem;
634 PyLongObject *temp = divrem1(a, (digit)base, &rem);
635 if (temp == NULL) {
636 Py_DECREF(a);
637 Py_DECREF(str);
638 return NULL;
639 }
640 if (rem < 10)
641 rem += '0';
642 else
643 rem += 'A'-10;
644 assert(p > PyString_AS_STRING(str));
645 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000647 a = temp;
648 SIGCHECK({
649 Py_DECREF(a);
650 Py_DECREF(str);
651 return NULL;
652 })
653 } while (ABS(a->ob_size) != 0);
654 Py_DECREF(a);
655 }
656
Guido van Rossum2c475421992-08-14 15:13:07 +0000657 if (base == 8) {
658 if (size_a != 0)
659 *--p = '0';
660 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000661 else if (base == 16) {
662 *--p = 'x';
663 *--p = '0';
664 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000665 else if (base != 10) {
666 *--p = '#';
667 *--p = '0' + base%10;
668 if (base > 10)
669 *--p = '0' + base/10;
670 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000671 if (sign)
672 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673 if (p != PyString_AS_STRING(str)) {
674 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000675 assert(p > q);
676 do {
677 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000678 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000679 _PyString_Resize((PyObject **)&str,
680 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000681 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000683}
684
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000685#if 0
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000686/* Convert a string to a long int object, in a given base.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000687 Base zero implies a default depending on the number.
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000688 External linkage: used in compile.c and stropmodule.c. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000689
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000691long_scan(str, base)
692 char *str;
693 int base;
694{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695 return PyLong_FromString(str, (char **)NULL, base);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000696}
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000697#endif
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000698
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000699PyObject *
700PyLong_FromString(str, pend, base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000701 char *str;
702 char **pend;
703 int base;
704{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000705 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000706 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000708
Guido van Rossum472c04f1996-12-05 21:57:21 +0000709 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 PyErr_SetString(PyExc_ValueError,
711 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000712 return NULL;
713 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000714 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000715 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000716 if (*str == '+')
717 ++str;
718 else if (*str == '-') {
719 ++str;
720 sign = -1;
721 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000722 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000723 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000724 if (base == 0) {
725 if (str[0] != '0')
726 base = 10;
727 else if (str[1] == 'x' || str[1] == 'X')
728 base = 16;
729 else
730 base = 8;
731 }
732 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
733 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000734 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000735 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000736 for ( ; z != NULL; ++str) {
737 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000738 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000739
740 if (*str <= '9')
741 k = *str - '0';
742 else if (*str >= 'a')
743 k = *str - 'a' + 10;
744 else if (*str >= 'A')
745 k = *str - 'A' + 10;
746 if (k < 0 || k >= base)
747 break;
748 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000749 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000750 z = temp;
751 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000752 if (z == NULL)
753 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000754 if (str == start)
755 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000756 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000757 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000758 if (*str == 'L' || *str == 'l')
759 str++;
760 while (*str && isspace(Py_CHARMASK(*str)))
761 str++;
762 if (*str != '\0')
763 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000764 if (pend)
765 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000767
768 onError:
769 PyErr_Format(PyExc_ValueError,
770 "invalid literal for long(): %.200s", orig_str);
771 Py_XDECREF(z);
772 return NULL;
773}
774
775PyObject *
776PyLong_FromUnicode(u, length, base)
777 Py_UNICODE *u;
778 int length;
779 int base;
780{
781 char buffer[256];
782
783 if (length >= sizeof(buffer)) {
784 PyErr_SetString(PyExc_ValueError,
785 "long() literal too large to convert");
786 return NULL;
787 }
788 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
789 return NULL;
790
791 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000792}
793
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794static PyLongObject *x_divrem
795 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject **));
796static PyObject *long_pos Py_PROTO((PyLongObject *));
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000797static int long_divrem Py_PROTO((PyLongObject *, PyLongObject *,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 PyLongObject **, PyLongObject **));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000799
800/* Long division with remainder, top-level routine */
801
Guido van Rossume32e0141992-01-19 16:31:05 +0000802static int
803long_divrem(a, b, pdiv, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 PyLongObject *a, *b;
805 PyLongObject **pdiv;
806 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000807{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000808 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000810
811 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000812 PyErr_SetString(PyExc_ZeroDivisionError,
813 "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000814 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000815 }
816 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000817 (size_a == size_b &&
818 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000819 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000820 *pdiv = _PyLong_New(0);
821 Py_INCREF(a);
822 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000823 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000824 }
825 if (size_b == 1) {
826 digit rem = 0;
827 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000828 if (z == NULL)
829 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000831 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000832 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000833 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000834 if (z == NULL)
835 return -1;
836 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000837 /* Set the signs.
838 The quotient z has the sign of a*b;
839 the remainder r has the sign of a,
840 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000841 if ((a->ob_size < 0) != (b->ob_size < 0))
842 z->ob_size = -(z->ob_size);
843 if (a->ob_size < 0 && (*prem)->ob_size != 0)
844 (*prem)->ob_size = -((*prem)->ob_size);
845 *pdiv = z;
846 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000847}
848
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000849/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000850
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000851static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000852x_divrem(v1, w1, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 PyLongObject *v1, *w1;
854 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000855{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000856 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000857 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 PyLongObject *v = mul1(v1, d);
859 PyLongObject *w = mul1(w1, d);
860 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000861 int j, k;
862
863 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000864 Py_XDECREF(v);
865 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000866 return NULL;
867 }
868
869 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000870 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000871 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000872
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000873 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000875
876 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
877 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
878 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000879 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000880 int i;
881
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000882 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000883 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000884 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000885 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000886 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000887 if (vj == w->ob_digit[size_w-1])
888 q = MASK;
889 else
890 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
891 w->ob_digit[size_w-1];
892
893 while (w->ob_digit[size_w-2]*q >
894 ((
895 ((twodigits)vj << SHIFT)
896 + v->ob_digit[j-1]
897 - q*w->ob_digit[size_w-1]
898 ) << SHIFT)
899 + v->ob_digit[j-2])
900 --q;
901
902 for (i = 0; i < size_w && i+k < size_v; ++i) {
903 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000904 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000905 carry += v->ob_digit[i+k] - z
906 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000907 v->ob_digit[i+k] = carry & MASK;
908 carry = (carry >> SHIFT) - zz;
909 }
910
911 if (i+k < size_v) {
912 carry += v->ob_digit[i+k];
913 v->ob_digit[i+k] = 0;
914 }
915
916 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000917 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000918 else {
919 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000920 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000921 carry = 0;
922 for (i = 0; i < size_w && i+k < size_v; ++i) {
923 carry += v->ob_digit[i+k] + w->ob_digit[i];
924 v->ob_digit[i+k] = carry & MASK;
925 carry >>= SHIFT;
926 }
927 }
928 } /* for j, k */
929
Guido van Rossumc206c761995-01-10 15:23:19 +0000930 if (a == NULL)
931 *prem = NULL;
932 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000933 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000934 *prem = divrem1(v, d, &d);
935 /* d receives the (unused) remainder */
936 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000938 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000939 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000940 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941 Py_DECREF(v);
942 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000943 return a;
944}
945
946/* Methods */
947
Guido van Rossume32e0141992-01-19 16:31:05 +0000948/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949static void long_dealloc Py_PROTO((PyObject *));
950static PyObject *long_repr Py_PROTO((PyObject *));
951static int long_compare Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossum065ce5a1998-09-13 15:37:20 +0000952static long long_hash Py_PROTO((PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000953
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000954static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *));
955static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *));
956static PyObject *long_mul Py_PROTO((PyLongObject *, PyLongObject *));
957static PyObject *long_div Py_PROTO((PyLongObject *, PyLongObject *));
958static PyObject *long_mod Py_PROTO((PyLongObject *, PyLongObject *));
959static PyObject *long_divmod Py_PROTO((PyLongObject *, PyLongObject *));
960static PyObject *long_pow
961 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject *));
962static PyObject *long_neg Py_PROTO((PyLongObject *));
963static PyObject *long_pos Py_PROTO((PyLongObject *));
964static PyObject *long_abs Py_PROTO((PyLongObject *));
965static int long_nonzero Py_PROTO((PyLongObject *));
966static PyObject *long_invert Py_PROTO((PyLongObject *));
967static PyObject *long_lshift Py_PROTO((PyLongObject *, PyLongObject *));
968static PyObject *long_rshift Py_PROTO((PyLongObject *, PyLongObject *));
969static PyObject *long_and Py_PROTO((PyLongObject *, PyLongObject *));
970static PyObject *long_xor Py_PROTO((PyLongObject *, PyLongObject *));
971static PyObject *long_or Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000972
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000973static void
974long_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000976{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000977 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000978}
979
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000980static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000981long_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000983{
Fred Drake121ee271999-12-23 15:41:28 +0000984 return long_format(v, 10, 1);
985}
986
987static PyObject *
988long_str(v)
989 PyObject *v;
990{
991 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000992}
993
994static int
995long_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000997{
998 int sign;
999
Guido van Rossumc6913e71991-11-19 20:26:46 +00001000 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001001 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001002 sign = 0;
1003 else
1004 sign = a->ob_size - b->ob_size;
1005 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001006 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001007 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001008 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1009 ;
1010 if (i < 0)
1011 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001012 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001013 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001014 if (a->ob_size < 0)
1015 sign = -sign;
1016 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001017 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001018 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001019}
1020
Guido van Rossum9bfef441993-03-29 10:43:31 +00001021static long
1022long_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 PyLongObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001024{
1025 long x;
1026 int i, sign;
1027
1028 /* This is designed so that Python ints and longs with the
1029 same value hash to the same value, otherwise comparisons
1030 of mapping keys will turn out weird */
1031 i = v->ob_size;
1032 sign = 1;
1033 x = 0;
1034 if (i < 0) {
1035 sign = -1;
1036 i = -(i);
1037 }
1038 while (--i >= 0) {
1039 /* Force a 32-bit circular shift */
1040 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1041 x += v->ob_digit[i];
1042 }
1043 x = x * sign;
1044 if (x == -1)
1045 x = -2;
1046 return x;
1047}
1048
1049
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001050/* Add the absolute values of two long integers. */
1051
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052static PyLongObject *x_add Py_PROTO((PyLongObject *, PyLongObject *));
1053static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001054x_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001056{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001057 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001059 int i;
1060 digit carry = 0;
1061
1062 /* Ensure a is the larger of the two: */
1063 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001064 { PyLongObject *temp = a; a = b; b = temp; }
1065 { int size_temp = size_a;
1066 size_a = size_b;
1067 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001068 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001070 if (z == NULL)
1071 return NULL;
1072 for (i = 0; i < size_b; ++i) {
1073 carry += a->ob_digit[i] + b->ob_digit[i];
1074 z->ob_digit[i] = carry & MASK;
1075 /* The following assumes unsigned shifts don't
1076 propagate the sign bit. */
1077 carry >>= SHIFT;
1078 }
1079 for (; i < size_a; ++i) {
1080 carry += a->ob_digit[i];
1081 z->ob_digit[i] = carry & MASK;
1082 carry >>= SHIFT;
1083 }
1084 z->ob_digit[i] = carry;
1085 return long_normalize(z);
1086}
1087
1088/* Subtract the absolute values of two integers. */
1089
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001090static PyLongObject *x_sub Py_PROTO((PyLongObject *, PyLongObject *));
1091static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001092x_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001093 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001094{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001095 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001096 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001097 int i;
1098 int sign = 1;
1099 digit borrow = 0;
1100
1101 /* Ensure a is the larger of the two: */
1102 if (size_a < size_b) {
1103 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001104 { PyLongObject *temp = a; a = b; b = temp; }
1105 { int size_temp = size_a;
1106 size_a = size_b;
1107 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001108 }
1109 else if (size_a == size_b) {
1110 /* Find highest digit where a and b differ: */
1111 i = size_a;
1112 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1113 ;
1114 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001115 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001116 if (a->ob_digit[i] < b->ob_digit[i]) {
1117 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001118 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001119 }
1120 size_a = size_b = i+1;
1121 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001122 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001123 if (z == NULL)
1124 return NULL;
1125 for (i = 0; i < size_b; ++i) {
1126 /* The following assumes unsigned arithmetic
1127 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001128 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001129 z->ob_digit[i] = borrow & MASK;
1130 borrow >>= SHIFT;
1131 borrow &= 1; /* Keep only one sign bit */
1132 }
1133 for (; i < size_a; ++i) {
1134 borrow = a->ob_digit[i] - borrow;
1135 z->ob_digit[i] = borrow & MASK;
1136 borrow >>= SHIFT;
1137 }
1138 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001139 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001140 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001141 return long_normalize(z);
1142}
1143
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001144static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001145long_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001146 PyLongObject *a;
1147 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001148{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001149 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001150
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001151 if (a->ob_size < 0) {
1152 if (b->ob_size < 0) {
1153 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001154 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001155 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001156 }
1157 else
1158 z = x_sub(b, a);
1159 }
1160 else {
1161 if (b->ob_size < 0)
1162 z = x_sub(a, b);
1163 else
1164 z = x_add(a, b);
1165 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001166 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001167}
1168
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001169static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001170long_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001171 PyLongObject *a;
1172 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001173{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001175
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001176 if (a->ob_size < 0) {
1177 if (b->ob_size < 0)
1178 z = x_sub(a, b);
1179 else
1180 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001181 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001182 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001183 }
1184 else {
1185 if (b->ob_size < 0)
1186 z = x_add(a, b);
1187 else
1188 z = x_sub(a, b);
1189 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001191}
1192
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001193static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001194long_mul(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001195 PyLongObject *a;
1196 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001197{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001198 int size_a;
1199 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001200 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001201 int i;
1202
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001203 size_a = ABS(a->ob_size);
1204 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001205 if (size_a > size_b) {
1206 /* we are faster with the small object on the left */
1207 int hold_sa = size_a;
1208 PyLongObject *hold_a = a;
1209 size_a = size_b;
1210 size_b = hold_sa;
1211 a = b;
1212 b = hold_a;
1213 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001214 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001215 if (z == NULL)
1216 return NULL;
1217 for (i = 0; i < z->ob_size; ++i)
1218 z->ob_digit[i] = 0;
1219 for (i = 0; i < size_a; ++i) {
1220 twodigits carry = 0;
1221 twodigits f = a->ob_digit[i];
1222 int j;
1223
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001224 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001225 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001226 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001227 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001228 for (j = 0; j < size_b; ++j) {
1229 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001230 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001231 carry >>= SHIFT;
1232 }
1233 for (; carry != 0; ++j) {
1234 assert(i+j < z->ob_size);
1235 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001236 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001237 carry >>= SHIFT;
1238 }
1239 }
1240 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001241 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001242 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001243 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001244 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001245}
1246
Guido van Rossume32e0141992-01-19 16:31:05 +00001247/* The / and % operators are now defined in terms of divmod().
1248 The expression a mod b has the value a - b*floor(a/b).
1249 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001250 |a| by |b|, with the sign of a. This is also expressed
1251 as a - b*trunc(a/b), if trunc truncates towards zero.
1252 Some examples:
1253 a b a rem b a mod b
1254 13 10 3 3
1255 -13 10 -3 7
1256 13 -10 3 -7
1257 -13 -10 -3 -3
1258 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001259 have different signs. We then subtract one from the 'div'
1260 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001261
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001262static int l_divmod Py_PROTO((PyLongObject *, PyLongObject *,
1263 PyLongObject **, PyLongObject **));
Guido van Rossume32e0141992-01-19 16:31:05 +00001264static int
1265l_divmod(v, w, pdiv, pmod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001266 PyLongObject *v;
1267 PyLongObject *w;
1268 PyLongObject **pdiv;
1269 PyLongObject **pmod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001270{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001272
1273 if (long_divrem(v, w, &div, &mod) < 0)
1274 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001275 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1276 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001277 PyLongObject *temp;
1278 PyLongObject *one;
1279 temp = (PyLongObject *) long_add(mod, w);
1280 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001281 mod = temp;
1282 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001284 return -1;
1285 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001286 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001287 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001288 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1289 Py_DECREF(mod);
1290 Py_DECREF(div);
1291 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001292 return -1;
1293 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001294 Py_DECREF(one);
1295 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001296 div = temp;
1297 }
1298 *pdiv = div;
1299 *pmod = mod;
1300 return 0;
1301}
1302
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001304long_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 PyLongObject *v;
1306 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001307{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001309 if (l_divmod(v, w, &div, &mod) < 0)
1310 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311 Py_DECREF(mod);
1312 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001313}
1314
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001316long_mod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317 PyLongObject *v;
1318 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001319{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001320 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001321 if (l_divmod(v, w, &div, &mod) < 0)
1322 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001323 Py_DECREF(div);
1324 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001325}
1326
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001328long_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001329 PyLongObject *v;
1330 PyLongObject *w;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001331{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001332 PyObject *z;
1333 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001334 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001335 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001337 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001338 PyTuple_SetItem(z, 0, (PyObject *) div);
1339 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001340 }
1341 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 Py_DECREF(div);
1343 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001344 }
1345 return z;
1346}
1347
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348static PyObject *
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001349long_pow(a, b, c)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350 PyLongObject *a;
1351 PyLongObject *b;
1352 PyLongObject *c;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001353{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001354 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001355 int size_b, i;
1356
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) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359 PyErr_SetString(PyExc_ValueError,
1360 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001361 return NULL;
1362 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363 z = (PyLongObject *)PyLong_FromLong(1L);
1364 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001365 for (i = 0; i < size_b; ++i) {
1366 digit bi = b->ob_digit[i];
1367 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001368
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001369 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001370 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001371
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001372 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373 temp = (PyLongObject *)long_mul(z, a);
1374 Py_DECREF(z);
1375 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001376 if (l_divmod(temp,c,&div,&mod) < 0) {
1377 Py_DECREF(temp);
1378 z = NULL;
1379 goto error;
1380 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001381 Py_XDECREF(div);
1382 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001383 temp = mod;
1384 }
1385 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001386 if (z == NULL)
1387 break;
1388 }
1389 bi >>= 1;
1390 if (bi == 0 && i+1 == size_b)
1391 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001392 temp = (PyLongObject *)long_mul(a, a);
1393 Py_DECREF(a);
1394 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001395 if (l_divmod(temp, c, &div, &mod) < 0) {
1396 Py_DECREF(temp);
1397 z = NULL;
1398 goto error;
1399 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400 Py_XDECREF(div);
1401 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001402 temp = mod;
1403 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001404 a = temp;
1405 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001407 z = NULL;
1408 break;
1409 }
1410 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001411 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001412 break;
1413 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001414 Py_XDECREF(a);
1415 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001416 if (l_divmod(z, c, &div, &mod) < 0) {
1417 Py_DECREF(z);
1418 z = NULL;
1419 }
1420 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001421 Py_XDECREF(div);
1422 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001423 z = mod;
1424 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001425 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001426 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001428}
1429
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001430static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001431long_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001432 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001433{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001434 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001435 PyLongObject *x;
1436 PyLongObject *w;
1437 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001438 if (w == NULL)
1439 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001440 x = (PyLongObject *) long_add(v, w);
1441 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001442 if (x == NULL)
1443 return NULL;
1444 if (x->ob_size != 0)
1445 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001447}
1448
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001449static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001450long_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001451 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001452{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001453 Py_INCREF(v);
1454 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001455}
1456
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001457static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001458long_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001459 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001460{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001462 int i, n;
1463 n = ABS(v->ob_size);
1464 if (n == 0) {
1465 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466 Py_INCREF(v);
1467 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001468 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001469 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001470 if (z == NULL)
1471 return NULL;
1472 for (i = 0; i < n; i++)
1473 z->ob_digit[i] = v->ob_digit[i];
1474 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001475 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001476}
1477
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001478static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001479long_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001480 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001481{
1482 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001483 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001484 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001485 Py_INCREF(v);
1486 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001487 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001488}
1489
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001490static int
1491long_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001492 PyLongObject *v;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001493{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001494 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001495}
1496
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001497static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001498long_rshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001499 PyLongObject *a;
1500 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001501{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001502 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001503 long shiftby;
1504 int newsize, wordshift, loshift, hishift, i, j;
1505 digit lomask, himask;
1506
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001507 if (a->ob_size < 0) {
1508 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509 PyLongObject *a1, *a2, *a3;
1510 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001511 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001512 a2 = (PyLongObject *) long_rshift(a1, b);
1513 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001514 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001515 a3 = (PyLongObject *) long_invert(a2);
1516 Py_DECREF(a2);
1517 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001518 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001519
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001520 shiftby = PyLong_AsLong((PyObject *)b);
1521 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001522 return NULL;
1523 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001524 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001525 return NULL;
1526 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001527 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001528 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001529 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001530 z = _PyLong_New(0);
1531 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001532 }
1533 loshift = shiftby % SHIFT;
1534 hishift = SHIFT - loshift;
1535 lomask = ((digit)1 << hishift) - 1;
1536 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001537 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001538 if (z == NULL)
1539 return NULL;
1540 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001541 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001542 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1543 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1544 if (i+1 < newsize)
1545 z->ob_digit[i] |=
1546 (a->ob_digit[j+1] << hishift) & himask;
1547 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001548 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001549}
1550
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001551static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001552long_lshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001553 PyLongObject *a;
1554 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001555{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001556 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001557 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001558 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001559 int oldsize, newsize, wordshift, remshift, i, j;
1560 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001561
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001562 shiftby = PyLong_AsLong((PyObject *)b);
1563 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001564 return NULL;
1565 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001566 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001567 return NULL;
1568 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001569 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001570 PyErr_SetString(PyExc_ValueError,
1571 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001572 return NULL;
1573 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001574 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1575 wordshift = (int)shiftby / SHIFT;
1576 remshift = (int)shiftby - wordshift * SHIFT;
1577
1578 oldsize = ABS(a->ob_size);
1579 newsize = oldsize + wordshift;
1580 if (remshift)
1581 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001583 if (z == NULL)
1584 return NULL;
1585 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001586 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001587 for (i = 0; i < wordshift; i++)
1588 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001589 accum = 0;
1590 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1591 accum |= a->ob_digit[j] << remshift;
1592 z->ob_digit[i] = (digit)(accum & MASK);
1593 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001594 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001595 if (remshift)
1596 z->ob_digit[newsize-1] = (digit)accum;
1597 else
1598 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001599 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001600}
1601
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001602
1603/* Bitwise and/xor/or operations */
1604
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001605#define MAX(x, y) ((x) < (y) ? (y) : (x))
1606#define MIN(x, y) ((x) > (y) ? (y) : (x))
1607
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001608static PyObject *long_bitwise Py_PROTO((PyLongObject *, int, PyLongObject *));
1609static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001610long_bitwise(a, op, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001611 PyLongObject *a;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001612 int op; /* '&', '|', '^' */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001613 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001614{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001615 digit maska, maskb; /* 0 or MASK */
1616 int negz;
1617 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001618 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001619 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001620 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001621 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001622
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001623 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001624 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001625 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001626 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001627 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001628 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001629 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001630 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001631 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001632 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001633 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001634 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001635 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001636 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001637 maskb = 0;
1638 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001639
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001640 negz = 0;
1641 switch (op) {
1642 case '^':
1643 if (maska != maskb) {
1644 maska ^= MASK;
1645 negz = -1;
1646 }
1647 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001648 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001649 if (maska && maskb) {
1650 op = '|';
1651 maska ^= MASK;
1652 maskb ^= MASK;
1653 negz = -1;
1654 }
1655 break;
1656 case '|':
1657 if (maska || maskb) {
1658 op = '&';
1659 maska ^= MASK;
1660 maskb ^= MASK;
1661 negz = -1;
1662 }
1663 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001664 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001665
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001666 /* JRH: The original logic here was to allocate the result value (z)
1667 as the longer of the two operands. However, there are some cases
1668 where the result is guaranteed to be shorter than that: AND of two
1669 positives, OR of two negatives: use the shorter number. AND with
1670 mixed signs: use the positive number. OR with mixed signs: use the
1671 negative number. After the transformations above, op will be '&'
1672 iff one of these cases applies, and mask will be non-0 for operands
1673 whose length should be ignored.
1674 */
1675
1676 size_a = a->ob_size;
1677 size_b = b->ob_size;
1678 size_z = op == '&'
1679 ? (maska
1680 ? size_b
1681 : (maskb ? size_a : MIN(size_a, size_b)))
1682 : MAX(size_a, size_b);
1683 z = _PyLong_New(size_z);
1684 if (a == NULL || b == NULL || z == NULL) {
1685 Py_XDECREF(a);
1686 Py_XDECREF(b);
1687 Py_XDECREF(z);
1688 return NULL;
1689 }
1690
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001691 for (i = 0; i < size_z; ++i) {
1692 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1693 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1694 switch (op) {
1695 case '&': z->ob_digit[i] = diga & digb; break;
1696 case '|': z->ob_digit[i] = diga | digb; break;
1697 case '^': z->ob_digit[i] = diga ^ digb; break;
1698 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001699 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001700
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001701 Py_DECREF(a);
1702 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001703 z = long_normalize(z);
1704 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001705 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001706 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001707 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001708 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001709}
1710
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001711static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001712long_and(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001713 PyLongObject *a;
1714 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001715{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001716 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001717}
1718
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001719static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001720long_xor(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001721 PyLongObject *a;
1722 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001723{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001724 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001725}
1726
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001727static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001728long_or(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001729 PyLongObject *a;
1730 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001731{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001732 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001733}
1734
Guido van Rossum234f9421993-06-17 12:35:49 +00001735static int
Guido van Rossume6eefc21992-08-14 12:06:52 +00001736long_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001737 PyObject **pv;
1738 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001739{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001740 if (PyInt_Check(*pw)) {
1741 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1742 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001743 return 0;
1744 }
1745 return 1; /* Can't do it */
1746}
1747
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001748static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001749long_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001750 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001751{
1752 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001753 x = PyLong_AsLong(v);
1754 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001755 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001756 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001757}
1758
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001759static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001760long_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001761 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001762{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001763 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001764 return v;
1765}
1766
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001767static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001768long_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001769 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001770{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001771 double result;
1772 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001773 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001774 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001775 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001776}
1777
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001778static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001779long_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001780 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001781{
Fred Drake121ee271999-12-23 15:41:28 +00001782 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001783}
1784
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001785static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001786long_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001787 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001788{
Fred Drake121ee271999-12-23 15:41:28 +00001789 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001790}
1791
1792
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001793#define UF (unaryfunc)
1794#define BF (binaryfunc)
1795#define TF (ternaryfunc)
1796#define IF (inquiry)
Guido van Rossum8b27d921992-03-27 17:27:05 +00001797
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001798static PyNumberMethods long_as_number = {
Guido van Rossum8b27d921992-03-27 17:27:05 +00001799 BF long_add, /*nb_add*/
1800 BF long_sub, /*nb_subtract*/
1801 BF long_mul, /*nb_multiply*/
1802 BF long_div, /*nb_divide*/
1803 BF long_mod, /*nb_remainder*/
1804 BF long_divmod, /*nb_divmod*/
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001805 TF long_pow, /*nb_power*/
Guido van Rossum8b27d921992-03-27 17:27:05 +00001806 UF long_neg, /*nb_negative*/
1807 UF long_pos, /*tp_positive*/
1808 UF long_abs, /*tp_absolute*/
1809 IF long_nonzero,/*tp_nonzero*/
1810 UF long_invert, /*nb_invert*/
1811 BF long_lshift, /*nb_lshift*/
1812 BF long_rshift, /*nb_rshift*/
1813 BF long_and, /*nb_and*/
1814 BF long_xor, /*nb_xor*/
1815 BF long_or, /*nb_or*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001816 (int (*) Py_FPROTO((PyObject **, PyObject **)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001817 (coercion)long_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001818 UF long_int, /*nb_int*/
1819 UF long_long, /*nb_long*/
1820 UF long_float, /*nb_float*/
1821 UF long_oct, /*nb_oct*/
1822 UF long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001823};
1824
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001825PyTypeObject PyLong_Type = {
1826 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001827 0,
1828 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001829 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001830 sizeof(digit),
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001831 (destructor)long_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001832 0, /*tp_print*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001833 0, /*tp_getattr*/
1834 0, /*tp_setattr*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001835 (int (*) Py_FPROTO((PyObject *, PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001836 (cmpfunc)long_compare, /*tp_compare*/
1837 (reprfunc)long_repr, /*tp_repr*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001838 &long_as_number,/*tp_as_number*/
1839 0, /*tp_as_sequence*/
1840 0, /*tp_as_mapping*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001841 (long (*) Py_FPROTO((PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001842 (hashfunc)long_hash, /*tp_hash*/
Fred Drake121ee271999-12-23 15:41:28 +00001843 0, /*tp_call*/
1844 (reprfunc)long_str, /*tp_str*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001845};