blob: 0aecf8f8afa3d3a666b6342e43ec899ac6afba34 [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumedcc38a1991-05-05 20:09:44 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumedcc38a1991-05-05 20:09:44 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumedcc38a1991-05-05 20:09:44 +000029
30******************************************************************/
31
32/* Long (arbitrary precision) integer object implementation */
33
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000034/* XXX The functional organization of this file is terrible */
35
Guido van Rossumc0b618a1997-05-02 03:12:38 +000036#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +000037#include "longintrepr.h"
Guido van Rossum687ec181995-03-04 22:43:47 +000038#include "mymath.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +000039
Guido van Rossumedcc38a1991-05-05 20:09:44 +000040#include <assert.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000041#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000042
Guido van Rossume32e0141992-01-19 16:31:05 +000043#define ABS(x) ((x) < 0 ? -(x) : (x))
44
45/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000046static PyLongObject *long_normalize Py_PROTO((PyLongObject *));
47static PyLongObject *mul1 Py_PROTO((PyLongObject *, wdigit));
48static PyLongObject *muladd1 Py_PROTO((PyLongObject *, wdigit, wdigit));
49static PyLongObject *divrem1 Py_PROTO((PyLongObject *, wdigit, digit *));
50static PyObject *long_format Py_PROTO((PyObject *aa, int base));
Guido van Rossume32e0141992-01-19 16:31:05 +000051
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000052static int ticker; /* XXX Could be shared with ceval? */
53
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000055 if (--ticker < 0) { \
56 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000058 }
59
Guido van Rossumedcc38a1991-05-05 20:09:44 +000060/* Normalize (remove leading zeros from) a long int object.
61 Doesn't attempt to free the storage--in most cases, due to the nature
62 of the algorithms used, this could save at most be one word anyway. */
63
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +000065long_normalize(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000067{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000068 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000069 register int i = j;
70
71 while (i > 0 && v->ob_digit[i-1] == 0)
72 --i;
73 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000074 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000075 return v;
76}
77
78/* Allocate a new long int object with size digits.
79 Return NULL and set exception if we run out of memory. */
80
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081PyLongObject *
82_PyLong_New(size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000083 int size;
84{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086}
87
88/* Create a new long int object from a C long int */
89
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090PyObject *
91PyLong_FromLong(ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000092 long ival;
93{
Guido van Rossum472c04f1996-12-05 21:57:21 +000094 /* Assume a C long fits in at most 5 'digits' */
95 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 PyLongObject *v = _PyLong_New(5);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000097 if (v != NULL) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000098 unsigned long t = ival;
99 int i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000100 if (ival < 0) {
Guido van Rossum472c04f1996-12-05 21:57:21 +0000101 t = -ival;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000102 v->ob_size = -(v->ob_size);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000103 }
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 Rossum472c04f1996-12-05 21:57:21 +0000106 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000107 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000108 v = long_normalize(v);
109 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000111}
112
Guido van Rossum53756b11997-01-03 17:14:46 +0000113/* Create a new long int object from a C unsigned long int */
114
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyObject *
Guido van Rossum53756b11997-01-03 17:14:46 +0000116PyLong_FromUnsignedLong(ival)
117 unsigned long ival;
118{
119 /* Assume a C long fits in at most 5 'digits' */
120 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 PyLongObject *v = _PyLong_New(5);
Guido van Rossum53756b11997-01-03 17:14:46 +0000122 if (v != NULL) {
123 unsigned long t = ival;
124 int i;
125 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000126 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum53756b11997-01-03 17:14:46 +0000127 t >>= SHIFT;
128 }
129 v = long_normalize(v);
130 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000132}
133
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000134/* Create a new long int object from a C double */
135
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136PyObject *
Guido van Rossum687ec181995-03-04 22:43:47 +0000137#ifdef MPW
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138PyLong_FromDouble(double dval)
Guido van Rossum687ec181995-03-04 22:43:47 +0000139#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140PyLong_FromDouble(dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000141 double dval;
Guido van Rossum687ec181995-03-04 22:43:47 +0000142#endif /* MPW */
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000143{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000145 double frac;
146 int i, ndig, expo, neg;
147 neg = 0;
Guido van Rossum1a23c241999-09-27 17:11:52 +0000148 if (dval && dval * 0.5 == dval) {
149 PyErr_SetString(PyExc_OverflowError,
150 "cannot convert float infinity to long");
151 return NULL;
152 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000153 if (dval < 0.0) {
154 neg = 1;
155 dval = -dval;
156 }
157 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
158 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000160 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000162 if (v == NULL)
163 return NULL;
164 frac = ldexp(frac, (expo-1) % SHIFT + 1);
165 for (i = ndig; --i >= 0; ) {
166 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000167 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000168 frac = frac - (double)bits;
169 frac = ldexp(frac, SHIFT);
170 }
171 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000172 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000174}
175
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000176/* Get a C long int from a long int object.
177 Returns -1 and sets an error condition if overflow occurs. */
178
179long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000180PyLong_AsLong(vv)
181 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000182{
Guido van Rossumf7531811998-05-26 14:33:37 +0000183 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000185 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000186 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000187
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 if (vv == NULL || !PyLong_Check(vv)) {
189 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000190 return -1;
191 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000193 i = v->ob_size;
194 sign = 1;
195 x = 0;
196 if (i < 0) {
197 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000198 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000199 }
200 while (--i >= 0) {
201 prev = x;
202 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000203 if ((x >> SHIFT) != prev)
204 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000205 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000206 /* Haven't lost any bits, but if the sign bit is set we're in
207 * trouble *unless* this is the min negative number. So,
208 * trouble iff sign bit set && (positive || some bit set other
209 * than the sign bit).
210 */
211 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
212 goto overflow;
213 return (long)x * sign;
214
215 overflow:
216 PyErr_SetString(PyExc_OverflowError,
217 "long int too long to convert");
218 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000219}
220
Guido van Rossum53756b11997-01-03 17:14:46 +0000221/* Get a C long int from a long int object.
222 Returns -1 and sets an error condition if overflow occurs. */
223
224unsigned long
225PyLong_AsUnsignedLong(vv)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 PyObject *vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000227{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000229 unsigned long x, prev;
230 int i;
231
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 if (vv == NULL || !PyLong_Check(vv)) {
233 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000234 return (unsigned long) -1;
235 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000237 i = v->ob_size;
238 x = 0;
239 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000241 "can't convert negative value to unsigned long");
242 return (unsigned long) -1;
243 }
244 while (--i >= 0) {
245 prev = x;
246 x = (x << SHIFT) + v->ob_digit[i];
247 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000248 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000249 "long int too long to convert");
250 return (unsigned long) -1;
251 }
252 }
253 return x;
254}
255
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000256/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000257
258double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000259PyLong_AsDouble(vv)
260 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000261{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000263 double x;
264 double multiplier = (double) (1L << SHIFT);
265 int i, sign;
266
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267 if (vv == NULL || !PyLong_Check(vv)) {
268 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000269 return -1;
270 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000271 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000272 i = v->ob_size;
273 sign = 1;
274 x = 0.0;
275 if (i < 0) {
276 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000277 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000278 }
279 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000280 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000281 }
282 return x * sign;
283}
284
Guido van Rossum78694d91998-09-18 14:14:13 +0000285/* Create a new long (or int) object from a C pointer */
286
287PyObject *
288PyLong_FromVoidPtr(p)
289 void *p;
290{
291#if SIZEOF_VOID_P == SIZEOF_LONG
292 return PyInt_FromLong((long)p);
293#else
294 /* optimize null pointers */
295 if ( p == NULL )
296 return PyInt_FromLong(0);
297
298 /* we can assume that HAVE_LONG_LONG is true. if not, then the
299 configuration process should have bailed (having big pointers
300 without long longs seems non-sensical) */
301 return PyLong_FromLongLong((LONG_LONG)p);
302#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
303}
304
305/* Get a C pointer from a long object (or an int object in some cases) */
306
307void *
308PyLong_AsVoidPtr(vv)
309 PyObject *vv;
310{
311 /* This function will allow int or long objects. If vv is neither,
312 then the PyLong_AsLong*() functions will raise the exception:
313 PyExc_SystemError, "bad argument to internal function"
314 */
315
316#if SIZEOF_VOID_P == SIZEOF_LONG
317 long x;
318
319 if ( PyInt_Check(vv) )
320 x = PyInt_AS_LONG(vv);
321 else
322 x = PyLong_AsLong(vv);
323#else
324 /* we can assume that HAVE_LONG_LONG is true. if not, then the
325 configuration process should have bailed (having big pointers
326 without long longs seems non-sensical) */
327 LONG_LONG x;
328
329 if ( PyInt_Check(vv) )
330 x = PyInt_AS_LONG(vv);
331 else
332 x = PyLong_AsLongLong(vv);
333#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
334
335 if (x == -1 && PyErr_Occurred())
336 return NULL;
337 return (void *)x;
338}
339
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000340#ifdef HAVE_LONG_LONG
341/*
Guido van Rossum3293b071998-08-25 16:07:15 +0000342 * LONG_LONG support by Chris Herborth (chrish@qnx.com)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000343 *
344 * For better or worse :-), I tried to follow the coding style already
345 * here.
346 */
347
Guido van Rossum3293b071998-08-25 16:07:15 +0000348/* Create a new long int object from a C LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000349
350PyObject *
351PyLong_FromLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000352 LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000353{
354#if SIZEOF_LONG_LONG == SIZEOF_LONG
355 /* In case the compiler is faking it. */
356 return PyLong_FromLong( (long)ival );
357#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000358 if( ival <= (LONG_LONG)LONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000359 return PyLong_FromLong( (long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000360 }
Guido van Rossum3293b071998-08-25 16:07:15 +0000361 else if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000362 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000363 }
364 else {
Guido van Rossum3293b071998-08-25 16:07:15 +0000365 /* Assume a C LONG_LONG fits in at most 10 'digits'.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000366 * Should be OK if we're assuming long fits in 5.
367 */
368 PyLongObject *v = _PyLong_New(10);
369
370 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000371 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000372 int i;
373 if (ival < 0) {
374 t = -ival;
375 v->ob_size = -(v->ob_size);
376 }
377
378 for (i = 0; i < 10; i++) {
379 v->ob_digit[i] = (digit) (t & MASK);
380 t >>= SHIFT;
381 }
382
383 v = long_normalize(v);
384 }
385
386 return (PyObject *)v;
387 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000388#endif
389}
390
Guido van Rossum3293b071998-08-25 16:07:15 +0000391/* Create a new long int object from a C unsigned LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000392PyObject *
393PyLong_FromUnsignedLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000394 unsigned LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000395{
396#if SIZEOF_LONG_LONG == SIZEOF_LONG
397 /* In case the compiler is faking it. */
398 return PyLong_FromUnsignedLong( (unsigned long)ival );
399#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000400 if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000401 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000402 }
403 else {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000404 /* Assume a C long fits in at most 10 'digits'. */
405 PyLongObject *v = _PyLong_New(10);
406
407 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000408 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000409 int i;
410 for (i = 0; i < 10; i++) {
411 v->ob_digit[i] = (digit) (t & MASK);
412 t >>= SHIFT;
413 }
414
415 v = long_normalize(v);
416 }
417
418 return (PyObject *)v;
419 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000420#endif
421}
422
Guido van Rossum3293b071998-08-25 16:07:15 +0000423/* Get a C LONG_LONG int from a long int object.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000424 Returns -1 and sets an error condition if overflow occurs. */
425
Guido van Rossum3293b071998-08-25 16:07:15 +0000426LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000427PyLong_AsLongLong(vv)
428 PyObject *vv;
429{
430#if SIZEOF_LONG_LONG == SIZEOF_LONG
431 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000432 return (LONG_LONG)PyLong_AsLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000433#else
434 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000435 LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000436 int i, sign;
437
438 if (vv == NULL || !PyLong_Check(vv)) {
439 PyErr_BadInternalCall();
440 return -1;
441 }
442
443 v = (PyLongObject *)vv;
444 i = v->ob_size;
445 sign = 1;
446 x = 0;
447
448 if (i < 0) {
449 sign = -1;
450 i = -(i);
451 }
452
453 while (--i >= 0) {
454 prev = x;
455 x = (x << SHIFT) + v->ob_digit[i];
456 if ((x >> SHIFT) != prev) {
457 PyErr_SetString(PyExc_OverflowError,
458 "long int too long to convert");
459 return -1;
460 }
461 }
462
463 return x * sign;
464#endif
465}
466
Guido van Rossum3293b071998-08-25 16:07:15 +0000467unsigned LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000468PyLong_AsUnsignedLongLong(vv)
469 PyObject *vv;
470{
471#if SIZEOF_LONG_LONG == 4
472 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000473 return (unsigned LONG_LONG)PyLong_AsUnsignedLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000474#else
475 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000476 unsigned LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000477 int i;
478
479 if (vv == NULL || !PyLong_Check(vv)) {
480 PyErr_BadInternalCall();
Guido van Rossum3293b071998-08-25 16:07:15 +0000481 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000482 }
483
484 v = (PyLongObject *)vv;
485 i = v->ob_size;
486 x = 0;
487
488 if (i < 0) {
489 PyErr_SetString(PyExc_OverflowError,
490 "can't convert negative value to unsigned long");
Guido van Rossum3293b071998-08-25 16:07:15 +0000491 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000492 }
493
494 while (--i >= 0) {
495 prev = x;
496 x = (x << SHIFT) + v->ob_digit[i];
497 if ((x >> SHIFT) != prev) {
498 PyErr_SetString(PyExc_OverflowError,
499 "long int too long to convert");
Guido van Rossum3293b071998-08-25 16:07:15 +0000500 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000501 }
502 }
503
504 return x;
505#endif
506}
507#endif /* HAVE_LONG_LONG */
508
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000509/* Multiply by a single digit, ignoring the sign. */
510
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000512mul1(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000514 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000515{
516 return muladd1(a, n, (digit)0);
517}
518
519/* Multiply by a single digit and add a single digit, ignoring the sign. */
520
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000522muladd1(a, n, extra)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000524 wdigit n;
525 wdigit extra;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000526{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000527 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000529 twodigits carry = extra;
530 int i;
531
532 if (z == NULL)
533 return NULL;
534 for (i = 0; i < size_a; ++i) {
535 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000536 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000537 carry >>= SHIFT;
538 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000539 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000540 return long_normalize(z);
541}
542
543/* Divide a long integer by a digit, returning both the quotient
544 (as function result) and the remainder (through *prem).
545 The sign of a is ignored; n should not be zero. */
546
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000548divrem1(a, n, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000550 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000551 digit *prem;
552{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000553 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000555 int i;
556 twodigits rem = 0;
557
558 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000560 if (z == NULL)
561 return NULL;
562 for (i = size; --i >= 0; ) {
563 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000564 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000565 rem %= n;
566 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000567 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000568 return long_normalize(z);
569}
570
571/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000572 Return a string object.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000573 If base is 8 or 16, add the proper prefix '0' or '0x'.
574 External linkage: used in bltinmodule.c by hex() and oct(). */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000575
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +0000577long_format(aa, base)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 PyObject *aa;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000579 int base;
580{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 register PyLongObject *a = (PyLongObject *)aa;
582 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000583 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000584 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000585 char *p;
586 int bits;
587 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000588
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589 if (a == NULL || !PyLong_Check(a)) {
590 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000591 return NULL;
592 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000593 assert(base >= 2 && base <= 36);
594
595 /* Compute a rough upper bound for the length of the string */
596 i = base;
597 bits = 0;
598 while (i > 1) {
599 ++bits;
600 i >>= 1;
601 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000602 i = 6 + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000604 if (str == NULL)
605 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000607 *p = '\0';
Guido van Rossumc6913e71991-11-19 20:26:46 +0000608 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000609 if (a->ob_size < 0)
610 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000611
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000612 if (a->ob_size == 0) {
613 *--p = '0';
614 }
615 else if ((base & (base - 1)) == 0) {
616 /* JRH: special case for power-of-2 bases */
617 twodigits temp = a->ob_digit[0];
618 int bitsleft = SHIFT;
619 int rem;
620 int last = abs(a->ob_size);
621 int basebits = 1;
622 i = base;
623 while ((i >>= 1) > 1) ++basebits;
624
625 i = 0;
626 for (;;) {
627 while (bitsleft >= basebits) {
628 if ((temp == 0) && (i >= last - 1)) break;
629 rem = temp & (base - 1);
630 if (rem < 10)
631 rem += '0';
632 else
633 rem += 'A' - 10;
634 assert(p > PyString_AS_STRING(str));
635 *--p = (char) rem;
636 bitsleft -= basebits;
637 temp >>= basebits;
638 }
639 if (++i >= last) {
640 if (temp == 0) break;
641 bitsleft = 99;
642 /* loop again to pick up final digits */
643 }
644 else {
645 temp = (a->ob_digit[i] << bitsleft) | temp;
646 bitsleft += SHIFT;
647 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000648 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000649 }
650 else {
651 Py_INCREF(a);
652 do {
653 digit rem;
654 PyLongObject *temp = divrem1(a, (digit)base, &rem);
655 if (temp == NULL) {
656 Py_DECREF(a);
657 Py_DECREF(str);
658 return NULL;
659 }
660 if (rem < 10)
661 rem += '0';
662 else
663 rem += 'A'-10;
664 assert(p > PyString_AS_STRING(str));
665 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000667 a = temp;
668 SIGCHECK({
669 Py_DECREF(a);
670 Py_DECREF(str);
671 return NULL;
672 })
673 } while (ABS(a->ob_size) != 0);
674 Py_DECREF(a);
675 }
676
Guido van Rossum2c475421992-08-14 15:13:07 +0000677 if (base == 8) {
678 if (size_a != 0)
679 *--p = '0';
680 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000681 else if (base == 16) {
682 *--p = 'x';
683 *--p = '0';
684 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000685 else if (base != 10) {
686 *--p = '#';
687 *--p = '0' + base%10;
688 if (base > 10)
689 *--p = '0' + base/10;
690 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000691 if (sign)
692 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 if (p != PyString_AS_STRING(str)) {
694 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000695 assert(p > q);
696 do {
697 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000698 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000699 _PyString_Resize((PyObject **)&str,
700 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000701 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000702 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000703}
704
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000705#if 0
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000706/* Convert a string to a long int object, in a given base.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000707 Base zero implies a default depending on the number.
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000708 External linkage: used in compile.c and stropmodule.c. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000709
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000711long_scan(str, base)
712 char *str;
713 int base;
714{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715 return PyLong_FromString(str, (char **)NULL, base);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000716}
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000717#endif
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000718
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719PyObject *
720PyLong_FromString(str, pend, base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000721 char *str;
722 char **pend;
723 int base;
724{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000725 int sign = 1;
Guido van Rossume6762971998-06-22 03:54:46 +0000726 char *start;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000728
Guido van Rossum472c04f1996-12-05 21:57:21 +0000729 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000730 PyErr_SetString(PyExc_ValueError,
731 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000732 return NULL;
733 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000734 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000735 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000736 if (*str == '+')
737 ++str;
738 else if (*str == '-') {
739 ++str;
740 sign = -1;
741 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000742 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000743 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000744 if (base == 0) {
745 if (str[0] != '0')
746 base = 10;
747 else if (str[1] == 'x' || str[1] == 'X')
748 base = 16;
749 else
750 base = 8;
751 }
752 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
753 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000755 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000756 for ( ; z != NULL; ++str) {
757 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000758 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000759
760 if (*str <= '9')
761 k = *str - '0';
762 else if (*str >= 'a')
763 k = *str - 'a' + 10;
764 else if (*str >= 'A')
765 k = *str - 'A' + 10;
766 if (k < 0 || k >= base)
767 break;
768 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000770 z = temp;
771 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000772 if (z == NULL)
773 return NULL;
Guido van Rossume6762971998-06-22 03:54:46 +0000774 if (str == start) {
775 PyErr_SetString(PyExc_ValueError,
776 "no digits in long int constant");
Barry Warsawb5cebfe1999-01-27 17:48:27 +0000777 Py_DECREF(z);
Guido van Rossume6762971998-06-22 03:54:46 +0000778 return NULL;
779 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000780 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000781 z->ob_size = -(z->ob_size);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000782 if (pend)
783 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784 return (PyObject *) z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000785}
786
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787static PyLongObject *x_divrem
788 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject **));
789static PyObject *long_pos Py_PROTO((PyLongObject *));
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000790static int long_divrem Py_PROTO((PyLongObject *, PyLongObject *,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000791 PyLongObject **, PyLongObject **));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000792
793/* Long division with remainder, top-level routine */
794
Guido van Rossume32e0141992-01-19 16:31:05 +0000795static int
796long_divrem(a, b, pdiv, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797 PyLongObject *a, *b;
798 PyLongObject **pdiv;
799 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000800{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000801 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000803
804 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000805 PyErr_SetString(PyExc_ZeroDivisionError,
806 "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000807 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000808 }
809 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000810 (size_a == size_b &&
811 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000812 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 *pdiv = _PyLong_New(0);
814 Py_INCREF(a);
815 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000816 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000817 }
818 if (size_b == 1) {
819 digit rem = 0;
820 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000821 if (z == NULL)
822 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000824 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000825 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000826 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000827 if (z == NULL)
828 return -1;
829 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000830 /* Set the signs.
831 The quotient z has the sign of a*b;
832 the remainder r has the sign of a,
833 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000834 if ((a->ob_size < 0) != (b->ob_size < 0))
835 z->ob_size = -(z->ob_size);
836 if (a->ob_size < 0 && (*prem)->ob_size != 0)
837 (*prem)->ob_size = -((*prem)->ob_size);
838 *pdiv = z;
839 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000840}
841
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000842/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000843
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000845x_divrem(v1, w1, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846 PyLongObject *v1, *w1;
847 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000848{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000849 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000850 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000851 PyLongObject *v = mul1(v1, d);
852 PyLongObject *w = mul1(w1, d);
853 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000854 int j, k;
855
856 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000857 Py_XDECREF(v);
858 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000859 return NULL;
860 }
861
862 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000863 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000864 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000865
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000866 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000867 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000868
869 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
870 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
871 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000872 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000873 int i;
874
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000875 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000877 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000878 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000879 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000880 if (vj == w->ob_digit[size_w-1])
881 q = MASK;
882 else
883 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
884 w->ob_digit[size_w-1];
885
886 while (w->ob_digit[size_w-2]*q >
887 ((
888 ((twodigits)vj << SHIFT)
889 + v->ob_digit[j-1]
890 - q*w->ob_digit[size_w-1]
891 ) << SHIFT)
892 + v->ob_digit[j-2])
893 --q;
894
895 for (i = 0; i < size_w && i+k < size_v; ++i) {
896 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000897 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000898 carry += v->ob_digit[i+k] - z
899 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000900 v->ob_digit[i+k] = carry & MASK;
901 carry = (carry >> SHIFT) - zz;
902 }
903
904 if (i+k < size_v) {
905 carry += v->ob_digit[i+k];
906 v->ob_digit[i+k] = 0;
907 }
908
909 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000910 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000911 else {
912 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000913 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000914 carry = 0;
915 for (i = 0; i < size_w && i+k < size_v; ++i) {
916 carry += v->ob_digit[i+k] + w->ob_digit[i];
917 v->ob_digit[i+k] = carry & MASK;
918 carry >>= SHIFT;
919 }
920 }
921 } /* for j, k */
922
Guido van Rossumc206c761995-01-10 15:23:19 +0000923 if (a == NULL)
924 *prem = NULL;
925 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000926 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000927 *prem = divrem1(v, d, &d);
928 /* d receives the (unused) remainder */
929 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000931 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000932 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000933 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000934 Py_DECREF(v);
935 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000936 return a;
937}
938
939/* Methods */
940
Guido van Rossume32e0141992-01-19 16:31:05 +0000941/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942static void long_dealloc Py_PROTO((PyObject *));
943static PyObject *long_repr Py_PROTO((PyObject *));
944static int long_compare Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossum065ce5a1998-09-13 15:37:20 +0000945static long long_hash Py_PROTO((PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000946
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *));
948static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *));
949static PyObject *long_mul Py_PROTO((PyLongObject *, PyLongObject *));
950static PyObject *long_div Py_PROTO((PyLongObject *, PyLongObject *));
951static PyObject *long_mod Py_PROTO((PyLongObject *, PyLongObject *));
952static PyObject *long_divmod Py_PROTO((PyLongObject *, PyLongObject *));
953static PyObject *long_pow
954 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject *));
955static PyObject *long_neg Py_PROTO((PyLongObject *));
956static PyObject *long_pos Py_PROTO((PyLongObject *));
957static PyObject *long_abs Py_PROTO((PyLongObject *));
958static int long_nonzero Py_PROTO((PyLongObject *));
959static PyObject *long_invert Py_PROTO((PyLongObject *));
960static PyObject *long_lshift Py_PROTO((PyLongObject *, PyLongObject *));
961static PyObject *long_rshift Py_PROTO((PyLongObject *, PyLongObject *));
962static PyObject *long_and Py_PROTO((PyLongObject *, PyLongObject *));
963static PyObject *long_xor Py_PROTO((PyLongObject *, PyLongObject *));
964static PyObject *long_or Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000965
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000966static void
967long_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000968 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000969{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 PyMem_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000971}
972
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000973static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000974long_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000976{
Guido van Rossum8b27d921992-03-27 17:27:05 +0000977 return long_format(v, 10);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000978}
979
980static int
981long_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000983{
984 int sign;
985
Guido van Rossumc6913e71991-11-19 20:26:46 +0000986 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000987 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +0000988 sign = 0;
989 else
990 sign = a->ob_size - b->ob_size;
991 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000992 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000993 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000994 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
995 ;
996 if (i < 0)
997 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000998 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000999 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001000 if (a->ob_size < 0)
1001 sign = -sign;
1002 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001003 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001004 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001005}
1006
Guido van Rossum9bfef441993-03-29 10:43:31 +00001007static long
1008long_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 PyLongObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001010{
1011 long x;
1012 int i, sign;
1013
1014 /* This is designed so that Python ints and longs with the
1015 same value hash to the same value, otherwise comparisons
1016 of mapping keys will turn out weird */
1017 i = v->ob_size;
1018 sign = 1;
1019 x = 0;
1020 if (i < 0) {
1021 sign = -1;
1022 i = -(i);
1023 }
1024 while (--i >= 0) {
1025 /* Force a 32-bit circular shift */
1026 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1027 x += v->ob_digit[i];
1028 }
1029 x = x * sign;
1030 if (x == -1)
1031 x = -2;
1032 return x;
1033}
1034
1035
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001036/* Add the absolute values of two long integers. */
1037
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038static PyLongObject *x_add Py_PROTO((PyLongObject *, PyLongObject *));
1039static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001040x_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001042{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001043 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001044 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001045 int i;
1046 digit carry = 0;
1047
1048 /* Ensure a is the larger of the two: */
1049 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 { PyLongObject *temp = a; a = b; b = temp; }
1051 { int size_temp = size_a;
1052 size_a = size_b;
1053 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001054 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001056 if (z == NULL)
1057 return NULL;
1058 for (i = 0; i < size_b; ++i) {
1059 carry += a->ob_digit[i] + b->ob_digit[i];
1060 z->ob_digit[i] = carry & MASK;
1061 /* The following assumes unsigned shifts don't
1062 propagate the sign bit. */
1063 carry >>= SHIFT;
1064 }
1065 for (; i < size_a; ++i) {
1066 carry += a->ob_digit[i];
1067 z->ob_digit[i] = carry & MASK;
1068 carry >>= SHIFT;
1069 }
1070 z->ob_digit[i] = carry;
1071 return long_normalize(z);
1072}
1073
1074/* Subtract the absolute values of two integers. */
1075
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001076static PyLongObject *x_sub Py_PROTO((PyLongObject *, PyLongObject *));
1077static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001078x_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001080{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001081 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001082 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001083 int i;
1084 int sign = 1;
1085 digit borrow = 0;
1086
1087 /* Ensure a is the larger of the two: */
1088 if (size_a < size_b) {
1089 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001090 { PyLongObject *temp = a; a = b; b = temp; }
1091 { int size_temp = size_a;
1092 size_a = size_b;
1093 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001094 }
1095 else if (size_a == size_b) {
1096 /* Find highest digit where a and b differ: */
1097 i = size_a;
1098 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1099 ;
1100 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001102 if (a->ob_digit[i] < b->ob_digit[i]) {
1103 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001104 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001105 }
1106 size_a = size_b = i+1;
1107 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001108 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001109 if (z == NULL)
1110 return NULL;
1111 for (i = 0; i < size_b; ++i) {
1112 /* The following assumes unsigned arithmetic
1113 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001114 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001115 z->ob_digit[i] = borrow & MASK;
1116 borrow >>= SHIFT;
1117 borrow &= 1; /* Keep only one sign bit */
1118 }
1119 for (; i < size_a; ++i) {
1120 borrow = a->ob_digit[i] - borrow;
1121 z->ob_digit[i] = borrow & MASK;
1122 borrow >>= SHIFT;
1123 }
1124 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001125 if (sign < 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 return long_normalize(z);
1128}
1129
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001130static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001131long_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001132 PyLongObject *a;
1133 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001134{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001136
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001137 if (a->ob_size < 0) {
1138 if (b->ob_size < 0) {
1139 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001140 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001141 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001142 }
1143 else
1144 z = x_sub(b, a);
1145 }
1146 else {
1147 if (b->ob_size < 0)
1148 z = x_sub(a, b);
1149 else
1150 z = x_add(a, b);
1151 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001152 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001153}
1154
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001155static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001156long_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001157 PyLongObject *a;
1158 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001159{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001160 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001161
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001162 if (a->ob_size < 0) {
1163 if (b->ob_size < 0)
1164 z = x_sub(a, b);
1165 else
1166 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001167 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001168 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001169 }
1170 else {
1171 if (b->ob_size < 0)
1172 z = x_add(a, b);
1173 else
1174 z = x_sub(a, b);
1175 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001176 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001177}
1178
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001179static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001180long_mul(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001181 PyLongObject *a;
1182 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001183{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001184 int size_a;
1185 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001186 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001187 int i;
1188
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001189 size_a = ABS(a->ob_size);
1190 size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001192 if (z == NULL)
1193 return NULL;
1194 for (i = 0; i < z->ob_size; ++i)
1195 z->ob_digit[i] = 0;
1196 for (i = 0; i < size_a; ++i) {
1197 twodigits carry = 0;
1198 twodigits f = a->ob_digit[i];
1199 int j;
1200
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001201 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001203 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001204 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001205 for (j = 0; j < size_b; ++j) {
1206 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
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 for (; carry != 0; ++j) {
1211 assert(i+j < z->ob_size);
1212 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001213 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001214 carry >>= SHIFT;
1215 }
1216 }
1217 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001218 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001219 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001220 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001222}
1223
Guido van Rossume32e0141992-01-19 16:31:05 +00001224/* The / and % operators are now defined in terms of divmod().
1225 The expression a mod b has the value a - b*floor(a/b).
1226 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001227 |a| by |b|, with the sign of a. This is also expressed
1228 as a - b*trunc(a/b), if trunc truncates towards zero.
1229 Some examples:
1230 a b a rem b a mod b
1231 13 10 3 3
1232 -13 10 -3 7
1233 13 -10 3 -7
1234 -13 -10 -3 -3
1235 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001236 have different signs. We then subtract one from the 'div'
1237 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001238
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239static int l_divmod Py_PROTO((PyLongObject *, PyLongObject *,
1240 PyLongObject **, PyLongObject **));
Guido van Rossume32e0141992-01-19 16:31:05 +00001241static int
1242l_divmod(v, w, pdiv, pmod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 PyLongObject *v;
1244 PyLongObject *w;
1245 PyLongObject **pdiv;
1246 PyLongObject **pmod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001247{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001249
1250 if (long_divrem(v, w, &div, &mod) < 0)
1251 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001252 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1253 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254 PyLongObject *temp;
1255 PyLongObject *one;
1256 temp = (PyLongObject *) long_add(mod, w);
1257 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001258 mod = temp;
1259 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001260 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001261 return -1;
1262 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001264 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001265 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1266 Py_DECREF(mod);
1267 Py_DECREF(div);
1268 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001269 return -1;
1270 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271 Py_DECREF(one);
1272 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001273 div = temp;
1274 }
1275 *pdiv = div;
1276 *pmod = mod;
1277 return 0;
1278}
1279
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001281long_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001282 PyLongObject *v;
1283 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001284{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001286 if (l_divmod(v, w, &div, &mod) < 0)
1287 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001288 Py_DECREF(mod);
1289 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001290}
1291
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001293long_mod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001294 PyLongObject *v;
1295 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001296{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001297 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001298 if (l_divmod(v, w, &div, &mod) < 0)
1299 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 Py_DECREF(div);
1301 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001302}
1303
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001305long_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 PyLongObject *v;
1307 PyLongObject *w;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001308{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001309 PyObject *z;
1310 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001311 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001312 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001313 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001314 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 PyTuple_SetItem(z, 0, (PyObject *) div);
1316 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001317 }
1318 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 Py_DECREF(div);
1320 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001321 }
1322 return z;
1323}
1324
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325static PyObject *
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001326long_pow(a, b, c)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327 PyLongObject *a;
1328 PyLongObject *b;
1329 PyLongObject *c;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001330{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001332 int size_b, i;
1333
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001334 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001335 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336 PyErr_SetString(PyExc_ValueError,
1337 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001338 return NULL;
1339 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340 z = (PyLongObject *)PyLong_FromLong(1L);
1341 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001342 for (i = 0; i < size_b; ++i) {
1343 digit bi = b->ob_digit[i];
1344 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001345
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001346 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001348
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001349 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350 temp = (PyLongObject *)long_mul(z, a);
1351 Py_DECREF(z);
1352 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001353 if (l_divmod(temp,c,&div,&mod) < 0) {
1354 Py_DECREF(temp);
1355 z = NULL;
1356 goto error;
1357 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358 Py_XDECREF(div);
1359 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001360 temp = mod;
1361 }
1362 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001363 if (z == NULL)
1364 break;
1365 }
1366 bi >>= 1;
1367 if (bi == 0 && i+1 == size_b)
1368 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369 temp = (PyLongObject *)long_mul(a, a);
1370 Py_DECREF(a);
1371 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001372 if (l_divmod(temp, c, &div, &mod) < 0) {
1373 Py_DECREF(temp);
1374 z = NULL;
1375 goto error;
1376 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001377 Py_XDECREF(div);
1378 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001379 temp = mod;
1380 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001381 a = temp;
1382 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001383 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001384 z = NULL;
1385 break;
1386 }
1387 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001388 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001389 break;
1390 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001391 Py_XDECREF(a);
1392 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001393 if (l_divmod(z, c, &div, &mod) < 0) {
1394 Py_DECREF(z);
1395 z = NULL;
1396 }
1397 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 Py_XDECREF(div);
1399 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001400 z = mod;
1401 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001402 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001403 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001404 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001405}
1406
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001407static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001408long_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001409 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001410{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001411 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001412 PyLongObject *x;
1413 PyLongObject *w;
1414 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001415 if (w == NULL)
1416 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417 x = (PyLongObject *) long_add(v, w);
1418 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001419 if (x == NULL)
1420 return NULL;
1421 if (x->ob_size != 0)
1422 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001423 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001424}
1425
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001426static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001427long_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001428 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001429{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001430 Py_INCREF(v);
1431 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001432}
1433
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001434static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001435long_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001436 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001437{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001439 int i, n;
1440 n = ABS(v->ob_size);
1441 if (n == 0) {
1442 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443 Py_INCREF(v);
1444 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001445 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001447 if (z == NULL)
1448 return NULL;
1449 for (i = 0; i < n; i++)
1450 z->ob_digit[i] = v->ob_digit[i];
1451 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001453}
1454
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001456long_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001457 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001458{
1459 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001460 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001461 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001462 Py_INCREF(v);
1463 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001464 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001465}
1466
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001467static int
1468long_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001469 PyLongObject *v;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001470{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001471 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001472}
1473
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001474static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001475long_rshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001476 PyLongObject *a;
1477 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001478{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001479 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001480 long shiftby;
1481 int newsize, wordshift, loshift, hishift, i, j;
1482 digit lomask, himask;
1483
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001484 if (a->ob_size < 0) {
1485 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001486 PyLongObject *a1, *a2, *a3;
1487 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001488 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001489 a2 = (PyLongObject *) long_rshift(a1, b);
1490 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001491 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001492 a3 = (PyLongObject *) long_invert(a2);
1493 Py_DECREF(a2);
1494 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001495 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001496
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001497 shiftby = PyLong_AsLong((PyObject *)b);
1498 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001499 return NULL;
1500 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001501 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001502 return NULL;
1503 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001504 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001505 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001506 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001507 z = _PyLong_New(0);
1508 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001509 }
1510 loshift = shiftby % SHIFT;
1511 hishift = SHIFT - loshift;
1512 lomask = ((digit)1 << hishift) - 1;
1513 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001514 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001515 if (z == NULL)
1516 return NULL;
1517 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001518 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001519 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1520 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1521 if (i+1 < newsize)
1522 z->ob_digit[i] |=
1523 (a->ob_digit[j+1] << hishift) & himask;
1524 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001525 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001526}
1527
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001528static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001529long_lshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001530 PyLongObject *a;
1531 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001532{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001533 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001534 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001535 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001536 int oldsize, newsize, wordshift, remshift, i, j;
1537 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001538
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001539 shiftby = PyLong_AsLong((PyObject *)b);
1540 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001541 return NULL;
1542 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001544 return NULL;
1545 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001546 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001547 PyErr_SetString(PyExc_ValueError,
1548 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001549 return NULL;
1550 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001551 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1552 wordshift = (int)shiftby / SHIFT;
1553 remshift = (int)shiftby - wordshift * SHIFT;
1554
1555 oldsize = ABS(a->ob_size);
1556 newsize = oldsize + wordshift;
1557 if (remshift)
1558 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001559 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001560 if (z == NULL)
1561 return NULL;
1562 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001563 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001564 for (i = 0; i < wordshift; i++)
1565 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001566 accum = 0;
1567 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1568 accum |= a->ob_digit[j] << remshift;
1569 z->ob_digit[i] = (digit)(accum & MASK);
1570 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001571 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001572 if (remshift)
1573 z->ob_digit[newsize-1] = (digit)accum;
1574 else
1575 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001576 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001577}
1578
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001579
1580/* Bitwise and/xor/or operations */
1581
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001582#define MAX(x, y) ((x) < (y) ? (y) : (x))
1583#define MIN(x, y) ((x) > (y) ? (y) : (x))
1584
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001585static PyObject *long_bitwise Py_PROTO((PyLongObject *, int, PyLongObject *));
1586static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001587long_bitwise(a, op, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001588 PyLongObject *a;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001589 int op; /* '&', '|', '^' */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001590 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001591{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001592 digit maska, maskb; /* 0 or MASK */
1593 int negz;
1594 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001595 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001596 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001597 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001598 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001599
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001600 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001601 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001602 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001603 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001604 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001605 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001606 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001607 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001608 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001609 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001610 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001611 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001612 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001613 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001614 maskb = 0;
1615 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001616
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001617 negz = 0;
1618 switch (op) {
1619 case '^':
1620 if (maska != maskb) {
1621 maska ^= MASK;
1622 negz = -1;
1623 }
1624 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001625 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001626 if (maska && maskb) {
1627 op = '|';
1628 maska ^= MASK;
1629 maskb ^= MASK;
1630 negz = -1;
1631 }
1632 break;
1633 case '|':
1634 if (maska || maskb) {
1635 op = '&';
1636 maska ^= MASK;
1637 maskb ^= MASK;
1638 negz = -1;
1639 }
1640 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001641 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001642
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001643 /* JRH: The original logic here was to allocate the result value (z)
1644 as the longer of the two operands. However, there are some cases
1645 where the result is guaranteed to be shorter than that: AND of two
1646 positives, OR of two negatives: use the shorter number. AND with
1647 mixed signs: use the positive number. OR with mixed signs: use the
1648 negative number. After the transformations above, op will be '&'
1649 iff one of these cases applies, and mask will be non-0 for operands
1650 whose length should be ignored.
1651 */
1652
1653 size_a = a->ob_size;
1654 size_b = b->ob_size;
1655 size_z = op == '&'
1656 ? (maska
1657 ? size_b
1658 : (maskb ? size_a : MIN(size_a, size_b)))
1659 : MAX(size_a, size_b);
1660 z = _PyLong_New(size_z);
1661 if (a == NULL || b == NULL || z == NULL) {
1662 Py_XDECREF(a);
1663 Py_XDECREF(b);
1664 Py_XDECREF(z);
1665 return NULL;
1666 }
1667
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001668 for (i = 0; i < size_z; ++i) {
1669 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1670 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1671 switch (op) {
1672 case '&': z->ob_digit[i] = diga & digb; break;
1673 case '|': z->ob_digit[i] = diga | digb; break;
1674 case '^': z->ob_digit[i] = diga ^ digb; break;
1675 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001676 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001677
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001678 Py_DECREF(a);
1679 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001680 z = long_normalize(z);
1681 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001682 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001683 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001684 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001685 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001686}
1687
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001688static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001689long_and(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001690 PyLongObject *a;
1691 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001692{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001693 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001694}
1695
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001696static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001697long_xor(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001698 PyLongObject *a;
1699 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001700{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001701 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001702}
1703
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001704static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001705long_or(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001706 PyLongObject *a;
1707 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001708{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001709 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001710}
1711
Guido van Rossum234f9421993-06-17 12:35:49 +00001712static int
Guido van Rossume6eefc21992-08-14 12:06:52 +00001713long_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001714 PyObject **pv;
1715 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001716{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001717 if (PyInt_Check(*pw)) {
1718 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1719 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001720 return 0;
1721 }
1722 return 1; /* Can't do it */
1723}
1724
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001725static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001726long_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001727 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001728{
1729 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001730 x = PyLong_AsLong(v);
1731 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001732 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001733 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001734}
1735
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001736static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001737long_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001738 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001739{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001740 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001741 return v;
1742}
1743
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001744static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001745long_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001746 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001747{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001748 double result;
1749 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001750 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001751 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001752 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001753}
1754
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001755static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001756long_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001757 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001758{
1759 return long_format(v, 8);
1760}
1761
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001762static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001763long_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001764 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001765{
1766 return long_format(v, 16);
1767}
1768
1769
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001770#define UF (unaryfunc)
1771#define BF (binaryfunc)
1772#define TF (ternaryfunc)
1773#define IF (inquiry)
Guido van Rossum8b27d921992-03-27 17:27:05 +00001774
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001775static PyNumberMethods long_as_number = {
Guido van Rossum8b27d921992-03-27 17:27:05 +00001776 BF long_add, /*nb_add*/
1777 BF long_sub, /*nb_subtract*/
1778 BF long_mul, /*nb_multiply*/
1779 BF long_div, /*nb_divide*/
1780 BF long_mod, /*nb_remainder*/
1781 BF long_divmod, /*nb_divmod*/
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001782 TF long_pow, /*nb_power*/
Guido van Rossum8b27d921992-03-27 17:27:05 +00001783 UF long_neg, /*nb_negative*/
1784 UF long_pos, /*tp_positive*/
1785 UF long_abs, /*tp_absolute*/
1786 IF long_nonzero,/*tp_nonzero*/
1787 UF long_invert, /*nb_invert*/
1788 BF long_lshift, /*nb_lshift*/
1789 BF long_rshift, /*nb_rshift*/
1790 BF long_and, /*nb_and*/
1791 BF long_xor, /*nb_xor*/
1792 BF long_or, /*nb_or*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001793 (int (*) Py_FPROTO((PyObject **, PyObject **)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001794 (coercion)long_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001795 UF long_int, /*nb_int*/
1796 UF long_long, /*nb_long*/
1797 UF long_float, /*nb_float*/
1798 UF long_oct, /*nb_oct*/
1799 UF long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001800};
1801
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001802PyTypeObject PyLong_Type = {
1803 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001804 0,
1805 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001806 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001807 sizeof(digit),
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001808 (destructor)long_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001809 0, /*tp_print*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001810 0, /*tp_getattr*/
1811 0, /*tp_setattr*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001812 (int (*) Py_FPROTO((PyObject *, PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001813 (cmpfunc)long_compare, /*tp_compare*/
1814 (reprfunc)long_repr, /*tp_repr*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001815 &long_as_number,/*tp_as_number*/
1816 0, /*tp_as_sequence*/
1817 0, /*tp_as_mapping*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001818 (long (*) Py_FPROTO((PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001819 (hashfunc)long_hash, /*tp_hash*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001820};