blob: df69a6da67ac980d8e91c439da6139ee301f8a52 [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;
574 while ((i >>= 1) > 1) ++basebits;
575
576 i = 0;
577 for (;;) {
578 while (bitsleft >= basebits) {
579 if ((temp == 0) && (i >= last - 1)) break;
580 rem = temp & (base - 1);
581 if (rem < 10)
582 rem += '0';
583 else
584 rem += 'A' - 10;
585 assert(p > PyString_AS_STRING(str));
586 *--p = (char) rem;
587 bitsleft -= basebits;
588 temp >>= basebits;
589 }
590 if (++i >= last) {
591 if (temp == 0) break;
592 bitsleft = 99;
593 /* loop again to pick up final digits */
594 }
595 else {
596 temp = (a->ob_digit[i] << bitsleft) | temp;
597 bitsleft += SHIFT;
598 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000599 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000600 }
601 else {
602 Py_INCREF(a);
603 do {
604 digit rem;
605 PyLongObject *temp = divrem1(a, (digit)base, &rem);
606 if (temp == NULL) {
607 Py_DECREF(a);
608 Py_DECREF(str);
609 return NULL;
610 }
611 if (rem < 10)
612 rem += '0';
613 else
614 rem += 'A'-10;
615 assert(p > PyString_AS_STRING(str));
616 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000618 a = temp;
619 SIGCHECK({
620 Py_DECREF(a);
621 Py_DECREF(str);
622 return NULL;
623 })
624 } while (ABS(a->ob_size) != 0);
625 Py_DECREF(a);
626 }
627
Guido van Rossum2c475421992-08-14 15:13:07 +0000628 if (base == 8) {
629 if (size_a != 0)
630 *--p = '0';
631 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000632 else if (base == 16) {
633 *--p = 'x';
634 *--p = '0';
635 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000636 else if (base != 10) {
637 *--p = '#';
638 *--p = '0' + base%10;
639 if (base > 10)
640 *--p = '0' + base/10;
641 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000642 if (sign)
643 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644 if (p != PyString_AS_STRING(str)) {
645 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000646 assert(p > q);
647 do {
648 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000649 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650 _PyString_Resize((PyObject **)&str,
651 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000652 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000653 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000654}
655
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000657PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000658{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000659 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000660 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000662
Guido van Rossum472c04f1996-12-05 21:57:21 +0000663 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 PyErr_SetString(PyExc_ValueError,
665 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000666 return NULL;
667 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000668 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000669 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000670 if (*str == '+')
671 ++str;
672 else if (*str == '-') {
673 ++str;
674 sign = -1;
675 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000676 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000677 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000678 if (base == 0) {
679 if (str[0] != '0')
680 base = 10;
681 else if (str[1] == 'x' || str[1] == 'X')
682 base = 16;
683 else
684 base = 8;
685 }
686 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
687 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000689 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000690 for ( ; z != NULL; ++str) {
691 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000693
694 if (*str <= '9')
695 k = *str - '0';
696 else if (*str >= 'a')
697 k = *str - 'a' + 10;
698 else if (*str >= 'A')
699 k = *str - 'A' + 10;
700 if (k < 0 || k >= base)
701 break;
702 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000704 z = temp;
705 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000706 if (z == NULL)
707 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000708 if (str == start)
709 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000710 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000711 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000712 if (*str == 'L' || *str == 'l')
713 str++;
714 while (*str && isspace(Py_CHARMASK(*str)))
715 str++;
716 if (*str != '\0')
717 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000718 if (pend)
719 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000720 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000721
722 onError:
723 PyErr_Format(PyExc_ValueError,
724 "invalid literal for long(): %.200s", orig_str);
725 Py_XDECREF(z);
726 return NULL;
727}
728
729PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000730PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000731{
732 char buffer[256];
733
734 if (length >= sizeof(buffer)) {
735 PyErr_SetString(PyExc_ValueError,
736 "long() literal too large to convert");
737 return NULL;
738 }
739 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
740 return NULL;
741
742 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000743}
744
Tim Peters9f688bf2000-07-07 15:53:28 +0000745/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000746static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +0000747 (PyLongObject *, PyLongObject *, PyLongObject **);
748static PyObject *long_pos(PyLongObject *);
749static int long_divrem(PyLongObject *, PyLongObject *,
750 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000751
752/* Long division with remainder, top-level routine */
753
Guido van Rossume32e0141992-01-19 16:31:05 +0000754static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000755long_divrem(PyLongObject *a, PyLongObject *b,
756 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000757{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000758 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000760
761 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000762 PyErr_SetString(PyExc_ZeroDivisionError,
763 "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000764 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000765 }
766 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000767 (size_a == size_b &&
768 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000769 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770 *pdiv = _PyLong_New(0);
771 Py_INCREF(a);
772 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000773 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000774 }
775 if (size_b == 1) {
776 digit rem = 0;
777 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000778 if (z == NULL)
779 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000780 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000781 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000782 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000783 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000784 if (z == NULL)
785 return -1;
786 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000787 /* Set the signs.
788 The quotient z has the sign of a*b;
789 the remainder r has the sign of a,
790 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000791 if ((a->ob_size < 0) != (b->ob_size < 0))
792 z->ob_size = -(z->ob_size);
793 if (a->ob_size < 0 && (*prem)->ob_size != 0)
794 (*prem)->ob_size = -((*prem)->ob_size);
795 *pdiv = z;
796 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000797}
798
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000799/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000800
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000802x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000803{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000804 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000805 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806 PyLongObject *v = mul1(v1, d);
807 PyLongObject *w = mul1(w1, d);
808 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000809 int j, k;
810
811 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000812 Py_XDECREF(v);
813 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000814 return NULL;
815 }
816
817 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000818 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000819 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000820
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000821 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000822 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000823
824 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
825 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
826 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000827 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000828 int i;
829
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000830 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000832 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000833 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000834 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000835 if (vj == w->ob_digit[size_w-1])
836 q = MASK;
837 else
838 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
839 w->ob_digit[size_w-1];
840
841 while (w->ob_digit[size_w-2]*q >
842 ((
843 ((twodigits)vj << SHIFT)
844 + v->ob_digit[j-1]
845 - q*w->ob_digit[size_w-1]
846 ) << SHIFT)
847 + v->ob_digit[j-2])
848 --q;
849
850 for (i = 0; i < size_w && i+k < size_v; ++i) {
851 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000852 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 carry += v->ob_digit[i+k] - z
854 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000855 v->ob_digit[i+k] = carry & MASK;
856 carry = (carry >> SHIFT) - zz;
857 }
858
859 if (i+k < size_v) {
860 carry += v->ob_digit[i+k];
861 v->ob_digit[i+k] = 0;
862 }
863
864 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000865 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000866 else {
867 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000868 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000869 carry = 0;
870 for (i = 0; i < size_w && i+k < size_v; ++i) {
871 carry += v->ob_digit[i+k] + w->ob_digit[i];
872 v->ob_digit[i+k] = carry & MASK;
873 carry >>= SHIFT;
874 }
875 }
876 } /* for j, k */
877
Guido van Rossumc206c761995-01-10 15:23:19 +0000878 if (a == NULL)
879 *prem = NULL;
880 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000881 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000882 *prem = divrem1(v, d, &d);
883 /* d receives the (unused) remainder */
884 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000886 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000887 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000888 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 Py_DECREF(v);
890 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000891 return a;
892}
893
894/* Methods */
895
896static void
Tim Peters9f688bf2000-07-07 15:53:28 +0000897long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000898{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000899 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000900}
901
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000903long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000904{
Fred Drake121ee271999-12-23 15:41:28 +0000905 return long_format(v, 10, 1);
906}
907
908static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000909long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +0000910{
911 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000912}
913
914static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000915long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000916{
917 int sign;
918
Guido van Rossumc6913e71991-11-19 20:26:46 +0000919 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000920 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +0000921 sign = 0;
922 else
923 sign = a->ob_size - b->ob_size;
924 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000925 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000926 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000927 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
928 ;
929 if (i < 0)
930 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000931 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000932 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000933 if (a->ob_size < 0)
934 sign = -sign;
935 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000936 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000937 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000938}
939
Guido van Rossum9bfef441993-03-29 10:43:31 +0000940static long
Tim Peters9f688bf2000-07-07 15:53:28 +0000941long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000942{
943 long x;
944 int i, sign;
945
946 /* This is designed so that Python ints and longs with the
947 same value hash to the same value, otherwise comparisons
948 of mapping keys will turn out weird */
949 i = v->ob_size;
950 sign = 1;
951 x = 0;
952 if (i < 0) {
953 sign = -1;
954 i = -(i);
955 }
956 while (--i >= 0) {
957 /* Force a 32-bit circular shift */
958 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
959 x += v->ob_digit[i];
960 }
961 x = x * sign;
962 if (x == -1)
963 x = -2;
964 return x;
965}
966
967
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000968/* Add the absolute values of two long integers. */
969
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000971x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000972{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000973 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000975 int i;
976 digit carry = 0;
977
978 /* Ensure a is the larger of the two: */
979 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000980 { PyLongObject *temp = a; a = b; b = temp; }
981 { int size_temp = size_a;
982 size_a = size_b;
983 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000984 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000986 if (z == NULL)
987 return NULL;
988 for (i = 0; i < size_b; ++i) {
989 carry += a->ob_digit[i] + b->ob_digit[i];
990 z->ob_digit[i] = carry & MASK;
991 /* The following assumes unsigned shifts don't
992 propagate the sign bit. */
993 carry >>= SHIFT;
994 }
995 for (; i < size_a; ++i) {
996 carry += a->ob_digit[i];
997 z->ob_digit[i] = carry & MASK;
998 carry >>= SHIFT;
999 }
1000 z->ob_digit[i] = carry;
1001 return long_normalize(z);
1002}
1003
1004/* Subtract the absolute values of two integers. */
1005
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001007x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001008{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001009 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001010 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001011 int i;
1012 int sign = 1;
1013 digit borrow = 0;
1014
1015 /* Ensure a is the larger of the two: */
1016 if (size_a < size_b) {
1017 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001018 { PyLongObject *temp = a; a = b; b = temp; }
1019 { int size_temp = size_a;
1020 size_a = size_b;
1021 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001022 }
1023 else if (size_a == size_b) {
1024 /* Find highest digit where a and b differ: */
1025 i = size_a;
1026 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1027 ;
1028 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001029 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001030 if (a->ob_digit[i] < b->ob_digit[i]) {
1031 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001033 }
1034 size_a = size_b = i+1;
1035 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001037 if (z == NULL)
1038 return NULL;
1039 for (i = 0; i < size_b; ++i) {
1040 /* The following assumes unsigned arithmetic
1041 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001042 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001043 z->ob_digit[i] = borrow & MASK;
1044 borrow >>= SHIFT;
1045 borrow &= 1; /* Keep only one sign bit */
1046 }
1047 for (; i < size_a; ++i) {
1048 borrow = a->ob_digit[i] - borrow;
1049 z->ob_digit[i] = borrow & MASK;
1050 borrow >>= SHIFT;
1051 }
1052 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001053 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001054 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001055 return long_normalize(z);
1056}
1057
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001059long_add(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001060{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001062
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001063 if (a->ob_size < 0) {
1064 if (b->ob_size < 0) {
1065 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001066 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001067 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001068 }
1069 else
1070 z = x_sub(b, a);
1071 }
1072 else {
1073 if (b->ob_size < 0)
1074 z = x_sub(a, b);
1075 else
1076 z = x_add(a, b);
1077 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001079}
1080
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001082long_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001083{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001084 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001085
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001086 if (a->ob_size < 0) {
1087 if (b->ob_size < 0)
1088 z = x_sub(a, b);
1089 else
1090 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001091 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001092 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001093 }
1094 else {
1095 if (b->ob_size < 0)
1096 z = x_add(a, b);
1097 else
1098 z = x_sub(a, b);
1099 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001100 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001101}
1102
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001103static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001104long_mul(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001105{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001106 int size_a;
1107 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001108 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001109 int i;
1110
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001111 size_a = ABS(a->ob_size);
1112 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001113 if (size_a > size_b) {
1114 /* we are faster with the small object on the left */
1115 int hold_sa = size_a;
1116 PyLongObject *hold_a = a;
1117 size_a = size_b;
1118 size_b = hold_sa;
1119 a = b;
1120 b = hold_a;
1121 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001122 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001123 if (z == NULL)
1124 return NULL;
1125 for (i = 0; i < z->ob_size; ++i)
1126 z->ob_digit[i] = 0;
1127 for (i = 0; i < size_a; ++i) {
1128 twodigits carry = 0;
1129 twodigits f = a->ob_digit[i];
1130 int j;
1131
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001132 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001134 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001135 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001136 for (j = 0; j < size_b; ++j) {
1137 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001138 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001139 carry >>= SHIFT;
1140 }
1141 for (; carry != 0; ++j) {
1142 assert(i+j < z->ob_size);
1143 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001144 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001145 carry >>= SHIFT;
1146 }
1147 }
1148 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001149 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001150 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001151 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001152 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001153}
1154
Guido van Rossume32e0141992-01-19 16:31:05 +00001155/* The / and % operators are now defined in terms of divmod().
1156 The expression a mod b has the value a - b*floor(a/b).
1157 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001158 |a| by |b|, with the sign of a. This is also expressed
1159 as a - b*trunc(a/b), if trunc truncates towards zero.
1160 Some examples:
1161 a b a rem b a mod b
1162 13 10 3 3
1163 -13 10 -3 7
1164 13 -10 3 -7
1165 -13 -10 -3 -3
1166 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001167 have different signs. We then subtract one from the 'div'
1168 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001169
Guido van Rossume32e0141992-01-19 16:31:05 +00001170static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001171l_divmod(PyLongObject *v, PyLongObject *w,
1172 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001173{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001175
1176 if (long_divrem(v, w, &div, &mod) < 0)
1177 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001178 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1179 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001180 PyLongObject *temp;
1181 PyLongObject *one;
1182 temp = (PyLongObject *) long_add(mod, w);
1183 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001184 mod = temp;
1185 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001186 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001187 return -1;
1188 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001189 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001190 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1192 Py_DECREF(mod);
1193 Py_DECREF(div);
1194 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001195 return -1;
1196 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001197 Py_DECREF(one);
1198 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001199 div = temp;
1200 }
1201 *pdiv = div;
1202 *pmod = mod;
1203 return 0;
1204}
1205
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001206static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001207long_div(PyLongObject *v, PyLongObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001208{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001209 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001210 if (l_divmod(v, w, &div, &mod) < 0)
1211 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212 Py_DECREF(mod);
1213 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001214}
1215
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001217long_mod(PyLongObject *v, PyLongObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001218{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001220 if (l_divmod(v, w, &div, &mod) < 0)
1221 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001222 Py_DECREF(div);
1223 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001224}
1225
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001226static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001227long_divmod(PyLongObject *v, PyLongObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001228{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001229 PyObject *z;
1230 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001231 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001232 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001233 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001234 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001235 PyTuple_SetItem(z, 0, (PyObject *) div);
1236 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001237 }
1238 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239 Py_DECREF(div);
1240 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001241 }
1242 return z;
1243}
1244
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001245static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001246long_pow(PyLongObject *a, PyLongObject *b, PyLongObject *c)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001247{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001249 int size_b, i;
1250
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001251 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001252 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253 PyErr_SetString(PyExc_ValueError,
1254 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001255 return NULL;
1256 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257 z = (PyLongObject *)PyLong_FromLong(1L);
1258 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001259 for (i = 0; i < size_b; ++i) {
1260 digit bi = b->ob_digit[i];
1261 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001262
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001263 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001264 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001265
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001266 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001267 temp = (PyLongObject *)long_mul(z, a);
1268 Py_DECREF(z);
1269 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001270 if (l_divmod(temp,c,&div,&mod) < 0) {
1271 Py_DECREF(temp);
1272 z = NULL;
1273 goto error;
1274 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001275 Py_XDECREF(div);
1276 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001277 temp = mod;
1278 }
1279 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001280 if (z == NULL)
1281 break;
1282 }
1283 bi >>= 1;
1284 if (bi == 0 && i+1 == size_b)
1285 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001286 temp = (PyLongObject *)long_mul(a, a);
1287 Py_DECREF(a);
1288 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001289 if (l_divmod(temp, c, &div, &mod) < 0) {
1290 Py_DECREF(temp);
1291 z = NULL;
1292 goto error;
1293 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001294 Py_XDECREF(div);
1295 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001296 temp = mod;
1297 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001298 a = temp;
1299 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001301 z = NULL;
1302 break;
1303 }
1304 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001305 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001306 break;
1307 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308 Py_XDECREF(a);
1309 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001310 if (l_divmod(z, c, &div, &mod) < 0) {
1311 Py_DECREF(z);
1312 z = NULL;
1313 }
1314 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 Py_XDECREF(div);
1316 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001317 z = mod;
1318 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001319 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001320 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001321 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001322}
1323
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001324static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001325long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001326{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001327 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001328 PyLongObject *x;
1329 PyLongObject *w;
1330 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001331 if (w == NULL)
1332 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333 x = (PyLongObject *) long_add(v, w);
1334 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001335 if (x == NULL)
1336 return NULL;
1337 if (x->ob_size != 0)
1338 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001340}
1341
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001343long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001344{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345 Py_INCREF(v);
1346 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001347}
1348
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001349static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001350long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001351{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001352 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001353 int i, n;
1354 n = ABS(v->ob_size);
1355 if (n == 0) {
1356 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001357 Py_INCREF(v);
1358 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001359 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001361 if (z == NULL)
1362 return NULL;
1363 for (i = 0; i < n; i++)
1364 z->ob_digit[i] = v->ob_digit[i];
1365 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001366 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001367}
1368
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001370long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001371{
1372 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001373 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001374 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 Py_INCREF(v);
1376 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001377 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001378}
1379
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001380static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001381long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001382{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001383 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001384}
1385
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001386static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001387long_rshift(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001388{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001390 long shiftby;
1391 int newsize, wordshift, loshift, hishift, i, j;
1392 digit lomask, himask;
1393
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001394 if (a->ob_size < 0) {
1395 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001396 PyLongObject *a1, *a2, *a3;
1397 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001398 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001399 a2 = (PyLongObject *) long_rshift(a1, b);
1400 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001401 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001402 a3 = (PyLongObject *) long_invert(a2);
1403 Py_DECREF(a2);
1404 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001405 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001406
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001407 shiftby = PyLong_AsLong((PyObject *)b);
1408 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001409 return NULL;
1410 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001411 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001412 return NULL;
1413 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001414 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001415 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001416 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417 z = _PyLong_New(0);
1418 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001419 }
1420 loshift = shiftby % SHIFT;
1421 hishift = SHIFT - loshift;
1422 lomask = ((digit)1 << hishift) - 1;
1423 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001424 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001425 if (z == NULL)
1426 return NULL;
1427 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001428 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001429 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1430 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1431 if (i+1 < newsize)
1432 z->ob_digit[i] |=
1433 (a->ob_digit[j+1] << hishift) & himask;
1434 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001435 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001436}
1437
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001439long_lshift(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001440{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001441 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001443 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001444 int oldsize, newsize, wordshift, remshift, i, j;
1445 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001446
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001447 shiftby = PyLong_AsLong((PyObject *)b);
1448 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001449 return NULL;
1450 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001451 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001452 return NULL;
1453 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001454 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455 PyErr_SetString(PyExc_ValueError,
1456 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001457 return NULL;
1458 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001459 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1460 wordshift = (int)shiftby / SHIFT;
1461 remshift = (int)shiftby - wordshift * SHIFT;
1462
1463 oldsize = ABS(a->ob_size);
1464 newsize = oldsize + wordshift;
1465 if (remshift)
1466 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001467 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001468 if (z == NULL)
1469 return NULL;
1470 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001471 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001472 for (i = 0; i < wordshift; i++)
1473 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001474 accum = 0;
1475 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1476 accum |= a->ob_digit[j] << remshift;
1477 z->ob_digit[i] = (digit)(accum & MASK);
1478 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001479 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001480 if (remshift)
1481 z->ob_digit[newsize-1] = (digit)accum;
1482 else
1483 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001484 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001485}
1486
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001487
1488/* Bitwise and/xor/or operations */
1489
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001490#define MAX(x, y) ((x) < (y) ? (y) : (x))
1491#define MIN(x, y) ((x) > (y) ? (y) : (x))
1492
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001493static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001494long_bitwise(PyLongObject *a,
1495 int op, /* '&', '|', '^' */
1496 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001497{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001498 digit maska, maskb; /* 0 or MASK */
1499 int negz;
1500 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001501 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001502 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001503 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001504 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001505
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001506 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001507 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001508 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001509 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001510 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001511 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001512 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001513 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001514 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001515 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001516 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001517 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001518 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001519 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001520 maskb = 0;
1521 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001522
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001523 negz = 0;
1524 switch (op) {
1525 case '^':
1526 if (maska != maskb) {
1527 maska ^= MASK;
1528 negz = -1;
1529 }
1530 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001531 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001532 if (maska && maskb) {
1533 op = '|';
1534 maska ^= MASK;
1535 maskb ^= MASK;
1536 negz = -1;
1537 }
1538 break;
1539 case '|':
1540 if (maska || maskb) {
1541 op = '&';
1542 maska ^= MASK;
1543 maskb ^= MASK;
1544 negz = -1;
1545 }
1546 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001547 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001548
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001549 /* JRH: The original logic here was to allocate the result value (z)
1550 as the longer of the two operands. However, there are some cases
1551 where the result is guaranteed to be shorter than that: AND of two
1552 positives, OR of two negatives: use the shorter number. AND with
1553 mixed signs: use the positive number. OR with mixed signs: use the
1554 negative number. After the transformations above, op will be '&'
1555 iff one of these cases applies, and mask will be non-0 for operands
1556 whose length should be ignored.
1557 */
1558
1559 size_a = a->ob_size;
1560 size_b = b->ob_size;
1561 size_z = op == '&'
1562 ? (maska
1563 ? size_b
1564 : (maskb ? size_a : MIN(size_a, size_b)))
1565 : MAX(size_a, size_b);
1566 z = _PyLong_New(size_z);
1567 if (a == NULL || b == NULL || z == NULL) {
1568 Py_XDECREF(a);
1569 Py_XDECREF(b);
1570 Py_XDECREF(z);
1571 return NULL;
1572 }
1573
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001574 for (i = 0; i < size_z; ++i) {
1575 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1576 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1577 switch (op) {
1578 case '&': z->ob_digit[i] = diga & digb; break;
1579 case '|': z->ob_digit[i] = diga | digb; break;
1580 case '^': z->ob_digit[i] = diga ^ digb; break;
1581 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001582 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001583
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001584 Py_DECREF(a);
1585 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001586 z = long_normalize(z);
1587 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001588 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001589 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001590 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001591 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001592}
1593
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001595long_and(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001596{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001597 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001598}
1599
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001600static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001601long_xor(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001602{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001603 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001604}
1605
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001606static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001607long_or(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001608{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001609 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001610}
1611
Guido van Rossum234f9421993-06-17 12:35:49 +00001612static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001613long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001614{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001615 if (PyInt_Check(*pw)) {
1616 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1617 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001618 return 0;
1619 }
1620 return 1; /* Can't do it */
1621}
1622
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001623static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001624long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001625{
1626 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001627 x = PyLong_AsLong(v);
1628 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001629 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001630 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001631}
1632
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001633static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001634long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001635{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001636 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001637 return v;
1638}
1639
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001640static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001641long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001642{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001643 double result;
1644 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001645 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001646 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001647 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001648}
1649
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001650static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001651long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001652{
Fred Drake121ee271999-12-23 15:41:28 +00001653 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001654}
1655
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001656static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001657long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001658{
Fred Drake121ee271999-12-23 15:41:28 +00001659 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001660}
1661
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001662static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00001663 (binaryfunc) long_add, /*nb_add*/
1664 (binaryfunc) long_sub, /*nb_subtract*/
1665 (binaryfunc) long_mul, /*nb_multiply*/
1666 (binaryfunc) long_div, /*nb_divide*/
1667 (binaryfunc) long_mod, /*nb_remainder*/
1668 (binaryfunc) long_divmod, /*nb_divmod*/
1669 (ternaryfunc) long_pow, /*nb_power*/
1670 (unaryfunc) long_neg, /*nb_negative*/
1671 (unaryfunc) long_pos, /*tp_positive*/
1672 (unaryfunc) long_abs, /*tp_absolute*/
1673 (inquiry) long_nonzero, /*tp_nonzero*/
1674 (unaryfunc) long_invert, /*nb_invert*/
1675 (binaryfunc) long_lshift, /*nb_lshift*/
1676 (binaryfunc) long_rshift, /*nb_rshift*/
1677 (binaryfunc) long_and, /*nb_and*/
1678 (binaryfunc) long_xor, /*nb_xor*/
1679 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001680 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001681 (unaryfunc) long_int, /*nb_int*/
1682 (unaryfunc) long_long, /*nb_long*/
1683 (unaryfunc) long_float, /*nb_float*/
1684 (unaryfunc) long_oct, /*nb_oct*/
1685 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001686};
1687
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001688PyTypeObject PyLong_Type = {
1689 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001690 0,
1691 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001692 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001693 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00001694 (destructor)long_dealloc, /*tp_dealloc*/
1695 0, /*tp_print*/
1696 0, /*tp_getattr*/
1697 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001698 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001699 (reprfunc)long_repr, /*tp_repr*/
1700 &long_as_number, /*tp_as_number*/
1701 0, /*tp_as_sequence*/
1702 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001703 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001704 0, /*tp_call*/
1705 (reprfunc)long_str, /*tp_str*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001706};