blob: 7c805a5259f6d817ce251a56dd90bc4ec30abeb8 [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
Guido van Rossum3293b071998-08-25 16:07:15 +0000343/* Create a new long int object from a C LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000344
345PyObject *
346PyLong_FromLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000347 LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000348{
349#if SIZEOF_LONG_LONG == SIZEOF_LONG
350 /* In case the compiler is faking it. */
351 return PyLong_FromLong( (long)ival );
352#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000353 if( ival <= (LONG_LONG)LONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000354 return PyLong_FromLong( (long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000355 }
Guido van Rossum3293b071998-08-25 16:07:15 +0000356 else if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000357 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000358 }
359 else {
Guido van Rossum3293b071998-08-25 16:07:15 +0000360 /* Assume a C LONG_LONG fits in at most 10 'digits'.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000361 * Should be OK if we're assuming long fits in 5.
362 */
363 PyLongObject *v = _PyLong_New(10);
364
365 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000366 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000367 int i;
368 if (ival < 0) {
369 t = -ival;
370 v->ob_size = -(v->ob_size);
371 }
372
373 for (i = 0; i < 10; i++) {
374 v->ob_digit[i] = (digit) (t & MASK);
375 t >>= SHIFT;
376 }
377
378 v = long_normalize(v);
379 }
380
381 return (PyObject *)v;
382 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000383#endif
384}
385
Guido van Rossum3293b071998-08-25 16:07:15 +0000386/* Create a new long int object from a C unsigned LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000387PyObject *
388PyLong_FromUnsignedLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000389 unsigned LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000390{
391#if SIZEOF_LONG_LONG == SIZEOF_LONG
392 /* In case the compiler is faking it. */
393 return PyLong_FromUnsignedLong( (unsigned long)ival );
394#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000395 if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000396 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000397 }
398 else {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000399 /* Assume a C long fits in at most 10 'digits'. */
400 PyLongObject *v = _PyLong_New(10);
401
402 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000403 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000404 int i;
405 for (i = 0; i < 10; i++) {
406 v->ob_digit[i] = (digit) (t & MASK);
407 t >>= SHIFT;
408 }
409
410 v = long_normalize(v);
411 }
412
413 return (PyObject *)v;
414 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000415#endif
416}
417
Guido van Rossum3293b071998-08-25 16:07:15 +0000418/* Get a C LONG_LONG int from a long int object.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000419 Returns -1 and sets an error condition if overflow occurs. */
420
Guido van Rossum3293b071998-08-25 16:07:15 +0000421LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000422PyLong_AsLongLong(vv)
423 PyObject *vv;
424{
425#if SIZEOF_LONG_LONG == SIZEOF_LONG
426 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000427 return (LONG_LONG)PyLong_AsLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000428#else
429 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000430 LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000431 int i, sign;
432
433 if (vv == NULL || !PyLong_Check(vv)) {
434 PyErr_BadInternalCall();
435 return -1;
436 }
437
438 v = (PyLongObject *)vv;
439 i = v->ob_size;
440 sign = 1;
441 x = 0;
442
443 if (i < 0) {
444 sign = -1;
445 i = -(i);
446 }
447
448 while (--i >= 0) {
449 prev = x;
450 x = (x << SHIFT) + v->ob_digit[i];
451 if ((x >> SHIFT) != prev) {
452 PyErr_SetString(PyExc_OverflowError,
453 "long int too long to convert");
454 return -1;
455 }
456 }
457
458 return x * sign;
459#endif
460}
461
Guido van Rossum3293b071998-08-25 16:07:15 +0000462unsigned LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000463PyLong_AsUnsignedLongLong(vv)
464 PyObject *vv;
465{
466#if SIZEOF_LONG_LONG == 4
467 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000468 return (unsigned LONG_LONG)PyLong_AsUnsignedLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000469#else
470 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000471 unsigned LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000472 int i;
473
474 if (vv == NULL || !PyLong_Check(vv)) {
475 PyErr_BadInternalCall();
Guido van Rossum3293b071998-08-25 16:07:15 +0000476 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000477 }
478
479 v = (PyLongObject *)vv;
480 i = v->ob_size;
481 x = 0;
482
483 if (i < 0) {
484 PyErr_SetString(PyExc_OverflowError,
485 "can't convert negative value to unsigned long");
Guido van Rossum3293b071998-08-25 16:07:15 +0000486 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000487 }
488
489 while (--i >= 0) {
490 prev = x;
491 x = (x << SHIFT) + v->ob_digit[i];
492 if ((x >> SHIFT) != prev) {
493 PyErr_SetString(PyExc_OverflowError,
494 "long int too long to convert");
Guido van Rossum3293b071998-08-25 16:07:15 +0000495 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000496 }
497 }
498
499 return x;
500#endif
501}
502#endif /* HAVE_LONG_LONG */
503
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000504/* Multiply by a single digit, ignoring the sign. */
505
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000507mul1(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000509 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000510{
511 return muladd1(a, n, (digit)0);
512}
513
514/* Multiply by a single digit and add a single digit, ignoring the sign. */
515
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000517muladd1(a, n, extra)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000519 wdigit n;
520 wdigit extra;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000521{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000522 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000524 twodigits carry = extra;
525 int i;
526
527 if (z == NULL)
528 return NULL;
529 for (i = 0; i < size_a; ++i) {
530 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000531 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000532 carry >>= SHIFT;
533 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000534 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000535 return long_normalize(z);
536}
537
538/* Divide a long integer by a digit, returning both the quotient
539 (as function result) and the remainder (through *prem).
540 The sign of a is ignored; n should not be zero. */
541
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000543divrem1(a, n, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000545 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000546 digit *prem;
547{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000548 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000550 int i;
551 twodigits rem = 0;
552
553 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000555 if (z == NULL)
556 return NULL;
557 for (i = size; --i >= 0; ) {
558 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000559 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000560 rem %= n;
561 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000562 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000563 return long_normalize(z);
564}
565
566/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000567 Return a string object.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000568 If base is 8 or 16, add the proper prefix '0' or '0x'.
569 External linkage: used in bltinmodule.c by hex() and oct(). */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000570
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000571static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +0000572long_format(aa, base)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573 PyObject *aa;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000574 int base;
575{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576 register PyLongObject *a = (PyLongObject *)aa;
577 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000578 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000579 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000580 char *p;
581 int bits;
582 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000583
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584 if (a == NULL || !PyLong_Check(a)) {
585 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000586 return NULL;
587 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000588 assert(base >= 2 && base <= 36);
589
590 /* Compute a rough upper bound for the length of the string */
591 i = base;
592 bits = 0;
593 while (i > 1) {
594 ++bits;
595 i >>= 1;
596 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000597 i = 6 + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000599 if (str == NULL)
600 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000602 *p = '\0';
Guido van Rossumc6913e71991-11-19 20:26:46 +0000603 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000604 if (a->ob_size < 0)
605 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000606
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000607 if (a->ob_size == 0) {
608 *--p = '0';
609 }
610 else if ((base & (base - 1)) == 0) {
611 /* JRH: special case for power-of-2 bases */
612 twodigits temp = a->ob_digit[0];
613 int bitsleft = SHIFT;
614 int rem;
615 int last = abs(a->ob_size);
616 int basebits = 1;
617 i = base;
618 while ((i >>= 1) > 1) ++basebits;
619
620 i = 0;
621 for (;;) {
622 while (bitsleft >= basebits) {
623 if ((temp == 0) && (i >= last - 1)) break;
624 rem = temp & (base - 1);
625 if (rem < 10)
626 rem += '0';
627 else
628 rem += 'A' - 10;
629 assert(p > PyString_AS_STRING(str));
630 *--p = (char) rem;
631 bitsleft -= basebits;
632 temp >>= basebits;
633 }
634 if (++i >= last) {
635 if (temp == 0) break;
636 bitsleft = 99;
637 /* loop again to pick up final digits */
638 }
639 else {
640 temp = (a->ob_digit[i] << bitsleft) | temp;
641 bitsleft += SHIFT;
642 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000643 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000644 }
645 else {
646 Py_INCREF(a);
647 do {
648 digit rem;
649 PyLongObject *temp = divrem1(a, (digit)base, &rem);
650 if (temp == NULL) {
651 Py_DECREF(a);
652 Py_DECREF(str);
653 return NULL;
654 }
655 if (rem < 10)
656 rem += '0';
657 else
658 rem += 'A'-10;
659 assert(p > PyString_AS_STRING(str));
660 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000662 a = temp;
663 SIGCHECK({
664 Py_DECREF(a);
665 Py_DECREF(str);
666 return NULL;
667 })
668 } while (ABS(a->ob_size) != 0);
669 Py_DECREF(a);
670 }
671
Guido van Rossum2c475421992-08-14 15:13:07 +0000672 if (base == 8) {
673 if (size_a != 0)
674 *--p = '0';
675 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000676 else if (base == 16) {
677 *--p = 'x';
678 *--p = '0';
679 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000680 else if (base != 10) {
681 *--p = '#';
682 *--p = '0' + base%10;
683 if (base > 10)
684 *--p = '0' + base/10;
685 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000686 if (sign)
687 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688 if (p != PyString_AS_STRING(str)) {
689 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000690 assert(p > q);
691 do {
692 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000693 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 _PyString_Resize((PyObject **)&str,
695 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000696 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000697 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000698}
699
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000700#if 0
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000701/* Convert a string to a long int object, in a given base.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000702 Base zero implies a default depending on the number.
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000703 External linkage: used in compile.c and stropmodule.c. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000704
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000706long_scan(str, base)
707 char *str;
708 int base;
709{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 return PyLong_FromString(str, (char **)NULL, base);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000711}
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000712#endif
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000713
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714PyObject *
715PyLong_FromString(str, pend, base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000716 char *str;
717 char **pend;
718 int base;
719{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000720 int sign = 1;
Guido van Rossume6762971998-06-22 03:54:46 +0000721 char *start;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000723
Guido van Rossum472c04f1996-12-05 21:57:21 +0000724 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 PyErr_SetString(PyExc_ValueError,
726 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000727 return NULL;
728 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000729 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000730 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000731 if (*str == '+')
732 ++str;
733 else if (*str == '-') {
734 ++str;
735 sign = -1;
736 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000737 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000738 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000739 if (base == 0) {
740 if (str[0] != '0')
741 base = 10;
742 else if (str[1] == 'x' || str[1] == 'X')
743 base = 16;
744 else
745 base = 8;
746 }
747 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
748 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000749 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000750 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000751 for ( ; z != NULL; ++str) {
752 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000754
755 if (*str <= '9')
756 k = *str - '0';
757 else if (*str >= 'a')
758 k = *str - 'a' + 10;
759 else if (*str >= 'A')
760 k = *str - 'A' + 10;
761 if (k < 0 || k >= base)
762 break;
763 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000765 z = temp;
766 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000767 if (z == NULL)
768 return NULL;
Guido van Rossume6762971998-06-22 03:54:46 +0000769 if (str == start) {
770 PyErr_SetString(PyExc_ValueError,
771 "no digits in long int constant");
Barry Warsawb5cebfe1999-01-27 17:48:27 +0000772 Py_DECREF(z);
Guido van Rossume6762971998-06-22 03:54:46 +0000773 return NULL;
774 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000775 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000776 z->ob_size = -(z->ob_size);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000777 if (pend)
778 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 return (PyObject *) z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000780}
781
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782static PyLongObject *x_divrem
783 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject **));
784static PyObject *long_pos Py_PROTO((PyLongObject *));
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000785static int long_divrem Py_PROTO((PyLongObject *, PyLongObject *,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786 PyLongObject **, PyLongObject **));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000787
788/* Long division with remainder, top-level routine */
789
Guido van Rossume32e0141992-01-19 16:31:05 +0000790static int
791long_divrem(a, b, pdiv, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792 PyLongObject *a, *b;
793 PyLongObject **pdiv;
794 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000795{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000796 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000798
799 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000800 PyErr_SetString(PyExc_ZeroDivisionError,
801 "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000802 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000803 }
804 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000805 (size_a == size_b &&
806 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000807 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000808 *pdiv = _PyLong_New(0);
809 Py_INCREF(a);
810 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000811 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000812 }
813 if (size_b == 1) {
814 digit rem = 0;
815 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000816 if (z == NULL)
817 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000819 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000820 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000821 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000822 if (z == NULL)
823 return -1;
824 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000825 /* Set the signs.
826 The quotient z has the sign of a*b;
827 the remainder r has the sign of a,
828 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000829 if ((a->ob_size < 0) != (b->ob_size < 0))
830 z->ob_size = -(z->ob_size);
831 if (a->ob_size < 0 && (*prem)->ob_size != 0)
832 (*prem)->ob_size = -((*prem)->ob_size);
833 *pdiv = z;
834 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000835}
836
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000837/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000838
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000840x_divrem(v1, w1, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000841 PyLongObject *v1, *w1;
842 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000843{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000844 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000845 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846 PyLongObject *v = mul1(v1, d);
847 PyLongObject *w = mul1(w1, d);
848 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000849 int j, k;
850
851 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000852 Py_XDECREF(v);
853 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000854 return NULL;
855 }
856
857 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000858 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000859 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000860
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000861 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000863
864 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
865 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
866 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000867 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000868 int i;
869
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000870 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000871 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000872 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000873 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000874 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000875 if (vj == w->ob_digit[size_w-1])
876 q = MASK;
877 else
878 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
879 w->ob_digit[size_w-1];
880
881 while (w->ob_digit[size_w-2]*q >
882 ((
883 ((twodigits)vj << SHIFT)
884 + v->ob_digit[j-1]
885 - q*w->ob_digit[size_w-1]
886 ) << SHIFT)
887 + v->ob_digit[j-2])
888 --q;
889
890 for (i = 0; i < size_w && i+k < size_v; ++i) {
891 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000892 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 carry += v->ob_digit[i+k] - z
894 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000895 v->ob_digit[i+k] = carry & MASK;
896 carry = (carry >> SHIFT) - zz;
897 }
898
899 if (i+k < size_v) {
900 carry += v->ob_digit[i+k];
901 v->ob_digit[i+k] = 0;
902 }
903
904 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000905 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000906 else {
907 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000908 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000909 carry = 0;
910 for (i = 0; i < size_w && i+k < size_v; ++i) {
911 carry += v->ob_digit[i+k] + w->ob_digit[i];
912 v->ob_digit[i+k] = carry & MASK;
913 carry >>= SHIFT;
914 }
915 }
916 } /* for j, k */
917
Guido van Rossumc206c761995-01-10 15:23:19 +0000918 if (a == NULL)
919 *prem = NULL;
920 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000921 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000922 *prem = divrem1(v, d, &d);
923 /* d receives the (unused) remainder */
924 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000926 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000927 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000928 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 Py_DECREF(v);
930 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000931 return a;
932}
933
934/* Methods */
935
Guido van Rossume32e0141992-01-19 16:31:05 +0000936/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937static void long_dealloc Py_PROTO((PyObject *));
938static PyObject *long_repr Py_PROTO((PyObject *));
939static int long_compare Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossum065ce5a1998-09-13 15:37:20 +0000940static long long_hash Py_PROTO((PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000941
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *));
943static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *));
944static PyObject *long_mul Py_PROTO((PyLongObject *, PyLongObject *));
945static PyObject *long_div Py_PROTO((PyLongObject *, PyLongObject *));
946static PyObject *long_mod Py_PROTO((PyLongObject *, PyLongObject *));
947static PyObject *long_divmod Py_PROTO((PyLongObject *, PyLongObject *));
948static PyObject *long_pow
949 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject *));
950static PyObject *long_neg Py_PROTO((PyLongObject *));
951static PyObject *long_pos Py_PROTO((PyLongObject *));
952static PyObject *long_abs Py_PROTO((PyLongObject *));
953static int long_nonzero Py_PROTO((PyLongObject *));
954static PyObject *long_invert Py_PROTO((PyLongObject *));
955static PyObject *long_lshift Py_PROTO((PyLongObject *, PyLongObject *));
956static PyObject *long_rshift Py_PROTO((PyLongObject *, PyLongObject *));
957static PyObject *long_and Py_PROTO((PyLongObject *, PyLongObject *));
958static PyObject *long_xor Py_PROTO((PyLongObject *, PyLongObject *));
959static PyObject *long_or Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000960
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000961static void
962long_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000964{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965 PyMem_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000966}
967
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000968static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000969long_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000971{
Guido van Rossum8b27d921992-03-27 17:27:05 +0000972 return long_format(v, 10);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000973}
974
975static int
976long_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000977 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000978{
979 int sign;
980
Guido van Rossumc6913e71991-11-19 20:26:46 +0000981 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000982 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +0000983 sign = 0;
984 else
985 sign = a->ob_size - b->ob_size;
986 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000987 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000988 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000989 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
990 ;
991 if (i < 0)
992 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000993 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000994 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000995 if (a->ob_size < 0)
996 sign = -sign;
997 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000998 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000999 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001000}
1001
Guido van Rossum9bfef441993-03-29 10:43:31 +00001002static long
1003long_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001004 PyLongObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001005{
1006 long x;
1007 int i, sign;
1008
1009 /* This is designed so that Python ints and longs with the
1010 same value hash to the same value, otherwise comparisons
1011 of mapping keys will turn out weird */
1012 i = v->ob_size;
1013 sign = 1;
1014 x = 0;
1015 if (i < 0) {
1016 sign = -1;
1017 i = -(i);
1018 }
1019 while (--i >= 0) {
1020 /* Force a 32-bit circular shift */
1021 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1022 x += v->ob_digit[i];
1023 }
1024 x = x * sign;
1025 if (x == -1)
1026 x = -2;
1027 return x;
1028}
1029
1030
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001031/* Add the absolute values of two long integers. */
1032
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033static PyLongObject *x_add Py_PROTO((PyLongObject *, PyLongObject *));
1034static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001035x_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001037{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001038 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001039 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001040 int i;
1041 digit carry = 0;
1042
1043 /* Ensure a is the larger of the two: */
1044 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 { PyLongObject *temp = a; a = b; b = temp; }
1046 { int size_temp = size_a;
1047 size_a = size_b;
1048 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001049 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001051 if (z == NULL)
1052 return NULL;
1053 for (i = 0; i < size_b; ++i) {
1054 carry += a->ob_digit[i] + b->ob_digit[i];
1055 z->ob_digit[i] = carry & MASK;
1056 /* The following assumes unsigned shifts don't
1057 propagate the sign bit. */
1058 carry >>= SHIFT;
1059 }
1060 for (; i < size_a; ++i) {
1061 carry += a->ob_digit[i];
1062 z->ob_digit[i] = carry & MASK;
1063 carry >>= SHIFT;
1064 }
1065 z->ob_digit[i] = carry;
1066 return long_normalize(z);
1067}
1068
1069/* Subtract the absolute values of two integers. */
1070
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001071static PyLongObject *x_sub Py_PROTO((PyLongObject *, PyLongObject *));
1072static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001073x_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001074 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001075{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001076 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001077 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001078 int i;
1079 int sign = 1;
1080 digit borrow = 0;
1081
1082 /* Ensure a is the larger of the two: */
1083 if (size_a < size_b) {
1084 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085 { PyLongObject *temp = a; a = b; b = temp; }
1086 { int size_temp = size_a;
1087 size_a = size_b;
1088 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001089 }
1090 else if (size_a == size_b) {
1091 /* Find highest digit where a and b differ: */
1092 i = size_a;
1093 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1094 ;
1095 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001096 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001097 if (a->ob_digit[i] < b->ob_digit[i]) {
1098 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001100 }
1101 size_a = size_b = i+1;
1102 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001103 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001104 if (z == NULL)
1105 return NULL;
1106 for (i = 0; i < size_b; ++i) {
1107 /* The following assumes unsigned arithmetic
1108 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001109 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001110 z->ob_digit[i] = borrow & MASK;
1111 borrow >>= SHIFT;
1112 borrow &= 1; /* Keep only one sign bit */
1113 }
1114 for (; i < size_a; ++i) {
1115 borrow = a->ob_digit[i] - borrow;
1116 z->ob_digit[i] = borrow & MASK;
1117 borrow >>= SHIFT;
1118 }
1119 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001120 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001121 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001122 return long_normalize(z);
1123}
1124
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001125static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001126long_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001127 PyLongObject *a;
1128 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001129{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001130 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001131
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001132 if (a->ob_size < 0) {
1133 if (b->ob_size < 0) {
1134 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001135 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001136 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001137 }
1138 else
1139 z = x_sub(b, a);
1140 }
1141 else {
1142 if (b->ob_size < 0)
1143 z = x_sub(a, b);
1144 else
1145 z = x_add(a, b);
1146 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001147 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001148}
1149
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001150static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001151long_sub(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_sub(a, b);
1160 else
1161 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001162 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001163 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001164 }
1165 else {
1166 if (b->ob_size < 0)
1167 z = x_add(a, b);
1168 else
1169 z = x_sub(a, b);
1170 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001171 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001172}
1173
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001175long_mul(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001176 PyLongObject *a;
1177 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001178{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001179 int size_a;
1180 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001181 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001182 int i;
1183
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001184 size_a = ABS(a->ob_size);
1185 size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001186 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001187 if (z == NULL)
1188 return NULL;
1189 for (i = 0; i < z->ob_size; ++i)
1190 z->ob_digit[i] = 0;
1191 for (i = 0; i < size_a; ++i) {
1192 twodigits carry = 0;
1193 twodigits f = a->ob_digit[i];
1194 int j;
1195
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001196 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001197 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001198 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001199 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001200 for (j = 0; j < size_b; ++j) {
1201 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001202 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001203 carry >>= SHIFT;
1204 }
1205 for (; carry != 0; ++j) {
1206 assert(i+j < z->ob_size);
1207 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001208 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001209 carry >>= SHIFT;
1210 }
1211 }
1212 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001213 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001214 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001215 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001217}
1218
Guido van Rossume32e0141992-01-19 16:31:05 +00001219/* The / and % operators are now defined in terms of divmod().
1220 The expression a mod b has the value a - b*floor(a/b).
1221 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001222 |a| by |b|, with the sign of a. This is also expressed
1223 as a - b*trunc(a/b), if trunc truncates towards zero.
1224 Some examples:
1225 a b a rem b a mod b
1226 13 10 3 3
1227 -13 10 -3 7
1228 13 -10 3 -7
1229 -13 -10 -3 -3
1230 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001231 have different signs. We then subtract one from the 'div'
1232 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001233
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001234static int l_divmod Py_PROTO((PyLongObject *, PyLongObject *,
1235 PyLongObject **, PyLongObject **));
Guido van Rossume32e0141992-01-19 16:31:05 +00001236static int
1237l_divmod(v, w, pdiv, pmod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001238 PyLongObject *v;
1239 PyLongObject *w;
1240 PyLongObject **pdiv;
1241 PyLongObject **pmod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001242{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001244
1245 if (long_divrem(v, w, &div, &mod) < 0)
1246 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001247 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1248 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001249 PyLongObject *temp;
1250 PyLongObject *one;
1251 temp = (PyLongObject *) long_add(mod, w);
1252 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001253 mod = temp;
1254 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001255 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001256 return -1;
1257 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001258 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001259 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001260 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1261 Py_DECREF(mod);
1262 Py_DECREF(div);
1263 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001264 return -1;
1265 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001266 Py_DECREF(one);
1267 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001268 div = temp;
1269 }
1270 *pdiv = div;
1271 *pmod = mod;
1272 return 0;
1273}
1274
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001275static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001276long_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001277 PyLongObject *v;
1278 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001279{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001281 if (l_divmod(v, w, &div, &mod) < 0)
1282 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283 Py_DECREF(mod);
1284 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001285}
1286
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001288long_mod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001289 PyLongObject *v;
1290 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001291{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001293 if (l_divmod(v, w, &div, &mod) < 0)
1294 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001295 Py_DECREF(div);
1296 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001297}
1298
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001299static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001300long_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001301 PyLongObject *v;
1302 PyLongObject *w;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001303{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 PyObject *z;
1305 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001306 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001307 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001309 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001310 PyTuple_SetItem(z, 0, (PyObject *) div);
1311 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001312 }
1313 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001314 Py_DECREF(div);
1315 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001316 }
1317 return z;
1318}
1319
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001320static PyObject *
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001321long_pow(a, b, c)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001322 PyLongObject *a;
1323 PyLongObject *b;
1324 PyLongObject *c;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001325{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001327 int size_b, i;
1328
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001329 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001330 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 PyErr_SetString(PyExc_ValueError,
1332 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001333 return NULL;
1334 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335 z = (PyLongObject *)PyLong_FromLong(1L);
1336 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001337 for (i = 0; i < size_b; ++i) {
1338 digit bi = b->ob_digit[i];
1339 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001340
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001341 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001343
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001344 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345 temp = (PyLongObject *)long_mul(z, a);
1346 Py_DECREF(z);
1347 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001348 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001349 Py_XDECREF(div);
1350 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001351 temp = mod;
1352 }
1353 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001354 if (z == NULL)
1355 break;
1356 }
1357 bi >>= 1;
1358 if (bi == 0 && i+1 == size_b)
1359 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 temp = (PyLongObject *)long_mul(a, a);
1361 Py_DECREF(a);
1362 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001363 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001364 Py_XDECREF(div);
1365 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001366 temp = mod;
1367 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001368 a = temp;
1369 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001370 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001371 z = NULL;
1372 break;
1373 }
1374 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001375 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001376 break;
1377 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001378 Py_XDECREF(a);
1379 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001380 l_divmod(z, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001381 Py_XDECREF(div);
1382 Py_DECREF(z);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001383 z=mod;
1384 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001386}
1387
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001388static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001389long_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001390 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001391{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001392 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001393 PyLongObject *x;
1394 PyLongObject *w;
1395 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001396 if (w == NULL)
1397 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 x = (PyLongObject *) long_add(v, w);
1399 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001400 if (x == NULL)
1401 return NULL;
1402 if (x->ob_size != 0)
1403 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001404 return (PyObject *)x;
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_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001409 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001410{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001411 Py_INCREF(v);
1412 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001413}
1414
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001416long_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001418{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001420 int i, n;
1421 n = ABS(v->ob_size);
1422 if (n == 0) {
1423 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001424 Py_INCREF(v);
1425 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001426 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001428 if (z == NULL)
1429 return NULL;
1430 for (i = 0; i < n; i++)
1431 z->ob_digit[i] = v->ob_digit[i];
1432 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001434}
1435
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001436static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001437long_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001439{
1440 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001441 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001442 else {
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 Rossumedcc38a1991-05-05 20:09:44 +00001446}
1447
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001448static int
1449long_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001450 PyLongObject *v;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001451{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001452 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001453}
1454
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001456long_rshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001457 PyLongObject *a;
1458 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001459{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001460 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001461 long shiftby;
1462 int newsize, wordshift, loshift, hishift, i, j;
1463 digit lomask, himask;
1464
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001465 if (a->ob_size < 0) {
1466 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001467 PyLongObject *a1, *a2, *a3;
1468 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001469 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001470 a2 = (PyLongObject *) long_rshift(a1, b);
1471 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001472 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001473 a3 = (PyLongObject *) long_invert(a2);
1474 Py_DECREF(a2);
1475 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001476 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001477
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001478 shiftby = PyLong_AsLong((PyObject *)b);
1479 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001480 return NULL;
1481 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001482 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001483 return NULL;
1484 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001485 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001486 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001487 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001488 z = _PyLong_New(0);
1489 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001490 }
1491 loshift = shiftby % SHIFT;
1492 hishift = SHIFT - loshift;
1493 lomask = ((digit)1 << hishift) - 1;
1494 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001495 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001496 if (z == NULL)
1497 return NULL;
1498 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001499 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001500 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1501 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1502 if (i+1 < newsize)
1503 z->ob_digit[i] |=
1504 (a->ob_digit[j+1] << hishift) & himask;
1505 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001506 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001507}
1508
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001510long_lshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001511 PyLongObject *a;
1512 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001513{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001514 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001515 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001516 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001517 int oldsize, newsize, wordshift, remshift, i, j;
1518 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001519
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001520 shiftby = PyLong_AsLong((PyObject *)b);
1521 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001522 return NULL;
1523 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001524 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001525 return NULL;
1526 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001527 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001528 PyErr_SetString(PyExc_ValueError,
1529 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001530 return NULL;
1531 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001532 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1533 wordshift = (int)shiftby / SHIFT;
1534 remshift = (int)shiftby - wordshift * SHIFT;
1535
1536 oldsize = ABS(a->ob_size);
1537 newsize = oldsize + wordshift;
1538 if (remshift)
1539 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001540 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001541 if (z == NULL)
1542 return NULL;
1543 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001544 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001545 for (i = 0; i < wordshift; i++)
1546 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001547 accum = 0;
1548 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1549 accum |= a->ob_digit[j] << remshift;
1550 z->ob_digit[i] = (digit)(accum & MASK);
1551 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001552 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001553 if (remshift)
1554 z->ob_digit[newsize-1] = (digit)accum;
1555 else
1556 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001557 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001558}
1559
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001560
1561/* Bitwise and/xor/or operations */
1562
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001563#define MAX(x, y) ((x) < (y) ? (y) : (x))
1564#define MIN(x, y) ((x) > (y) ? (y) : (x))
1565
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001566static PyObject *long_bitwise Py_PROTO((PyLongObject *, int, PyLongObject *));
1567static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001568long_bitwise(a, op, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569 PyLongObject *a;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001570 int op; /* '&', '|', '^' */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001571 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001572{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001573 digit maska, maskb; /* 0 or MASK */
1574 int negz;
1575 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001576 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001577 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001578 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001579 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001580
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001581 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001583 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001584 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001585 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001586 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001587 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001588 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001589 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001590 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001591 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001592 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001593 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001595 maskb = 0;
1596 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001597
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001598 negz = 0;
1599 switch (op) {
1600 case '^':
1601 if (maska != maskb) {
1602 maska ^= MASK;
1603 negz = -1;
1604 }
1605 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001606 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001607 if (maska && maskb) {
1608 op = '|';
1609 maska ^= MASK;
1610 maskb ^= MASK;
1611 negz = -1;
1612 }
1613 break;
1614 case '|':
1615 if (maska || maskb) {
1616 op = '&';
1617 maska ^= MASK;
1618 maskb ^= MASK;
1619 negz = -1;
1620 }
1621 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001622 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001623
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001624 /* JRH: The original logic here was to allocate the result value (z)
1625 as the longer of the two operands. However, there are some cases
1626 where the result is guaranteed to be shorter than that: AND of two
1627 positives, OR of two negatives: use the shorter number. AND with
1628 mixed signs: use the positive number. OR with mixed signs: use the
1629 negative number. After the transformations above, op will be '&'
1630 iff one of these cases applies, and mask will be non-0 for operands
1631 whose length should be ignored.
1632 */
1633
1634 size_a = a->ob_size;
1635 size_b = b->ob_size;
1636 size_z = op == '&'
1637 ? (maska
1638 ? size_b
1639 : (maskb ? size_a : MIN(size_a, size_b)))
1640 : MAX(size_a, size_b);
1641 z = _PyLong_New(size_z);
1642 if (a == NULL || b == NULL || z == NULL) {
1643 Py_XDECREF(a);
1644 Py_XDECREF(b);
1645 Py_XDECREF(z);
1646 return NULL;
1647 }
1648
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001649 for (i = 0; i < size_z; ++i) {
1650 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1651 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1652 switch (op) {
1653 case '&': z->ob_digit[i] = diga & digb; break;
1654 case '|': z->ob_digit[i] = diga | digb; break;
1655 case '^': z->ob_digit[i] = diga ^ digb; break;
1656 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001657 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001658
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659 Py_DECREF(a);
1660 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001661 z = long_normalize(z);
1662 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001663 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001664 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001665 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001666 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001667}
1668
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001669static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001670long_and(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001671 PyLongObject *a;
1672 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001673{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001674 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001675}
1676
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001677static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001678long_xor(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001679 PyLongObject *a;
1680 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001681{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001682 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001683}
1684
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001685static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001686long_or(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001687 PyLongObject *a;
1688 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001689{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001690 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001691}
1692
Guido van Rossum234f9421993-06-17 12:35:49 +00001693static int
Guido van Rossume6eefc21992-08-14 12:06:52 +00001694long_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001695 PyObject **pv;
1696 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001697{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001698 if (PyInt_Check(*pw)) {
1699 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1700 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001701 return 0;
1702 }
1703 return 1; /* Can't do it */
1704}
1705
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001706static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001707long_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001708 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001709{
1710 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001711 x = PyLong_AsLong(v);
1712 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001713 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001714 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001715}
1716
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001717static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001718long_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001719 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001720{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001721 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001722 return v;
1723}
1724
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001725static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001726long_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001727 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001728{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001729 double result;
1730 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001731 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001732 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001733 return PyFloat_FromDouble(result);
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_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001738 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001739{
1740 return long_format(v, 8);
1741}
1742
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001743static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001744long_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001745 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001746{
1747 return long_format(v, 16);
1748}
1749
1750
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001751#define UF (unaryfunc)
1752#define BF (binaryfunc)
1753#define TF (ternaryfunc)
1754#define IF (inquiry)
Guido van Rossum8b27d921992-03-27 17:27:05 +00001755
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001756static PyNumberMethods long_as_number = {
Guido van Rossum8b27d921992-03-27 17:27:05 +00001757 BF long_add, /*nb_add*/
1758 BF long_sub, /*nb_subtract*/
1759 BF long_mul, /*nb_multiply*/
1760 BF long_div, /*nb_divide*/
1761 BF long_mod, /*nb_remainder*/
1762 BF long_divmod, /*nb_divmod*/
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001763 TF long_pow, /*nb_power*/
Guido van Rossum8b27d921992-03-27 17:27:05 +00001764 UF long_neg, /*nb_negative*/
1765 UF long_pos, /*tp_positive*/
1766 UF long_abs, /*tp_absolute*/
1767 IF long_nonzero,/*tp_nonzero*/
1768 UF long_invert, /*nb_invert*/
1769 BF long_lshift, /*nb_lshift*/
1770 BF long_rshift, /*nb_rshift*/
1771 BF long_and, /*nb_and*/
1772 BF long_xor, /*nb_xor*/
1773 BF long_or, /*nb_or*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001774 (int (*) Py_FPROTO((PyObject **, PyObject **)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001775 (coercion)long_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001776 UF long_int, /*nb_int*/
1777 UF long_long, /*nb_long*/
1778 UF long_float, /*nb_float*/
1779 UF long_oct, /*nb_oct*/
1780 UF long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001781};
1782
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001783PyTypeObject PyLong_Type = {
1784 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001785 0,
1786 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001787 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001788 sizeof(digit),
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001789 (destructor)long_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001790 0, /*tp_print*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001791 0, /*tp_getattr*/
1792 0, /*tp_setattr*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001793 (int (*) Py_FPROTO((PyObject *, PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001794 (cmpfunc)long_compare, /*tp_compare*/
1795 (reprfunc)long_repr, /*tp_repr*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001796 &long_as_number,/*tp_as_number*/
1797 0, /*tp_as_sequence*/
1798 0, /*tp_as_mapping*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001799 (long (*) Py_FPROTO((PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001800 (hashfunc)long_hash, /*tp_hash*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001801};