blob: 5a092552fa57fd863b61bb7492ea41305382bf4d [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumedcc38a1991-05-05 20:09:44 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumedcc38a1991-05-05 20:09:44 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumedcc38a1991-05-05 20:09:44 +000029
30******************************************************************/
31
32/* Long (arbitrary precision) integer object implementation */
33
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000034/* XXX The functional organization of this file is terrible */
35
Guido van Rossumc0b618a1997-05-02 03:12:38 +000036#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +000037#include "longintrepr.h"
Guido van Rossum687ec181995-03-04 22:43:47 +000038#include "mymath.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +000039
Guido van Rossumedcc38a1991-05-05 20:09:44 +000040#include <assert.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000041#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000042
Guido van Rossume32e0141992-01-19 16:31:05 +000043#define ABS(x) ((x) < 0 ? -(x) : (x))
44
45/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000046static PyLongObject *long_normalize Py_PROTO((PyLongObject *));
47static PyLongObject *mul1 Py_PROTO((PyLongObject *, wdigit));
48static PyLongObject *muladd1 Py_PROTO((PyLongObject *, wdigit, wdigit));
49static PyLongObject *divrem1 Py_PROTO((PyLongObject *, wdigit, digit *));
50static PyObject *long_format Py_PROTO((PyObject *aa, int base));
Guido van Rossume32e0141992-01-19 16:31:05 +000051
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000052static int ticker; /* XXX Could be shared with ceval? */
53
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000055 if (--ticker < 0) { \
56 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000058 }
59
Guido van Rossumedcc38a1991-05-05 20:09:44 +000060/* Normalize (remove leading zeros from) a long int object.
61 Doesn't attempt to free the storage--in most cases, due to the nature
62 of the algorithms used, this could save at most be one word anyway. */
63
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +000065long_normalize(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000067{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000068 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000069 register int i = j;
70
71 while (i > 0 && v->ob_digit[i-1] == 0)
72 --i;
73 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000074 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000075 return v;
76}
77
78/* Allocate a new long int object with size digits.
79 Return NULL and set exception if we run out of memory. */
80
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081PyLongObject *
82_PyLong_New(size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000083 int size;
84{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086}
87
88/* Create a new long int object from a C long int */
89
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090PyObject *
91PyLong_FromLong(ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000092 long ival;
93{
Guido van Rossum472c04f1996-12-05 21:57:21 +000094 /* Assume a C long fits in at most 5 'digits' */
95 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 PyLongObject *v = _PyLong_New(5);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000097 if (v != NULL) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000098 unsigned long t = ival;
99 int i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000100 if (ival < 0) {
Guido van Rossum472c04f1996-12-05 21:57:21 +0000101 t = -ival;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000102 v->ob_size = -(v->ob_size);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000103 }
104 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000105 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000106 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000107 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000108 v = long_normalize(v);
109 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000111}
112
Guido van Rossum53756b11997-01-03 17:14:46 +0000113/* Create a new long int object from a C unsigned long int */
114
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyObject *
Guido van Rossum53756b11997-01-03 17:14:46 +0000116PyLong_FromUnsignedLong(ival)
117 unsigned long ival;
118{
119 /* Assume a C long fits in at most 5 'digits' */
120 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 PyLongObject *v = _PyLong_New(5);
Guido van Rossum53756b11997-01-03 17:14:46 +0000122 if (v != NULL) {
123 unsigned long t = ival;
124 int i;
125 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000126 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum53756b11997-01-03 17:14:46 +0000127 t >>= SHIFT;
128 }
129 v = long_normalize(v);
130 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000132}
133
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000134/* Create a new long int object from a C double */
135
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136PyObject *
Guido van Rossum687ec181995-03-04 22:43:47 +0000137#ifdef MPW
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138PyLong_FromDouble(double dval)
Guido van Rossum687ec181995-03-04 22:43:47 +0000139#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140PyLong_FromDouble(dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000141 double dval;
Guido van Rossum687ec181995-03-04 22:43:47 +0000142#endif /* MPW */
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000143{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000145 double frac;
146 int i, ndig, expo, neg;
147 neg = 0;
148 if (dval < 0.0) {
149 neg = 1;
150 dval = -dval;
151 }
152 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
153 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000155 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000157 if (v == NULL)
158 return NULL;
159 frac = ldexp(frac, (expo-1) % SHIFT + 1);
160 for (i = ndig; --i >= 0; ) {
161 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000162 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000163 frac = frac - (double)bits;
164 frac = ldexp(frac, SHIFT);
165 }
166 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000167 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000169}
170
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000171/* Get a C long int from a long int object.
172 Returns -1 and sets an error condition if overflow occurs. */
173
174long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175PyLong_AsLong(vv)
176 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000177{
Guido van Rossumf7531811998-05-26 14:33:37 +0000178 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000180 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000181 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000182
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 if (vv == NULL || !PyLong_Check(vv)) {
184 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000185 return -1;
186 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000188 i = v->ob_size;
189 sign = 1;
190 x = 0;
191 if (i < 0) {
192 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000193 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000194 }
195 while (--i >= 0) {
196 prev = x;
197 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000198 if ((x >> SHIFT) != prev)
199 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000200 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000201 /* Haven't lost any bits, but if the sign bit is set we're in
202 * trouble *unless* this is the min negative number. So,
203 * trouble iff sign bit set && (positive || some bit set other
204 * than the sign bit).
205 */
206 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
207 goto overflow;
208 return (long)x * sign;
209
210 overflow:
211 PyErr_SetString(PyExc_OverflowError,
212 "long int too long to convert");
213 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000214}
215
Guido van Rossum53756b11997-01-03 17:14:46 +0000216/* Get a C long int from a long int object.
217 Returns -1 and sets an error condition if overflow occurs. */
218
219unsigned long
220PyLong_AsUnsignedLong(vv)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 PyObject *vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000222{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000224 unsigned long x, prev;
225 int i;
226
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 if (vv == NULL || !PyLong_Check(vv)) {
228 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000229 return (unsigned long) -1;
230 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000232 i = v->ob_size;
233 x = 0;
234 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000236 "can't convert negative value to unsigned long");
237 return (unsigned long) -1;
238 }
239 while (--i >= 0) {
240 prev = x;
241 x = (x << SHIFT) + v->ob_digit[i];
242 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000244 "long int too long to convert");
245 return (unsigned long) -1;
246 }
247 }
248 return x;
249}
250
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000251/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000252
253double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254PyLong_AsDouble(vv)
255 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000256{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000257 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000258 double x;
259 double multiplier = (double) (1L << SHIFT);
260 int i, sign;
261
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262 if (vv == NULL || !PyLong_Check(vv)) {
263 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000264 return -1;
265 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000266 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000267 i = v->ob_size;
268 sign = 1;
269 x = 0.0;
270 if (i < 0) {
271 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000272 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000273 }
274 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000275 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000276 }
277 return x * sign;
278}
279
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000280#ifdef HAVE_LONG_LONG
281/*
Guido van Rossum3293b071998-08-25 16:07:15 +0000282 * LONG_LONG support by Chris Herborth (chrish@qnx.com)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000283 *
284 * For better or worse :-), I tried to follow the coding style already
285 * here.
286 */
287
288#ifdef HAVE_LIMITS_H
289#include <limits.h>
290#endif
291
292/* Hopefully this is portable... */
293#ifndef LONG_MAX
294#define LONG_MAX 2147483647L
295#endif
296#ifndef ULONG_MAX
297#define ULONG_MAX 4294967295U
298#endif
299#ifndef LONGLONG_MAX
300#define LONGLONG_MAX 9223372036854775807LL
301#endif
302#ifndef ULONGLONG_MAX
303#define ULONGLONG_MAX 0xffffffffffffffffULL
304#endif
305
Guido van Rossum3293b071998-08-25 16:07:15 +0000306/* Create a new long int object from a C LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000307
308PyObject *
309PyLong_FromLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000310 LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000311{
312#if SIZEOF_LONG_LONG == SIZEOF_LONG
313 /* In case the compiler is faking it. */
314 return PyLong_FromLong( (long)ival );
315#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000316 if( ival <= (LONG_LONG)LONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000317 return PyLong_FromLong( (long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000318 }
Guido van Rossum3293b071998-08-25 16:07:15 +0000319 else if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000320 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000321 }
322 else {
Guido van Rossum3293b071998-08-25 16:07:15 +0000323 /* Assume a C LONG_LONG fits in at most 10 'digits'.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000324 * Should be OK if we're assuming long fits in 5.
325 */
326 PyLongObject *v = _PyLong_New(10);
327
328 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000329 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000330 int i;
331 if (ival < 0) {
332 t = -ival;
333 v->ob_size = -(v->ob_size);
334 }
335
336 for (i = 0; i < 10; i++) {
337 v->ob_digit[i] = (digit) (t & MASK);
338 t >>= SHIFT;
339 }
340
341 v = long_normalize(v);
342 }
343
344 return (PyObject *)v;
345 }
346
347 /* If we got here, we're confused... */
348 PyErr_SetString( PyExc_ArithmeticError, "invalid long integer" );
349 return NULL;
350#endif
351}
352
Guido van Rossum3293b071998-08-25 16:07:15 +0000353/* Create a new long int object from a C unsigned LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000354PyObject *
355PyLong_FromUnsignedLongLong(ival)
Guido van Rossum3293b071998-08-25 16:07:15 +0000356 unsigned LONG_LONG ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000357{
358#if SIZEOF_LONG_LONG == SIZEOF_LONG
359 /* In case the compiler is faking it. */
360 return PyLong_FromUnsignedLong( (unsigned long)ival );
361#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000362 if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000363 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000364 }
365 else {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000366 /* Assume a C long fits in at most 10 'digits'. */
367 PyLongObject *v = _PyLong_New(10);
368
369 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000370 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000371 int i;
372 for (i = 0; i < 10; i++) {
373 v->ob_digit[i] = (digit) (t & MASK);
374 t >>= SHIFT;
375 }
376
377 v = long_normalize(v);
378 }
379
380 return (PyObject *)v;
381 }
382
383 /* If we got here, we're confused... */
384 PyErr_SetString( PyExc_ArithmeticError, "invalid unsigned long integer" );
385 return NULL;
386#endif
387}
388
Guido van Rossum3293b071998-08-25 16:07:15 +0000389/* Get a C LONG_LONG int from a long int object.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000390 Returns -1 and sets an error condition if overflow occurs. */
391
Guido van Rossum3293b071998-08-25 16:07:15 +0000392LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000393PyLong_AsLongLong(vv)
394 PyObject *vv;
395{
396#if SIZEOF_LONG_LONG == SIZEOF_LONG
397 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000398 return (LONG_LONG)PyLong_AsLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000399#else
400 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000401 LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000402 int i, sign;
403
404 if (vv == NULL || !PyLong_Check(vv)) {
405 PyErr_BadInternalCall();
406 return -1;
407 }
408
409 v = (PyLongObject *)vv;
410 i = v->ob_size;
411 sign = 1;
412 x = 0;
413
414 if (i < 0) {
415 sign = -1;
416 i = -(i);
417 }
418
419 while (--i >= 0) {
420 prev = x;
421 x = (x << SHIFT) + v->ob_digit[i];
422 if ((x >> SHIFT) != prev) {
423 PyErr_SetString(PyExc_OverflowError,
424 "long int too long to convert");
425 return -1;
426 }
427 }
428
429 return x * sign;
430#endif
431}
432
Guido van Rossum3293b071998-08-25 16:07:15 +0000433unsigned LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000434PyLong_AsUnsignedLongLong(vv)
435 PyObject *vv;
436{
437#if SIZEOF_LONG_LONG == 4
438 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000439 return (unsigned LONG_LONG)PyLong_AsUnsignedLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000440#else
441 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000442 unsigned LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000443 int i;
444
445 if (vv == NULL || !PyLong_Check(vv)) {
446 PyErr_BadInternalCall();
Guido van Rossum3293b071998-08-25 16:07:15 +0000447 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000448 }
449
450 v = (PyLongObject *)vv;
451 i = v->ob_size;
452 x = 0;
453
454 if (i < 0) {
455 PyErr_SetString(PyExc_OverflowError,
456 "can't convert negative value to unsigned long");
Guido van Rossum3293b071998-08-25 16:07:15 +0000457 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000458 }
459
460 while (--i >= 0) {
461 prev = x;
462 x = (x << SHIFT) + v->ob_digit[i];
463 if ((x >> SHIFT) != prev) {
464 PyErr_SetString(PyExc_OverflowError,
465 "long int too long to convert");
Guido van Rossum3293b071998-08-25 16:07:15 +0000466 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000467 }
468 }
469
470 return x;
471#endif
472}
473#endif /* HAVE_LONG_LONG */
474
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000475/* Multiply by a single digit, ignoring the sign. */
476
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000478mul1(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000479 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000480 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000481{
482 return muladd1(a, n, (digit)0);
483}
484
485/* Multiply by a single digit and add a single digit, ignoring the sign. */
486
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000488muladd1(a, n, extra)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000490 wdigit n;
491 wdigit extra;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000492{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000493 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000495 twodigits carry = extra;
496 int i;
497
498 if (z == NULL)
499 return NULL;
500 for (i = 0; i < size_a; ++i) {
501 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000502 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000503 carry >>= SHIFT;
504 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000505 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000506 return long_normalize(z);
507}
508
509/* Divide a long integer by a digit, returning both the quotient
510 (as function result) and the remainder (through *prem).
511 The sign of a is ignored; n should not be zero. */
512
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000514divrem1(a, n, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000516 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000517 digit *prem;
518{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000519 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000520 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000521 int i;
522 twodigits rem = 0;
523
524 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000526 if (z == NULL)
527 return NULL;
528 for (i = size; --i >= 0; ) {
529 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000530 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000531 rem %= n;
532 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000533 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000534 return long_normalize(z);
535}
536
537/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000538 Return a string object.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000539 If base is 8 or 16, add the proper prefix '0' or '0x'.
540 External linkage: used in bltinmodule.c by hex() and oct(). */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000541
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +0000543long_format(aa, base)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544 PyObject *aa;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000545 int base;
546{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 register PyLongObject *a = (PyLongObject *)aa;
548 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000549 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000550 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000551 char *p;
552 int bits;
553 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000554
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 if (a == NULL || !PyLong_Check(a)) {
556 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000557 return NULL;
558 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000559 assert(base >= 2 && base <= 36);
560
561 /* Compute a rough upper bound for the length of the string */
562 i = base;
563 bits = 0;
564 while (i > 1) {
565 ++bits;
566 i >>= 1;
567 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000568 i = 6 + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000570 if (str == NULL)
571 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000573 *p = '\0';
Guido van Rossumc6913e71991-11-19 20:26:46 +0000574 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000575 if (a->ob_size < 0)
576 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000577
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000578 if (a->ob_size == 0) {
579 *--p = '0';
580 }
581 else if ((base & (base - 1)) == 0) {
582 /* JRH: special case for power-of-2 bases */
583 twodigits temp = a->ob_digit[0];
584 int bitsleft = SHIFT;
585 int rem;
586 int last = abs(a->ob_size);
587 int basebits = 1;
588 i = base;
589 while ((i >>= 1) > 1) ++basebits;
590
591 i = 0;
592 for (;;) {
593 while (bitsleft >= basebits) {
594 if ((temp == 0) && (i >= last - 1)) break;
595 rem = temp & (base - 1);
596 if (rem < 10)
597 rem += '0';
598 else
599 rem += 'A' - 10;
600 assert(p > PyString_AS_STRING(str));
601 *--p = (char) rem;
602 bitsleft -= basebits;
603 temp >>= basebits;
604 }
605 if (++i >= last) {
606 if (temp == 0) break;
607 bitsleft = 99;
608 /* loop again to pick up final digits */
609 }
610 else {
611 temp = (a->ob_digit[i] << bitsleft) | temp;
612 bitsleft += SHIFT;
613 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000614 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000615 }
616 else {
617 Py_INCREF(a);
618 do {
619 digit rem;
620 PyLongObject *temp = divrem1(a, (digit)base, &rem);
621 if (temp == NULL) {
622 Py_DECREF(a);
623 Py_DECREF(str);
624 return NULL;
625 }
626 if (rem < 10)
627 rem += '0';
628 else
629 rem += 'A'-10;
630 assert(p > PyString_AS_STRING(str));
631 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000633 a = temp;
634 SIGCHECK({
635 Py_DECREF(a);
636 Py_DECREF(str);
637 return NULL;
638 })
639 } while (ABS(a->ob_size) != 0);
640 Py_DECREF(a);
641 }
642
Guido van Rossum2c475421992-08-14 15:13:07 +0000643 if (base == 8) {
644 if (size_a != 0)
645 *--p = '0';
646 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000647 else if (base == 16) {
648 *--p = 'x';
649 *--p = '0';
650 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000651 else if (base != 10) {
652 *--p = '#';
653 *--p = '0' + base%10;
654 if (base > 10)
655 *--p = '0' + base/10;
656 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000657 if (sign)
658 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659 if (p != PyString_AS_STRING(str)) {
660 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000661 assert(p > q);
662 do {
663 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000664 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 _PyString_Resize((PyObject **)&str,
666 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000667 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000669}
670
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000671#if 0
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000672/* Convert a string to a long int object, in a given base.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000673 Base zero implies a default depending on the number.
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000674 External linkage: used in compile.c and stropmodule.c. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000675
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000677long_scan(str, base)
678 char *str;
679 int base;
680{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681 return PyLong_FromString(str, (char **)NULL, base);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000682}
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000683#endif
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000684
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685PyObject *
686PyLong_FromString(str, pend, base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000687 char *str;
688 char **pend;
689 int base;
690{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000691 int sign = 1;
Guido van Rossume6762971998-06-22 03:54:46 +0000692 char *start;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000694
Guido van Rossum472c04f1996-12-05 21:57:21 +0000695 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 PyErr_SetString(PyExc_ValueError,
697 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000698 return NULL;
699 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000700 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000701 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000702 if (*str == '+')
703 ++str;
704 else if (*str == '-') {
705 ++str;
706 sign = -1;
707 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000708 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000709 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000710 if (base == 0) {
711 if (str[0] != '0')
712 base = 10;
713 else if (str[1] == 'x' || str[1] == 'X')
714 base = 16;
715 else
716 base = 8;
717 }
718 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
719 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000720 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000721 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000722 for ( ; z != NULL; ++str) {
723 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000725
726 if (*str <= '9')
727 k = *str - '0';
728 else if (*str >= 'a')
729 k = *str - 'a' + 10;
730 else if (*str >= 'A')
731 k = *str - 'A' + 10;
732 if (k < 0 || k >= base)
733 break;
734 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000736 z = temp;
737 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000738 if (z == NULL)
739 return NULL;
Guido van Rossume6762971998-06-22 03:54:46 +0000740 if (str == start) {
741 PyErr_SetString(PyExc_ValueError,
742 "no digits in long int constant");
743 return NULL;
744 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000745 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000746 z->ob_size = -(z->ob_size);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000747 if (pend)
748 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000749 return (PyObject *) z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000750}
751
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000752static PyLongObject *x_divrem
753 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject **));
754static PyObject *long_pos Py_PROTO((PyLongObject *));
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000755static int long_divrem Py_PROTO((PyLongObject *, PyLongObject *,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 PyLongObject **, PyLongObject **));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000757
758/* Long division with remainder, top-level routine */
759
Guido van Rossume32e0141992-01-19 16:31:05 +0000760static int
761long_divrem(a, b, pdiv, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000762 PyLongObject *a, *b;
763 PyLongObject **pdiv;
764 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000765{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000766 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000768
769 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000770 PyErr_SetString(PyExc_ZeroDivisionError,
771 "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000772 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000773 }
774 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000775 (size_a == size_b &&
776 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000777 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778 *pdiv = _PyLong_New(0);
779 Py_INCREF(a);
780 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000781 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000782 }
783 if (size_b == 1) {
784 digit rem = 0;
785 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000786 if (z == NULL)
787 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000789 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000790 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000791 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000792 if (z == NULL)
793 return -1;
794 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000795 /* Set the signs.
796 The quotient z has the sign of a*b;
797 the remainder r has the sign of a,
798 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000799 if ((a->ob_size < 0) != (b->ob_size < 0))
800 z->ob_size = -(z->ob_size);
801 if (a->ob_size < 0 && (*prem)->ob_size != 0)
802 (*prem)->ob_size = -((*prem)->ob_size);
803 *pdiv = z;
804 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000805}
806
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000807/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000808
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000810x_divrem(v1, w1, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000811 PyLongObject *v1, *w1;
812 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000813{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000814 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000815 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816 PyLongObject *v = mul1(v1, d);
817 PyLongObject *w = mul1(w1, d);
818 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000819 int j, k;
820
821 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000822 Py_XDECREF(v);
823 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000824 return NULL;
825 }
826
827 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000828 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000829 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000830
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000831 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000832 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000833
834 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
835 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
836 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000837 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000838 int i;
839
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000840 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000841 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000842 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000843 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000844 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000845 if (vj == w->ob_digit[size_w-1])
846 q = MASK;
847 else
848 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
849 w->ob_digit[size_w-1];
850
851 while (w->ob_digit[size_w-2]*q >
852 ((
853 ((twodigits)vj << SHIFT)
854 + v->ob_digit[j-1]
855 - q*w->ob_digit[size_w-1]
856 ) << SHIFT)
857 + v->ob_digit[j-2])
858 --q;
859
860 for (i = 0; i < size_w && i+k < size_v; ++i) {
861 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000862 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000863 carry += v->ob_digit[i+k] - z
864 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000865 v->ob_digit[i+k] = carry & MASK;
866 carry = (carry >> SHIFT) - zz;
867 }
868
869 if (i+k < size_v) {
870 carry += v->ob_digit[i+k];
871 v->ob_digit[i+k] = 0;
872 }
873
874 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000875 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000876 else {
877 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000878 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000879 carry = 0;
880 for (i = 0; i < size_w && i+k < size_v; ++i) {
881 carry += v->ob_digit[i+k] + w->ob_digit[i];
882 v->ob_digit[i+k] = carry & MASK;
883 carry >>= SHIFT;
884 }
885 }
886 } /* for j, k */
887
Guido van Rossumc206c761995-01-10 15:23:19 +0000888 if (a == NULL)
889 *prem = NULL;
890 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000891 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000892 *prem = divrem1(v, d, &d);
893 /* d receives the (unused) remainder */
894 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000896 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000897 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000898 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000899 Py_DECREF(v);
900 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000901 return a;
902}
903
904/* Methods */
905
Guido van Rossume32e0141992-01-19 16:31:05 +0000906/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907static void long_dealloc Py_PROTO((PyObject *));
908static PyObject *long_repr Py_PROTO((PyObject *));
909static int long_compare Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossum065ce5a1998-09-13 15:37:20 +0000910static long long_hash Py_PROTO((PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000911
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000912static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *));
913static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *));
914static PyObject *long_mul Py_PROTO((PyLongObject *, PyLongObject *));
915static PyObject *long_div Py_PROTO((PyLongObject *, PyLongObject *));
916static PyObject *long_mod Py_PROTO((PyLongObject *, PyLongObject *));
917static PyObject *long_divmod Py_PROTO((PyLongObject *, PyLongObject *));
918static PyObject *long_pow
919 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject *));
920static PyObject *long_neg Py_PROTO((PyLongObject *));
921static PyObject *long_pos Py_PROTO((PyLongObject *));
922static PyObject *long_abs Py_PROTO((PyLongObject *));
923static int long_nonzero Py_PROTO((PyLongObject *));
924static PyObject *long_invert Py_PROTO((PyLongObject *));
925static PyObject *long_lshift Py_PROTO((PyLongObject *, PyLongObject *));
926static PyObject *long_rshift Py_PROTO((PyLongObject *, PyLongObject *));
927static PyObject *long_and Py_PROTO((PyLongObject *, PyLongObject *));
928static PyObject *long_xor Py_PROTO((PyLongObject *, PyLongObject *));
929static PyObject *long_or Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000930
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000931static void
932long_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000934{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935 PyMem_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000936}
937
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000939long_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000941{
Guido van Rossum8b27d921992-03-27 17:27:05 +0000942 return long_format(v, 10);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000943}
944
945static int
946long_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000948{
949 int sign;
950
Guido van Rossumc6913e71991-11-19 20:26:46 +0000951 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000952 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +0000953 sign = 0;
954 else
955 sign = a->ob_size - b->ob_size;
956 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000957 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000958 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000959 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
960 ;
961 if (i < 0)
962 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000963 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000964 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000965 if (a->ob_size < 0)
966 sign = -sign;
967 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000968 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000969 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000970}
971
Guido van Rossum9bfef441993-03-29 10:43:31 +0000972static long
973long_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 PyLongObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000975{
976 long x;
977 int i, sign;
978
979 /* This is designed so that Python ints and longs with the
980 same value hash to the same value, otherwise comparisons
981 of mapping keys will turn out weird */
982 i = v->ob_size;
983 sign = 1;
984 x = 0;
985 if (i < 0) {
986 sign = -1;
987 i = -(i);
988 }
989 while (--i >= 0) {
990 /* Force a 32-bit circular shift */
991 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
992 x += v->ob_digit[i];
993 }
994 x = x * sign;
995 if (x == -1)
996 x = -2;
997 return x;
998}
999
1000
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001001/* Add the absolute values of two long integers. */
1002
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003static PyLongObject *x_add Py_PROTO((PyLongObject *, PyLongObject *));
1004static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001005x_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001007{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001008 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001010 int i;
1011 digit carry = 0;
1012
1013 /* Ensure a is the larger of the two: */
1014 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001015 { PyLongObject *temp = a; a = b; b = temp; }
1016 { int size_temp = size_a;
1017 size_a = size_b;
1018 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001019 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001021 if (z == NULL)
1022 return NULL;
1023 for (i = 0; i < size_b; ++i) {
1024 carry += a->ob_digit[i] + b->ob_digit[i];
1025 z->ob_digit[i] = carry & MASK;
1026 /* The following assumes unsigned shifts don't
1027 propagate the sign bit. */
1028 carry >>= SHIFT;
1029 }
1030 for (; i < size_a; ++i) {
1031 carry += a->ob_digit[i];
1032 z->ob_digit[i] = carry & MASK;
1033 carry >>= SHIFT;
1034 }
1035 z->ob_digit[i] = carry;
1036 return long_normalize(z);
1037}
1038
1039/* Subtract the absolute values of two integers. */
1040
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041static PyLongObject *x_sub Py_PROTO((PyLongObject *, PyLongObject *));
1042static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001043x_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001044 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001045{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001046 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001047 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001048 int i;
1049 int sign = 1;
1050 digit borrow = 0;
1051
1052 /* Ensure a is the larger of the two: */
1053 if (size_a < size_b) {
1054 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055 { PyLongObject *temp = a; a = b; b = temp; }
1056 { int size_temp = size_a;
1057 size_a = size_b;
1058 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001059 }
1060 else if (size_a == size_b) {
1061 /* Find highest digit where a and b differ: */
1062 i = size_a;
1063 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1064 ;
1065 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001066 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001067 if (a->ob_digit[i] < b->ob_digit[i]) {
1068 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001070 }
1071 size_a = size_b = i+1;
1072 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001073 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001074 if (z == NULL)
1075 return NULL;
1076 for (i = 0; i < size_b; ++i) {
1077 /* The following assumes unsigned arithmetic
1078 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001079 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001080 z->ob_digit[i] = borrow & MASK;
1081 borrow >>= SHIFT;
1082 borrow &= 1; /* Keep only one sign bit */
1083 }
1084 for (; i < size_a; ++i) {
1085 borrow = a->ob_digit[i] - borrow;
1086 z->ob_digit[i] = borrow & MASK;
1087 borrow >>= SHIFT;
1088 }
1089 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001090 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001091 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001092 return long_normalize(z);
1093}
1094
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001095static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001096long_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001097 PyLongObject *a;
1098 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001099{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001101
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001102 if (a->ob_size < 0) {
1103 if (b->ob_size < 0) {
1104 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001105 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001106 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001107 }
1108 else
1109 z = x_sub(b, a);
1110 }
1111 else {
1112 if (b->ob_size < 0)
1113 z = x_sub(a, b);
1114 else
1115 z = x_add(a, b);
1116 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001117 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001118}
1119
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001120static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001121long_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001122 PyLongObject *a;
1123 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001124{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001125 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001126
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001127 if (a->ob_size < 0) {
1128 if (b->ob_size < 0)
1129 z = x_sub(a, b);
1130 else
1131 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001132 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001133 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001134 }
1135 else {
1136 if (b->ob_size < 0)
1137 z = x_add(a, b);
1138 else
1139 z = x_sub(a, b);
1140 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001142}
1143
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001144static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001145long_mul(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001146 PyLongObject *a;
1147 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001148{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001149 int size_a;
1150 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001151 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001152 int i;
1153
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001154 size_a = ABS(a->ob_size);
1155 size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001156 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001157 if (z == NULL)
1158 return NULL;
1159 for (i = 0; i < z->ob_size; ++i)
1160 z->ob_digit[i] = 0;
1161 for (i = 0; i < size_a; ++i) {
1162 twodigits carry = 0;
1163 twodigits f = a->ob_digit[i];
1164 int j;
1165
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001166 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001167 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001168 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001169 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001170 for (j = 0; j < size_b; ++j) {
1171 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001172 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001173 carry >>= SHIFT;
1174 }
1175 for (; carry != 0; ++j) {
1176 assert(i+j < z->ob_size);
1177 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001178 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001179 carry >>= SHIFT;
1180 }
1181 }
1182 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001183 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001184 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001185 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001186 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001187}
1188
Guido van Rossume32e0141992-01-19 16:31:05 +00001189/* The / and % operators are now defined in terms of divmod().
1190 The expression a mod b has the value a - b*floor(a/b).
1191 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001192 |a| by |b|, with the sign of a. This is also expressed
1193 as a - b*trunc(a/b), if trunc truncates towards zero.
1194 Some examples:
1195 a b a rem b a mod b
1196 13 10 3 3
1197 -13 10 -3 7
1198 13 -10 3 -7
1199 -13 -10 -3 -3
1200 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001201 have different signs. We then subtract one from the 'div'
1202 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001203
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001204static int l_divmod Py_PROTO((PyLongObject *, PyLongObject *,
1205 PyLongObject **, PyLongObject **));
Guido van Rossume32e0141992-01-19 16:31:05 +00001206static int
1207l_divmod(v, w, pdiv, pmod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001208 PyLongObject *v;
1209 PyLongObject *w;
1210 PyLongObject **pdiv;
1211 PyLongObject **pmod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001212{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001213 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001214
1215 if (long_divrem(v, w, &div, &mod) < 0)
1216 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001217 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1218 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219 PyLongObject *temp;
1220 PyLongObject *one;
1221 temp = (PyLongObject *) long_add(mod, w);
1222 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001223 mod = temp;
1224 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001225 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001226 return -1;
1227 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001229 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1231 Py_DECREF(mod);
1232 Py_DECREF(div);
1233 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001234 return -1;
1235 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236 Py_DECREF(one);
1237 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001238 div = temp;
1239 }
1240 *pdiv = div;
1241 *pmod = mod;
1242 return 0;
1243}
1244
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001245static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001246long_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001247 PyLongObject *v;
1248 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001249{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001251 if (l_divmod(v, w, &div, &mod) < 0)
1252 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253 Py_DECREF(mod);
1254 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001255}
1256
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001258long_mod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001259 PyLongObject *v;
1260 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001261{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001262 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001263 if (l_divmod(v, w, &div, &mod) < 0)
1264 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001265 Py_DECREF(div);
1266 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001267}
1268
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001269static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001270long_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271 PyLongObject *v;
1272 PyLongObject *w;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001273{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001274 PyObject *z;
1275 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001276 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001277 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001279 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280 PyTuple_SetItem(z, 0, (PyObject *) div);
1281 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001282 }
1283 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284 Py_DECREF(div);
1285 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001286 }
1287 return z;
1288}
1289
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290static PyObject *
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001291long_pow(a, b, c)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292 PyLongObject *a;
1293 PyLongObject *b;
1294 PyLongObject *c;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001295{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001296 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001297 int size_b, i;
1298
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001299 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001300 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001301 PyErr_SetString(PyExc_ValueError,
1302 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001303 return NULL;
1304 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001305 z = (PyLongObject *)PyLong_FromLong(1L);
1306 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001307 for (i = 0; i < size_b; ++i) {
1308 digit bi = b->ob_digit[i];
1309 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001310
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001311 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001312 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001313
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001314 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 temp = (PyLongObject *)long_mul(z, a);
1316 Py_DECREF(z);
1317 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001318 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 Py_XDECREF(div);
1320 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001321 temp = mod;
1322 }
1323 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001324 if (z == NULL)
1325 break;
1326 }
1327 bi >>= 1;
1328 if (bi == 0 && i+1 == size_b)
1329 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001330 temp = (PyLongObject *)long_mul(a, a);
1331 Py_DECREF(a);
1332 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001333 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334 Py_XDECREF(div);
1335 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001336 temp = mod;
1337 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001338 a = temp;
1339 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001341 z = NULL;
1342 break;
1343 }
1344 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001345 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001346 break;
1347 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348 Py_XDECREF(a);
1349 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001350 l_divmod(z, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001351 Py_XDECREF(div);
1352 Py_DECREF(z);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001353 z=mod;
1354 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001355 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001356}
1357
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001359long_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001361{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001362 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363 PyLongObject *x;
1364 PyLongObject *w;
1365 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001366 if (w == NULL)
1367 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001368 x = (PyLongObject *) long_add(v, w);
1369 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001370 if (x == NULL)
1371 return NULL;
1372 if (x->ob_size != 0)
1373 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001374 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001375}
1376
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001377static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001378long_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001379 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001380{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001381 Py_INCREF(v);
1382 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001383}
1384
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001386long_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001388{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001390 int i, n;
1391 n = ABS(v->ob_size);
1392 if (n == 0) {
1393 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001394 Py_INCREF(v);
1395 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001396 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001397 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001398 if (z == NULL)
1399 return NULL;
1400 for (i = 0; i < n; i++)
1401 z->ob_digit[i] = v->ob_digit[i];
1402 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001403 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001404}
1405
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001407long_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001408 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001409{
1410 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001411 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001412 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001413 Py_INCREF(v);
1414 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001415 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001416}
1417
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001418static int
1419long_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001420 PyLongObject *v;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001421{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001422 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001423}
1424
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001425static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001426long_rshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 PyLongObject *a;
1428 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001429{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001430 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001431 long shiftby;
1432 int newsize, wordshift, loshift, hishift, i, j;
1433 digit lomask, himask;
1434
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001435 if (a->ob_size < 0) {
1436 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001437 PyLongObject *a1, *a2, *a3;
1438 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001439 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001440 a2 = (PyLongObject *) long_rshift(a1, b);
1441 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001442 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443 a3 = (PyLongObject *) long_invert(a2);
1444 Py_DECREF(a2);
1445 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001446 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001447
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001448 shiftby = PyLong_AsLong((PyObject *)b);
1449 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001450 return NULL;
1451 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001453 return NULL;
1454 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001455 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001456 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001457 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458 z = _PyLong_New(0);
1459 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001460 }
1461 loshift = shiftby % SHIFT;
1462 hishift = SHIFT - loshift;
1463 lomask = ((digit)1 << hishift) - 1;
1464 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001465 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001466 if (z == NULL)
1467 return NULL;
1468 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001469 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001470 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1471 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1472 if (i+1 < newsize)
1473 z->ob_digit[i] |=
1474 (a->ob_digit[j+1] << hishift) & himask;
1475 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001476 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001477}
1478
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001479static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001480long_lshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001481 PyLongObject *a;
1482 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001483{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001484 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001485 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001486 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001487 int oldsize, newsize, wordshift, remshift, i, j;
1488 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001489
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001490 shiftby = PyLong_AsLong((PyObject *)b);
1491 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001492 return NULL;
1493 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001494 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001495 return NULL;
1496 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001497 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001498 PyErr_SetString(PyExc_ValueError,
1499 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001500 return NULL;
1501 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001502 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1503 wordshift = (int)shiftby / SHIFT;
1504 remshift = (int)shiftby - wordshift * SHIFT;
1505
1506 oldsize = ABS(a->ob_size);
1507 newsize = oldsize + wordshift;
1508 if (remshift)
1509 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001510 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001511 if (z == NULL)
1512 return NULL;
1513 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001514 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001515 for (i = 0; i < wordshift; i++)
1516 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001517 accum = 0;
1518 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1519 accum |= a->ob_digit[j] << remshift;
1520 z->ob_digit[i] = (digit)(accum & MASK);
1521 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001522 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001523 if (remshift)
1524 z->ob_digit[newsize-1] = (digit)accum;
1525 else
1526 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001527 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001528}
1529
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001530
1531/* Bitwise and/xor/or operations */
1532
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001533#define MAX(x, y) ((x) < (y) ? (y) : (x))
1534#define MIN(x, y) ((x) > (y) ? (y) : (x))
1535
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001536static PyObject *long_bitwise Py_PROTO((PyLongObject *, int, PyLongObject *));
1537static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001538long_bitwise(a, op, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001539 PyLongObject *a;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001540 int op; /* '&', '|', '^' */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001541 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001542{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001543 digit maska, maskb; /* 0 or MASK */
1544 int negz;
1545 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001546 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001547 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001548 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001549 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001550
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001551 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001552 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001553 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001554 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001555 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001556 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001557 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001558 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001559 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001560 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001561 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001562 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001563 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001564 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001565 maskb = 0;
1566 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001567
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001568 negz = 0;
1569 switch (op) {
1570 case '^':
1571 if (maska != maskb) {
1572 maska ^= MASK;
1573 negz = -1;
1574 }
1575 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001576 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001577 if (maska && maskb) {
1578 op = '|';
1579 maska ^= MASK;
1580 maskb ^= MASK;
1581 negz = -1;
1582 }
1583 break;
1584 case '|':
1585 if (maska || maskb) {
1586 op = '&';
1587 maska ^= MASK;
1588 maskb ^= MASK;
1589 negz = -1;
1590 }
1591 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001592 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001593
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001594 /* JRH: The original logic here was to allocate the result value (z)
1595 as the longer of the two operands. However, there are some cases
1596 where the result is guaranteed to be shorter than that: AND of two
1597 positives, OR of two negatives: use the shorter number. AND with
1598 mixed signs: use the positive number. OR with mixed signs: use the
1599 negative number. After the transformations above, op will be '&'
1600 iff one of these cases applies, and mask will be non-0 for operands
1601 whose length should be ignored.
1602 */
1603
1604 size_a = a->ob_size;
1605 size_b = b->ob_size;
1606 size_z = op == '&'
1607 ? (maska
1608 ? size_b
1609 : (maskb ? size_a : MIN(size_a, size_b)))
1610 : MAX(size_a, size_b);
1611 z = _PyLong_New(size_z);
1612 if (a == NULL || b == NULL || z == NULL) {
1613 Py_XDECREF(a);
1614 Py_XDECREF(b);
1615 Py_XDECREF(z);
1616 return NULL;
1617 }
1618
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001619 for (i = 0; i < size_z; ++i) {
1620 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1621 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1622 switch (op) {
1623 case '&': z->ob_digit[i] = diga & digb; break;
1624 case '|': z->ob_digit[i] = diga | digb; break;
1625 case '^': z->ob_digit[i] = diga ^ digb; break;
1626 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001627 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001628
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001629 Py_DECREF(a);
1630 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001631 z = long_normalize(z);
1632 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001633 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001634 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001635 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001636 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001637}
1638
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001640long_and(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001641 PyLongObject *a;
1642 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001643{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001644 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001645}
1646
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001647static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001648long_xor(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001649 PyLongObject *a;
1650 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001651{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001652 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001653}
1654
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001655static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001656long_or(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001657 PyLongObject *a;
1658 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001659{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001660 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001661}
1662
Guido van Rossum234f9421993-06-17 12:35:49 +00001663static int
Guido van Rossume6eefc21992-08-14 12:06:52 +00001664long_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001665 PyObject **pv;
1666 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001667{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001668 if (PyInt_Check(*pw)) {
1669 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1670 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001671 return 0;
1672 }
1673 return 1; /* Can't do it */
1674}
1675
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001676static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001677long_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001678 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001679{
1680 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001681 x = PyLong_AsLong(v);
1682 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001683 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001684 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001685}
1686
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001687static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001688long_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001689 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001690{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001691 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001692 return v;
1693}
1694
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001695static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001696long_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001697 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001698{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001699 double result;
1700 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001701 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001702 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001703 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001704}
1705
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001706static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001707long_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001708 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001709{
1710 return long_format(v, 8);
1711}
1712
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001713static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001714long_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001715 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001716{
1717 return long_format(v, 16);
1718}
1719
1720
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001721#define UF (unaryfunc)
1722#define BF (binaryfunc)
1723#define TF (ternaryfunc)
1724#define IF (inquiry)
Guido van Rossum8b27d921992-03-27 17:27:05 +00001725
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001726static PyNumberMethods long_as_number = {
Guido van Rossum8b27d921992-03-27 17:27:05 +00001727 BF long_add, /*nb_add*/
1728 BF long_sub, /*nb_subtract*/
1729 BF long_mul, /*nb_multiply*/
1730 BF long_div, /*nb_divide*/
1731 BF long_mod, /*nb_remainder*/
1732 BF long_divmod, /*nb_divmod*/
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001733 TF long_pow, /*nb_power*/
Guido van Rossum8b27d921992-03-27 17:27:05 +00001734 UF long_neg, /*nb_negative*/
1735 UF long_pos, /*tp_positive*/
1736 UF long_abs, /*tp_absolute*/
1737 IF long_nonzero,/*tp_nonzero*/
1738 UF long_invert, /*nb_invert*/
1739 BF long_lshift, /*nb_lshift*/
1740 BF long_rshift, /*nb_rshift*/
1741 BF long_and, /*nb_and*/
1742 BF long_xor, /*nb_xor*/
1743 BF long_or, /*nb_or*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001744 (int (*) Py_FPROTO((PyObject **, PyObject **)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001745 (coercion)long_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001746 UF long_int, /*nb_int*/
1747 UF long_long, /*nb_long*/
1748 UF long_float, /*nb_float*/
1749 UF long_oct, /*nb_oct*/
1750 UF long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001751};
1752
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001753PyTypeObject PyLong_Type = {
1754 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001755 0,
1756 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001757 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001758 sizeof(digit),
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001759 (destructor)long_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001760 0, /*tp_print*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001761 0, /*tp_getattr*/
1762 0, /*tp_setattr*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001763 (int (*) Py_FPROTO((PyObject *, PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001764 (cmpfunc)long_compare, /*tp_compare*/
1765 (reprfunc)long_repr, /*tp_repr*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001766 &long_as_number,/*tp_as_number*/
1767 0, /*tp_as_sequence*/
1768 0, /*tp_as_mapping*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001769 (long (*) Py_FPROTO((PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001770 (hashfunc)long_hash, /*tp_hash*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001771};