blob: df3c6a58860844a6bf85097dbd36a15add4de9d6 [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumedcc38a1991-05-05 20:09:44 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumedcc38a1991-05-05 20:09:44 +00009******************************************************************/
10
11/* Long (arbitrary precision) integer object implementation */
12
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000013/* XXX The functional organization of this file is terrible */
14
Guido van Rossumc0b618a1997-05-02 03:12:38 +000015#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +000016#include "longintrepr.h"
Guido van Rossum687ec181995-03-04 22:43:47 +000017#include "mymath.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +000018
Guido van Rossumedcc38a1991-05-05 20:09:44 +000019#include <assert.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000020#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000021
Guido van Rossume32e0141992-01-19 16:31:05 +000022#define ABS(x) ((x) < 0 ? -(x) : (x))
23
24/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000025static PyLongObject *long_normalize(PyLongObject *);
26static PyLongObject *mul1(PyLongObject *, wdigit);
27static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
28static PyLongObject *divrem1(PyLongObject *, wdigit, digit *);
29static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000030
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000031static int ticker; /* XXX Could be shared with ceval? */
32
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000034 if (--ticker < 0) { \
35 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000036 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000037 }
38
Guido van Rossumedcc38a1991-05-05 20:09:44 +000039/* Normalize (remove leading zeros from) a long int object.
40 Doesn't attempt to free the storage--in most cases, due to the nature
41 of the algorithms used, this could save at most be one word anyway. */
42
Guido van Rossumc0b618a1997-05-02 03:12:38 +000043static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000044long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000045{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000046 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000047 register int i = j;
48
49 while (i > 0 && v->ob_digit[i-1] == 0)
50 --i;
51 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000052 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000053 return v;
54}
55
56/* Allocate a new long int object with size digits.
57 Return NULL and set exception if we run out of memory. */
58
Guido van Rossumc0b618a1997-05-02 03:12:38 +000059PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000060_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000061{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000063}
64
65/* Create a new long int object from a C long int */
66
Guido van Rossumc0b618a1997-05-02 03:12:38 +000067PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000068PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000069{
Guido van Rossum472c04f1996-12-05 21:57:21 +000070 /* Assume a C long fits in at most 5 'digits' */
71 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000072 PyLongObject *v = _PyLong_New(5);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000073 if (v != NULL) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000074 unsigned long t = ival;
75 int i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000076 if (ival < 0) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000077 t = -ival;
Guido van Rossum4c260ff1992-01-14 18:36:43 +000078 v->ob_size = -(v->ob_size);
Guido van Rossum472c04f1996-12-05 21:57:21 +000079 }
80 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +000081 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000082 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000083 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000084 v = long_normalize(v);
85 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000087}
88
Guido van Rossum53756b11997-01-03 17:14:46 +000089/* Create a new long int object from a C unsigned long int */
90
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000092PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +000093{
94 /* 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 Rossum53756b11997-01-03 17:14:46 +000097 if (v != NULL) {
98 unsigned long t = ival;
99 int i;
100 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000101 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum53756b11997-01-03 17:14:46 +0000102 t >>= SHIFT;
103 }
104 v = long_normalize(v);
105 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000107}
108
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000109/* Create a new long int object from a C double */
110
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000113{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000115 double frac;
116 int i, ndig, expo, neg;
117 neg = 0;
Guido van Rossum1a23c241999-09-27 17:11:52 +0000118 if (dval && dval * 0.5 == dval) {
119 PyErr_SetString(PyExc_OverflowError,
120 "cannot convert float infinity to long");
121 return NULL;
122 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000123 if (dval < 0.0) {
124 neg = 1;
125 dval = -dval;
126 }
127 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
128 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000130 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000132 if (v == NULL)
133 return NULL;
134 frac = ldexp(frac, (expo-1) % SHIFT + 1);
135 for (i = ndig; --i >= 0; ) {
136 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000137 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000138 frac = frac - (double)bits;
139 frac = ldexp(frac, SHIFT);
140 }
141 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000142 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000144}
145
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000146/* Get a C long int from a long int object.
147 Returns -1 and sets an error condition if overflow occurs. */
148
149long
Tim Peters9f688bf2000-07-07 15:53:28 +0000150PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000151{
Guido van Rossumf7531811998-05-26 14:33:37 +0000152 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000153 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000154 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000155 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000156
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 if (vv == NULL || !PyLong_Check(vv)) {
158 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000159 return -1;
160 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000162 i = v->ob_size;
163 sign = 1;
164 x = 0;
165 if (i < 0) {
166 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000167 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000168 }
169 while (--i >= 0) {
170 prev = x;
171 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000172 if ((x >> SHIFT) != prev)
173 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000174 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000175 /* Haven't lost any bits, but if the sign bit is set we're in
176 * trouble *unless* this is the min negative number. So,
177 * trouble iff sign bit set && (positive || some bit set other
178 * than the sign bit).
179 */
180 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
181 goto overflow;
182 return (long)x * sign;
183
184 overflow:
185 PyErr_SetString(PyExc_OverflowError,
186 "long int too long to convert");
187 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000188}
189
Guido van Rossum53756b11997-01-03 17:14:46 +0000190/* Get a C long int from a long int object.
191 Returns -1 and sets an error condition if overflow occurs. */
192
193unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000194PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000195{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000197 unsigned long x, prev;
198 int i;
199
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 if (vv == NULL || !PyLong_Check(vv)) {
201 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000202 return (unsigned long) -1;
203 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000205 i = v->ob_size;
206 x = 0;
207 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000208 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000209 "can't convert negative value to unsigned long");
210 return (unsigned long) -1;
211 }
212 while (--i >= 0) {
213 prev = x;
214 x = (x << SHIFT) + v->ob_digit[i];
215 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000217 "long int too long to convert");
218 return (unsigned long) -1;
219 }
220 }
221 return x;
222}
223
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000224/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000225
226double
Tim Peters9f688bf2000-07-07 15:53:28 +0000227PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000228{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000229 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000230 double x;
231 double multiplier = (double) (1L << SHIFT);
232 int i, sign;
233
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 if (vv == NULL || !PyLong_Check(vv)) {
235 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000236 return -1;
237 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000238 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000239 i = v->ob_size;
240 sign = 1;
241 x = 0.0;
242 if (i < 0) {
243 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000244 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000245 }
246 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000247 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000248 }
249 return x * sign;
250}
251
Guido van Rossum78694d91998-09-18 14:14:13 +0000252/* Create a new long (or int) object from a C pointer */
253
254PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000255PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000256{
257#if SIZEOF_VOID_P == SIZEOF_LONG
258 return PyInt_FromLong((long)p);
259#else
260 /* optimize null pointers */
261 if ( p == NULL )
262 return PyInt_FromLong(0);
263
264 /* we can assume that HAVE_LONG_LONG is true. if not, then the
265 configuration process should have bailed (having big pointers
266 without long longs seems non-sensical) */
267 return PyLong_FromLongLong((LONG_LONG)p);
268#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
269}
270
271/* Get a C pointer from a long object (or an int object in some cases) */
272
273void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000274PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000275{
276 /* This function will allow int or long objects. If vv is neither,
277 then the PyLong_AsLong*() functions will raise the exception:
278 PyExc_SystemError, "bad argument to internal function"
279 */
280
281#if SIZEOF_VOID_P == SIZEOF_LONG
282 long x;
283
284 if ( PyInt_Check(vv) )
285 x = PyInt_AS_LONG(vv);
286 else
287 x = PyLong_AsLong(vv);
288#else
289 /* we can assume that HAVE_LONG_LONG is true. if not, then the
290 configuration process should have bailed (having big pointers
291 without long longs seems non-sensical) */
292 LONG_LONG x;
293
294 if ( PyInt_Check(vv) )
295 x = PyInt_AS_LONG(vv);
296 else
297 x = PyLong_AsLongLong(vv);
298#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
299
300 if (x == -1 && PyErr_Occurred())
301 return NULL;
302 return (void *)x;
303}
304
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000305#ifdef HAVE_LONG_LONG
306/*
Guido van Rossum3293b071998-08-25 16:07:15 +0000307 * LONG_LONG support by Chris Herborth (chrish@qnx.com)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000308 *
309 * For better or worse :-), I tried to follow the coding style already
310 * here.
311 */
312
Guido van Rossum3293b071998-08-25 16:07:15 +0000313/* Create a new long int object from a C LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000314
315PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000316PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000317{
318#if SIZEOF_LONG_LONG == SIZEOF_LONG
319 /* In case the compiler is faking it. */
320 return PyLong_FromLong( (long)ival );
321#else
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000322 if ((LONG_LONG)LONG_MIN <= ival && ival <= (LONG_LONG)LONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000323 return PyLong_FromLong( (long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000324 }
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000325 else if (0 <= ival && ival <= (unsigned LONG_LONG)ULONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000326 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000327 }
328 else {
Guido van Rossum3293b071998-08-25 16:07:15 +0000329 /* Assume a C LONG_LONG fits in at most 10 'digits'.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000330 * Should be OK if we're assuming long fits in 5.
331 */
332 PyLongObject *v = _PyLong_New(10);
333
334 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000335 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000336 int i;
337 if (ival < 0) {
338 t = -ival;
339 v->ob_size = -(v->ob_size);
340 }
341
342 for (i = 0; i < 10; i++) {
343 v->ob_digit[i] = (digit) (t & MASK);
344 t >>= SHIFT;
345 }
346
347 v = long_normalize(v);
348 }
349
350 return (PyObject *)v;
351 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000352#endif
353}
354
Guido van Rossum3293b071998-08-25 16:07:15 +0000355/* Create a new long int object from a C unsigned LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000356PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000357PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000358{
359#if SIZEOF_LONG_LONG == SIZEOF_LONG
360 /* In case the compiler is faking it. */
361 return PyLong_FromUnsignedLong( (unsigned long)ival );
362#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000363 if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000364 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000365 }
366 else {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000367 /* Assume a C long fits in at most 10 'digits'. */
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 for (i = 0; i < 10; i++) {
374 v->ob_digit[i] = (digit) (t & MASK);
375 t >>= SHIFT;
376 }
377
378 v = long_normalize(v);
379 }
380
381 return (PyObject *)v;
382 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000383#endif
384}
385
Guido van Rossum3293b071998-08-25 16:07:15 +0000386/* Get a C LONG_LONG int from a long int object.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000387 Returns -1 and sets an error condition if overflow occurs. */
388
Guido van Rossum3293b071998-08-25 16:07:15 +0000389LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000390PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000391{
392#if SIZEOF_LONG_LONG == SIZEOF_LONG
393 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000394 return (LONG_LONG)PyLong_AsLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000395#else
396 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000397 LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000398 int i, sign;
399
400 if (vv == NULL || !PyLong_Check(vv)) {
401 PyErr_BadInternalCall();
402 return -1;
403 }
404
405 v = (PyLongObject *)vv;
406 i = v->ob_size;
407 sign = 1;
408 x = 0;
409
410 if (i < 0) {
411 sign = -1;
412 i = -(i);
413 }
414
415 while (--i >= 0) {
416 prev = x;
417 x = (x << SHIFT) + v->ob_digit[i];
418 if ((x >> SHIFT) != prev) {
419 PyErr_SetString(PyExc_OverflowError,
420 "long int too long to convert");
421 return -1;
422 }
423 }
424
425 return x * sign;
426#endif
427}
428
Guido van Rossum3293b071998-08-25 16:07:15 +0000429unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000430PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000431{
432#if SIZEOF_LONG_LONG == 4
433 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000434 return (unsigned LONG_LONG)PyLong_AsUnsignedLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000435#else
436 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000437 unsigned LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000438 int i;
439
440 if (vv == NULL || !PyLong_Check(vv)) {
441 PyErr_BadInternalCall();
Guido van Rossum3293b071998-08-25 16:07:15 +0000442 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000443 }
444
445 v = (PyLongObject *)vv;
446 i = v->ob_size;
447 x = 0;
448
449 if (i < 0) {
450 PyErr_SetString(PyExc_OverflowError,
451 "can't convert negative value to unsigned long");
Guido van Rossum3293b071998-08-25 16:07:15 +0000452 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000453 }
454
455 while (--i >= 0) {
456 prev = x;
457 x = (x << SHIFT) + v->ob_digit[i];
458 if ((x >> SHIFT) != prev) {
459 PyErr_SetString(PyExc_OverflowError,
460 "long int too long to convert");
Guido van Rossum3293b071998-08-25 16:07:15 +0000461 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000462 }
463 }
464
465 return x;
466#endif
467}
468#endif /* HAVE_LONG_LONG */
469
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000470/* Multiply by a single digit, ignoring the sign. */
471
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000473mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000474{
475 return muladd1(a, n, (digit)0);
476}
477
478/* Multiply by a single digit and add a single digit, ignoring the sign. */
479
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000481muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000482{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000483 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000485 twodigits carry = extra;
486 int i;
487
488 if (z == NULL)
489 return NULL;
490 for (i = 0; i < size_a; ++i) {
491 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000492 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000493 carry >>= SHIFT;
494 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000495 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000496 return long_normalize(z);
497}
498
499/* Divide a long integer by a digit, returning both the quotient
500 (as function result) and the remainder (through *prem).
501 The sign of a is ignored; n should not be zero. */
502
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000504divrem1(PyLongObject *a, wdigit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000505{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000506 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000508 int i;
509 twodigits rem = 0;
510
511 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000513 if (z == NULL)
514 return NULL;
515 for (i = size; --i >= 0; ) {
516 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000517 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000518 rem %= n;
519 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000520 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000521 return long_normalize(z);
522}
523
524/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000525 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000526 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000527
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000529long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000530{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 register PyLongObject *a = (PyLongObject *)aa;
532 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000533 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000534 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000535 char *p;
536 int bits;
537 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000538
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 if (a == NULL || !PyLong_Check(a)) {
540 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000541 return NULL;
542 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000543 assert(base >= 2 && base <= 36);
544
545 /* Compute a rough upper bound for the length of the string */
546 i = base;
547 bits = 0;
548 while (i > 1) {
549 ++bits;
550 i >>= 1;
551 }
Fred Drake121ee271999-12-23 15:41:28 +0000552 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000554 if (str == NULL)
555 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000557 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000558 if (addL)
559 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000560 if (a->ob_size < 0)
561 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000562
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000563 if (a->ob_size == 0) {
564 *--p = '0';
565 }
566 else if ((base & (base - 1)) == 0) {
567 /* JRH: special case for power-of-2 bases */
568 twodigits temp = a->ob_digit[0];
569 int bitsleft = SHIFT;
570 int rem;
571 int last = abs(a->ob_size);
572 int basebits = 1;
573 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000574 while ((i >>= 1) > 1)
575 ++basebits;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000576
577 i = 0;
578 for (;;) {
579 while (bitsleft >= basebits) {
580 if ((temp == 0) && (i >= last - 1)) break;
581 rem = temp & (base - 1);
582 if (rem < 10)
583 rem += '0';
584 else
585 rem += 'A' - 10;
586 assert(p > PyString_AS_STRING(str));
587 *--p = (char) rem;
588 bitsleft -= basebits;
589 temp >>= basebits;
590 }
591 if (++i >= last) {
592 if (temp == 0) break;
593 bitsleft = 99;
594 /* loop again to pick up final digits */
595 }
596 else {
597 temp = (a->ob_digit[i] << bitsleft) | temp;
598 bitsleft += SHIFT;
599 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000600 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000601 }
602 else {
603 Py_INCREF(a);
604 do {
605 digit rem;
606 PyLongObject *temp = divrem1(a, (digit)base, &rem);
607 if (temp == NULL) {
608 Py_DECREF(a);
609 Py_DECREF(str);
610 return NULL;
611 }
612 if (rem < 10)
613 rem += '0';
614 else
615 rem += 'A'-10;
616 assert(p > PyString_AS_STRING(str));
617 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000618 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000619 a = temp;
620 SIGCHECK({
621 Py_DECREF(a);
622 Py_DECREF(str);
623 return NULL;
624 })
625 } while (ABS(a->ob_size) != 0);
626 Py_DECREF(a);
627 }
628
Guido van Rossum2c475421992-08-14 15:13:07 +0000629 if (base == 8) {
630 if (size_a != 0)
631 *--p = '0';
632 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000633 else if (base == 16) {
634 *--p = 'x';
635 *--p = '0';
636 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000637 else if (base != 10) {
638 *--p = '#';
639 *--p = '0' + base%10;
640 if (base > 10)
641 *--p = '0' + base/10;
642 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000643 if (sign)
644 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000645 if (p != PyString_AS_STRING(str)) {
646 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000647 assert(p > q);
648 do {
649 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000650 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651 _PyString_Resize((PyObject **)&str,
652 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000653 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000655}
656
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000657PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000658PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000659{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000660 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000661 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000663
Guido van Rossum472c04f1996-12-05 21:57:21 +0000664 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 PyErr_SetString(PyExc_ValueError,
666 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000667 return NULL;
668 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000669 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000670 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000671 if (*str == '+')
672 ++str;
673 else if (*str == '-') {
674 ++str;
675 sign = -1;
676 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000677 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000678 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000679 if (base == 0) {
680 if (str[0] != '0')
681 base = 10;
682 else if (str[1] == 'x' || str[1] == 'X')
683 base = 16;
684 else
685 base = 8;
686 }
687 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
688 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000690 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000691 for ( ; z != NULL; ++str) {
692 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000694
695 if (*str <= '9')
696 k = *str - '0';
697 else if (*str >= 'a')
698 k = *str - 'a' + 10;
699 else if (*str >= 'A')
700 k = *str - 'A' + 10;
701 if (k < 0 || k >= base)
702 break;
703 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000704 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000705 z = temp;
706 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000707 if (z == NULL)
708 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000709 if (str == start)
710 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000711 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000712 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000713 if (*str == 'L' || *str == 'l')
714 str++;
715 while (*str && isspace(Py_CHARMASK(*str)))
716 str++;
717 if (*str != '\0')
718 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000719 if (pend)
720 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000722
723 onError:
724 PyErr_Format(PyExc_ValueError,
725 "invalid literal for long(): %.200s", orig_str);
726 Py_XDECREF(z);
727 return NULL;
728}
729
730PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000731PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000732{
733 char buffer[256];
734
735 if (length >= sizeof(buffer)) {
736 PyErr_SetString(PyExc_ValueError,
737 "long() literal too large to convert");
738 return NULL;
739 }
740 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
741 return NULL;
742
743 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000744}
745
Tim Peters9f688bf2000-07-07 15:53:28 +0000746/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000747static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +0000748 (PyLongObject *, PyLongObject *, PyLongObject **);
749static PyObject *long_pos(PyLongObject *);
750static int long_divrem(PyLongObject *, PyLongObject *,
751 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000752
753/* Long division with remainder, top-level routine */
754
Guido van Rossume32e0141992-01-19 16:31:05 +0000755static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000756long_divrem(PyLongObject *a, PyLongObject *b,
757 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000758{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000759 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000761
762 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000763 PyErr_SetString(PyExc_ZeroDivisionError,
764 "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000765 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000766 }
767 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000768 (size_a == size_b &&
769 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000770 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000771 *pdiv = _PyLong_New(0);
772 Py_INCREF(a);
773 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000774 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000775 }
776 if (size_b == 1) {
777 digit rem = 0;
778 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000779 if (z == NULL)
780 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000782 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000783 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000784 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000785 if (z == NULL)
786 return -1;
787 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000788 /* Set the signs.
789 The quotient z has the sign of a*b;
790 the remainder r has the sign of a,
791 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000792 if ((a->ob_size < 0) != (b->ob_size < 0))
793 z->ob_size = -(z->ob_size);
794 if (a->ob_size < 0 && (*prem)->ob_size != 0)
795 (*prem)->ob_size = -((*prem)->ob_size);
796 *pdiv = z;
797 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000798}
799
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000800/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000801
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000803x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000804{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000805 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000806 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807 PyLongObject *v = mul1(v1, d);
808 PyLongObject *w = mul1(w1, d);
809 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000810 int j, k;
811
812 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 Py_XDECREF(v);
814 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000815 return NULL;
816 }
817
818 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000819 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000820 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000821
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000822 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000824
825 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
826 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
827 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000828 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000829 int i;
830
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000831 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000832 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000833 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000834 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000835 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000836 if (vj == w->ob_digit[size_w-1])
837 q = MASK;
838 else
839 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
840 w->ob_digit[size_w-1];
841
842 while (w->ob_digit[size_w-2]*q >
843 ((
844 ((twodigits)vj << SHIFT)
845 + v->ob_digit[j-1]
846 - q*w->ob_digit[size_w-1]
847 ) << SHIFT)
848 + v->ob_digit[j-2])
849 --q;
850
851 for (i = 0; i < size_w && i+k < size_v; ++i) {
852 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000853 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 carry += v->ob_digit[i+k] - z
855 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000856 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +0000857 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
858 carry, SHIFT);
859 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000860 }
861
862 if (i+k < size_v) {
863 carry += v->ob_digit[i+k];
864 v->ob_digit[i+k] = 0;
865 }
866
867 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000868 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000869 else {
870 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000871 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000872 carry = 0;
873 for (i = 0; i < size_w && i+k < size_v; ++i) {
874 carry += v->ob_digit[i+k] + w->ob_digit[i];
875 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +0000876 carry = Py_ARITHMETIC_RIGHT_SHIFT(
877 BASE_TWODIGITS_TYPE,
878 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000879 }
880 }
881 } /* for j, k */
882
Guido van Rossumc206c761995-01-10 15:23:19 +0000883 if (a == NULL)
884 *prem = NULL;
885 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000886 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000887 *prem = divrem1(v, d, &d);
888 /* d receives the (unused) remainder */
889 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000890 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000891 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000892 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000893 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000894 Py_DECREF(v);
895 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000896 return a;
897}
898
899/* Methods */
900
901static void
Tim Peters9f688bf2000-07-07 15:53:28 +0000902long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000903{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000904 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000905}
906
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000908long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000909{
Fred Drake121ee271999-12-23 15:41:28 +0000910 return long_format(v, 10, 1);
911}
912
913static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000914long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +0000915{
916 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000917}
918
919static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000920long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000921{
922 int sign;
923
Guido van Rossumc6913e71991-11-19 20:26:46 +0000924 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000925 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +0000926 sign = 0;
927 else
928 sign = a->ob_size - b->ob_size;
929 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000930 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000931 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000932 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
933 ;
934 if (i < 0)
935 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000936 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000937 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000938 if (a->ob_size < 0)
939 sign = -sign;
940 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000941 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000942 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000943}
944
Guido van Rossum9bfef441993-03-29 10:43:31 +0000945static long
Tim Peters9f688bf2000-07-07 15:53:28 +0000946long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000947{
948 long x;
949 int i, sign;
950
951 /* This is designed so that Python ints and longs with the
952 same value hash to the same value, otherwise comparisons
953 of mapping keys will turn out weird */
954 i = v->ob_size;
955 sign = 1;
956 x = 0;
957 if (i < 0) {
958 sign = -1;
959 i = -(i);
960 }
961 while (--i >= 0) {
962 /* Force a 32-bit circular shift */
963 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
964 x += v->ob_digit[i];
965 }
966 x = x * sign;
967 if (x == -1)
968 x = -2;
969 return x;
970}
971
972
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000973/* Add the absolute values of two long integers. */
974
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000976x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000977{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000978 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000980 int i;
981 digit carry = 0;
982
983 /* Ensure a is the larger of the two: */
984 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985 { PyLongObject *temp = a; a = b; b = temp; }
986 { int size_temp = size_a;
987 size_a = size_b;
988 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000989 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000990 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000991 if (z == NULL)
992 return NULL;
993 for (i = 0; i < size_b; ++i) {
994 carry += a->ob_digit[i] + b->ob_digit[i];
995 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000996 carry >>= SHIFT;
997 }
998 for (; i < size_a; ++i) {
999 carry += a->ob_digit[i];
1000 z->ob_digit[i] = carry & MASK;
1001 carry >>= SHIFT;
1002 }
1003 z->ob_digit[i] = carry;
1004 return long_normalize(z);
1005}
1006
1007/* Subtract the absolute values of two integers. */
1008
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001010x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001011{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001012 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001014 int i;
1015 int sign = 1;
1016 digit borrow = 0;
1017
1018 /* Ensure a is the larger of the two: */
1019 if (size_a < size_b) {
1020 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 { PyLongObject *temp = a; a = b; b = temp; }
1022 { int size_temp = size_a;
1023 size_a = size_b;
1024 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001025 }
1026 else if (size_a == size_b) {
1027 /* Find highest digit where a and b differ: */
1028 i = size_a;
1029 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1030 ;
1031 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001033 if (a->ob_digit[i] < b->ob_digit[i]) {
1034 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001035 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001036 }
1037 size_a = size_b = i+1;
1038 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001039 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001040 if (z == NULL)
1041 return NULL;
1042 for (i = 0; i < size_b; ++i) {
1043 /* The following assumes unsigned arithmetic
1044 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001045 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001046 z->ob_digit[i] = borrow & MASK;
1047 borrow >>= SHIFT;
1048 borrow &= 1; /* Keep only one sign bit */
1049 }
1050 for (; i < size_a; ++i) {
1051 borrow = a->ob_digit[i] - borrow;
1052 z->ob_digit[i] = borrow & MASK;
1053 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001054 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001055 }
1056 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001057 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001058 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001059 return long_normalize(z);
1060}
1061
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001062static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001063long_add(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001064{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001065 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001066
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001067 if (a->ob_size < 0) {
1068 if (b->ob_size < 0) {
1069 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001070 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001071 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001072 }
1073 else
1074 z = x_sub(b, a);
1075 }
1076 else {
1077 if (b->ob_size < 0)
1078 z = x_sub(a, b);
1079 else
1080 z = x_add(a, b);
1081 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001082 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001083}
1084
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001086long_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001087{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001088 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001089
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001090 if (a->ob_size < 0) {
1091 if (b->ob_size < 0)
1092 z = x_sub(a, b);
1093 else
1094 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001095 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001096 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001097 }
1098 else {
1099 if (b->ob_size < 0)
1100 z = x_add(a, b);
1101 else
1102 z = x_sub(a, b);
1103 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001104 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001105}
1106
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001107static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001108long_mul(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001109{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001110 int size_a;
1111 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001112 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001113 int i;
1114
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001115 size_a = ABS(a->ob_size);
1116 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001117 if (size_a > size_b) {
1118 /* we are faster with the small object on the left */
1119 int hold_sa = size_a;
1120 PyLongObject *hold_a = a;
1121 size_a = size_b;
1122 size_b = hold_sa;
1123 a = b;
1124 b = hold_a;
1125 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001126 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001127 if (z == NULL)
1128 return NULL;
1129 for (i = 0; i < z->ob_size; ++i)
1130 z->ob_digit[i] = 0;
1131 for (i = 0; i < size_a; ++i) {
1132 twodigits carry = 0;
1133 twodigits f = a->ob_digit[i];
1134 int j;
1135
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001136 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001137 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001138 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001139 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001140 for (j = 0; j < size_b; ++j) {
1141 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001142 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001143 carry >>= SHIFT;
1144 }
1145 for (; carry != 0; ++j) {
1146 assert(i+j < z->ob_size);
1147 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001148 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001149 carry >>= SHIFT;
1150 }
1151 }
1152 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001153 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001154 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001155 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001156 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001157}
1158
Guido van Rossume32e0141992-01-19 16:31:05 +00001159/* The / and % operators are now defined in terms of divmod().
1160 The expression a mod b has the value a - b*floor(a/b).
1161 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001162 |a| by |b|, with the sign of a. This is also expressed
1163 as a - b*trunc(a/b), if trunc truncates towards zero.
1164 Some examples:
1165 a b a rem b a mod b
1166 13 10 3 3
1167 -13 10 -3 7
1168 13 -10 3 -7
1169 -13 -10 -3 -3
1170 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001171 have different signs. We then subtract one from the 'div'
1172 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001173
Guido van Rossume32e0141992-01-19 16:31:05 +00001174static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001175l_divmod(PyLongObject *v, PyLongObject *w,
1176 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001177{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001178 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001179
1180 if (long_divrem(v, w, &div, &mod) < 0)
1181 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001182 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1183 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001184 PyLongObject *temp;
1185 PyLongObject *one;
1186 temp = (PyLongObject *) long_add(mod, w);
1187 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001188 mod = temp;
1189 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001191 return -1;
1192 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001193 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001194 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001195 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1196 Py_DECREF(mod);
1197 Py_DECREF(div);
1198 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001199 return -1;
1200 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001201 Py_DECREF(one);
1202 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001203 div = temp;
1204 }
1205 *pdiv = div;
1206 *pmod = mod;
1207 return 0;
1208}
1209
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001211long_div(PyLongObject *v, PyLongObject *w)
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 if (l_divmod(v, w, &div, &mod) < 0)
1215 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 Py_DECREF(mod);
1217 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001218}
1219
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001221long_mod(PyLongObject *v, PyLongObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001222{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001223 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001224 if (l_divmod(v, w, &div, &mod) < 0)
1225 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001226 Py_DECREF(div);
1227 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001228}
1229
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001231long_divmod(PyLongObject *v, PyLongObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001232{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001233 PyObject *z;
1234 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001235 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001236 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001237 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001238 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239 PyTuple_SetItem(z, 0, (PyObject *) div);
1240 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001241 }
1242 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 Py_DECREF(div);
1244 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001245 }
1246 return z;
1247}
1248
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001249static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001250long_pow(PyLongObject *a, PyLongObject *b, PyLongObject *c)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001251{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001252 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001253 int size_b, i;
1254
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001255 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001256 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257 PyErr_SetString(PyExc_ValueError,
1258 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001259 return NULL;
1260 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001261 z = (PyLongObject *)PyLong_FromLong(1L);
1262 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001263 for (i = 0; i < size_b; ++i) {
1264 digit bi = b->ob_digit[i];
1265 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001266
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001267 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001268 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001269
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001270 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271 temp = (PyLongObject *)long_mul(z, a);
1272 Py_DECREF(z);
1273 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001274 if (l_divmod(temp,c,&div,&mod) < 0) {
1275 Py_DECREF(temp);
1276 z = NULL;
1277 goto error;
1278 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001279 Py_XDECREF(div);
1280 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001281 temp = mod;
1282 }
1283 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001284 if (z == NULL)
1285 break;
1286 }
1287 bi >>= 1;
1288 if (bi == 0 && i+1 == size_b)
1289 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290 temp = (PyLongObject *)long_mul(a, a);
1291 Py_DECREF(a);
1292 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001293 if (l_divmod(temp, c, &div, &mod) < 0) {
1294 Py_DECREF(temp);
1295 z = NULL;
1296 goto error;
1297 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001298 Py_XDECREF(div);
1299 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001300 temp = mod;
1301 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001302 a = temp;
1303 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001305 z = NULL;
1306 break;
1307 }
1308 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001309 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001310 break;
1311 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001312 Py_XDECREF(a);
1313 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001314 if (l_divmod(z, c, &div, &mod) < 0) {
1315 Py_DECREF(z);
1316 z = NULL;
1317 }
1318 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 Py_XDECREF(div);
1320 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001321 z = mod;
1322 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001323 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001324 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001326}
1327
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001328static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001329long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001330{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001331 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001332 PyLongObject *x;
1333 PyLongObject *w;
1334 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001335 if (w == NULL)
1336 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001337 x = (PyLongObject *) long_add(v, w);
1338 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001339 if (x == NULL)
1340 return NULL;
1341 if (x->ob_size != 0)
1342 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001343 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001344}
1345
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001347long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001348{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001349 Py_INCREF(v);
1350 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001351}
1352
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001354long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001355{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001356 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001357 int i, n;
1358 n = ABS(v->ob_size);
1359 if (n == 0) {
1360 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361 Py_INCREF(v);
1362 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001363 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001364 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001365 if (z == NULL)
1366 return NULL;
1367 for (i = 0; i < n; i++)
1368 z->ob_digit[i] = v->ob_digit[i];
1369 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001370 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001371}
1372
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001374long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001375{
1376 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001377 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001378 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001379 Py_INCREF(v);
1380 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001381 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001382}
1383
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001384static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001385long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001386{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001387 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001388}
1389
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001390static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001391long_rshift(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001392{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001393 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001394 long shiftby;
1395 int newsize, wordshift, loshift, hishift, i, j;
1396 digit lomask, himask;
1397
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001398 if (a->ob_size < 0) {
1399 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400 PyLongObject *a1, *a2, *a3;
1401 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001402 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001403 a2 = (PyLongObject *) long_rshift(a1, b);
1404 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001405 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406 a3 = (PyLongObject *) long_invert(a2);
1407 Py_DECREF(a2);
1408 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001409 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001410
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001411 shiftby = PyLong_AsLong((PyObject *)b);
1412 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001413 return NULL;
1414 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001416 return NULL;
1417 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001418 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001419 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001420 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001421 z = _PyLong_New(0);
1422 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001423 }
1424 loshift = shiftby % SHIFT;
1425 hishift = SHIFT - loshift;
1426 lomask = ((digit)1 << hishift) - 1;
1427 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001428 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001429 if (z == NULL)
1430 return NULL;
1431 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001432 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001433 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1434 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1435 if (i+1 < newsize)
1436 z->ob_digit[i] |=
1437 (a->ob_digit[j+1] << hishift) & himask;
1438 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001439 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001440}
1441
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001443long_lshift(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001444{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001445 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001447 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001448 int oldsize, newsize, wordshift, remshift, i, j;
1449 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001450
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001451 shiftby = PyLong_AsLong((PyObject *)b);
1452 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001453 return NULL;
1454 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001456 return NULL;
1457 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001458 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001459 PyErr_SetString(PyExc_ValueError,
1460 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001461 return NULL;
1462 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001463 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1464 wordshift = (int)shiftby / SHIFT;
1465 remshift = (int)shiftby - wordshift * SHIFT;
1466
1467 oldsize = ABS(a->ob_size);
1468 newsize = oldsize + wordshift;
1469 if (remshift)
1470 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001471 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001472 if (z == NULL)
1473 return NULL;
1474 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001475 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001476 for (i = 0; i < wordshift; i++)
1477 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001478 accum = 0;
1479 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1480 accum |= a->ob_digit[j] << remshift;
1481 z->ob_digit[i] = (digit)(accum & MASK);
1482 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001483 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001484 if (remshift)
1485 z->ob_digit[newsize-1] = (digit)accum;
1486 else
1487 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001488 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001489}
1490
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001491
1492/* Bitwise and/xor/or operations */
1493
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001494#define MAX(x, y) ((x) < (y) ? (y) : (x))
1495#define MIN(x, y) ((x) > (y) ? (y) : (x))
1496
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001497static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001498long_bitwise(PyLongObject *a,
1499 int op, /* '&', '|', '^' */
1500 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001501{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001502 digit maska, maskb; /* 0 or MASK */
1503 int negz;
1504 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001505 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001506 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001507 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001508 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001509
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001510 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001511 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001512 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001513 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001514 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001515 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001516 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001517 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001518 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001519 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001520 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001521 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001522 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001523 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001524 maskb = 0;
1525 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001526
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001527 negz = 0;
1528 switch (op) {
1529 case '^':
1530 if (maska != maskb) {
1531 maska ^= MASK;
1532 negz = -1;
1533 }
1534 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001535 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001536 if (maska && maskb) {
1537 op = '|';
1538 maska ^= MASK;
1539 maskb ^= MASK;
1540 negz = -1;
1541 }
1542 break;
1543 case '|':
1544 if (maska || maskb) {
1545 op = '&';
1546 maska ^= MASK;
1547 maskb ^= MASK;
1548 negz = -1;
1549 }
1550 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001551 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001552
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001553 /* JRH: The original logic here was to allocate the result value (z)
1554 as the longer of the two operands. However, there are some cases
1555 where the result is guaranteed to be shorter than that: AND of two
1556 positives, OR of two negatives: use the shorter number. AND with
1557 mixed signs: use the positive number. OR with mixed signs: use the
1558 negative number. After the transformations above, op will be '&'
1559 iff one of these cases applies, and mask will be non-0 for operands
1560 whose length should be ignored.
1561 */
1562
1563 size_a = a->ob_size;
1564 size_b = b->ob_size;
1565 size_z = op == '&'
1566 ? (maska
1567 ? size_b
1568 : (maskb ? size_a : MIN(size_a, size_b)))
1569 : MAX(size_a, size_b);
1570 z = _PyLong_New(size_z);
1571 if (a == NULL || b == NULL || z == NULL) {
1572 Py_XDECREF(a);
1573 Py_XDECREF(b);
1574 Py_XDECREF(z);
1575 return NULL;
1576 }
1577
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001578 for (i = 0; i < size_z; ++i) {
1579 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1580 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1581 switch (op) {
1582 case '&': z->ob_digit[i] = diga & digb; break;
1583 case '|': z->ob_digit[i] = diga | digb; break;
1584 case '^': z->ob_digit[i] = diga ^ digb; break;
1585 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001586 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001587
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001588 Py_DECREF(a);
1589 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001590 z = long_normalize(z);
1591 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001592 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001593 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001595 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001596}
1597
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001598static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001599long_and(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001600{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001601 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001602}
1603
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001604static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001605long_xor(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001606{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001607 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001608}
1609
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001610static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001611long_or(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001612{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001613 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001614}
1615
Guido van Rossum234f9421993-06-17 12:35:49 +00001616static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001617long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001618{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001619 if (PyInt_Check(*pw)) {
1620 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1621 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001622 return 0;
1623 }
1624 return 1; /* Can't do it */
1625}
1626
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001627static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001628long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001629{
1630 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001631 x = PyLong_AsLong(v);
1632 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001633 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001634 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001635}
1636
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001637static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001638long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001639{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001640 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001641 return v;
1642}
1643
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001644static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001645long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001646{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001647 double result;
1648 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001649 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001650 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001651 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001652}
1653
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001654static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001655long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001656{
Fred Drake121ee271999-12-23 15:41:28 +00001657 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001658}
1659
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001660static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001661long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001662{
Fred Drake121ee271999-12-23 15:41:28 +00001663 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001664}
1665
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001666static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00001667 (binaryfunc) long_add, /*nb_add*/
1668 (binaryfunc) long_sub, /*nb_subtract*/
1669 (binaryfunc) long_mul, /*nb_multiply*/
1670 (binaryfunc) long_div, /*nb_divide*/
1671 (binaryfunc) long_mod, /*nb_remainder*/
1672 (binaryfunc) long_divmod, /*nb_divmod*/
1673 (ternaryfunc) long_pow, /*nb_power*/
1674 (unaryfunc) long_neg, /*nb_negative*/
1675 (unaryfunc) long_pos, /*tp_positive*/
1676 (unaryfunc) long_abs, /*tp_absolute*/
1677 (inquiry) long_nonzero, /*tp_nonzero*/
1678 (unaryfunc) long_invert, /*nb_invert*/
1679 (binaryfunc) long_lshift, /*nb_lshift*/
1680 (binaryfunc) long_rshift, /*nb_rshift*/
1681 (binaryfunc) long_and, /*nb_and*/
1682 (binaryfunc) long_xor, /*nb_xor*/
1683 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001684 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001685 (unaryfunc) long_int, /*nb_int*/
1686 (unaryfunc) long_long, /*nb_long*/
1687 (unaryfunc) long_float, /*nb_float*/
1688 (unaryfunc) long_oct, /*nb_oct*/
1689 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001690};
1691
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001692PyTypeObject PyLong_Type = {
1693 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001694 0,
1695 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001696 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001697 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00001698 (destructor)long_dealloc, /*tp_dealloc*/
1699 0, /*tp_print*/
1700 0, /*tp_getattr*/
1701 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001702 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001703 (reprfunc)long_repr, /*tp_repr*/
1704 &long_as_number, /*tp_as_number*/
1705 0, /*tp_as_sequence*/
1706 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001707 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001708 0, /*tp_call*/
1709 (reprfunc)long_str, /*tp_str*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001710};