blob: d5c2f5f767493ac4dbe33bce92108f97f0d29307 [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 Rossumc0b618a1997-05-02 03:12:38 +0000998 PyMem_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 Rossumc0b618a1997-05-02 03:12:38 +00001226 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001227 if (z == NULL)
1228 return NULL;
1229 for (i = 0; i < z->ob_size; ++i)
1230 z->ob_digit[i] = 0;
1231 for (i = 0; i < size_a; ++i) {
1232 twodigits carry = 0;
1233 twodigits f = a->ob_digit[i];
1234 int j;
1235
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001236 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001237 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001238 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001239 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001240 for (j = 0; j < size_b; ++j) {
1241 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
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 for (; carry != 0; ++j) {
1246 assert(i+j < z->ob_size);
1247 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001248 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001249 carry >>= SHIFT;
1250 }
1251 }
1252 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001253 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001254 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001255 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001257}
1258
Guido van Rossume32e0141992-01-19 16:31:05 +00001259/* The / and % operators are now defined in terms of divmod().
1260 The expression a mod b has the value a - b*floor(a/b).
1261 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001262 |a| by |b|, with the sign of a. This is also expressed
1263 as a - b*trunc(a/b), if trunc truncates towards zero.
1264 Some examples:
1265 a b a rem b a mod b
1266 13 10 3 3
1267 -13 10 -3 7
1268 13 -10 3 -7
1269 -13 -10 -3 -3
1270 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001271 have different signs. We then subtract one from the 'div'
1272 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001273
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001274static int l_divmod Py_PROTO((PyLongObject *, PyLongObject *,
1275 PyLongObject **, PyLongObject **));
Guido van Rossume32e0141992-01-19 16:31:05 +00001276static int
1277l_divmod(v, w, pdiv, pmod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 PyLongObject *v;
1279 PyLongObject *w;
1280 PyLongObject **pdiv;
1281 PyLongObject **pmod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001282{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001284
1285 if (long_divrem(v, w, &div, &mod) < 0)
1286 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001287 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1288 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001289 PyLongObject *temp;
1290 PyLongObject *one;
1291 temp = (PyLongObject *) long_add(mod, w);
1292 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001293 mod = temp;
1294 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001295 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001296 return -1;
1297 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001298 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001299 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1301 Py_DECREF(mod);
1302 Py_DECREF(div);
1303 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001304 return -1;
1305 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 Py_DECREF(one);
1307 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001308 div = temp;
1309 }
1310 *pdiv = div;
1311 *pmod = mod;
1312 return 0;
1313}
1314
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001316long_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317 PyLongObject *v;
1318 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001319{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001320 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001321 if (l_divmod(v, w, &div, &mod) < 0)
1322 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001323 Py_DECREF(mod);
1324 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001325}
1326
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001328long_mod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001329 PyLongObject *v;
1330 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001331{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001332 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001333 if (l_divmod(v, w, &div, &mod) < 0)
1334 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335 Py_DECREF(div);
1336 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001337}
1338
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001340long_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001341 PyLongObject *v;
1342 PyLongObject *w;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001343{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001344 PyObject *z;
1345 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001346 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001347 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001349 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350 PyTuple_SetItem(z, 0, (PyObject *) div);
1351 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001352 }
1353 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001354 Py_DECREF(div);
1355 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001356 }
1357 return z;
1358}
1359
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360static PyObject *
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001361long_pow(a, b, c)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001362 PyLongObject *a;
1363 PyLongObject *b;
1364 PyLongObject *c;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001365{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001366 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001367 int size_b, i;
1368
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001369 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001370 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371 PyErr_SetString(PyExc_ValueError,
1372 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001373 return NULL;
1374 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 z = (PyLongObject *)PyLong_FromLong(1L);
1376 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001377 for (i = 0; i < size_b; ++i) {
1378 digit bi = b->ob_digit[i];
1379 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001380
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001381 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001383
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001384 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385 temp = (PyLongObject *)long_mul(z, a);
1386 Py_DECREF(z);
1387 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001388 if (l_divmod(temp,c,&div,&mod) < 0) {
1389 Py_DECREF(temp);
1390 z = NULL;
1391 goto error;
1392 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001393 Py_XDECREF(div);
1394 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001395 temp = mod;
1396 }
1397 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001398 if (z == NULL)
1399 break;
1400 }
1401 bi >>= 1;
1402 if (bi == 0 && i+1 == size_b)
1403 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001404 temp = (PyLongObject *)long_mul(a, a);
1405 Py_DECREF(a);
1406 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001407 if (l_divmod(temp, c, &div, &mod) < 0) {
1408 Py_DECREF(temp);
1409 z = NULL;
1410 goto error;
1411 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001412 Py_XDECREF(div);
1413 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001414 temp = mod;
1415 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001416 a = temp;
1417 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001419 z = NULL;
1420 break;
1421 }
1422 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001423 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001424 break;
1425 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001426 Py_XDECREF(a);
1427 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001428 if (l_divmod(z, c, &div, &mod) < 0) {
1429 Py_DECREF(z);
1430 z = NULL;
1431 }
1432 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433 Py_XDECREF(div);
1434 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001435 z = mod;
1436 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001437 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001438 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001439 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001440}
1441
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001443long_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001444 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001445{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001446 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001447 PyLongObject *x;
1448 PyLongObject *w;
1449 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001450 if (w == NULL)
1451 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452 x = (PyLongObject *) long_add(v, w);
1453 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001454 if (x == NULL)
1455 return NULL;
1456 if (x->ob_size != 0)
1457 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001459}
1460
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001462long_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001463 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001464{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001465 Py_INCREF(v);
1466 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001467}
1468
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001469static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001470long_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001471 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001472{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001473 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001474 int i, n;
1475 n = ABS(v->ob_size);
1476 if (n == 0) {
1477 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001478 Py_INCREF(v);
1479 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001480 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001481 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001482 if (z == NULL)
1483 return NULL;
1484 for (i = 0; i < n; i++)
1485 z->ob_digit[i] = v->ob_digit[i];
1486 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001487 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001488}
1489
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001490static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001491long_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001492 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001493{
1494 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001495 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001496 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001497 Py_INCREF(v);
1498 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001499 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001500}
1501
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001502static int
1503long_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001504 PyLongObject *v;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001505{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001506 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001507}
1508
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001510long_rshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001511 PyLongObject *a;
1512 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001513{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001514 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001515 long shiftby;
1516 int newsize, wordshift, loshift, hishift, i, j;
1517 digit lomask, himask;
1518
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001519 if (a->ob_size < 0) {
1520 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001521 PyLongObject *a1, *a2, *a3;
1522 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001523 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001524 a2 = (PyLongObject *) long_rshift(a1, b);
1525 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001526 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001527 a3 = (PyLongObject *) long_invert(a2);
1528 Py_DECREF(a2);
1529 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001530 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001531
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001532 shiftby = PyLong_AsLong((PyObject *)b);
1533 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001534 return NULL;
1535 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001537 return NULL;
1538 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001539 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001540 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001541 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001542 z = _PyLong_New(0);
1543 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001544 }
1545 loshift = shiftby % SHIFT;
1546 hishift = SHIFT - loshift;
1547 lomask = ((digit)1 << hishift) - 1;
1548 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001549 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001550 if (z == NULL)
1551 return NULL;
1552 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001553 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001554 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1555 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1556 if (i+1 < newsize)
1557 z->ob_digit[i] |=
1558 (a->ob_digit[j+1] << hishift) & himask;
1559 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001560 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001561}
1562
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001563static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001564long_lshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001565 PyLongObject *a;
1566 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001567{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001568 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001570 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001571 int oldsize, newsize, wordshift, remshift, i, j;
1572 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001573
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574 shiftby = PyLong_AsLong((PyObject *)b);
1575 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001576 return NULL;
1577 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001578 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001579 return NULL;
1580 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001581 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582 PyErr_SetString(PyExc_ValueError,
1583 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001584 return NULL;
1585 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001586 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1587 wordshift = (int)shiftby / SHIFT;
1588 remshift = (int)shiftby - wordshift * SHIFT;
1589
1590 oldsize = ABS(a->ob_size);
1591 newsize = oldsize + wordshift;
1592 if (remshift)
1593 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001595 if (z == NULL)
1596 return NULL;
1597 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001598 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001599 for (i = 0; i < wordshift; i++)
1600 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001601 accum = 0;
1602 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1603 accum |= a->ob_digit[j] << remshift;
1604 z->ob_digit[i] = (digit)(accum & MASK);
1605 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001606 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001607 if (remshift)
1608 z->ob_digit[newsize-1] = (digit)accum;
1609 else
1610 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001611 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001612}
1613
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001614
1615/* Bitwise and/xor/or operations */
1616
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001617#define MAX(x, y) ((x) < (y) ? (y) : (x))
1618#define MIN(x, y) ((x) > (y) ? (y) : (x))
1619
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001620static PyObject *long_bitwise Py_PROTO((PyLongObject *, int, PyLongObject *));
1621static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001622long_bitwise(a, op, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001623 PyLongObject *a;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001624 int op; /* '&', '|', '^' */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001625 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001626{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001627 digit maska, maskb; /* 0 or MASK */
1628 int negz;
1629 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001630 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001631 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001632 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001633 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001634
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001635 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001636 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001637 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001638 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001639 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001640 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001641 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001642 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001643 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001644 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001645 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001646 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001647 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001648 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001649 maskb = 0;
1650 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001651
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001652 negz = 0;
1653 switch (op) {
1654 case '^':
1655 if (maska != maskb) {
1656 maska ^= MASK;
1657 negz = -1;
1658 }
1659 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001660 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001661 if (maska && maskb) {
1662 op = '|';
1663 maska ^= MASK;
1664 maskb ^= MASK;
1665 negz = -1;
1666 }
1667 break;
1668 case '|':
1669 if (maska || maskb) {
1670 op = '&';
1671 maska ^= MASK;
1672 maskb ^= MASK;
1673 negz = -1;
1674 }
1675 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001676 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001677
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001678 /* JRH: The original logic here was to allocate the result value (z)
1679 as the longer of the two operands. However, there are some cases
1680 where the result is guaranteed to be shorter than that: AND of two
1681 positives, OR of two negatives: use the shorter number. AND with
1682 mixed signs: use the positive number. OR with mixed signs: use the
1683 negative number. After the transformations above, op will be '&'
1684 iff one of these cases applies, and mask will be non-0 for operands
1685 whose length should be ignored.
1686 */
1687
1688 size_a = a->ob_size;
1689 size_b = b->ob_size;
1690 size_z = op == '&'
1691 ? (maska
1692 ? size_b
1693 : (maskb ? size_a : MIN(size_a, size_b)))
1694 : MAX(size_a, size_b);
1695 z = _PyLong_New(size_z);
1696 if (a == NULL || b == NULL || z == NULL) {
1697 Py_XDECREF(a);
1698 Py_XDECREF(b);
1699 Py_XDECREF(z);
1700 return NULL;
1701 }
1702
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001703 for (i = 0; i < size_z; ++i) {
1704 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1705 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1706 switch (op) {
1707 case '&': z->ob_digit[i] = diga & digb; break;
1708 case '|': z->ob_digit[i] = diga | digb; break;
1709 case '^': z->ob_digit[i] = diga ^ digb; break;
1710 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001711 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001712
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001713 Py_DECREF(a);
1714 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001715 z = long_normalize(z);
1716 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001717 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001718 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001719 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001720 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001721}
1722
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001723static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001724long_and(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001725 PyLongObject *a;
1726 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001727{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001728 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001729}
1730
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001731static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001732long_xor(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001733 PyLongObject *a;
1734 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001735{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001736 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001737}
1738
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001739static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001740long_or(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001741 PyLongObject *a;
1742 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001743{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001744 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001745}
1746
Guido van Rossum234f9421993-06-17 12:35:49 +00001747static int
Guido van Rossume6eefc21992-08-14 12:06:52 +00001748long_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001749 PyObject **pv;
1750 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001751{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001752 if (PyInt_Check(*pw)) {
1753 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1754 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001755 return 0;
1756 }
1757 return 1; /* Can't do it */
1758}
1759
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001760static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001761long_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001762 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001763{
1764 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001765 x = PyLong_AsLong(v);
1766 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001767 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001768 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001769}
1770
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001771static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001772long_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001773 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001774{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001775 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001776 return v;
1777}
1778
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001779static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001780long_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001781 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001782{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001783 double result;
1784 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001785 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001786 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001787 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001788}
1789
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001790static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001791long_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001792 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001793{
Fred Drake121ee271999-12-23 15:41:28 +00001794 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001795}
1796
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001797static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001798long_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001799 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001800{
Fred Drake121ee271999-12-23 15:41:28 +00001801 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001802}
1803
1804
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001805#define UF (unaryfunc)
1806#define BF (binaryfunc)
1807#define TF (ternaryfunc)
1808#define IF (inquiry)
Guido van Rossum8b27d921992-03-27 17:27:05 +00001809
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001810static PyNumberMethods long_as_number = {
Guido van Rossum8b27d921992-03-27 17:27:05 +00001811 BF long_add, /*nb_add*/
1812 BF long_sub, /*nb_subtract*/
1813 BF long_mul, /*nb_multiply*/
1814 BF long_div, /*nb_divide*/
1815 BF long_mod, /*nb_remainder*/
1816 BF long_divmod, /*nb_divmod*/
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001817 TF long_pow, /*nb_power*/
Guido van Rossum8b27d921992-03-27 17:27:05 +00001818 UF long_neg, /*nb_negative*/
1819 UF long_pos, /*tp_positive*/
1820 UF long_abs, /*tp_absolute*/
1821 IF long_nonzero,/*tp_nonzero*/
1822 UF long_invert, /*nb_invert*/
1823 BF long_lshift, /*nb_lshift*/
1824 BF long_rshift, /*nb_rshift*/
1825 BF long_and, /*nb_and*/
1826 BF long_xor, /*nb_xor*/
1827 BF long_or, /*nb_or*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001828 (int (*) Py_FPROTO((PyObject **, PyObject **)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001829 (coercion)long_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001830 UF long_int, /*nb_int*/
1831 UF long_long, /*nb_long*/
1832 UF long_float, /*nb_float*/
1833 UF long_oct, /*nb_oct*/
1834 UF long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001835};
1836
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001837PyTypeObject PyLong_Type = {
1838 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001839 0,
1840 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001841 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001842 sizeof(digit),
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001843 (destructor)long_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001844 0, /*tp_print*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001845 0, /*tp_getattr*/
1846 0, /*tp_setattr*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001847 (int (*) Py_FPROTO((PyObject *, PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001848 (cmpfunc)long_compare, /*tp_compare*/
1849 (reprfunc)long_repr, /*tp_repr*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001850 &long_as_number,/*tp_as_number*/
1851 0, /*tp_as_sequence*/
1852 0, /*tp_as_mapping*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001853 (long (*) Py_FPROTO((PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001854 (hashfunc)long_hash, /*tp_hash*/
Fred Drake121ee271999-12-23 15:41:28 +00001855 0, /*tp_call*/
1856 (reprfunc)long_str, /*tp_str*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001857};