blob: 4bf89d9aaf20312825100f4449ab41fa40e9413d [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 *));
Fred Drake121ee271999-12-23 15:41:28 +000050static PyObject *long_format Py_PROTO((PyObject *aa, int base, int addL));
Guido van Rossume32e0141992-01-19 16:31:05 +000051
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000052static int ticker; /* XXX Could be shared with ceval? */
53
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000055 if (--ticker < 0) { \
56 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000058 }
59
Guido van Rossumedcc38a1991-05-05 20:09:44 +000060/* Normalize (remove leading zeros from) a long int object.
61 Doesn't attempt to free the storage--in most cases, due to the nature
62 of the algorithms used, this could save at most be one word anyway. */
63
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +000065long_normalize(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000067{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000068 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000069 register int i = j;
70
71 while (i > 0 && v->ob_digit[i-1] == 0)
72 --i;
73 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000074 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000075 return v;
76}
77
78/* Allocate a new long int object with size digits.
79 Return NULL and set exception if we run out of memory. */
80
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081PyLongObject *
82_PyLong_New(size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000083 int size;
84{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086}
87
88/* Create a new long int object from a C long int */
89
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090PyObject *
91PyLong_FromLong(ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000092 long ival;
93{
Guido van Rossum472c04f1996-12-05 21:57:21 +000094 /* Assume a C long fits in at most 5 'digits' */
95 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 PyLongObject *v = _PyLong_New(5);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000097 if (v != NULL) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000098 unsigned long t = ival;
99 int i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000100 if (ival < 0) {
Guido van Rossum472c04f1996-12-05 21:57:21 +0000101 t = -ival;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000102 v->ob_size = -(v->ob_size);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000103 }
104 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000105 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000106 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000107 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000108 v = long_normalize(v);
109 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000111}
112
Guido van Rossum53756b11997-01-03 17:14:46 +0000113/* Create a new long int object from a C unsigned long int */
114
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyObject *
Guido van Rossum53756b11997-01-03 17:14:46 +0000116PyLong_FromUnsignedLong(ival)
117 unsigned long ival;
118{
119 /* Assume a C long fits in at most 5 'digits' */
120 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 PyLongObject *v = _PyLong_New(5);
Guido van Rossum53756b11997-01-03 17:14:46 +0000122 if (v != NULL) {
123 unsigned long t = ival;
124 int i;
125 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000126 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum53756b11997-01-03 17:14:46 +0000127 t >>= SHIFT;
128 }
129 v = long_normalize(v);
130 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000132}
133
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000134/* Create a new long int object from a C double */
135
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136PyObject *
Guido van Rossum687ec181995-03-04 22:43:47 +0000137#ifdef MPW
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138PyLong_FromDouble(double dval)
Guido van Rossum687ec181995-03-04 22:43:47 +0000139#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140PyLong_FromDouble(dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000141 double dval;
Guido van Rossum687ec181995-03-04 22:43:47 +0000142#endif /* MPW */
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000143{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000145 double frac;
146 int i, ndig, expo, neg;
147 neg = 0;
Guido van Rossum1a23c241999-09-27 17:11:52 +0000148 if (dval && dval * 0.5 == dval) {
149 PyErr_SetString(PyExc_OverflowError,
150 "cannot convert float infinity to long");
151 return NULL;
152 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000153 if (dval < 0.0) {
154 neg = 1;
155 dval = -dval;
156 }
157 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
158 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000160 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000162 if (v == NULL)
163 return NULL;
164 frac = ldexp(frac, (expo-1) % SHIFT + 1);
165 for (i = ndig; --i >= 0; ) {
166 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000167 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000168 frac = frac - (double)bits;
169 frac = ldexp(frac, SHIFT);
170 }
171 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000172 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000174}
175
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000176/* Get a C long int from a long int object.
177 Returns -1 and sets an error condition if overflow occurs. */
178
179long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000180PyLong_AsLong(vv)
181 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000182{
Guido van Rossumf7531811998-05-26 14:33:37 +0000183 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000185 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000186 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000187
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 if (vv == NULL || !PyLong_Check(vv)) {
189 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000190 return -1;
191 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000193 i = v->ob_size;
194 sign = 1;
195 x = 0;
196 if (i < 0) {
197 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000198 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000199 }
200 while (--i >= 0) {
201 prev = x;
202 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000203 if ((x >> SHIFT) != prev)
204 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000205 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000206 /* Haven't lost any bits, but if the sign bit is set we're in
207 * trouble *unless* this is the min negative number. So,
208 * trouble iff sign bit set && (positive || some bit set other
209 * than the sign bit).
210 */
211 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
212 goto overflow;
213 return (long)x * sign;
214
215 overflow:
216 PyErr_SetString(PyExc_OverflowError,
217 "long int too long to convert");
218 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000219}
220
Guido van Rossum53756b11997-01-03 17:14:46 +0000221/* Get a C long int from a long int object.
222 Returns -1 and sets an error condition if overflow occurs. */
223
224unsigned long
225PyLong_AsUnsignedLong(vv)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 PyObject *vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000227{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000229 unsigned long x, prev;
230 int i;
231
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 if (vv == NULL || !PyLong_Check(vv)) {
233 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000234 return (unsigned long) -1;
235 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000237 i = v->ob_size;
238 x = 0;
239 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000241 "can't convert negative value to unsigned long");
242 return (unsigned long) -1;
243 }
244 while (--i >= 0) {
245 prev = x;
246 x = (x << SHIFT) + v->ob_digit[i];
247 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000248 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000249 "long int too long to convert");
250 return (unsigned long) -1;
251 }
252 }
253 return x;
254}
255
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000256/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000257
258double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000259PyLong_AsDouble(vv)
260 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000261{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000263 double x;
264 double multiplier = (double) (1L << SHIFT);
265 int i, sign;
266
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267 if (vv == NULL || !PyLong_Check(vv)) {
268 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000269 return -1;
270 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000271 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000272 i = v->ob_size;
273 sign = 1;
274 x = 0.0;
275 if (i < 0) {
276 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000277 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000278 }
279 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000280 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000281 }
282 return x * sign;
283}
284
Guido van Rossum78694d91998-09-18 14:14:13 +0000285/* Create a new long (or int) object from a C pointer */
286
287PyObject *
288PyLong_FromVoidPtr(p)
289 void *p;
290{
291#if SIZEOF_VOID_P == SIZEOF_LONG
292 return PyInt_FromLong((long)p);
293#else
294 /* optimize null pointers */
295 if ( p == NULL )
296 return PyInt_FromLong(0);
297
298 /* we can assume that HAVE_LONG_LONG is true. if not, then the
299 configuration process should have bailed (having big pointers
300 without long longs seems non-sensical) */
301 return PyLong_FromLongLong((LONG_LONG)p);
302#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
303}
304
305/* Get a C pointer from a long object (or an int object in some cases) */
306
307void *
308PyLong_AsVoidPtr(vv)
309 PyObject *vv;
310{
311 /* This function will allow int or long objects. If vv is neither,
312 then the PyLong_AsLong*() functions will raise the exception:
313 PyExc_SystemError, "bad argument to internal function"
314 */
315
316#if SIZEOF_VOID_P == SIZEOF_LONG
317 long x;
318
319 if ( PyInt_Check(vv) )
320 x = PyInt_AS_LONG(vv);
321 else
322 x = PyLong_AsLong(vv);
323#else
324 /* we can assume that HAVE_LONG_LONG is true. if not, then the
325 configuration process should have bailed (having big pointers
326 without long longs seems non-sensical) */
327 LONG_LONG x;
328
329 if ( PyInt_Check(vv) )
330 x = PyInt_AS_LONG(vv);
331 else
332 x = PyLong_AsLongLong(vv);
333#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
334
335 if (x == -1 && PyErr_Occurred())
336 return NULL;
337 return (void *)x;
338}
339
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000340#ifdef HAVE_LONG_LONG
341/*
Guido van Rossum3293b071998-08-25 16:07:15 +0000342 * LONG_LONG support by Chris Herborth (chrish@qnx.com)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000343 *
344 * For better or worse :-), I tried to follow the coding style already
345 * here.
346 */
347
Guido van Rossum3293b071998-08-25 16:07:15 +0000348/* Create a new long int object from a C LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000349
350PyObject *
351PyLong_FromLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000352 LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000353{
354#if SIZEOF_LONG_LONG == SIZEOF_LONG
355 /* In case the compiler is faking it. */
356 return PyLong_FromLong( (long)ival );
357#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000358 if( ival <= (LONG_LONG)LONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000359 return PyLong_FromLong( (long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000360 }
Guido van Rossum3293b071998-08-25 16:07:15 +0000361 else if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000362 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000363 }
364 else {
Guido van Rossum3293b071998-08-25 16:07:15 +0000365 /* Assume a C LONG_LONG fits in at most 10 'digits'.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000366 * Should be OK if we're assuming long fits in 5.
367 */
368 PyLongObject *v = _PyLong_New(10);
369
370 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000371 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000372 int i;
373 if (ival < 0) {
374 t = -ival;
375 v->ob_size = -(v->ob_size);
376 }
377
378 for (i = 0; i < 10; i++) {
379 v->ob_digit[i] = (digit) (t & MASK);
380 t >>= SHIFT;
381 }
382
383 v = long_normalize(v);
384 }
385
386 return (PyObject *)v;
387 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000388#endif
389}
390
Guido van Rossum3293b071998-08-25 16:07:15 +0000391/* Create a new long int object from a C unsigned LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000392PyObject *
393PyLong_FromUnsignedLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000394 unsigned LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000395{
396#if SIZEOF_LONG_LONG == SIZEOF_LONG
397 /* In case the compiler is faking it. */
398 return PyLong_FromUnsignedLong( (unsigned long)ival );
399#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000400 if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000401 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000402 }
403 else {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000404 /* Assume a C long fits in at most 10 'digits'. */
405 PyLongObject *v = _PyLong_New(10);
406
407 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000408 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000409 int i;
410 for (i = 0; i < 10; i++) {
411 v->ob_digit[i] = (digit) (t & MASK);
412 t >>= SHIFT;
413 }
414
415 v = long_normalize(v);
416 }
417
418 return (PyObject *)v;
419 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000420#endif
421}
422
Guido van Rossum3293b071998-08-25 16:07:15 +0000423/* Get a C LONG_LONG int from a long int object.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000424 Returns -1 and sets an error condition if overflow occurs. */
425
Guido van Rossum3293b071998-08-25 16:07:15 +0000426LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000427PyLong_AsLongLong(vv)
428 PyObject *vv;
429{
430#if SIZEOF_LONG_LONG == SIZEOF_LONG
431 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000432 return (LONG_LONG)PyLong_AsLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000433#else
434 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000435 LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000436 int i, sign;
437
438 if (vv == NULL || !PyLong_Check(vv)) {
439 PyErr_BadInternalCall();
440 return -1;
441 }
442
443 v = (PyLongObject *)vv;
444 i = v->ob_size;
445 sign = 1;
446 x = 0;
447
448 if (i < 0) {
449 sign = -1;
450 i = -(i);
451 }
452
453 while (--i >= 0) {
454 prev = x;
455 x = (x << SHIFT) + v->ob_digit[i];
456 if ((x >> SHIFT) != prev) {
457 PyErr_SetString(PyExc_OverflowError,
458 "long int too long to convert");
459 return -1;
460 }
461 }
462
463 return x * sign;
464#endif
465}
466
Guido van Rossum3293b071998-08-25 16:07:15 +0000467unsigned LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000468PyLong_AsUnsignedLongLong(vv)
469 PyObject *vv;
470{
471#if SIZEOF_LONG_LONG == 4
472 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000473 return (unsigned LONG_LONG)PyLong_AsUnsignedLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000474#else
475 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000476 unsigned LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000477 int i;
478
479 if (vv == NULL || !PyLong_Check(vv)) {
480 PyErr_BadInternalCall();
Guido van Rossum3293b071998-08-25 16:07:15 +0000481 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000482 }
483
484 v = (PyLongObject *)vv;
485 i = v->ob_size;
486 x = 0;
487
488 if (i < 0) {
489 PyErr_SetString(PyExc_OverflowError,
490 "can't convert negative value to unsigned long");
Guido van Rossum3293b071998-08-25 16:07:15 +0000491 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000492 }
493
494 while (--i >= 0) {
495 prev = x;
496 x = (x << SHIFT) + v->ob_digit[i];
497 if ((x >> SHIFT) != prev) {
498 PyErr_SetString(PyExc_OverflowError,
499 "long int too long to convert");
Guido van Rossum3293b071998-08-25 16:07:15 +0000500 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000501 }
502 }
503
504 return x;
505#endif
506}
507#endif /* HAVE_LONG_LONG */
508
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000509/* Multiply by a single digit, ignoring the sign. */
510
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000512mul1(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000514 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000515{
516 return muladd1(a, n, (digit)0);
517}
518
519/* Multiply by a single digit and add a single digit, ignoring the sign. */
520
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000522muladd1(a, n, extra)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000524 wdigit n;
525 wdigit extra;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000526{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000527 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000529 twodigits carry = extra;
530 int i;
531
532 if (z == NULL)
533 return NULL;
534 for (i = 0; i < size_a; ++i) {
535 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000536 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000537 carry >>= SHIFT;
538 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000539 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000540 return long_normalize(z);
541}
542
543/* Divide a long integer by a digit, returning both the quotient
544 (as function result) and the remainder (through *prem).
545 The sign of a is ignored; n should not be zero. */
546
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000548divrem1(a, n, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000550 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000551 digit *prem;
552{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000553 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000555 int i;
556 twodigits rem = 0;
557
558 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000560 if (z == NULL)
561 return NULL;
562 for (i = size; --i >= 0; ) {
563 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000564 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000565 rem %= n;
566 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000567 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000568 return long_normalize(z);
569}
570
571/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000572 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000573 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000574
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575static PyObject *
Fred Drake121ee271999-12-23 15:41:28 +0000576long_format(aa, base, addL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 PyObject *aa;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000578 int base;
Fred Drake121ee271999-12-23 15:41:28 +0000579 int addL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000580{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 register PyLongObject *a = (PyLongObject *)aa;
582 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000583 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000584 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000585 char *p;
586 int bits;
587 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000588
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589 if (a == NULL || !PyLong_Check(a)) {
590 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000591 return NULL;
592 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000593 assert(base >= 2 && base <= 36);
594
595 /* Compute a rough upper bound for the length of the string */
596 i = base;
597 bits = 0;
598 while (i > 1) {
599 ++bits;
600 i >>= 1;
601 }
Fred Drake121ee271999-12-23 15:41:28 +0000602 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000604 if (str == NULL)
605 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000607 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000608 if (addL)
609 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000610 if (a->ob_size < 0)
611 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000612
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000613 if (a->ob_size == 0) {
614 *--p = '0';
615 }
616 else if ((base & (base - 1)) == 0) {
617 /* JRH: special case for power-of-2 bases */
618 twodigits temp = a->ob_digit[0];
619 int bitsleft = SHIFT;
620 int rem;
621 int last = abs(a->ob_size);
622 int basebits = 1;
623 i = base;
624 while ((i >>= 1) > 1) ++basebits;
625
626 i = 0;
627 for (;;) {
628 while (bitsleft >= basebits) {
629 if ((temp == 0) && (i >= last - 1)) break;
630 rem = temp & (base - 1);
631 if (rem < 10)
632 rem += '0';
633 else
634 rem += 'A' - 10;
635 assert(p > PyString_AS_STRING(str));
636 *--p = (char) rem;
637 bitsleft -= basebits;
638 temp >>= basebits;
639 }
640 if (++i >= last) {
641 if (temp == 0) break;
642 bitsleft = 99;
643 /* loop again to pick up final digits */
644 }
645 else {
646 temp = (a->ob_digit[i] << bitsleft) | temp;
647 bitsleft += SHIFT;
648 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000649 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000650 }
651 else {
652 Py_INCREF(a);
653 do {
654 digit rem;
655 PyLongObject *temp = divrem1(a, (digit)base, &rem);
656 if (temp == NULL) {
657 Py_DECREF(a);
658 Py_DECREF(str);
659 return NULL;
660 }
661 if (rem < 10)
662 rem += '0';
663 else
664 rem += 'A'-10;
665 assert(p > PyString_AS_STRING(str));
666 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000668 a = temp;
669 SIGCHECK({
670 Py_DECREF(a);
671 Py_DECREF(str);
672 return NULL;
673 })
674 } while (ABS(a->ob_size) != 0);
675 Py_DECREF(a);
676 }
677
Guido van Rossum2c475421992-08-14 15:13:07 +0000678 if (base == 8) {
679 if (size_a != 0)
680 *--p = '0';
681 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000682 else if (base == 16) {
683 *--p = 'x';
684 *--p = '0';
685 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000686 else if (base != 10) {
687 *--p = '#';
688 *--p = '0' + base%10;
689 if (base > 10)
690 *--p = '0' + base/10;
691 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000692 if (sign)
693 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 if (p != PyString_AS_STRING(str)) {
695 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000696 assert(p > q);
697 do {
698 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000699 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700 _PyString_Resize((PyObject **)&str,
701 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000702 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000704}
705
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000706#if 0
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000707/* Convert a string to a long int object, in a given base.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000708 Base zero implies a default depending on the number.
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000709 External linkage: used in compile.c and stropmodule.c. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000710
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000712long_scan(str, base)
713 char *str;
714 int base;
715{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716 return PyLong_FromString(str, (char **)NULL, base);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000717}
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000718#endif
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000719
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000720PyObject *
721PyLong_FromString(str, pend, base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000722 char *str;
723 char **pend;
724 int base;
725{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000726 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000727 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000729
Guido van Rossum472c04f1996-12-05 21:57:21 +0000730 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 PyErr_SetString(PyExc_ValueError,
732 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000733 return NULL;
734 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000735 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000736 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000737 if (*str == '+')
738 ++str;
739 else if (*str == '-') {
740 ++str;
741 sign = -1;
742 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000743 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000744 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000745 if (base == 0) {
746 if (str[0] != '0')
747 base = 10;
748 else if (str[1] == 'x' || str[1] == 'X')
749 base = 16;
750 else
751 base = 8;
752 }
753 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
754 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000756 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000757 for ( ; z != NULL; ++str) {
758 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000760
761 if (*str <= '9')
762 k = *str - '0';
763 else if (*str >= 'a')
764 k = *str - 'a' + 10;
765 else if (*str >= 'A')
766 k = *str - 'A' + 10;
767 if (k < 0 || k >= base)
768 break;
769 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000771 z = temp;
772 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000773 if (z == NULL)
774 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000775 if (str == start)
776 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000777 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000778 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000779 if (*str == 'L' || *str == 'l')
780 str++;
781 while (*str && isspace(Py_CHARMASK(*str)))
782 str++;
783 if (*str != '\0')
784 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000785 if (pend)
786 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000788
789 onError:
790 PyErr_Format(PyExc_ValueError,
791 "invalid literal for long(): %.200s", orig_str);
792 Py_XDECREF(z);
793 return NULL;
794}
795
796PyObject *
797PyLong_FromUnicode(u, length, base)
798 Py_UNICODE *u;
799 int length;
800 int base;
801{
802 char buffer[256];
803
804 if (length >= sizeof(buffer)) {
805 PyErr_SetString(PyExc_ValueError,
806 "long() literal too large to convert");
807 return NULL;
808 }
809 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
810 return NULL;
811
812 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000813}
814
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000815static PyLongObject *x_divrem
816 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject **));
817static PyObject *long_pos Py_PROTO((PyLongObject *));
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000818static int long_divrem Py_PROTO((PyLongObject *, PyLongObject *,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819 PyLongObject **, PyLongObject **));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000820
821/* Long division with remainder, top-level routine */
822
Guido van Rossume32e0141992-01-19 16:31:05 +0000823static int
824long_divrem(a, b, pdiv, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000825 PyLongObject *a, *b;
826 PyLongObject **pdiv;
827 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000828{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000829 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000831
832 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000833 PyErr_SetString(PyExc_ZeroDivisionError,
834 "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000835 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000836 }
837 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000838 (size_a == size_b &&
839 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000840 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000841 *pdiv = _PyLong_New(0);
842 Py_INCREF(a);
843 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000844 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000845 }
846 if (size_b == 1) {
847 digit rem = 0;
848 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000849 if (z == NULL)
850 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000851 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000852 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000853 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000854 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000855 if (z == NULL)
856 return -1;
857 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000858 /* Set the signs.
859 The quotient z has the sign of a*b;
860 the remainder r has the sign of a,
861 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000862 if ((a->ob_size < 0) != (b->ob_size < 0))
863 z->ob_size = -(z->ob_size);
864 if (a->ob_size < 0 && (*prem)->ob_size != 0)
865 (*prem)->ob_size = -((*prem)->ob_size);
866 *pdiv = z;
867 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000868}
869
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000870/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000871
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000873x_divrem(v1, w1, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874 PyLongObject *v1, *w1;
875 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000876{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000877 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000878 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000879 PyLongObject *v = mul1(v1, d);
880 PyLongObject *w = mul1(w1, d);
881 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000882 int j, k;
883
884 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 Py_XDECREF(v);
886 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000887 return NULL;
888 }
889
890 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000891 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000892 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000893
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000894 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000896
897 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
898 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
899 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000900 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000901 int i;
902
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000903 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000905 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000906 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000907 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000908 if (vj == w->ob_digit[size_w-1])
909 q = MASK;
910 else
911 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
912 w->ob_digit[size_w-1];
913
914 while (w->ob_digit[size_w-2]*q >
915 ((
916 ((twodigits)vj << SHIFT)
917 + v->ob_digit[j-1]
918 - q*w->ob_digit[size_w-1]
919 ) << SHIFT)
920 + v->ob_digit[j-2])
921 --q;
922
923 for (i = 0; i < size_w && i+k < size_v; ++i) {
924 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000925 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 carry += v->ob_digit[i+k] - z
927 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000928 v->ob_digit[i+k] = carry & MASK;
929 carry = (carry >> SHIFT) - zz;
930 }
931
932 if (i+k < size_v) {
933 carry += v->ob_digit[i+k];
934 v->ob_digit[i+k] = 0;
935 }
936
937 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000938 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000939 else {
940 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000941 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000942 carry = 0;
943 for (i = 0; i < size_w && i+k < size_v; ++i) {
944 carry += v->ob_digit[i+k] + w->ob_digit[i];
945 v->ob_digit[i+k] = carry & MASK;
946 carry >>= SHIFT;
947 }
948 }
949 } /* for j, k */
950
Guido van Rossumc206c761995-01-10 15:23:19 +0000951 if (a == NULL)
952 *prem = NULL;
953 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000954 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000955 *prem = divrem1(v, d, &d);
956 /* d receives the (unused) remainder */
957 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000959 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000960 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000961 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000962 Py_DECREF(v);
963 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000964 return a;
965}
966
967/* Methods */
968
Guido van Rossume32e0141992-01-19 16:31:05 +0000969/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970static void long_dealloc Py_PROTO((PyObject *));
971static PyObject *long_repr Py_PROTO((PyObject *));
972static int long_compare Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossum065ce5a1998-09-13 15:37:20 +0000973static long long_hash Py_PROTO((PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000974
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *));
976static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *));
977static PyObject *long_mul Py_PROTO((PyLongObject *, PyLongObject *));
978static PyObject *long_div Py_PROTO((PyLongObject *, PyLongObject *));
979static PyObject *long_mod Py_PROTO((PyLongObject *, PyLongObject *));
980static PyObject *long_divmod Py_PROTO((PyLongObject *, PyLongObject *));
981static PyObject *long_pow
982 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject *));
983static PyObject *long_neg Py_PROTO((PyLongObject *));
984static PyObject *long_pos Py_PROTO((PyLongObject *));
985static PyObject *long_abs Py_PROTO((PyLongObject *));
986static int long_nonzero Py_PROTO((PyLongObject *));
987static PyObject *long_invert Py_PROTO((PyLongObject *));
988static PyObject *long_lshift Py_PROTO((PyLongObject *, PyLongObject *));
989static PyObject *long_rshift Py_PROTO((PyLongObject *, PyLongObject *));
990static PyObject *long_and Py_PROTO((PyLongObject *, PyLongObject *));
991static PyObject *long_xor Py_PROTO((PyLongObject *, PyLongObject *));
992static PyObject *long_or Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000993
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000994static void
995long_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000997{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000998 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000999}
1000
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001001static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001002long_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001004{
Fred Drake121ee271999-12-23 15:41:28 +00001005 return long_format(v, 10, 1);
1006}
1007
1008static PyObject *
1009long_str(v)
1010 PyObject *v;
1011{
1012 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001013}
1014
1015static int
1016long_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001018{
1019 int sign;
1020
Guido van Rossumc6913e71991-11-19 20:26:46 +00001021 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001022 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001023 sign = 0;
1024 else
1025 sign = a->ob_size - b->ob_size;
1026 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001027 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001028 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001029 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1030 ;
1031 if (i < 0)
1032 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001033 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001034 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001035 if (a->ob_size < 0)
1036 sign = -sign;
1037 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001038 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001039 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001040}
1041
Guido van Rossum9bfef441993-03-29 10:43:31 +00001042static long
1043long_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001044 PyLongObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001045{
1046 long x;
1047 int i, sign;
1048
1049 /* This is designed so that Python ints and longs with the
1050 same value hash to the same value, otherwise comparisons
1051 of mapping keys will turn out weird */
1052 i = v->ob_size;
1053 sign = 1;
1054 x = 0;
1055 if (i < 0) {
1056 sign = -1;
1057 i = -(i);
1058 }
1059 while (--i >= 0) {
1060 /* Force a 32-bit circular shift */
1061 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1062 x += v->ob_digit[i];
1063 }
1064 x = x * sign;
1065 if (x == -1)
1066 x = -2;
1067 return x;
1068}
1069
1070
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001071/* Add the absolute values of two long integers. */
1072
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001073static PyLongObject *x_add Py_PROTO((PyLongObject *, PyLongObject *));
1074static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001075x_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001076 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001077{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001078 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001080 int i;
1081 digit carry = 0;
1082
1083 /* Ensure a is the larger of the two: */
1084 if (size_a < size_b) {
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 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001090 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001091 if (z == NULL)
1092 return NULL;
1093 for (i = 0; i < size_b; ++i) {
1094 carry += a->ob_digit[i] + b->ob_digit[i];
1095 z->ob_digit[i] = carry & MASK;
1096 /* The following assumes unsigned shifts don't
1097 propagate the sign bit. */
1098 carry >>= SHIFT;
1099 }
1100 for (; i < size_a; ++i) {
1101 carry += a->ob_digit[i];
1102 z->ob_digit[i] = carry & MASK;
1103 carry >>= SHIFT;
1104 }
1105 z->ob_digit[i] = carry;
1106 return long_normalize(z);
1107}
1108
1109/* Subtract the absolute values of two integers. */
1110
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001111static PyLongObject *x_sub Py_PROTO((PyLongObject *, PyLongObject *));
1112static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001113x_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001114 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001115{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001116 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001117 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001118 int i;
1119 int sign = 1;
1120 digit borrow = 0;
1121
1122 /* Ensure a is the larger of the two: */
1123 if (size_a < size_b) {
1124 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001125 { PyLongObject *temp = a; a = b; b = temp; }
1126 { int size_temp = size_a;
1127 size_a = size_b;
1128 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001129 }
1130 else if (size_a == size_b) {
1131 /* Find highest digit where a and b differ: */
1132 i = size_a;
1133 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1134 ;
1135 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001136 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001137 if (a->ob_digit[i] < b->ob_digit[i]) {
1138 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001139 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001140 }
1141 size_a = size_b = i+1;
1142 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001144 if (z == NULL)
1145 return NULL;
1146 for (i = 0; i < size_b; ++i) {
1147 /* The following assumes unsigned arithmetic
1148 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001149 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001150 z->ob_digit[i] = borrow & MASK;
1151 borrow >>= SHIFT;
1152 borrow &= 1; /* Keep only one sign bit */
1153 }
1154 for (; i < size_a; ++i) {
1155 borrow = a->ob_digit[i] - borrow;
1156 z->ob_digit[i] = borrow & MASK;
1157 borrow >>= SHIFT;
1158 }
1159 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001160 if (sign < 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 return long_normalize(z);
1163}
1164
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001165static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001166long_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001167 PyLongObject *a;
1168 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001169{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001170 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001171
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001172 if (a->ob_size < 0) {
1173 if (b->ob_size < 0) {
1174 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001175 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001176 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001177 }
1178 else
1179 z = x_sub(b, a);
1180 }
1181 else {
1182 if (b->ob_size < 0)
1183 z = x_sub(a, b);
1184 else
1185 z = x_add(a, b);
1186 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001188}
1189
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001191long_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001192 PyLongObject *a;
1193 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001194{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001195 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001196
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001197 if (a->ob_size < 0) {
1198 if (b->ob_size < 0)
1199 z = x_sub(a, b);
1200 else
1201 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001202 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001203 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001204 }
1205 else {
1206 if (b->ob_size < 0)
1207 z = x_add(a, b);
1208 else
1209 z = x_sub(a, b);
1210 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001211 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001212}
1213
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001214static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001215long_mul(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 PyLongObject *a;
1217 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001218{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001219 int size_a;
1220 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001222 int i;
1223
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001224 size_a = ABS(a->ob_size);
1225 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001226 if (size_a > size_b) {
1227 /* we are faster with the small object on the left */
1228 int hold_sa = size_a;
1229 PyLongObject *hold_a = a;
1230 size_a = size_b;
1231 size_b = hold_sa;
1232 a = b;
1233 b = hold_a;
1234 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001235 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001236 if (z == NULL)
1237 return NULL;
1238 for (i = 0; i < z->ob_size; ++i)
1239 z->ob_digit[i] = 0;
1240 for (i = 0; i < size_a; ++i) {
1241 twodigits carry = 0;
1242 twodigits f = a->ob_digit[i];
1243 int j;
1244
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001245 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001246 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001247 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001248 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001249 for (j = 0; j < size_b; ++j) {
1250 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001251 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001252 carry >>= SHIFT;
1253 }
1254 for (; carry != 0; ++j) {
1255 assert(i+j < z->ob_size);
1256 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001257 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001258 carry >>= SHIFT;
1259 }
1260 }
1261 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001262 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001263 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001264 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001265 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001266}
1267
Guido van Rossume32e0141992-01-19 16:31:05 +00001268/* The / and % operators are now defined in terms of divmod().
1269 The expression a mod b has the value a - b*floor(a/b).
1270 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001271 |a| by |b|, with the sign of a. This is also expressed
1272 as a - b*trunc(a/b), if trunc truncates towards zero.
1273 Some examples:
1274 a b a rem b a mod b
1275 13 10 3 3
1276 -13 10 -3 7
1277 13 -10 3 -7
1278 -13 -10 -3 -3
1279 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001280 have different signs. We then subtract one from the 'div'
1281 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001282
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283static int l_divmod Py_PROTO((PyLongObject *, PyLongObject *,
1284 PyLongObject **, PyLongObject **));
Guido van Rossume32e0141992-01-19 16:31:05 +00001285static int
1286l_divmod(v, w, pdiv, pmod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287 PyLongObject *v;
1288 PyLongObject *w;
1289 PyLongObject **pdiv;
1290 PyLongObject **pmod;
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
1294 if (long_divrem(v, w, &div, &mod) < 0)
1295 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001296 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1297 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001298 PyLongObject *temp;
1299 PyLongObject *one;
1300 temp = (PyLongObject *) long_add(mod, w);
1301 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001302 mod = temp;
1303 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001305 return -1;
1306 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001308 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001309 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1310 Py_DECREF(mod);
1311 Py_DECREF(div);
1312 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001313 return -1;
1314 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 Py_DECREF(one);
1316 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001317 div = temp;
1318 }
1319 *pdiv = div;
1320 *pmod = mod;
1321 return 0;
1322}
1323
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001324static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001325long_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 PyLongObject *v;
1327 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001328{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001329 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001330 if (l_divmod(v, w, &div, &mod) < 0)
1331 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001332 Py_DECREF(mod);
1333 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001334}
1335
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001337long_mod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001338 PyLongObject *v;
1339 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001340{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001341 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001342 if (l_divmod(v, w, &div, &mod) < 0)
1343 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001344 Py_DECREF(div);
1345 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001346}
1347
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001349long_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350 PyLongObject *v;
1351 PyLongObject *w;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001352{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 PyObject *z;
1354 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001355 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001356 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001357 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001358 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359 PyTuple_SetItem(z, 0, (PyObject *) div);
1360 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001361 }
1362 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363 Py_DECREF(div);
1364 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001365 }
1366 return z;
1367}
1368
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369static PyObject *
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001370long_pow(a, b, c)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371 PyLongObject *a;
1372 PyLongObject *b;
1373 PyLongObject *c;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001374{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001376 int size_b, i;
1377
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001378 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001379 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001380 PyErr_SetString(PyExc_ValueError,
1381 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001382 return NULL;
1383 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001384 z = (PyLongObject *)PyLong_FromLong(1L);
1385 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001386 for (i = 0; i < size_b; ++i) {
1387 digit bi = b->ob_digit[i];
1388 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001389
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001390 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001391 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001392
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001393 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001394 temp = (PyLongObject *)long_mul(z, a);
1395 Py_DECREF(z);
1396 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001397 if (l_divmod(temp,c,&div,&mod) < 0) {
1398 Py_DECREF(temp);
1399 z = NULL;
1400 goto error;
1401 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001402 Py_XDECREF(div);
1403 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001404 temp = mod;
1405 }
1406 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001407 if (z == NULL)
1408 break;
1409 }
1410 bi >>= 1;
1411 if (bi == 0 && i+1 == size_b)
1412 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001413 temp = (PyLongObject *)long_mul(a, a);
1414 Py_DECREF(a);
1415 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001416 if (l_divmod(temp, c, &div, &mod) < 0) {
1417 Py_DECREF(temp);
1418 z = NULL;
1419 goto error;
1420 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001421 Py_XDECREF(div);
1422 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001423 temp = mod;
1424 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001425 a = temp;
1426 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001428 z = NULL;
1429 break;
1430 }
1431 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001432 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001433 break;
1434 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001435 Py_XDECREF(a);
1436 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001437 if (l_divmod(z, c, &div, &mod) < 0) {
1438 Py_DECREF(z);
1439 z = NULL;
1440 }
1441 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442 Py_XDECREF(div);
1443 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001444 z = mod;
1445 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001446 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001447 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001448 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001449}
1450
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001451static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001452long_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001453 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001454{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001455 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001456 PyLongObject *x;
1457 PyLongObject *w;
1458 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001459 if (w == NULL)
1460 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461 x = (PyLongObject *) long_add(v, w);
1462 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001463 if (x == NULL)
1464 return NULL;
1465 if (x->ob_size != 0)
1466 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001467 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001468}
1469
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001470static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001471long_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001472 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001473{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001474 Py_INCREF(v);
1475 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001476}
1477
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001478static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001479long_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001480 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001481{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001482 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001483 int i, n;
1484 n = ABS(v->ob_size);
1485 if (n == 0) {
1486 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001487 Py_INCREF(v);
1488 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001489 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001490 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001491 if (z == NULL)
1492 return NULL;
1493 for (i = 0; i < n; i++)
1494 z->ob_digit[i] = v->ob_digit[i];
1495 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001496 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001497}
1498
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001499static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001500long_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001501 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001502{
1503 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001504 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001505 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001506 Py_INCREF(v);
1507 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001508 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001509}
1510
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001511static int
1512long_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001513 PyLongObject *v;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001514{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001515 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001516}
1517
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001518static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001519long_rshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001520 PyLongObject *a;
1521 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001522{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001523 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001524 long shiftby;
1525 int newsize, wordshift, loshift, hishift, i, j;
1526 digit lomask, himask;
1527
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001528 if (a->ob_size < 0) {
1529 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001530 PyLongObject *a1, *a2, *a3;
1531 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001532 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001533 a2 = (PyLongObject *) long_rshift(a1, b);
1534 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001535 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 a3 = (PyLongObject *) long_invert(a2);
1537 Py_DECREF(a2);
1538 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001539 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001540
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001541 shiftby = PyLong_AsLong((PyObject *)b);
1542 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001543 return NULL;
1544 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001545 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001546 return NULL;
1547 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001548 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001549 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001550 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001551 z = _PyLong_New(0);
1552 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001553 }
1554 loshift = shiftby % SHIFT;
1555 hishift = SHIFT - loshift;
1556 lomask = ((digit)1 << hishift) - 1;
1557 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001558 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001559 if (z == NULL)
1560 return NULL;
1561 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001562 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001563 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1564 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1565 if (i+1 < newsize)
1566 z->ob_digit[i] |=
1567 (a->ob_digit[j+1] << hishift) & himask;
1568 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001570}
1571
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001572static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001573long_lshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574 PyLongObject *a;
1575 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001576{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001577 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001578 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001579 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001580 int oldsize, newsize, wordshift, remshift, i, j;
1581 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001582
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001583 shiftby = PyLong_AsLong((PyObject *)b);
1584 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001585 return NULL;
1586 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001587 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001588 return NULL;
1589 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001590 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001591 PyErr_SetString(PyExc_ValueError,
1592 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001593 return NULL;
1594 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001595 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1596 wordshift = (int)shiftby / SHIFT;
1597 remshift = (int)shiftby - wordshift * SHIFT;
1598
1599 oldsize = ABS(a->ob_size);
1600 newsize = oldsize + wordshift;
1601 if (remshift)
1602 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001603 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001604 if (z == NULL)
1605 return NULL;
1606 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001607 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001608 for (i = 0; i < wordshift; i++)
1609 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001610 accum = 0;
1611 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1612 accum |= a->ob_digit[j] << remshift;
1613 z->ob_digit[i] = (digit)(accum & MASK);
1614 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001615 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001616 if (remshift)
1617 z->ob_digit[newsize-1] = (digit)accum;
1618 else
1619 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001620 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001621}
1622
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001623
1624/* Bitwise and/xor/or operations */
1625
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001626#define MAX(x, y) ((x) < (y) ? (y) : (x))
1627#define MIN(x, y) ((x) > (y) ? (y) : (x))
1628
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001629static PyObject *long_bitwise Py_PROTO((PyLongObject *, int, PyLongObject *));
1630static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001631long_bitwise(a, op, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001632 PyLongObject *a;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001633 int op; /* '&', '|', '^' */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001634 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001635{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001636 digit maska, maskb; /* 0 or MASK */
1637 int negz;
1638 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001640 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001641 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001642 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001643
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001644 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001645 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001646 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001647 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001648 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001649 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001650 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001651 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001652 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001653 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001654 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001655 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001656 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001657 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001658 maskb = 0;
1659 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001660
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001661 negz = 0;
1662 switch (op) {
1663 case '^':
1664 if (maska != maskb) {
1665 maska ^= MASK;
1666 negz = -1;
1667 }
1668 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001669 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001670 if (maska && maskb) {
1671 op = '|';
1672 maska ^= MASK;
1673 maskb ^= MASK;
1674 negz = -1;
1675 }
1676 break;
1677 case '|':
1678 if (maska || maskb) {
1679 op = '&';
1680 maska ^= MASK;
1681 maskb ^= MASK;
1682 negz = -1;
1683 }
1684 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001685 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001686
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001687 /* JRH: The original logic here was to allocate the result value (z)
1688 as the longer of the two operands. However, there are some cases
1689 where the result is guaranteed to be shorter than that: AND of two
1690 positives, OR of two negatives: use the shorter number. AND with
1691 mixed signs: use the positive number. OR with mixed signs: use the
1692 negative number. After the transformations above, op will be '&'
1693 iff one of these cases applies, and mask will be non-0 for operands
1694 whose length should be ignored.
1695 */
1696
1697 size_a = a->ob_size;
1698 size_b = b->ob_size;
1699 size_z = op == '&'
1700 ? (maska
1701 ? size_b
1702 : (maskb ? size_a : MIN(size_a, size_b)))
1703 : MAX(size_a, size_b);
1704 z = _PyLong_New(size_z);
1705 if (a == NULL || b == NULL || z == NULL) {
1706 Py_XDECREF(a);
1707 Py_XDECREF(b);
1708 Py_XDECREF(z);
1709 return NULL;
1710 }
1711
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001712 for (i = 0; i < size_z; ++i) {
1713 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1714 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1715 switch (op) {
1716 case '&': z->ob_digit[i] = diga & digb; break;
1717 case '|': z->ob_digit[i] = diga | digb; break;
1718 case '^': z->ob_digit[i] = diga ^ digb; break;
1719 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001720 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001721
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001722 Py_DECREF(a);
1723 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001724 z = long_normalize(z);
1725 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001726 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001727 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001728 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001729 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001730}
1731
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001732static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001733long_and(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001734 PyLongObject *a;
1735 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001736{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001737 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001738}
1739
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001740static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001741long_xor(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001742 PyLongObject *a;
1743 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001744{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001745 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001746}
1747
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001748static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001749long_or(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001750 PyLongObject *a;
1751 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001752{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001753 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001754}
1755
Guido van Rossum234f9421993-06-17 12:35:49 +00001756static int
Guido van Rossume6eefc21992-08-14 12:06:52 +00001757long_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001758 PyObject **pv;
1759 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001760{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001761 if (PyInt_Check(*pw)) {
1762 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1763 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001764 return 0;
1765 }
1766 return 1; /* Can't do it */
1767}
1768
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001769static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001770long_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001771 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001772{
1773 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001774 x = PyLong_AsLong(v);
1775 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001776 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001777 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001778}
1779
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001780static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001781long_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001782 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001783{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001784 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001785 return v;
1786}
1787
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001788static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001789long_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001790 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001791{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001792 double result;
1793 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001794 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001795 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001796 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001797}
1798
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001799static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001800long_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001801 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001802{
Fred Drake121ee271999-12-23 15:41:28 +00001803 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001804}
1805
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001806static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001807long_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001808 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001809{
Fred Drake121ee271999-12-23 15:41:28 +00001810 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001811}
1812
1813
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001814#define UF (unaryfunc)
1815#define BF (binaryfunc)
1816#define TF (ternaryfunc)
1817#define IF (inquiry)
Guido van Rossum8b27d921992-03-27 17:27:05 +00001818
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001819static PyNumberMethods long_as_number = {
Guido van Rossum8b27d921992-03-27 17:27:05 +00001820 BF long_add, /*nb_add*/
1821 BF long_sub, /*nb_subtract*/
1822 BF long_mul, /*nb_multiply*/
1823 BF long_div, /*nb_divide*/
1824 BF long_mod, /*nb_remainder*/
1825 BF long_divmod, /*nb_divmod*/
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001826 TF long_pow, /*nb_power*/
Guido van Rossum8b27d921992-03-27 17:27:05 +00001827 UF long_neg, /*nb_negative*/
1828 UF long_pos, /*tp_positive*/
1829 UF long_abs, /*tp_absolute*/
1830 IF long_nonzero,/*tp_nonzero*/
1831 UF long_invert, /*nb_invert*/
1832 BF long_lshift, /*nb_lshift*/
1833 BF long_rshift, /*nb_rshift*/
1834 BF long_and, /*nb_and*/
1835 BF long_xor, /*nb_xor*/
1836 BF long_or, /*nb_or*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001837 (int (*) Py_FPROTO((PyObject **, PyObject **)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001838 (coercion)long_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001839 UF long_int, /*nb_int*/
1840 UF long_long, /*nb_long*/
1841 UF long_float, /*nb_float*/
1842 UF long_oct, /*nb_oct*/
1843 UF long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001844};
1845
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001846PyTypeObject PyLong_Type = {
1847 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001848 0,
1849 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001850 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001851 sizeof(digit),
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001852 (destructor)long_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001853 0, /*tp_print*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001854 0, /*tp_getattr*/
1855 0, /*tp_setattr*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001856 (int (*) Py_FPROTO((PyObject *, PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001857 (cmpfunc)long_compare, /*tp_compare*/
1858 (reprfunc)long_repr, /*tp_repr*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001859 &long_as_number,/*tp_as_number*/
1860 0, /*tp_as_sequence*/
1861 0, /*tp_as_mapping*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001862 (long (*) Py_FPROTO((PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001863 (hashfunc)long_hash, /*tp_hash*/
Fred Drake121ee271999-12-23 15:41:28 +00001864 0, /*tp_call*/
1865 (reprfunc)long_str, /*tp_str*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001866};