blob: 7dbb54264a193a6c1e0e93704732593df977b180 [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;
148 if (dval < 0.0) {
149 neg = 1;
150 dval = -dval;
151 }
152 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
153 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000155 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000157 if (v == NULL)
158 return NULL;
159 frac = ldexp(frac, (expo-1) % SHIFT + 1);
160 for (i = ndig; --i >= 0; ) {
161 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000162 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000163 frac = frac - (double)bits;
164 frac = ldexp(frac, SHIFT);
165 }
166 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000167 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000169}
170
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000171/* Get a C long int from a long int object.
172 Returns -1 and sets an error condition if overflow occurs. */
173
174long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175PyLong_AsLong(vv)
176 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000177{
Guido van Rossumf7531811998-05-26 14:33:37 +0000178 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000180 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000181 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000182
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 if (vv == NULL || !PyLong_Check(vv)) {
184 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000185 return -1;
186 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000188 i = v->ob_size;
189 sign = 1;
190 x = 0;
191 if (i < 0) {
192 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000193 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000194 }
195 while (--i >= 0) {
196 prev = x;
197 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000198 if ((x >> SHIFT) != prev)
199 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000200 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000201 /* Haven't lost any bits, but if the sign bit is set we're in
202 * trouble *unless* this is the min negative number. So,
203 * trouble iff sign bit set && (positive || some bit set other
204 * than the sign bit).
205 */
206 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
207 goto overflow;
208 return (long)x * sign;
209
210 overflow:
211 PyErr_SetString(PyExc_OverflowError,
212 "long int too long to convert");
213 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000214}
215
Guido van Rossum53756b11997-01-03 17:14:46 +0000216/* Get a C long int from a long int object.
217 Returns -1 and sets an error condition if overflow occurs. */
218
219unsigned long
220PyLong_AsUnsignedLong(vv)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 PyObject *vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000222{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000224 unsigned long x, prev;
225 int i;
226
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 if (vv == NULL || !PyLong_Check(vv)) {
228 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000229 return (unsigned long) -1;
230 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000232 i = v->ob_size;
233 x = 0;
234 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000236 "can't convert negative value to unsigned long");
237 return (unsigned long) -1;
238 }
239 while (--i >= 0) {
240 prev = x;
241 x = (x << SHIFT) + v->ob_digit[i];
242 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000244 "long int too long to convert");
245 return (unsigned long) -1;
246 }
247 }
248 return x;
249}
250
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000251/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000252
253double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254PyLong_AsDouble(vv)
255 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000256{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000257 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000258 double x;
259 double multiplier = (double) (1L << SHIFT);
260 int i, sign;
261
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262 if (vv == NULL || !PyLong_Check(vv)) {
263 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000264 return -1;
265 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000266 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000267 i = v->ob_size;
268 sign = 1;
269 x = 0.0;
270 if (i < 0) {
271 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000272 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000273 }
274 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000275 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000276 }
277 return x * sign;
278}
279
Guido van Rossum78694d91998-09-18 14:14:13 +0000280/* Create a new long (or int) object from a C pointer */
281
282PyObject *
283PyLong_FromVoidPtr(p)
284 void *p;
285{
286#if SIZEOF_VOID_P == SIZEOF_LONG
287 return PyInt_FromLong((long)p);
288#else
289 /* optimize null pointers */
290 if ( p == NULL )
291 return PyInt_FromLong(0);
292
293 /* we can assume that HAVE_LONG_LONG is true. if not, then the
294 configuration process should have bailed (having big pointers
295 without long longs seems non-sensical) */
296 return PyLong_FromLongLong((LONG_LONG)p);
297#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
298}
299
300/* Get a C pointer from a long object (or an int object in some cases) */
301
302void *
303PyLong_AsVoidPtr(vv)
304 PyObject *vv;
305{
306 /* This function will allow int or long objects. If vv is neither,
307 then the PyLong_AsLong*() functions will raise the exception:
308 PyExc_SystemError, "bad argument to internal function"
309 */
310
311#if SIZEOF_VOID_P == SIZEOF_LONG
312 long x;
313
314 if ( PyInt_Check(vv) )
315 x = PyInt_AS_LONG(vv);
316 else
317 x = PyLong_AsLong(vv);
318#else
319 /* we can assume that HAVE_LONG_LONG is true. if not, then the
320 configuration process should have bailed (having big pointers
321 without long longs seems non-sensical) */
322 LONG_LONG x;
323
324 if ( PyInt_Check(vv) )
325 x = PyInt_AS_LONG(vv);
326 else
327 x = PyLong_AsLongLong(vv);
328#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
329
330 if (x == -1 && PyErr_Occurred())
331 return NULL;
332 return (void *)x;
333}
334
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000335#ifdef HAVE_LONG_LONG
336/*
Guido van Rossum3293b071998-08-25 16:07:15 +0000337 * LONG_LONG support by Chris Herborth (chrish@qnx.com)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000338 *
339 * For better or worse :-), I tried to follow the coding style already
340 * here.
341 */
342
343#ifdef HAVE_LIMITS_H
344#include <limits.h>
345#endif
346
347/* Hopefully this is portable... */
348#ifndef LONG_MAX
349#define LONG_MAX 2147483647L
350#endif
351#ifndef ULONG_MAX
352#define ULONG_MAX 4294967295U
353#endif
354#ifndef LONGLONG_MAX
355#define LONGLONG_MAX 9223372036854775807LL
356#endif
357#ifndef ULONGLONG_MAX
358#define ULONGLONG_MAX 0xffffffffffffffffULL
359#endif
360
Guido van Rossum3293b071998-08-25 16:07:15 +0000361/* Create a new long int object from a C LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000362
363PyObject *
364PyLong_FromLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000365 LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000366{
367#if SIZEOF_LONG_LONG == SIZEOF_LONG
368 /* In case the compiler is faking it. */
369 return PyLong_FromLong( (long)ival );
370#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000371 if( ival <= (LONG_LONG)LONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000372 return PyLong_FromLong( (long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000373 }
Guido van Rossum3293b071998-08-25 16:07:15 +0000374 else if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000375 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000376 }
377 else {
Guido van Rossum3293b071998-08-25 16:07:15 +0000378 /* Assume a C LONG_LONG fits in at most 10 'digits'.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000379 * Should be OK if we're assuming long fits in 5.
380 */
381 PyLongObject *v = _PyLong_New(10);
382
383 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000384 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000385 int i;
386 if (ival < 0) {
387 t = -ival;
388 v->ob_size = -(v->ob_size);
389 }
390
391 for (i = 0; i < 10; i++) {
392 v->ob_digit[i] = (digit) (t & MASK);
393 t >>= SHIFT;
394 }
395
396 v = long_normalize(v);
397 }
398
399 return (PyObject *)v;
400 }
401
402 /* If we got here, we're confused... */
403 PyErr_SetString( PyExc_ArithmeticError, "invalid long integer" );
404 return NULL;
405#endif
406}
407
Guido van Rossum3293b071998-08-25 16:07:15 +0000408/* Create a new long int object from a C unsigned LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000409PyObject *
410PyLong_FromUnsignedLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000411 unsigned LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000412{
413#if SIZEOF_LONG_LONG == SIZEOF_LONG
414 /* In case the compiler is faking it. */
415 return PyLong_FromUnsignedLong( (unsigned long)ival );
416#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000417 if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000418 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000419 }
420 else {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000421 /* Assume a C long fits in at most 10 'digits'. */
422 PyLongObject *v = _PyLong_New(10);
423
424 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000425 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000426 int i;
427 for (i = 0; i < 10; i++) {
428 v->ob_digit[i] = (digit) (t & MASK);
429 t >>= SHIFT;
430 }
431
432 v = long_normalize(v);
433 }
434
435 return (PyObject *)v;
436 }
437
438 /* If we got here, we're confused... */
439 PyErr_SetString( PyExc_ArithmeticError, "invalid unsigned long integer" );
440 return NULL;
441#endif
442}
443
Guido van Rossum3293b071998-08-25 16:07:15 +0000444/* Get a C LONG_LONG int from a long int object.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000445 Returns -1 and sets an error condition if overflow occurs. */
446
Guido van Rossum3293b071998-08-25 16:07:15 +0000447LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000448PyLong_AsLongLong(vv)
449 PyObject *vv;
450{
451#if SIZEOF_LONG_LONG == SIZEOF_LONG
452 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000453 return (LONG_LONG)PyLong_AsLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000454#else
455 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000456 LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000457 int i, sign;
458
459 if (vv == NULL || !PyLong_Check(vv)) {
460 PyErr_BadInternalCall();
461 return -1;
462 }
463
464 v = (PyLongObject *)vv;
465 i = v->ob_size;
466 sign = 1;
467 x = 0;
468
469 if (i < 0) {
470 sign = -1;
471 i = -(i);
472 }
473
474 while (--i >= 0) {
475 prev = x;
476 x = (x << SHIFT) + v->ob_digit[i];
477 if ((x >> SHIFT) != prev) {
478 PyErr_SetString(PyExc_OverflowError,
479 "long int too long to convert");
480 return -1;
481 }
482 }
483
484 return x * sign;
485#endif
486}
487
Guido van Rossum3293b071998-08-25 16:07:15 +0000488unsigned LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000489PyLong_AsUnsignedLongLong(vv)
490 PyObject *vv;
491{
492#if SIZEOF_LONG_LONG == 4
493 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000494 return (unsigned LONG_LONG)PyLong_AsUnsignedLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000495#else
496 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000497 unsigned LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000498 int i;
499
500 if (vv == NULL || !PyLong_Check(vv)) {
501 PyErr_BadInternalCall();
Guido van Rossum3293b071998-08-25 16:07:15 +0000502 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000503 }
504
505 v = (PyLongObject *)vv;
506 i = v->ob_size;
507 x = 0;
508
509 if (i < 0) {
510 PyErr_SetString(PyExc_OverflowError,
511 "can't convert negative value to unsigned long");
Guido van Rossum3293b071998-08-25 16:07:15 +0000512 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000513 }
514
515 while (--i >= 0) {
516 prev = x;
517 x = (x << SHIFT) + v->ob_digit[i];
518 if ((x >> SHIFT) != prev) {
519 PyErr_SetString(PyExc_OverflowError,
520 "long int too long to convert");
Guido van Rossum3293b071998-08-25 16:07:15 +0000521 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000522 }
523 }
524
525 return x;
526#endif
527}
528#endif /* HAVE_LONG_LONG */
529
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000530/* Multiply by a single digit, ignoring the sign. */
531
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000533mul1(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000535 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000536{
537 return muladd1(a, n, (digit)0);
538}
539
540/* Multiply by a single digit and add a single digit, ignoring the sign. */
541
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000543muladd1(a, n, extra)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000545 wdigit n;
546 wdigit extra;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000547{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000548 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000550 twodigits carry = extra;
551 int i;
552
553 if (z == NULL)
554 return NULL;
555 for (i = 0; i < size_a; ++i) {
556 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000557 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000558 carry >>= SHIFT;
559 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000560 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000561 return long_normalize(z);
562}
563
564/* Divide a long integer by a digit, returning both the quotient
565 (as function result) and the remainder (through *prem).
566 The sign of a is ignored; n should not be zero. */
567
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000569divrem1(a, n, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000571 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000572 digit *prem;
573{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000574 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000576 int i;
577 twodigits rem = 0;
578
579 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000581 if (z == NULL)
582 return NULL;
583 for (i = size; --i >= 0; ) {
584 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000585 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000586 rem %= n;
587 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000588 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000589 return long_normalize(z);
590}
591
592/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000593 Return a string object.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000594 If base is 8 or 16, add the proper prefix '0' or '0x'.
595 External linkage: used in bltinmodule.c by hex() and oct(). */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000596
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +0000598long_format(aa, base)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 PyObject *aa;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000600 int base;
601{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 register PyLongObject *a = (PyLongObject *)aa;
603 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000604 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000605 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000606 char *p;
607 int bits;
608 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000609
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 if (a == NULL || !PyLong_Check(a)) {
611 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000612 return NULL;
613 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000614 assert(base >= 2 && base <= 36);
615
616 /* Compute a rough upper bound for the length of the string */
617 i = base;
618 bits = 0;
619 while (i > 1) {
620 ++bits;
621 i >>= 1;
622 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000623 i = 6 + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000625 if (str == NULL)
626 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000628 *p = '\0';
Guido van Rossumc6913e71991-11-19 20:26:46 +0000629 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000630 if (a->ob_size < 0)
631 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000632
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000633 if (a->ob_size == 0) {
634 *--p = '0';
635 }
636 else if ((base & (base - 1)) == 0) {
637 /* JRH: special case for power-of-2 bases */
638 twodigits temp = a->ob_digit[0];
639 int bitsleft = SHIFT;
640 int rem;
641 int last = abs(a->ob_size);
642 int basebits = 1;
643 i = base;
644 while ((i >>= 1) > 1) ++basebits;
645
646 i = 0;
647 for (;;) {
648 while (bitsleft >= basebits) {
649 if ((temp == 0) && (i >= last - 1)) break;
650 rem = temp & (base - 1);
651 if (rem < 10)
652 rem += '0';
653 else
654 rem += 'A' - 10;
655 assert(p > PyString_AS_STRING(str));
656 *--p = (char) rem;
657 bitsleft -= basebits;
658 temp >>= basebits;
659 }
660 if (++i >= last) {
661 if (temp == 0) break;
662 bitsleft = 99;
663 /* loop again to pick up final digits */
664 }
665 else {
666 temp = (a->ob_digit[i] << bitsleft) | temp;
667 bitsleft += SHIFT;
668 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000669 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000670 }
671 else {
672 Py_INCREF(a);
673 do {
674 digit rem;
675 PyLongObject *temp = divrem1(a, (digit)base, &rem);
676 if (temp == NULL) {
677 Py_DECREF(a);
678 Py_DECREF(str);
679 return NULL;
680 }
681 if (rem < 10)
682 rem += '0';
683 else
684 rem += 'A'-10;
685 assert(p > PyString_AS_STRING(str));
686 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000687 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000688 a = temp;
689 SIGCHECK({
690 Py_DECREF(a);
691 Py_DECREF(str);
692 return NULL;
693 })
694 } while (ABS(a->ob_size) != 0);
695 Py_DECREF(a);
696 }
697
Guido van Rossum2c475421992-08-14 15:13:07 +0000698 if (base == 8) {
699 if (size_a != 0)
700 *--p = '0';
701 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000702 else if (base == 16) {
703 *--p = 'x';
704 *--p = '0';
705 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000706 else if (base != 10) {
707 *--p = '#';
708 *--p = '0' + base%10;
709 if (base > 10)
710 *--p = '0' + base/10;
711 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000712 if (sign)
713 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714 if (p != PyString_AS_STRING(str)) {
715 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000716 assert(p > q);
717 do {
718 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000719 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000720 _PyString_Resize((PyObject **)&str,
721 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000722 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000724}
725
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000726#if 0
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000727/* Convert a string to a long int object, in a given base.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000728 Base zero implies a default depending on the number.
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000729 External linkage: used in compile.c and stropmodule.c. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000730
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000732long_scan(str, base)
733 char *str;
734 int base;
735{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736 return PyLong_FromString(str, (char **)NULL, base);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000737}
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000738#endif
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000739
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740PyObject *
741PyLong_FromString(str, pend, base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000742 char *str;
743 char **pend;
744 int base;
745{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000746 int sign = 1;
Guido van Rossume6762971998-06-22 03:54:46 +0000747 char *start;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000748 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000749
Guido van Rossum472c04f1996-12-05 21:57:21 +0000750 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000751 PyErr_SetString(PyExc_ValueError,
752 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000753 return NULL;
754 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000755 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000756 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000757 if (*str == '+')
758 ++str;
759 else if (*str == '-') {
760 ++str;
761 sign = -1;
762 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000763 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000764 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000765 if (base == 0) {
766 if (str[0] != '0')
767 base = 10;
768 else if (str[1] == 'x' || str[1] == 'X')
769 base = 16;
770 else
771 base = 8;
772 }
773 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
774 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000775 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000776 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000777 for ( ; z != NULL; ++str) {
778 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000780
781 if (*str <= '9')
782 k = *str - '0';
783 else if (*str >= 'a')
784 k = *str - 'a' + 10;
785 else if (*str >= 'A')
786 k = *str - 'A' + 10;
787 if (k < 0 || k >= base)
788 break;
789 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000790 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000791 z = temp;
792 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000793 if (z == NULL)
794 return NULL;
Guido van Rossume6762971998-06-22 03:54:46 +0000795 if (str == start) {
796 PyErr_SetString(PyExc_ValueError,
797 "no digits in long int constant");
798 return NULL;
799 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000800 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000801 z->ob_size = -(z->ob_size);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000802 if (pend)
803 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 return (PyObject *) z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000805}
806
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807static PyLongObject *x_divrem
808 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject **));
809static PyObject *long_pos Py_PROTO((PyLongObject *));
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000810static int long_divrem Py_PROTO((PyLongObject *, PyLongObject *,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000811 PyLongObject **, PyLongObject **));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000812
813/* Long division with remainder, top-level routine */
814
Guido van Rossume32e0141992-01-19 16:31:05 +0000815static int
816long_divrem(a, b, pdiv, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 PyLongObject *a, *b;
818 PyLongObject **pdiv;
819 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000820{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000821 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000822 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000823
824 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000825 PyErr_SetString(PyExc_ZeroDivisionError,
826 "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000827 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000828 }
829 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000830 (size_a == size_b &&
831 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000832 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 *pdiv = _PyLong_New(0);
834 Py_INCREF(a);
835 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000836 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000837 }
838 if (size_b == 1) {
839 digit rem = 0;
840 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000841 if (z == NULL)
842 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000843 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000844 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000845 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000846 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000847 if (z == NULL)
848 return -1;
849 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000850 /* Set the signs.
851 The quotient z has the sign of a*b;
852 the remainder r has the sign of a,
853 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000854 if ((a->ob_size < 0) != (b->ob_size < 0))
855 z->ob_size = -(z->ob_size);
856 if (a->ob_size < 0 && (*prem)->ob_size != 0)
857 (*prem)->ob_size = -((*prem)->ob_size);
858 *pdiv = z;
859 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000860}
861
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000862/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000863
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000864static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000865x_divrem(v1, w1, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000866 PyLongObject *v1, *w1;
867 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000868{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000869 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000870 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000871 PyLongObject *v = mul1(v1, d);
872 PyLongObject *w = mul1(w1, d);
873 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000874 int j, k;
875
876 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000877 Py_XDECREF(v);
878 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000879 return NULL;
880 }
881
882 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000883 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000884 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000885
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000886 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000887 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000888
889 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
890 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
891 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000892 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000893 int i;
894
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000895 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000897 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000898 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000899 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000900 if (vj == w->ob_digit[size_w-1])
901 q = MASK;
902 else
903 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
904 w->ob_digit[size_w-1];
905
906 while (w->ob_digit[size_w-2]*q >
907 ((
908 ((twodigits)vj << SHIFT)
909 + v->ob_digit[j-1]
910 - q*w->ob_digit[size_w-1]
911 ) << SHIFT)
912 + v->ob_digit[j-2])
913 --q;
914
915 for (i = 0; i < size_w && i+k < size_v; ++i) {
916 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000917 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 carry += v->ob_digit[i+k] - z
919 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000920 v->ob_digit[i+k] = carry & MASK;
921 carry = (carry >> SHIFT) - zz;
922 }
923
924 if (i+k < size_v) {
925 carry += v->ob_digit[i+k];
926 v->ob_digit[i+k] = 0;
927 }
928
929 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000930 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000931 else {
932 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000933 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000934 carry = 0;
935 for (i = 0; i < size_w && i+k < size_v; ++i) {
936 carry += v->ob_digit[i+k] + w->ob_digit[i];
937 v->ob_digit[i+k] = carry & MASK;
938 carry >>= SHIFT;
939 }
940 }
941 } /* for j, k */
942
Guido van Rossumc206c761995-01-10 15:23:19 +0000943 if (a == NULL)
944 *prem = NULL;
945 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000946 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000947 *prem = divrem1(v, d, &d);
948 /* d receives the (unused) remainder */
949 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000950 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000951 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000952 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000953 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000954 Py_DECREF(v);
955 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000956 return a;
957}
958
959/* Methods */
960
Guido van Rossume32e0141992-01-19 16:31:05 +0000961/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000962static void long_dealloc Py_PROTO((PyObject *));
963static PyObject *long_repr Py_PROTO((PyObject *));
964static int long_compare Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossum065ce5a1998-09-13 15:37:20 +0000965static long long_hash Py_PROTO((PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000966
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *));
968static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *));
969static PyObject *long_mul Py_PROTO((PyLongObject *, PyLongObject *));
970static PyObject *long_div Py_PROTO((PyLongObject *, PyLongObject *));
971static PyObject *long_mod Py_PROTO((PyLongObject *, PyLongObject *));
972static PyObject *long_divmod Py_PROTO((PyLongObject *, PyLongObject *));
973static PyObject *long_pow
974 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject *));
975static PyObject *long_neg Py_PROTO((PyLongObject *));
976static PyObject *long_pos Py_PROTO((PyLongObject *));
977static PyObject *long_abs Py_PROTO((PyLongObject *));
978static int long_nonzero Py_PROTO((PyLongObject *));
979static PyObject *long_invert Py_PROTO((PyLongObject *));
980static PyObject *long_lshift Py_PROTO((PyLongObject *, PyLongObject *));
981static PyObject *long_rshift Py_PROTO((PyLongObject *, PyLongObject *));
982static PyObject *long_and Py_PROTO((PyLongObject *, PyLongObject *));
983static PyObject *long_xor Py_PROTO((PyLongObject *, PyLongObject *));
984static PyObject *long_or Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000985
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000986static void
987long_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000988 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000989{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000990 PyMem_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000991}
992
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000993static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000994long_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000995 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000996{
Guido van Rossum8b27d921992-03-27 17:27:05 +0000997 return long_format(v, 10);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000998}
999
1000static int
1001long_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001003{
1004 int sign;
1005
Guido van Rossumc6913e71991-11-19 20:26:46 +00001006 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001007 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001008 sign = 0;
1009 else
1010 sign = a->ob_size - b->ob_size;
1011 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001012 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001013 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001014 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1015 ;
1016 if (i < 0)
1017 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001018 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001019 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001020 if (a->ob_size < 0)
1021 sign = -sign;
1022 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001023 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001024 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001025}
1026
Guido van Rossum9bfef441993-03-29 10:43:31 +00001027static long
1028long_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001029 PyLongObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001030{
1031 long x;
1032 int i, sign;
1033
1034 /* This is designed so that Python ints and longs with the
1035 same value hash to the same value, otherwise comparisons
1036 of mapping keys will turn out weird */
1037 i = v->ob_size;
1038 sign = 1;
1039 x = 0;
1040 if (i < 0) {
1041 sign = -1;
1042 i = -(i);
1043 }
1044 while (--i >= 0) {
1045 /* Force a 32-bit circular shift */
1046 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1047 x += v->ob_digit[i];
1048 }
1049 x = x * sign;
1050 if (x == -1)
1051 x = -2;
1052 return x;
1053}
1054
1055
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001056/* Add the absolute values of two long integers. */
1057
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058static PyLongObject *x_add Py_PROTO((PyLongObject *, PyLongObject *));
1059static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001060x_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001062{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001063 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001064 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001065 int i;
1066 digit carry = 0;
1067
1068 /* Ensure a is the larger of the two: */
1069 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001070 { PyLongObject *temp = a; a = b; b = temp; }
1071 { int size_temp = size_a;
1072 size_a = size_b;
1073 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001074 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001076 if (z == NULL)
1077 return NULL;
1078 for (i = 0; i < size_b; ++i) {
1079 carry += a->ob_digit[i] + b->ob_digit[i];
1080 z->ob_digit[i] = carry & MASK;
1081 /* The following assumes unsigned shifts don't
1082 propagate the sign bit. */
1083 carry >>= SHIFT;
1084 }
1085 for (; i < size_a; ++i) {
1086 carry += a->ob_digit[i];
1087 z->ob_digit[i] = carry & MASK;
1088 carry >>= SHIFT;
1089 }
1090 z->ob_digit[i] = carry;
1091 return long_normalize(z);
1092}
1093
1094/* Subtract the absolute values of two integers. */
1095
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001096static PyLongObject *x_sub Py_PROTO((PyLongObject *, PyLongObject *));
1097static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001098x_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001100{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001101 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001102 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001103 int i;
1104 int sign = 1;
1105 digit borrow = 0;
1106
1107 /* Ensure a is the larger of the two: */
1108 if (size_a < size_b) {
1109 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001110 { PyLongObject *temp = a; a = b; b = temp; }
1111 { int size_temp = size_a;
1112 size_a = size_b;
1113 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001114 }
1115 else if (size_a == size_b) {
1116 /* Find highest digit where a and b differ: */
1117 i = size_a;
1118 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1119 ;
1120 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001122 if (a->ob_digit[i] < b->ob_digit[i]) {
1123 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001124 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001125 }
1126 size_a = size_b = i+1;
1127 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001128 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001129 if (z == NULL)
1130 return NULL;
1131 for (i = 0; i < size_b; ++i) {
1132 /* The following assumes unsigned arithmetic
1133 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001134 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001135 z->ob_digit[i] = borrow & MASK;
1136 borrow >>= SHIFT;
1137 borrow &= 1; /* Keep only one sign bit */
1138 }
1139 for (; i < size_a; ++i) {
1140 borrow = a->ob_digit[i] - borrow;
1141 z->ob_digit[i] = borrow & MASK;
1142 borrow >>= SHIFT;
1143 }
1144 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001145 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001146 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001147 return long_normalize(z);
1148}
1149
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001150static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001151long_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001152 PyLongObject *a;
1153 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001154{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001155 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001156
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001157 if (a->ob_size < 0) {
1158 if (b->ob_size < 0) {
1159 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001160 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001161 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001162 }
1163 else
1164 z = x_sub(b, a);
1165 }
1166 else {
1167 if (b->ob_size < 0)
1168 z = x_sub(a, b);
1169 else
1170 z = x_add(a, b);
1171 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001172 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001173}
1174
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001175static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001176long_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001177 PyLongObject *a;
1178 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001179{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001180 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001181
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001182 if (a->ob_size < 0) {
1183 if (b->ob_size < 0)
1184 z = x_sub(a, b);
1185 else
1186 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001187 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001188 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001189 }
1190 else {
1191 if (b->ob_size < 0)
1192 z = x_add(a, b);
1193 else
1194 z = x_sub(a, b);
1195 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001196 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001197}
1198
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001199static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001200long_mul(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001201 PyLongObject *a;
1202 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001203{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001204 int size_a;
1205 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001206 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001207 int i;
1208
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001209 size_a = ABS(a->ob_size);
1210 size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001211 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001212 if (z == NULL)
1213 return NULL;
1214 for (i = 0; i < z->ob_size; ++i)
1215 z->ob_digit[i] = 0;
1216 for (i = 0; i < size_a; ++i) {
1217 twodigits carry = 0;
1218 twodigits f = a->ob_digit[i];
1219 int j;
1220
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001221 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001222 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001223 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001224 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001225 for (j = 0; j < size_b; ++j) {
1226 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001227 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001228 carry >>= SHIFT;
1229 }
1230 for (; carry != 0; ++j) {
1231 assert(i+j < z->ob_size);
1232 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001233 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001234 carry >>= SHIFT;
1235 }
1236 }
1237 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001238 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001239 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001240 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001241 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001242}
1243
Guido van Rossume32e0141992-01-19 16:31:05 +00001244/* The / and % operators are now defined in terms of divmod().
1245 The expression a mod b has the value a - b*floor(a/b).
1246 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001247 |a| by |b|, with the sign of a. This is also expressed
1248 as a - b*trunc(a/b), if trunc truncates towards zero.
1249 Some examples:
1250 a b a rem b a mod b
1251 13 10 3 3
1252 -13 10 -3 7
1253 13 -10 3 -7
1254 -13 -10 -3 -3
1255 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001256 have different signs. We then subtract one from the 'div'
1257 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001258
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001259static int l_divmod Py_PROTO((PyLongObject *, PyLongObject *,
1260 PyLongObject **, PyLongObject **));
Guido van Rossume32e0141992-01-19 16:31:05 +00001261static int
1262l_divmod(v, w, pdiv, pmod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001263 PyLongObject *v;
1264 PyLongObject *w;
1265 PyLongObject **pdiv;
1266 PyLongObject **pmod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001267{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001268 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001269
1270 if (long_divrem(v, w, &div, &mod) < 0)
1271 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001272 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1273 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001274 PyLongObject *temp;
1275 PyLongObject *one;
1276 temp = (PyLongObject *) long_add(mod, w);
1277 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001278 mod = temp;
1279 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001281 return -1;
1282 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001284 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1286 Py_DECREF(mod);
1287 Py_DECREF(div);
1288 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001289 return -1;
1290 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001291 Py_DECREF(one);
1292 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001293 div = temp;
1294 }
1295 *pdiv = div;
1296 *pmod = mod;
1297 return 0;
1298}
1299
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001301long_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302 PyLongObject *v;
1303 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001304{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001306 if (l_divmod(v, w, &div, &mod) < 0)
1307 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308 Py_DECREF(mod);
1309 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001310}
1311
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001312static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001313long_mod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001314 PyLongObject *v;
1315 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001316{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001318 if (l_divmod(v, w, &div, &mod) < 0)
1319 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001320 Py_DECREF(div);
1321 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001322}
1323
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001324static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001325long_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 PyLongObject *v;
1327 PyLongObject *w;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001328{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001329 PyObject *z;
1330 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001331 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001332 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001334 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335 PyTuple_SetItem(z, 0, (PyObject *) div);
1336 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001337 }
1338 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 Py_DECREF(div);
1340 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001341 }
1342 return z;
1343}
1344
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345static PyObject *
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001346long_pow(a, b, c)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347 PyLongObject *a;
1348 PyLongObject *b;
1349 PyLongObject *c;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001350{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001351 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001352 int size_b, i;
1353
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001354 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001355 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001356 PyErr_SetString(PyExc_ValueError,
1357 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001358 return NULL;
1359 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 z = (PyLongObject *)PyLong_FromLong(1L);
1361 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001362 for (i = 0; i < size_b; ++i) {
1363 digit bi = b->ob_digit[i];
1364 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001365
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001366 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001368
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001369 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001370 temp = (PyLongObject *)long_mul(z, a);
1371 Py_DECREF(z);
1372 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001373 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001374 Py_XDECREF(div);
1375 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001376 temp = mod;
1377 }
1378 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001379 if (z == NULL)
1380 break;
1381 }
1382 bi >>= 1;
1383 if (bi == 0 && i+1 == size_b)
1384 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385 temp = (PyLongObject *)long_mul(a, a);
1386 Py_DECREF(a);
1387 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001388 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 Py_XDECREF(div);
1390 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001391 temp = mod;
1392 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001393 a = temp;
1394 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001395 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001396 z = NULL;
1397 break;
1398 }
1399 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001400 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001401 break;
1402 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001403 Py_XDECREF(a);
1404 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001405 l_divmod(z, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406 Py_XDECREF(div);
1407 Py_DECREF(z);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001408 z=mod;
1409 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001410 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001411}
1412
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001413static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001414long_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001416{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001417 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418 PyLongObject *x;
1419 PyLongObject *w;
1420 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001421 if (w == NULL)
1422 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001423 x = (PyLongObject *) long_add(v, w);
1424 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001425 if (x == NULL)
1426 return NULL;
1427 if (x->ob_size != 0)
1428 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001429 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001430}
1431
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001432static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001433long_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001434 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001435{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001436 Py_INCREF(v);
1437 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001438}
1439
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001440static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001441long_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001443{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001444 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001445 int i, n;
1446 n = ABS(v->ob_size);
1447 if (n == 0) {
1448 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001449 Py_INCREF(v);
1450 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001451 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001453 if (z == NULL)
1454 return NULL;
1455 for (i = 0; i < n; i++)
1456 z->ob_digit[i] = v->ob_digit[i];
1457 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001459}
1460
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001462long_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001463 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001464{
1465 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001466 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001467 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001468 Py_INCREF(v);
1469 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001470 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001471}
1472
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001473static int
1474long_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001475 PyLongObject *v;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001476{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001477 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001478}
1479
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001480static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001481long_rshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001482 PyLongObject *a;
1483 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001484{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001485 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001486 long shiftby;
1487 int newsize, wordshift, loshift, hishift, i, j;
1488 digit lomask, himask;
1489
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001490 if (a->ob_size < 0) {
1491 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001492 PyLongObject *a1, *a2, *a3;
1493 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001494 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001495 a2 = (PyLongObject *) long_rshift(a1, b);
1496 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001497 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001498 a3 = (PyLongObject *) long_invert(a2);
1499 Py_DECREF(a2);
1500 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001501 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001502
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001503 shiftby = PyLong_AsLong((PyObject *)b);
1504 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001505 return NULL;
1506 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001507 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001508 return NULL;
1509 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001510 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001511 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001512 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001513 z = _PyLong_New(0);
1514 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001515 }
1516 loshift = shiftby % SHIFT;
1517 hishift = SHIFT - loshift;
1518 lomask = ((digit)1 << hishift) - 1;
1519 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001520 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001521 if (z == NULL)
1522 return NULL;
1523 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001524 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001525 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1526 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1527 if (i+1 < newsize)
1528 z->ob_digit[i] |=
1529 (a->ob_digit[j+1] << hishift) & himask;
1530 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001531 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001532}
1533
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001534static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001535long_lshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 PyLongObject *a;
1537 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001538{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001539 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001540 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001541 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001542 int oldsize, newsize, wordshift, remshift, i, j;
1543 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001544
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001545 shiftby = PyLong_AsLong((PyObject *)b);
1546 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001547 return NULL;
1548 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001549 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001550 return NULL;
1551 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001552 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001553 PyErr_SetString(PyExc_ValueError,
1554 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001555 return NULL;
1556 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001557 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1558 wordshift = (int)shiftby / SHIFT;
1559 remshift = (int)shiftby - wordshift * SHIFT;
1560
1561 oldsize = ABS(a->ob_size);
1562 newsize = oldsize + wordshift;
1563 if (remshift)
1564 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001565 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001566 if (z == NULL)
1567 return NULL;
1568 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001569 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001570 for (i = 0; i < wordshift; i++)
1571 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001572 accum = 0;
1573 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1574 accum |= a->ob_digit[j] << remshift;
1575 z->ob_digit[i] = (digit)(accum & MASK);
1576 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001577 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001578 if (remshift)
1579 z->ob_digit[newsize-1] = (digit)accum;
1580 else
1581 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001583}
1584
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001585
1586/* Bitwise and/xor/or operations */
1587
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001588#define MAX(x, y) ((x) < (y) ? (y) : (x))
1589#define MIN(x, y) ((x) > (y) ? (y) : (x))
1590
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001591static PyObject *long_bitwise Py_PROTO((PyLongObject *, int, PyLongObject *));
1592static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001593long_bitwise(a, op, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594 PyLongObject *a;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001595 int op; /* '&', '|', '^' */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001596 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001597{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001598 digit maska, maskb; /* 0 or MASK */
1599 int negz;
1600 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001601 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001602 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001603 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001604 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001605
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001606 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001607 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001608 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001609 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001610 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001611 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001612 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001613 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001614 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001615 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001616 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001617 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001618 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001619 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001620 maskb = 0;
1621 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001622
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001623 negz = 0;
1624 switch (op) {
1625 case '^':
1626 if (maska != maskb) {
1627 maska ^= MASK;
1628 negz = -1;
1629 }
1630 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001631 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001632 if (maska && maskb) {
1633 op = '|';
1634 maska ^= MASK;
1635 maskb ^= MASK;
1636 negz = -1;
1637 }
1638 break;
1639 case '|':
1640 if (maska || maskb) {
1641 op = '&';
1642 maska ^= MASK;
1643 maskb ^= MASK;
1644 negz = -1;
1645 }
1646 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001647 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001648
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001649 /* JRH: The original logic here was to allocate the result value (z)
1650 as the longer of the two operands. However, there are some cases
1651 where the result is guaranteed to be shorter than that: AND of two
1652 positives, OR of two negatives: use the shorter number. AND with
1653 mixed signs: use the positive number. OR with mixed signs: use the
1654 negative number. After the transformations above, op will be '&'
1655 iff one of these cases applies, and mask will be non-0 for operands
1656 whose length should be ignored.
1657 */
1658
1659 size_a = a->ob_size;
1660 size_b = b->ob_size;
1661 size_z = op == '&'
1662 ? (maska
1663 ? size_b
1664 : (maskb ? size_a : MIN(size_a, size_b)))
1665 : MAX(size_a, size_b);
1666 z = _PyLong_New(size_z);
1667 if (a == NULL || b == NULL || z == NULL) {
1668 Py_XDECREF(a);
1669 Py_XDECREF(b);
1670 Py_XDECREF(z);
1671 return NULL;
1672 }
1673
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001674 for (i = 0; i < size_z; ++i) {
1675 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1676 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1677 switch (op) {
1678 case '&': z->ob_digit[i] = diga & digb; break;
1679 case '|': z->ob_digit[i] = diga | digb; break;
1680 case '^': z->ob_digit[i] = diga ^ digb; break;
1681 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001682 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001683
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001684 Py_DECREF(a);
1685 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001686 z = long_normalize(z);
1687 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001688 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001689 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001690 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001691 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001692}
1693
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001694static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001695long_and(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001696 PyLongObject *a;
1697 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001698{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001699 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001700}
1701
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001702static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001703long_xor(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001704 PyLongObject *a;
1705 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001706{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001707 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001708}
1709
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001710static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001711long_or(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001712 PyLongObject *a;
1713 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001714{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001715 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001716}
1717
Guido van Rossum234f9421993-06-17 12:35:49 +00001718static int
Guido van Rossume6eefc21992-08-14 12:06:52 +00001719long_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001720 PyObject **pv;
1721 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001722{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001723 if (PyInt_Check(*pw)) {
1724 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1725 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001726 return 0;
1727 }
1728 return 1; /* Can't do it */
1729}
1730
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001731static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001732long_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001733 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001734{
1735 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001736 x = PyLong_AsLong(v);
1737 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001738 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001739 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001740}
1741
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001742static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001743long_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001744 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001745{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001746 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001747 return v;
1748}
1749
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001750static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001751long_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001752 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001753{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001754 double result;
1755 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001756 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001757 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001758 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001759}
1760
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001761static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001762long_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001763 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001764{
1765 return long_format(v, 8);
1766}
1767
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001768static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001769long_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001770 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001771{
1772 return long_format(v, 16);
1773}
1774
1775
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001776#define UF (unaryfunc)
1777#define BF (binaryfunc)
1778#define TF (ternaryfunc)
1779#define IF (inquiry)
Guido van Rossum8b27d921992-03-27 17:27:05 +00001780
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001781static PyNumberMethods long_as_number = {
Guido van Rossum8b27d921992-03-27 17:27:05 +00001782 BF long_add, /*nb_add*/
1783 BF long_sub, /*nb_subtract*/
1784 BF long_mul, /*nb_multiply*/
1785 BF long_div, /*nb_divide*/
1786 BF long_mod, /*nb_remainder*/
1787 BF long_divmod, /*nb_divmod*/
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001788 TF long_pow, /*nb_power*/
Guido van Rossum8b27d921992-03-27 17:27:05 +00001789 UF long_neg, /*nb_negative*/
1790 UF long_pos, /*tp_positive*/
1791 UF long_abs, /*tp_absolute*/
1792 IF long_nonzero,/*tp_nonzero*/
1793 UF long_invert, /*nb_invert*/
1794 BF long_lshift, /*nb_lshift*/
1795 BF long_rshift, /*nb_rshift*/
1796 BF long_and, /*nb_and*/
1797 BF long_xor, /*nb_xor*/
1798 BF long_or, /*nb_or*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001799 (int (*) Py_FPROTO((PyObject **, PyObject **)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001800 (coercion)long_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001801 UF long_int, /*nb_int*/
1802 UF long_long, /*nb_long*/
1803 UF long_float, /*nb_float*/
1804 UF long_oct, /*nb_oct*/
1805 UF long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001806};
1807
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001808PyTypeObject PyLong_Type = {
1809 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001810 0,
1811 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001812 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001813 sizeof(digit),
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001814 (destructor)long_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001815 0, /*tp_print*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001816 0, /*tp_getattr*/
1817 0, /*tp_setattr*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001818 (int (*) Py_FPROTO((PyObject *, PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001819 (cmpfunc)long_compare, /*tp_compare*/
1820 (reprfunc)long_repr, /*tp_repr*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001821 &long_as_number,/*tp_as_number*/
1822 0, /*tp_as_sequence*/
1823 0, /*tp_as_mapping*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001824 (long (*) Py_FPROTO((PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001825 (hashfunc)long_hash, /*tp_hash*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001826};