blob: c539e50b35646f3c2e695fad7b8038e83982176c [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 Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumedcc38a1991-05-05 20:09:44 +000014
15******************************************************************/
16
17/* Long (arbitrary precision) integer object implementation */
18
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000019/* XXX The functional organization of this file is terrible */
20
Guido van Rossumc0b618a1997-05-02 03:12:38 +000021#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +000022#include "longintrepr.h"
Guido van Rossum687ec181995-03-04 22:43:47 +000023#include "mymath.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +000024
Guido van Rossumedcc38a1991-05-05 20:09:44 +000025#include <assert.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000026#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000027
Guido van Rossume32e0141992-01-19 16:31:05 +000028#define ABS(x) ((x) < 0 ? -(x) : (x))
29
30/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000031static PyLongObject *long_normalize Py_PROTO((PyLongObject *));
32static PyLongObject *mul1 Py_PROTO((PyLongObject *, wdigit));
33static PyLongObject *muladd1 Py_PROTO((PyLongObject *, wdigit, wdigit));
34static PyLongObject *divrem1 Py_PROTO((PyLongObject *, wdigit, digit *));
Fred Drake121ee271999-12-23 15:41:28 +000035static PyObject *long_format Py_PROTO((PyObject *aa, int base, int addL));
Guido van Rossume32e0141992-01-19 16:31:05 +000036
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000037static int ticker; /* XXX Could be shared with ceval? */
38
Guido van Rossumc0b618a1997-05-02 03:12:38 +000039#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000040 if (--ticker < 0) { \
41 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000042 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000043 }
44
Guido van Rossumedcc38a1991-05-05 20:09:44 +000045/* Normalize (remove leading zeros from) a long int object.
46 Doesn't attempt to free the storage--in most cases, due to the nature
47 of the algorithms used, this could save at most be one word anyway. */
48
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +000050long_normalize(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000052{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000053 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000054 register int i = j;
55
56 while (i > 0 && v->ob_digit[i-1] == 0)
57 --i;
58 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000059 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000060 return v;
61}
62
63/* Allocate a new long int object with size digits.
64 Return NULL and set exception if we run out of memory. */
65
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066PyLongObject *
67_PyLong_New(size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000068 int size;
69{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000070 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000071}
72
73/* Create a new long int object from a C long int */
74
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075PyObject *
76PyLong_FromLong(ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000077 long ival;
78{
Guido van Rossum472c04f1996-12-05 21:57:21 +000079 /* Assume a C long fits in at most 5 'digits' */
80 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 PyLongObject *v = _PyLong_New(5);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000082 if (v != NULL) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000083 unsigned long t = ival;
84 int i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000085 if (ival < 0) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000086 t = -ival;
Guido van Rossum4c260ff1992-01-14 18:36:43 +000087 v->ob_size = -(v->ob_size);
Guido van Rossum472c04f1996-12-05 21:57:21 +000088 }
89 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +000090 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000091 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000092 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000093 v = long_normalize(v);
94 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000096}
97
Guido van Rossum53756b11997-01-03 17:14:46 +000098/* Create a new long int object from a C unsigned long int */
99
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100PyObject *
Guido van Rossum53756b11997-01-03 17:14:46 +0000101PyLong_FromUnsignedLong(ival)
102 unsigned long ival;
103{
104 /* Assume a C long fits in at most 5 'digits' */
105 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 PyLongObject *v = _PyLong_New(5);
Guido van Rossum53756b11997-01-03 17:14:46 +0000107 if (v != NULL) {
108 unsigned long t = ival;
109 int i;
110 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000111 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum53756b11997-01-03 17:14:46 +0000112 t >>= SHIFT;
113 }
114 v = long_normalize(v);
115 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000117}
118
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000119/* Create a new long int object from a C double */
120
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyObject *
Guido van Rossum687ec181995-03-04 22:43:47 +0000122#ifdef MPW
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123PyLong_FromDouble(double dval)
Guido van Rossum687ec181995-03-04 22:43:47 +0000124#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125PyLong_FromDouble(dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000126 double dval;
Guido van Rossum687ec181995-03-04 22:43:47 +0000127#endif /* MPW */
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000128{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000130 double frac;
131 int i, ndig, expo, neg;
132 neg = 0;
Guido van Rossum1a23c241999-09-27 17:11:52 +0000133 if (dval && dval * 0.5 == dval) {
134 PyErr_SetString(PyExc_OverflowError,
135 "cannot convert float infinity to long");
136 return NULL;
137 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000138 if (dval < 0.0) {
139 neg = 1;
140 dval = -dval;
141 }
142 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
143 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000145 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000147 if (v == NULL)
148 return NULL;
149 frac = ldexp(frac, (expo-1) % SHIFT + 1);
150 for (i = ndig; --i >= 0; ) {
151 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000152 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000153 frac = frac - (double)bits;
154 frac = ldexp(frac, SHIFT);
155 }
156 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000157 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000158 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000159}
160
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000161/* Get a C long int from a long int object.
162 Returns -1 and sets an error condition if overflow occurs. */
163
164long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165PyLong_AsLong(vv)
166 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000167{
Guido van Rossumf7531811998-05-26 14:33:37 +0000168 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000169 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000170 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000171 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000172
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 if (vv == NULL || !PyLong_Check(vv)) {
174 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000175 return -1;
176 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000177 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000178 i = v->ob_size;
179 sign = 1;
180 x = 0;
181 if (i < 0) {
182 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000183 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000184 }
185 while (--i >= 0) {
186 prev = x;
187 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000188 if ((x >> SHIFT) != prev)
189 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000190 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000191 /* Haven't lost any bits, but if the sign bit is set we're in
192 * trouble *unless* this is the min negative number. So,
193 * trouble iff sign bit set && (positive || some bit set other
194 * than the sign bit).
195 */
196 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
197 goto overflow;
198 return (long)x * sign;
199
200 overflow:
201 PyErr_SetString(PyExc_OverflowError,
202 "long int too long to convert");
203 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000204}
205
Guido van Rossum53756b11997-01-03 17:14:46 +0000206/* Get a C long int from a long int object.
207 Returns -1 and sets an error condition if overflow occurs. */
208
209unsigned long
210PyLong_AsUnsignedLong(vv)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000211 PyObject *vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000212{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000214 unsigned long x, prev;
215 int i;
216
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 if (vv == NULL || !PyLong_Check(vv)) {
218 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000219 return (unsigned long) -1;
220 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000222 i = v->ob_size;
223 x = 0;
224 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000226 "can't convert negative value to unsigned long");
227 return (unsigned long) -1;
228 }
229 while (--i >= 0) {
230 prev = x;
231 x = (x << SHIFT) + v->ob_digit[i];
232 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000234 "long int too long to convert");
235 return (unsigned long) -1;
236 }
237 }
238 return x;
239}
240
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000241/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000242
243double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244PyLong_AsDouble(vv)
245 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000246{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000247 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000248 double x;
249 double multiplier = (double) (1L << SHIFT);
250 int i, sign;
251
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000252 if (vv == NULL || !PyLong_Check(vv)) {
253 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000254 return -1;
255 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000257 i = v->ob_size;
258 sign = 1;
259 x = 0.0;
260 if (i < 0) {
261 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000262 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000263 }
264 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000265 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000266 }
267 return x * sign;
268}
269
Guido van Rossum78694d91998-09-18 14:14:13 +0000270/* Create a new long (or int) object from a C pointer */
271
272PyObject *
273PyLong_FromVoidPtr(p)
274 void *p;
275{
276#if SIZEOF_VOID_P == SIZEOF_LONG
277 return PyInt_FromLong((long)p);
278#else
279 /* optimize null pointers */
280 if ( p == NULL )
281 return PyInt_FromLong(0);
282
283 /* we can assume that HAVE_LONG_LONG is true. if not, then the
284 configuration process should have bailed (having big pointers
285 without long longs seems non-sensical) */
286 return PyLong_FromLongLong((LONG_LONG)p);
287#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
288}
289
290/* Get a C pointer from a long object (or an int object in some cases) */
291
292void *
293PyLong_AsVoidPtr(vv)
294 PyObject *vv;
295{
296 /* This function will allow int or long objects. If vv is neither,
297 then the PyLong_AsLong*() functions will raise the exception:
298 PyExc_SystemError, "bad argument to internal function"
299 */
300
301#if SIZEOF_VOID_P == SIZEOF_LONG
302 long x;
303
304 if ( PyInt_Check(vv) )
305 x = PyInt_AS_LONG(vv);
306 else
307 x = PyLong_AsLong(vv);
308#else
309 /* we can assume that HAVE_LONG_LONG is true. if not, then the
310 configuration process should have bailed (having big pointers
311 without long longs seems non-sensical) */
312 LONG_LONG x;
313
314 if ( PyInt_Check(vv) )
315 x = PyInt_AS_LONG(vv);
316 else
317 x = PyLong_AsLongLong(vv);
318#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
319
320 if (x == -1 && PyErr_Occurred())
321 return NULL;
322 return (void *)x;
323}
324
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000325#ifdef HAVE_LONG_LONG
326/*
Guido van Rossum3293b071998-08-25 16:07:15 +0000327 * LONG_LONG support by Chris Herborth (chrish@qnx.com)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000328 *
329 * For better or worse :-), I tried to follow the coding style already
330 * here.
331 */
332
Guido van Rossum3293b071998-08-25 16:07:15 +0000333/* Create a new long int object from a C LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000334
335PyObject *
336PyLong_FromLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000337 LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000338{
339#if SIZEOF_LONG_LONG == SIZEOF_LONG
340 /* In case the compiler is faking it. */
341 return PyLong_FromLong( (long)ival );
342#else
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000343 if ((LONG_LONG)LONG_MIN <= ival && ival <= (LONG_LONG)LONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000344 return PyLong_FromLong( (long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000345 }
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000346 else if (0 <= ival && ival <= (unsigned LONG_LONG)ULONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000347 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000348 }
349 else {
Guido van Rossum3293b071998-08-25 16:07:15 +0000350 /* Assume a C LONG_LONG fits in at most 10 'digits'.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000351 * Should be OK if we're assuming long fits in 5.
352 */
353 PyLongObject *v = _PyLong_New(10);
354
355 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000356 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000357 int i;
358 if (ival < 0) {
359 t = -ival;
360 v->ob_size = -(v->ob_size);
361 }
362
363 for (i = 0; i < 10; i++) {
364 v->ob_digit[i] = (digit) (t & MASK);
365 t >>= SHIFT;
366 }
367
368 v = long_normalize(v);
369 }
370
371 return (PyObject *)v;
372 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000373#endif
374}
375
Guido van Rossum3293b071998-08-25 16:07:15 +0000376/* Create a new long int object from a C unsigned LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000377PyObject *
378PyLong_FromUnsignedLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000379 unsigned LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000380{
381#if SIZEOF_LONG_LONG == SIZEOF_LONG
382 /* In case the compiler is faking it. */
383 return PyLong_FromUnsignedLong( (unsigned long)ival );
384#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000385 if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000386 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000387 }
388 else {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000389 /* Assume a C long fits in at most 10 'digits'. */
390 PyLongObject *v = _PyLong_New(10);
391
392 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000393 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000394 int i;
395 for (i = 0; i < 10; i++) {
396 v->ob_digit[i] = (digit) (t & MASK);
397 t >>= SHIFT;
398 }
399
400 v = long_normalize(v);
401 }
402
403 return (PyObject *)v;
404 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000405#endif
406}
407
Guido van Rossum3293b071998-08-25 16:07:15 +0000408/* Get a C LONG_LONG int from a long int object.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000409 Returns -1 and sets an error condition if overflow occurs. */
410
Guido van Rossum3293b071998-08-25 16:07:15 +0000411LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000412PyLong_AsLongLong(vv)
413 PyObject *vv;
414{
415#if SIZEOF_LONG_LONG == SIZEOF_LONG
416 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000417 return (LONG_LONG)PyLong_AsLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000418#else
419 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000420 LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000421 int i, sign;
422
423 if (vv == NULL || !PyLong_Check(vv)) {
424 PyErr_BadInternalCall();
425 return -1;
426 }
427
428 v = (PyLongObject *)vv;
429 i = v->ob_size;
430 sign = 1;
431 x = 0;
432
433 if (i < 0) {
434 sign = -1;
435 i = -(i);
436 }
437
438 while (--i >= 0) {
439 prev = x;
440 x = (x << SHIFT) + v->ob_digit[i];
441 if ((x >> SHIFT) != prev) {
442 PyErr_SetString(PyExc_OverflowError,
443 "long int too long to convert");
444 return -1;
445 }
446 }
447
448 return x * sign;
449#endif
450}
451
Guido van Rossum3293b071998-08-25 16:07:15 +0000452unsigned LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000453PyLong_AsUnsignedLongLong(vv)
454 PyObject *vv;
455{
456#if SIZEOF_LONG_LONG == 4
457 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000458 return (unsigned LONG_LONG)PyLong_AsUnsignedLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000459#else
460 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000461 unsigned LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000462 int i;
463
464 if (vv == NULL || !PyLong_Check(vv)) {
465 PyErr_BadInternalCall();
Guido van Rossum3293b071998-08-25 16:07:15 +0000466 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000467 }
468
469 v = (PyLongObject *)vv;
470 i = v->ob_size;
471 x = 0;
472
473 if (i < 0) {
474 PyErr_SetString(PyExc_OverflowError,
475 "can't convert negative value to unsigned long");
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 while (--i >= 0) {
480 prev = x;
481 x = (x << SHIFT) + v->ob_digit[i];
482 if ((x >> SHIFT) != prev) {
483 PyErr_SetString(PyExc_OverflowError,
484 "long int too long to convert");
Guido van Rossum3293b071998-08-25 16:07:15 +0000485 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000486 }
487 }
488
489 return x;
490#endif
491}
492#endif /* HAVE_LONG_LONG */
493
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000494/* Multiply by a single digit, ignoring the sign. */
495
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000497mul1(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000498 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000499 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000500{
501 return muladd1(a, n, (digit)0);
502}
503
504/* Multiply by a single digit and add 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 +0000507muladd1(a, n, extra)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000509 wdigit n;
510 wdigit extra;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000511{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000512 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000514 twodigits carry = extra;
515 int i;
516
517 if (z == NULL)
518 return NULL;
519 for (i = 0; i < size_a; ++i) {
520 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000521 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000522 carry >>= SHIFT;
523 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000524 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000525 return long_normalize(z);
526}
527
528/* Divide a long integer by a digit, returning both the quotient
529 (as function result) and the remainder (through *prem).
530 The sign of a is ignored; n should not be zero. */
531
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000533divrem1(a, n, prem)
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 digit *prem;
537{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000538 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000540 int i;
541 twodigits rem = 0;
542
543 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000545 if (z == NULL)
546 return NULL;
547 for (i = size; --i >= 0; ) {
548 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000549 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000550 rem %= n;
551 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000552 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000553 return long_normalize(z);
554}
555
556/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000557 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000558 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000559
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560static PyObject *
Fred Drake121ee271999-12-23 15:41:28 +0000561long_format(aa, base, addL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562 PyObject *aa;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000563 int base;
Fred Drake121ee271999-12-23 15:41:28 +0000564 int addL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000565{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 register PyLongObject *a = (PyLongObject *)aa;
567 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000568 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000569 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000570 char *p;
571 int bits;
572 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000573
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574 if (a == NULL || !PyLong_Check(a)) {
575 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000576 return NULL;
577 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000578 assert(base >= 2 && base <= 36);
579
580 /* Compute a rough upper bound for the length of the string */
581 i = base;
582 bits = 0;
583 while (i > 1) {
584 ++bits;
585 i >>= 1;
586 }
Fred Drake121ee271999-12-23 15:41:28 +0000587 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000589 if (str == NULL)
590 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000592 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000593 if (addL)
594 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000595 if (a->ob_size < 0)
596 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000597
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000598 if (a->ob_size == 0) {
599 *--p = '0';
600 }
601 else if ((base & (base - 1)) == 0) {
602 /* JRH: special case for power-of-2 bases */
603 twodigits temp = a->ob_digit[0];
604 int bitsleft = SHIFT;
605 int rem;
606 int last = abs(a->ob_size);
607 int basebits = 1;
608 i = base;
609 while ((i >>= 1) > 1) ++basebits;
610
611 i = 0;
612 for (;;) {
613 while (bitsleft >= basebits) {
614 if ((temp == 0) && (i >= last - 1)) break;
615 rem = temp & (base - 1);
616 if (rem < 10)
617 rem += '0';
618 else
619 rem += 'A' - 10;
620 assert(p > PyString_AS_STRING(str));
621 *--p = (char) rem;
622 bitsleft -= basebits;
623 temp >>= basebits;
624 }
625 if (++i >= last) {
626 if (temp == 0) break;
627 bitsleft = 99;
628 /* loop again to pick up final digits */
629 }
630 else {
631 temp = (a->ob_digit[i] << bitsleft) | temp;
632 bitsleft += SHIFT;
633 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000634 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000635 }
636 else {
637 Py_INCREF(a);
638 do {
639 digit rem;
640 PyLongObject *temp = divrem1(a, (digit)base, &rem);
641 if (temp == NULL) {
642 Py_DECREF(a);
643 Py_DECREF(str);
644 return NULL;
645 }
646 if (rem < 10)
647 rem += '0';
648 else
649 rem += 'A'-10;
650 assert(p > PyString_AS_STRING(str));
651 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000653 a = temp;
654 SIGCHECK({
655 Py_DECREF(a);
656 Py_DECREF(str);
657 return NULL;
658 })
659 } while (ABS(a->ob_size) != 0);
660 Py_DECREF(a);
661 }
662
Guido van Rossum2c475421992-08-14 15:13:07 +0000663 if (base == 8) {
664 if (size_a != 0)
665 *--p = '0';
666 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000667 else if (base == 16) {
668 *--p = 'x';
669 *--p = '0';
670 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000671 else if (base != 10) {
672 *--p = '#';
673 *--p = '0' + base%10;
674 if (base > 10)
675 *--p = '0' + base/10;
676 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000677 if (sign)
678 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000679 if (p != PyString_AS_STRING(str)) {
680 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000681 assert(p > q);
682 do {
683 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000684 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685 _PyString_Resize((PyObject **)&str,
686 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000687 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000689}
690
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000691#if 0
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000692/* Convert a string to a long int object, in a given base.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000693 Base zero implies a default depending on the number.
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000694 External linkage: used in compile.c and stropmodule.c. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000695
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000697long_scan(str, base)
698 char *str;
699 int base;
700{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701 return PyLong_FromString(str, (char **)NULL, base);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000702}
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000703#endif
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000704
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705PyObject *
706PyLong_FromString(str, pend, base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000707 char *str;
708 char **pend;
709 int base;
710{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000711 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000712 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000714
Guido van Rossum472c04f1996-12-05 21:57:21 +0000715 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716 PyErr_SetString(PyExc_ValueError,
717 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000718 return NULL;
719 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000720 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000721 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000722 if (*str == '+')
723 ++str;
724 else if (*str == '-') {
725 ++str;
726 sign = -1;
727 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000728 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000729 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000730 if (base == 0) {
731 if (str[0] != '0')
732 base = 10;
733 else if (str[1] == 'x' || str[1] == 'X')
734 base = 16;
735 else
736 base = 8;
737 }
738 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
739 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000741 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000742 for ( ; z != NULL; ++str) {
743 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000744 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000745
746 if (*str <= '9')
747 k = *str - '0';
748 else if (*str >= 'a')
749 k = *str - 'a' + 10;
750 else if (*str >= 'A')
751 k = *str - 'A' + 10;
752 if (k < 0 || k >= base)
753 break;
754 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000756 z = temp;
757 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000758 if (z == NULL)
759 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000760 if (str == start)
761 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000762 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000763 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000764 if (*str == 'L' || *str == 'l')
765 str++;
766 while (*str && isspace(Py_CHARMASK(*str)))
767 str++;
768 if (*str != '\0')
769 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000770 if (pend)
771 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000772 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000773
774 onError:
775 PyErr_Format(PyExc_ValueError,
776 "invalid literal for long(): %.200s", orig_str);
777 Py_XDECREF(z);
778 return NULL;
779}
780
781PyObject *
782PyLong_FromUnicode(u, length, base)
783 Py_UNICODE *u;
784 int length;
785 int base;
786{
787 char buffer[256];
788
789 if (length >= sizeof(buffer)) {
790 PyErr_SetString(PyExc_ValueError,
791 "long() literal too large to convert");
792 return NULL;
793 }
794 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
795 return NULL;
796
797 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000798}
799
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000800static PyLongObject *x_divrem
801 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject **));
802static PyObject *long_pos Py_PROTO((PyLongObject *));
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000803static int long_divrem Py_PROTO((PyLongObject *, PyLongObject *,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 PyLongObject **, PyLongObject **));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000805
806/* Long division with remainder, top-level routine */
807
Guido van Rossume32e0141992-01-19 16:31:05 +0000808static int
809long_divrem(a, b, pdiv, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 PyLongObject *a, *b;
811 PyLongObject **pdiv;
812 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000813{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000814 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000815 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000816
817 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000818 PyErr_SetString(PyExc_ZeroDivisionError,
819 "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000820 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000821 }
822 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000823 (size_a == size_b &&
824 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000825 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000826 *pdiv = _PyLong_New(0);
827 Py_INCREF(a);
828 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000829 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000830 }
831 if (size_b == 1) {
832 digit rem = 0;
833 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000834 if (z == NULL)
835 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000836 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000837 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000838 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000839 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000840 if (z == NULL)
841 return -1;
842 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000843 /* Set the signs.
844 The quotient z has the sign of a*b;
845 the remainder r has the sign of a,
846 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000847 if ((a->ob_size < 0) != (b->ob_size < 0))
848 z->ob_size = -(z->ob_size);
849 if (a->ob_size < 0 && (*prem)->ob_size != 0)
850 (*prem)->ob_size = -((*prem)->ob_size);
851 *pdiv = z;
852 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000853}
854
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000855/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000856
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000857static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000858x_divrem(v1, w1, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000859 PyLongObject *v1, *w1;
860 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000861{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000862 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000863 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000864 PyLongObject *v = mul1(v1, d);
865 PyLongObject *w = mul1(w1, d);
866 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000867 int j, k;
868
869 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870 Py_XDECREF(v);
871 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000872 return NULL;
873 }
874
875 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000876 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000877 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000878
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000879 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000880 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000881
882 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
883 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
884 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000885 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000886 int i;
887
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000888 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000890 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000891 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000892 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000893 if (vj == w->ob_digit[size_w-1])
894 q = MASK;
895 else
896 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
897 w->ob_digit[size_w-1];
898
899 while (w->ob_digit[size_w-2]*q >
900 ((
901 ((twodigits)vj << SHIFT)
902 + v->ob_digit[j-1]
903 - q*w->ob_digit[size_w-1]
904 ) << SHIFT)
905 + v->ob_digit[j-2])
906 --q;
907
908 for (i = 0; i < size_w && i+k < size_v; ++i) {
909 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000910 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000911 carry += v->ob_digit[i+k] - z
912 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000913 v->ob_digit[i+k] = carry & MASK;
914 carry = (carry >> SHIFT) - zz;
915 }
916
917 if (i+k < size_v) {
918 carry += v->ob_digit[i+k];
919 v->ob_digit[i+k] = 0;
920 }
921
922 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000923 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000924 else {
925 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000926 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000927 carry = 0;
928 for (i = 0; i < size_w && i+k < size_v; ++i) {
929 carry += v->ob_digit[i+k] + w->ob_digit[i];
930 v->ob_digit[i+k] = carry & MASK;
931 carry >>= SHIFT;
932 }
933 }
934 } /* for j, k */
935
Guido van Rossumc206c761995-01-10 15:23:19 +0000936 if (a == NULL)
937 *prem = NULL;
938 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000939 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000940 *prem = divrem1(v, d, &d);
941 /* d receives the (unused) remainder */
942 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000943 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000944 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000945 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000946 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947 Py_DECREF(v);
948 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000949 return a;
950}
951
952/* Methods */
953
Guido van Rossume32e0141992-01-19 16:31:05 +0000954/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000955static void long_dealloc Py_PROTO((PyObject *));
956static PyObject *long_repr Py_PROTO((PyObject *));
957static int long_compare Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossum065ce5a1998-09-13 15:37:20 +0000958static long long_hash Py_PROTO((PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000959
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000960static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *));
961static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *));
962static PyObject *long_mul Py_PROTO((PyLongObject *, PyLongObject *));
963static PyObject *long_div Py_PROTO((PyLongObject *, PyLongObject *));
964static PyObject *long_mod Py_PROTO((PyLongObject *, PyLongObject *));
965static PyObject *long_divmod Py_PROTO((PyLongObject *, PyLongObject *));
966static PyObject *long_pow
967 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject *));
968static PyObject *long_neg Py_PROTO((PyLongObject *));
969static PyObject *long_pos Py_PROTO((PyLongObject *));
970static PyObject *long_abs Py_PROTO((PyLongObject *));
971static int long_nonzero Py_PROTO((PyLongObject *));
972static PyObject *long_invert Py_PROTO((PyLongObject *));
973static PyObject *long_lshift Py_PROTO((PyLongObject *, PyLongObject *));
974static PyObject *long_rshift Py_PROTO((PyLongObject *, PyLongObject *));
975static PyObject *long_and Py_PROTO((PyLongObject *, PyLongObject *));
976static PyObject *long_xor Py_PROTO((PyLongObject *, PyLongObject *));
977static PyObject *long_or Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000978
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000979static void
980long_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000981 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000982{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000983 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000984}
985
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000986static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000987long_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000988 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000989{
Fred Drake121ee271999-12-23 15:41:28 +0000990 return long_format(v, 10, 1);
991}
992
993static PyObject *
994long_str(v)
995 PyObject *v;
996{
997 return long_format(v, 10, 0);
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 Rossumba71a242000-04-10 17:31:58 +00001211 if (size_a > size_b) {
1212 /* we are faster with the small object on the left */
1213 int hold_sa = size_a;
1214 PyLongObject *hold_a = a;
1215 size_a = size_b;
1216 size_b = hold_sa;
1217 a = b;
1218 b = hold_a;
1219 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001221 if (z == NULL)
1222 return NULL;
1223 for (i = 0; i < z->ob_size; ++i)
1224 z->ob_digit[i] = 0;
1225 for (i = 0; i < size_a; ++i) {
1226 twodigits carry = 0;
1227 twodigits f = a->ob_digit[i];
1228 int j;
1229
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001230 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001231 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001232 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001233 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001234 for (j = 0; j < size_b; ++j) {
1235 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001236 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001237 carry >>= SHIFT;
1238 }
1239 for (; carry != 0; ++j) {
1240 assert(i+j < z->ob_size);
1241 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001242 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001243 carry >>= SHIFT;
1244 }
1245 }
1246 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001247 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001248 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001249 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001251}
1252
Guido van Rossume32e0141992-01-19 16:31:05 +00001253/* The / and % operators are now defined in terms of divmod().
1254 The expression a mod b has the value a - b*floor(a/b).
1255 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001256 |a| by |b|, with the sign of a. This is also expressed
1257 as a - b*trunc(a/b), if trunc truncates towards zero.
1258 Some examples:
1259 a b a rem b a mod b
1260 13 10 3 3
1261 -13 10 -3 7
1262 13 -10 3 -7
1263 -13 -10 -3 -3
1264 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001265 have different signs. We then subtract one from the 'div'
1266 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001267
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001268static int l_divmod Py_PROTO((PyLongObject *, PyLongObject *,
1269 PyLongObject **, PyLongObject **));
Guido van Rossume32e0141992-01-19 16:31:05 +00001270static int
1271l_divmod(v, w, pdiv, pmod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001272 PyLongObject *v;
1273 PyLongObject *w;
1274 PyLongObject **pdiv;
1275 PyLongObject **pmod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001276{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001277 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001278
1279 if (long_divrem(v, w, &div, &mod) < 0)
1280 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001281 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1282 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283 PyLongObject *temp;
1284 PyLongObject *one;
1285 temp = (PyLongObject *) long_add(mod, w);
1286 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001287 mod = temp;
1288 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001289 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001290 return -1;
1291 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001293 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001294 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1295 Py_DECREF(mod);
1296 Py_DECREF(div);
1297 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001298 return -1;
1299 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 Py_DECREF(one);
1301 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001302 div = temp;
1303 }
1304 *pdiv = div;
1305 *pmod = mod;
1306 return 0;
1307}
1308
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001309static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001310long_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311 PyLongObject *v;
1312 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001313{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001314 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001315 if (l_divmod(v, w, &div, &mod) < 0)
1316 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317 Py_DECREF(mod);
1318 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001319}
1320
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001321static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001322long_mod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001323 PyLongObject *v;
1324 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001325{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001327 if (l_divmod(v, w, &div, &mod) < 0)
1328 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001329 Py_DECREF(div);
1330 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001331}
1332
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001334long_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335 PyLongObject *v;
1336 PyLongObject *w;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001337{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001338 PyObject *z;
1339 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001340 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001341 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001343 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001344 PyTuple_SetItem(z, 0, (PyObject *) div);
1345 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001346 }
1347 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348 Py_DECREF(div);
1349 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001350 }
1351 return z;
1352}
1353
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001354static PyObject *
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001355long_pow(a, b, c)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001356 PyLongObject *a;
1357 PyLongObject *b;
1358 PyLongObject *c;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001359{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001361 int size_b, i;
1362
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001363 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001364 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001365 PyErr_SetString(PyExc_ValueError,
1366 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001367 return NULL;
1368 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369 z = (PyLongObject *)PyLong_FromLong(1L);
1370 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001371 for (i = 0; i < size_b; ++i) {
1372 digit bi = b->ob_digit[i];
1373 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001374
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001375 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001376 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001377
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001378 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001379 temp = (PyLongObject *)long_mul(z, a);
1380 Py_DECREF(z);
1381 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001382 if (l_divmod(temp,c,&div,&mod) < 0) {
1383 Py_DECREF(temp);
1384 z = NULL;
1385 goto error;
1386 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387 Py_XDECREF(div);
1388 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001389 temp = mod;
1390 }
1391 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001392 if (z == NULL)
1393 break;
1394 }
1395 bi >>= 1;
1396 if (bi == 0 && i+1 == size_b)
1397 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 temp = (PyLongObject *)long_mul(a, a);
1399 Py_DECREF(a);
1400 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001401 if (l_divmod(temp, c, &div, &mod) < 0) {
1402 Py_DECREF(temp);
1403 z = NULL;
1404 goto error;
1405 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406 Py_XDECREF(div);
1407 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001408 temp = mod;
1409 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001410 a = temp;
1411 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001412 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001413 z = NULL;
1414 break;
1415 }
1416 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001417 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001418 break;
1419 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001420 Py_XDECREF(a);
1421 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001422 if (l_divmod(z, c, &div, &mod) < 0) {
1423 Py_DECREF(z);
1424 z = NULL;
1425 }
1426 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 Py_XDECREF(div);
1428 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001429 z = mod;
1430 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001431 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001432 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001434}
1435
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001436static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001437long_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001439{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001440 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001441 PyLongObject *x;
1442 PyLongObject *w;
1443 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001444 if (w == NULL)
1445 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 x = (PyLongObject *) long_add(v, w);
1447 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001448 if (x == NULL)
1449 return NULL;
1450 if (x->ob_size != 0)
1451 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001453}
1454
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001456long_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001457 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001458{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001459 Py_INCREF(v);
1460 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001461}
1462
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001463static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001464long_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001465 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001466{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001467 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001468 int i, n;
1469 n = ABS(v->ob_size);
1470 if (n == 0) {
1471 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001472 Py_INCREF(v);
1473 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001474 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001475 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001476 if (z == NULL)
1477 return NULL;
1478 for (i = 0; i < n; i++)
1479 z->ob_digit[i] = v->ob_digit[i];
1480 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001481 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001482}
1483
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001484static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001485long_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001486 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001487{
1488 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001489 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001490 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001491 Py_INCREF(v);
1492 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001493 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001494}
1495
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001496static int
1497long_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001498 PyLongObject *v;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001499{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001500 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001501}
1502
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001503static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001504long_rshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001505 PyLongObject *a;
1506 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001507{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001508 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001509 long shiftby;
1510 int newsize, wordshift, loshift, hishift, i, j;
1511 digit lomask, himask;
1512
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001513 if (a->ob_size < 0) {
1514 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001515 PyLongObject *a1, *a2, *a3;
1516 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001517 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001518 a2 = (PyLongObject *) long_rshift(a1, b);
1519 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001520 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001521 a3 = (PyLongObject *) long_invert(a2);
1522 Py_DECREF(a2);
1523 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001524 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001525
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001526 shiftby = PyLong_AsLong((PyObject *)b);
1527 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001528 return NULL;
1529 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001530 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001531 return NULL;
1532 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001533 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001534 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001535 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 z = _PyLong_New(0);
1537 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001538 }
1539 loshift = shiftby % SHIFT;
1540 hishift = SHIFT - loshift;
1541 lomask = ((digit)1 << hishift) - 1;
1542 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001544 if (z == NULL)
1545 return NULL;
1546 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001547 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001548 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1549 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1550 if (i+1 < newsize)
1551 z->ob_digit[i] |=
1552 (a->ob_digit[j+1] << hishift) & himask;
1553 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001554 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001555}
1556
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001557static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001558long_lshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001559 PyLongObject *a;
1560 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001561{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001562 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001563 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001564 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001565 int oldsize, newsize, wordshift, remshift, i, j;
1566 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001567
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568 shiftby = PyLong_AsLong((PyObject *)b);
1569 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001570 return NULL;
1571 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001572 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001573 return NULL;
1574 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001575 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001576 PyErr_SetString(PyExc_ValueError,
1577 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001578 return NULL;
1579 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001580 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1581 wordshift = (int)shiftby / SHIFT;
1582 remshift = (int)shiftby - wordshift * SHIFT;
1583
1584 oldsize = ABS(a->ob_size);
1585 newsize = oldsize + wordshift;
1586 if (remshift)
1587 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001588 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001589 if (z == NULL)
1590 return NULL;
1591 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001592 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001593 for (i = 0; i < wordshift; i++)
1594 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001595 accum = 0;
1596 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1597 accum |= a->ob_digit[j] << remshift;
1598 z->ob_digit[i] = (digit)(accum & MASK);
1599 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001600 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001601 if (remshift)
1602 z->ob_digit[newsize-1] = (digit)accum;
1603 else
1604 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001605 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001606}
1607
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001608
1609/* Bitwise and/xor/or operations */
1610
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001611#define MAX(x, y) ((x) < (y) ? (y) : (x))
1612#define MIN(x, y) ((x) > (y) ? (y) : (x))
1613
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001614static PyObject *long_bitwise Py_PROTO((PyLongObject *, int, PyLongObject *));
1615static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001616long_bitwise(a, op, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001617 PyLongObject *a;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001618 int op; /* '&', '|', '^' */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001619 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001620{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001621 digit maska, maskb; /* 0 or MASK */
1622 int negz;
1623 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001624 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001625 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001626 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001627 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001628
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001629 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001630 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001631 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001632 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001633 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001634 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001635 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001636 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001637 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001638 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001639 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001640 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001641 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001642 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001643 maskb = 0;
1644 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001645
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001646 negz = 0;
1647 switch (op) {
1648 case '^':
1649 if (maska != maskb) {
1650 maska ^= MASK;
1651 negz = -1;
1652 }
1653 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001654 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001655 if (maska && maskb) {
1656 op = '|';
1657 maska ^= MASK;
1658 maskb ^= MASK;
1659 negz = -1;
1660 }
1661 break;
1662 case '|':
1663 if (maska || maskb) {
1664 op = '&';
1665 maska ^= MASK;
1666 maskb ^= MASK;
1667 negz = -1;
1668 }
1669 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001670 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001671
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001672 /* JRH: The original logic here was to allocate the result value (z)
1673 as the longer of the two operands. However, there are some cases
1674 where the result is guaranteed to be shorter than that: AND of two
1675 positives, OR of two negatives: use the shorter number. AND with
1676 mixed signs: use the positive number. OR with mixed signs: use the
1677 negative number. After the transformations above, op will be '&'
1678 iff one of these cases applies, and mask will be non-0 for operands
1679 whose length should be ignored.
1680 */
1681
1682 size_a = a->ob_size;
1683 size_b = b->ob_size;
1684 size_z = op == '&'
1685 ? (maska
1686 ? size_b
1687 : (maskb ? size_a : MIN(size_a, size_b)))
1688 : MAX(size_a, size_b);
1689 z = _PyLong_New(size_z);
1690 if (a == NULL || b == NULL || z == NULL) {
1691 Py_XDECREF(a);
1692 Py_XDECREF(b);
1693 Py_XDECREF(z);
1694 return NULL;
1695 }
1696
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001697 for (i = 0; i < size_z; ++i) {
1698 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1699 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1700 switch (op) {
1701 case '&': z->ob_digit[i] = diga & digb; break;
1702 case '|': z->ob_digit[i] = diga | digb; break;
1703 case '^': z->ob_digit[i] = diga ^ digb; break;
1704 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001705 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001706
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001707 Py_DECREF(a);
1708 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001709 z = long_normalize(z);
1710 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001711 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001712 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001713 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001714 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001715}
1716
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001717static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001718long_and(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001719 PyLongObject *a;
1720 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001721{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001722 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001723}
1724
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001725static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001726long_xor(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001727 PyLongObject *a;
1728 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001729{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001730 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001731}
1732
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001733static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001734long_or(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001735 PyLongObject *a;
1736 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001737{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001738 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001739}
1740
Guido van Rossum234f9421993-06-17 12:35:49 +00001741static int
Guido van Rossume6eefc21992-08-14 12:06:52 +00001742long_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001743 PyObject **pv;
1744 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001745{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001746 if (PyInt_Check(*pw)) {
1747 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1748 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001749 return 0;
1750 }
1751 return 1; /* Can't do it */
1752}
1753
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001754static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001755long_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001756 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001757{
1758 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001759 x = PyLong_AsLong(v);
1760 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001761 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001762 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001763}
1764
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001765static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001766long_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001767 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001768{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001769 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001770 return v;
1771}
1772
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001773static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001774long_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001775 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001776{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001777 double result;
1778 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001779 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001780 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001781 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001782}
1783
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001784static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001785long_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001786 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001787{
Fred Drake121ee271999-12-23 15:41:28 +00001788 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001789}
1790
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001791static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001792long_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001793 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001794{
Fred Drake121ee271999-12-23 15:41:28 +00001795 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001796}
1797
1798
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001799#define UF (unaryfunc)
1800#define BF (binaryfunc)
1801#define TF (ternaryfunc)
1802#define IF (inquiry)
Guido van Rossum8b27d921992-03-27 17:27:05 +00001803
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001804static PyNumberMethods long_as_number = {
Guido van Rossum8b27d921992-03-27 17:27:05 +00001805 BF long_add, /*nb_add*/
1806 BF long_sub, /*nb_subtract*/
1807 BF long_mul, /*nb_multiply*/
1808 BF long_div, /*nb_divide*/
1809 BF long_mod, /*nb_remainder*/
1810 BF long_divmod, /*nb_divmod*/
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001811 TF long_pow, /*nb_power*/
Guido van Rossum8b27d921992-03-27 17:27:05 +00001812 UF long_neg, /*nb_negative*/
1813 UF long_pos, /*tp_positive*/
1814 UF long_abs, /*tp_absolute*/
1815 IF long_nonzero,/*tp_nonzero*/
1816 UF long_invert, /*nb_invert*/
1817 BF long_lshift, /*nb_lshift*/
1818 BF long_rshift, /*nb_rshift*/
1819 BF long_and, /*nb_and*/
1820 BF long_xor, /*nb_xor*/
1821 BF long_or, /*nb_or*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001822 (int (*) Py_FPROTO((PyObject **, PyObject **)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001823 (coercion)long_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001824 UF long_int, /*nb_int*/
1825 UF long_long, /*nb_long*/
1826 UF long_float, /*nb_float*/
1827 UF long_oct, /*nb_oct*/
1828 UF long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001829};
1830
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001831PyTypeObject PyLong_Type = {
1832 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001833 0,
1834 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001835 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001836 sizeof(digit),
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001837 (destructor)long_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001838 0, /*tp_print*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001839 0, /*tp_getattr*/
1840 0, /*tp_setattr*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001841 (int (*) Py_FPROTO((PyObject *, PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001842 (cmpfunc)long_compare, /*tp_compare*/
1843 (reprfunc)long_repr, /*tp_repr*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001844 &long_as_number,/*tp_as_number*/
1845 0, /*tp_as_sequence*/
1846 0, /*tp_as_mapping*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001847 (long (*) Py_FPROTO((PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001848 (hashfunc)long_hash, /*tp_hash*/
Fred Drake121ee271999-12-23 15:41:28 +00001849 0, /*tp_call*/
1850 (reprfunc)long_str, /*tp_str*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001851};