blob: a28dbaf34d7f8c8255ab17029b386bc932c24333 [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;
Tim Peters43f04a32000-07-08 02:26:47 +00001051 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001052 }
1053 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001054 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001055 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001056 return long_normalize(z);
1057}
1058
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001060long_add(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001061{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001062 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001063
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001064 if (a->ob_size < 0) {
1065 if (b->ob_size < 0) {
1066 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001067 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001068 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001069 }
1070 else
1071 z = x_sub(b, a);
1072 }
1073 else {
1074 if (b->ob_size < 0)
1075 z = x_sub(a, b);
1076 else
1077 z = x_add(a, b);
1078 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001080}
1081
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001082static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001083long_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001084{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001086
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001087 if (a->ob_size < 0) {
1088 if (b->ob_size < 0)
1089 z = x_sub(a, b);
1090 else
1091 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001092 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001093 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001094 }
1095 else {
1096 if (b->ob_size < 0)
1097 z = x_add(a, b);
1098 else
1099 z = x_sub(a, b);
1100 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001102}
1103
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001104static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001105long_mul(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001106{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001107 int size_a;
1108 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001109 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001110 int i;
1111
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001112 size_a = ABS(a->ob_size);
1113 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001114 if (size_a > size_b) {
1115 /* we are faster with the small object on the left */
1116 int hold_sa = size_a;
1117 PyLongObject *hold_a = a;
1118 size_a = size_b;
1119 size_b = hold_sa;
1120 a = b;
1121 b = hold_a;
1122 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001123 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001124 if (z == NULL)
1125 return NULL;
1126 for (i = 0; i < z->ob_size; ++i)
1127 z->ob_digit[i] = 0;
1128 for (i = 0; i < size_a; ++i) {
1129 twodigits carry = 0;
1130 twodigits f = a->ob_digit[i];
1131 int j;
1132
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001133 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001134 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001135 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001136 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001137 for (j = 0; j < size_b; ++j) {
1138 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001139 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001140 carry >>= SHIFT;
1141 }
1142 for (; carry != 0; ++j) {
1143 assert(i+j < z->ob_size);
1144 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001145 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001146 carry >>= SHIFT;
1147 }
1148 }
1149 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001150 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001151 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001152 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001153 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001154}
1155
Guido van Rossume32e0141992-01-19 16:31:05 +00001156/* The / and % operators are now defined in terms of divmod().
1157 The expression a mod b has the value a - b*floor(a/b).
1158 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001159 |a| by |b|, with the sign of a. This is also expressed
1160 as a - b*trunc(a/b), if trunc truncates towards zero.
1161 Some examples:
1162 a b a rem b a mod b
1163 13 10 3 3
1164 -13 10 -3 7
1165 13 -10 3 -7
1166 -13 -10 -3 -3
1167 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001168 have different signs. We then subtract one from the 'div'
1169 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001170
Guido van Rossume32e0141992-01-19 16:31:05 +00001171static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001172l_divmod(PyLongObject *v, PyLongObject *w,
1173 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001174{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001175 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001176
1177 if (long_divrem(v, w, &div, &mod) < 0)
1178 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001179 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1180 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001181 PyLongObject *temp;
1182 PyLongObject *one;
1183 temp = (PyLongObject *) long_add(mod, w);
1184 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001185 mod = temp;
1186 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001188 return -1;
1189 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001191 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001192 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1193 Py_DECREF(mod);
1194 Py_DECREF(div);
1195 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001196 return -1;
1197 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001198 Py_DECREF(one);
1199 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001200 div = temp;
1201 }
1202 *pdiv = div;
1203 *pmod = mod;
1204 return 0;
1205}
1206
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001207static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001208long_div(PyLongObject *v, PyLongObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001209{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001211 if (l_divmod(v, w, &div, &mod) < 0)
1212 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001213 Py_DECREF(mod);
1214 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001215}
1216
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001217static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001218long_mod(PyLongObject *v, PyLongObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001219{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001221 if (l_divmod(v, w, &div, &mod) < 0)
1222 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001223 Py_DECREF(div);
1224 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001225}
1226
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001227static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001228long_divmod(PyLongObject *v, PyLongObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001229{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230 PyObject *z;
1231 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001232 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001233 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001234 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001235 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236 PyTuple_SetItem(z, 0, (PyObject *) div);
1237 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001238 }
1239 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001240 Py_DECREF(div);
1241 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001242 }
1243 return z;
1244}
1245
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001246static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001247long_pow(PyLongObject *a, PyLongObject *b, PyLongObject *c)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001248{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001249 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001250 int size_b, i;
1251
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001252 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001253 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254 PyErr_SetString(PyExc_ValueError,
1255 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001256 return NULL;
1257 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001258 z = (PyLongObject *)PyLong_FromLong(1L);
1259 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001260 for (i = 0; i < size_b; ++i) {
1261 digit bi = b->ob_digit[i];
1262 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001263
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001264 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001265 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001266
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001267 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001268 temp = (PyLongObject *)long_mul(z, a);
1269 Py_DECREF(z);
1270 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001271 if (l_divmod(temp,c,&div,&mod) < 0) {
1272 Py_DECREF(temp);
1273 z = NULL;
1274 goto error;
1275 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001276 Py_XDECREF(div);
1277 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001278 temp = mod;
1279 }
1280 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001281 if (z == NULL)
1282 break;
1283 }
1284 bi >>= 1;
1285 if (bi == 0 && i+1 == size_b)
1286 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001287 temp = (PyLongObject *)long_mul(a, a);
1288 Py_DECREF(a);
1289 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001290 if (l_divmod(temp, c, &div, &mod) < 0) {
1291 Py_DECREF(temp);
1292 z = NULL;
1293 goto error;
1294 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001295 Py_XDECREF(div);
1296 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001297 temp = mod;
1298 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001299 a = temp;
1300 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001301 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001302 z = NULL;
1303 break;
1304 }
1305 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001306 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001307 break;
1308 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001309 Py_XDECREF(a);
1310 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001311 if (l_divmod(z, c, &div, &mod) < 0) {
1312 Py_DECREF(z);
1313 z = NULL;
1314 }
1315 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001316 Py_XDECREF(div);
1317 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001318 z = mod;
1319 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001320 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001321 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001322 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001323}
1324
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001326long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001327{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001328 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001329 PyLongObject *x;
1330 PyLongObject *w;
1331 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001332 if (w == NULL)
1333 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334 x = (PyLongObject *) long_add(v, w);
1335 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001336 if (x == NULL)
1337 return NULL;
1338 if (x->ob_size != 0)
1339 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001341}
1342
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001343static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001344long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001345{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346 Py_INCREF(v);
1347 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001348}
1349
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001351long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001352{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001354 int i, n;
1355 n = ABS(v->ob_size);
1356 if (n == 0) {
1357 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358 Py_INCREF(v);
1359 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001360 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001362 if (z == NULL)
1363 return NULL;
1364 for (i = 0; i < n; i++)
1365 z->ob_digit[i] = v->ob_digit[i];
1366 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001368}
1369
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001370static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001371long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001372{
1373 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001374 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001375 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001376 Py_INCREF(v);
1377 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001378 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001379}
1380
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001381static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001382long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001383{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001384 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001385}
1386
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001388long_rshift(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001389{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001390 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001391 long shiftby;
1392 int newsize, wordshift, loshift, hishift, i, j;
1393 digit lomask, himask;
1394
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001395 if (a->ob_size < 0) {
1396 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001397 PyLongObject *a1, *a2, *a3;
1398 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001399 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400 a2 = (PyLongObject *) long_rshift(a1, b);
1401 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001402 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001403 a3 = (PyLongObject *) long_invert(a2);
1404 Py_DECREF(a2);
1405 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001406 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001407
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001408 shiftby = PyLong_AsLong((PyObject *)b);
1409 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001410 return NULL;
1411 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001412 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001413 return NULL;
1414 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001415 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001416 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001417 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418 z = _PyLong_New(0);
1419 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001420 }
1421 loshift = shiftby % SHIFT;
1422 hishift = SHIFT - loshift;
1423 lomask = ((digit)1 << hishift) - 1;
1424 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001425 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001426 if (z == NULL)
1427 return NULL;
1428 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001429 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001430 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1431 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1432 if (i+1 < newsize)
1433 z->ob_digit[i] |=
1434 (a->ob_digit[j+1] << hishift) & himask;
1435 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001436 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001437}
1438
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001439static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001440long_lshift(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001441{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001442 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001444 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001445 int oldsize, newsize, wordshift, remshift, i, j;
1446 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001447
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001448 shiftby = PyLong_AsLong((PyObject *)b);
1449 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001450 return NULL;
1451 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001453 return NULL;
1454 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001455 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001456 PyErr_SetString(PyExc_ValueError,
1457 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001458 return NULL;
1459 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001460 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1461 wordshift = (int)shiftby / SHIFT;
1462 remshift = (int)shiftby - wordshift * SHIFT;
1463
1464 oldsize = ABS(a->ob_size);
1465 newsize = oldsize + wordshift;
1466 if (remshift)
1467 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001468 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001469 if (z == NULL)
1470 return NULL;
1471 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001472 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001473 for (i = 0; i < wordshift; i++)
1474 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001475 accum = 0;
1476 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1477 accum |= a->ob_digit[j] << remshift;
1478 z->ob_digit[i] = (digit)(accum & MASK);
1479 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001480 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001481 if (remshift)
1482 z->ob_digit[newsize-1] = (digit)accum;
1483 else
1484 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001485 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001486}
1487
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001488
1489/* Bitwise and/xor/or operations */
1490
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001491#define MAX(x, y) ((x) < (y) ? (y) : (x))
1492#define MIN(x, y) ((x) > (y) ? (y) : (x))
1493
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001494static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001495long_bitwise(PyLongObject *a,
1496 int op, /* '&', '|', '^' */
1497 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001498{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001499 digit maska, maskb; /* 0 or MASK */
1500 int negz;
1501 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001502 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001503 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001504 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001505 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001506
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001507 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001508 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001509 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001510 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001511 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001512 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001513 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001514 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001515 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001516 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001517 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001518 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001519 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001520 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001521 maskb = 0;
1522 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001523
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001524 negz = 0;
1525 switch (op) {
1526 case '^':
1527 if (maska != maskb) {
1528 maska ^= MASK;
1529 negz = -1;
1530 }
1531 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001532 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001533 if (maska && maskb) {
1534 op = '|';
1535 maska ^= MASK;
1536 maskb ^= MASK;
1537 negz = -1;
1538 }
1539 break;
1540 case '|':
1541 if (maska || maskb) {
1542 op = '&';
1543 maska ^= MASK;
1544 maskb ^= MASK;
1545 negz = -1;
1546 }
1547 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001548 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001549
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001550 /* JRH: The original logic here was to allocate the result value (z)
1551 as the longer of the two operands. However, there are some cases
1552 where the result is guaranteed to be shorter than that: AND of two
1553 positives, OR of two negatives: use the shorter number. AND with
1554 mixed signs: use the positive number. OR with mixed signs: use the
1555 negative number. After the transformations above, op will be '&'
1556 iff one of these cases applies, and mask will be non-0 for operands
1557 whose length should be ignored.
1558 */
1559
1560 size_a = a->ob_size;
1561 size_b = b->ob_size;
1562 size_z = op == '&'
1563 ? (maska
1564 ? size_b
1565 : (maskb ? size_a : MIN(size_a, size_b)))
1566 : MAX(size_a, size_b);
1567 z = _PyLong_New(size_z);
1568 if (a == NULL || b == NULL || z == NULL) {
1569 Py_XDECREF(a);
1570 Py_XDECREF(b);
1571 Py_XDECREF(z);
1572 return NULL;
1573 }
1574
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001575 for (i = 0; i < size_z; ++i) {
1576 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1577 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1578 switch (op) {
1579 case '&': z->ob_digit[i] = diga & digb; break;
1580 case '|': z->ob_digit[i] = diga | digb; break;
1581 case '^': z->ob_digit[i] = diga ^ digb; break;
1582 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001583 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001584
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001585 Py_DECREF(a);
1586 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001587 z = long_normalize(z);
1588 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001589 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001590 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001591 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001592 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001593}
1594
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001595static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001596long_and(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001597{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001598 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001599}
1600
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001601static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001602long_xor(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001603{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001604 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001605}
1606
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001607static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001608long_or(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001609{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001610 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001611}
1612
Guido van Rossum234f9421993-06-17 12:35:49 +00001613static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001614long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001615{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001616 if (PyInt_Check(*pw)) {
1617 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1618 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001619 return 0;
1620 }
1621 return 1; /* Can't do it */
1622}
1623
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001624static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001625long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001626{
1627 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001628 x = PyLong_AsLong(v);
1629 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001630 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001631 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001632}
1633
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001634static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001635long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001636{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001637 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001638 return v;
1639}
1640
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001641static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001642long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001643{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001644 double result;
1645 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001646 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001647 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001648 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001649}
1650
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001651static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001652long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001653{
Fred Drake121ee271999-12-23 15:41:28 +00001654 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001655}
1656
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001657static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001658long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001659{
Fred Drake121ee271999-12-23 15:41:28 +00001660 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001661}
1662
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001663static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00001664 (binaryfunc) long_add, /*nb_add*/
1665 (binaryfunc) long_sub, /*nb_subtract*/
1666 (binaryfunc) long_mul, /*nb_multiply*/
1667 (binaryfunc) long_div, /*nb_divide*/
1668 (binaryfunc) long_mod, /*nb_remainder*/
1669 (binaryfunc) long_divmod, /*nb_divmod*/
1670 (ternaryfunc) long_pow, /*nb_power*/
1671 (unaryfunc) long_neg, /*nb_negative*/
1672 (unaryfunc) long_pos, /*tp_positive*/
1673 (unaryfunc) long_abs, /*tp_absolute*/
1674 (inquiry) long_nonzero, /*tp_nonzero*/
1675 (unaryfunc) long_invert, /*nb_invert*/
1676 (binaryfunc) long_lshift, /*nb_lshift*/
1677 (binaryfunc) long_rshift, /*nb_rshift*/
1678 (binaryfunc) long_and, /*nb_and*/
1679 (binaryfunc) long_xor, /*nb_xor*/
1680 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001681 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001682 (unaryfunc) long_int, /*nb_int*/
1683 (unaryfunc) long_long, /*nb_long*/
1684 (unaryfunc) long_float, /*nb_float*/
1685 (unaryfunc) long_oct, /*nb_oct*/
1686 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001687};
1688
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001689PyTypeObject PyLong_Type = {
1690 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001691 0,
1692 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001693 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001694 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00001695 (destructor)long_dealloc, /*tp_dealloc*/
1696 0, /*tp_print*/
1697 0, /*tp_getattr*/
1698 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001699 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001700 (reprfunc)long_repr, /*tp_repr*/
1701 &long_as_number, /*tp_as_number*/
1702 0, /*tp_as_sequence*/
1703 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001704 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001705 0, /*tp_call*/
1706 (reprfunc)long_str, /*tp_str*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001707};