blob: 37da2447991b09b17b5b9a94c74fddfcf0591639 [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 Rossumc0b618a1997-05-02 03:12:38 +000017
Guido van Rossumedcc38a1991-05-05 20:09:44 +000018#include <assert.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000019#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000020
Guido van Rossume32e0141992-01-19 16:31:05 +000021#define ABS(x) ((x) < 0 ? -(x) : (x))
22
23/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000024static PyLongObject *long_normalize(PyLongObject *);
25static PyLongObject *mul1(PyLongObject *, wdigit);
26static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
27static PyLongObject *divrem1(PyLongObject *, wdigit, digit *);
28static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000029
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000030static int ticker; /* XXX Could be shared with ceval? */
31
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000033 if (--ticker < 0) { \
34 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000035 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000036 }
37
Guido van Rossumedcc38a1991-05-05 20:09:44 +000038/* Normalize (remove leading zeros from) a long int object.
39 Doesn't attempt to free the storage--in most cases, due to the nature
40 of the algorithms used, this could save at most be one word anyway. */
41
Guido van Rossumc0b618a1997-05-02 03:12:38 +000042static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000043long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000044{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000045 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000046 register int i = j;
47
48 while (i > 0 && v->ob_digit[i-1] == 0)
49 --i;
50 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000051 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000052 return v;
53}
54
55/* Allocate a new long int object with size digits.
56 Return NULL and set exception if we run out of memory. */
57
Guido van Rossumc0b618a1997-05-02 03:12:38 +000058PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000059_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000060{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000061 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000062}
63
64/* Create a new long int object from a C long int */
65
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000067PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000068{
Guido van Rossum472c04f1996-12-05 21:57:21 +000069 /* Assume a C long fits in at most 5 'digits' */
70 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000071 PyLongObject *v = _PyLong_New(5);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000072 if (v != NULL) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000073 unsigned long t = ival;
74 int i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000075 if (ival < 0) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000076 t = -ival;
Guido van Rossum4c260ff1992-01-14 18:36:43 +000077 v->ob_size = -(v->ob_size);
Guido van Rossum472c04f1996-12-05 21:57:21 +000078 }
79 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +000080 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000081 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000082 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000083 v = long_normalize(v);
84 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086}
87
Guido van Rossum53756b11997-01-03 17:14:46 +000088/* Create a new long int object from a C unsigned long int */
89
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000091PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +000092{
93 /* Assume a C long fits in at most 5 'digits' */
94 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 PyLongObject *v = _PyLong_New(5);
Guido van Rossum53756b11997-01-03 17:14:46 +000096 if (v != NULL) {
97 unsigned long t = ival;
98 int i;
99 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000100 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum53756b11997-01-03 17:14:46 +0000101 t >>= SHIFT;
102 }
103 v = long_normalize(v);
104 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000106}
107
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000108/* Create a new long int object from a C double */
109
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000112{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000114 double frac;
115 int i, ndig, expo, neg;
116 neg = 0;
Guido van Rossum1a23c241999-09-27 17:11:52 +0000117 if (dval && dval * 0.5 == dval) {
118 PyErr_SetString(PyExc_OverflowError,
119 "cannot convert float infinity to long");
120 return NULL;
121 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000122 if (dval < 0.0) {
123 neg = 1;
124 dval = -dval;
125 }
126 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
127 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000128 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000129 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000131 if (v == NULL)
132 return NULL;
133 frac = ldexp(frac, (expo-1) % SHIFT + 1);
134 for (i = ndig; --i >= 0; ) {
135 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000136 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000137 frac = frac - (double)bits;
138 frac = ldexp(frac, SHIFT);
139 }
140 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000141 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000143}
144
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000145/* Get a C long int from a long int object.
146 Returns -1 and sets an error condition if overflow occurs. */
147
148long
Tim Peters9f688bf2000-07-07 15:53:28 +0000149PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000150{
Guido van Rossumf7531811998-05-26 14:33:37 +0000151 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000153 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000154 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000155
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 if (vv == NULL || !PyLong_Check(vv)) {
157 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000158 return -1;
159 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000161 i = v->ob_size;
162 sign = 1;
163 x = 0;
164 if (i < 0) {
165 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000166 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000167 }
168 while (--i >= 0) {
169 prev = x;
170 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000171 if ((x >> SHIFT) != prev)
172 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000173 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000174 /* Haven't lost any bits, but if the sign bit is set we're in
175 * trouble *unless* this is the min negative number. So,
176 * trouble iff sign bit set && (positive || some bit set other
177 * than the sign bit).
178 */
179 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
180 goto overflow;
181 return (long)x * sign;
182
183 overflow:
184 PyErr_SetString(PyExc_OverflowError,
185 "long int too long to convert");
186 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000187}
188
Guido van Rossum53756b11997-01-03 17:14:46 +0000189/* Get a C long int from a long int object.
190 Returns -1 and sets an error condition if overflow occurs. */
191
192unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000193PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000194{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000196 unsigned long x, prev;
197 int i;
198
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000199 if (vv == NULL || !PyLong_Check(vv)) {
200 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000201 return (unsigned long) -1;
202 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000204 i = v->ob_size;
205 x = 0;
206 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000208 "can't convert negative value to unsigned long");
209 return (unsigned long) -1;
210 }
211 while (--i >= 0) {
212 prev = x;
213 x = (x << SHIFT) + v->ob_digit[i];
214 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000216 "long int too long to convert");
217 return (unsigned long) -1;
218 }
219 }
220 return x;
221}
222
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000223/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000224
225double
Tim Peters9f688bf2000-07-07 15:53:28 +0000226PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000227{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000229 double x;
230 double multiplier = (double) (1L << SHIFT);
231 int i, sign;
232
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 if (vv == NULL || !PyLong_Check(vv)) {
234 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000235 return -1;
236 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000238 i = v->ob_size;
239 sign = 1;
240 x = 0.0;
241 if (i < 0) {
242 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000243 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000244 }
245 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000246 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000247 }
248 return x * sign;
249}
250
Guido van Rossum78694d91998-09-18 14:14:13 +0000251/* Create a new long (or int) object from a C pointer */
252
253PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000254PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000255{
256#if SIZEOF_VOID_P == SIZEOF_LONG
257 return PyInt_FromLong((long)p);
258#else
259 /* optimize null pointers */
260 if ( p == NULL )
261 return PyInt_FromLong(0);
262
263 /* we can assume that HAVE_LONG_LONG is true. if not, then the
264 configuration process should have bailed (having big pointers
265 without long longs seems non-sensical) */
266 return PyLong_FromLongLong((LONG_LONG)p);
267#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
268}
269
270/* Get a C pointer from a long object (or an int object in some cases) */
271
272void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000273PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000274{
275 /* This function will allow int or long objects. If vv is neither,
276 then the PyLong_AsLong*() functions will raise the exception:
277 PyExc_SystemError, "bad argument to internal function"
278 */
279
280#if SIZEOF_VOID_P == SIZEOF_LONG
281 long x;
282
283 if ( PyInt_Check(vv) )
284 x = PyInt_AS_LONG(vv);
285 else
286 x = PyLong_AsLong(vv);
287#else
288 /* we can assume that HAVE_LONG_LONG is true. if not, then the
289 configuration process should have bailed (having big pointers
290 without long longs seems non-sensical) */
291 LONG_LONG x;
292
293 if ( PyInt_Check(vv) )
294 x = PyInt_AS_LONG(vv);
295 else
296 x = PyLong_AsLongLong(vv);
297#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
298
299 if (x == -1 && PyErr_Occurred())
300 return NULL;
301 return (void *)x;
302}
303
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000304#ifdef HAVE_LONG_LONG
305/*
Guido van Rossum3293b071998-08-25 16:07:15 +0000306 * LONG_LONG support by Chris Herborth (chrish@qnx.com)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000307 *
308 * For better or worse :-), I tried to follow the coding style already
309 * here.
310 */
311
Guido van Rossum3293b071998-08-25 16:07:15 +0000312/* Create a new long int object from a C LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000313
314PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000315PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000316{
317#if SIZEOF_LONG_LONG == SIZEOF_LONG
318 /* In case the compiler is faking it. */
319 return PyLong_FromLong( (long)ival );
320#else
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000321 if ((LONG_LONG)LONG_MIN <= ival && ival <= (LONG_LONG)LONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000322 return PyLong_FromLong( (long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000323 }
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000324 else if (0 <= ival && ival <= (unsigned LONG_LONG)ULONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000325 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000326 }
327 else {
Guido van Rossum3293b071998-08-25 16:07:15 +0000328 /* Assume a C LONG_LONG fits in at most 10 'digits'.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000329 * Should be OK if we're assuming long fits in 5.
330 */
331 PyLongObject *v = _PyLong_New(10);
332
333 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000334 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000335 int i;
336 if (ival < 0) {
337 t = -ival;
338 v->ob_size = -(v->ob_size);
339 }
340
341 for (i = 0; i < 10; i++) {
342 v->ob_digit[i] = (digit) (t & MASK);
343 t >>= SHIFT;
344 }
345
346 v = long_normalize(v);
347 }
348
349 return (PyObject *)v;
350 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000351#endif
352}
353
Guido van Rossum3293b071998-08-25 16:07:15 +0000354/* Create a new long int object from a C unsigned LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000355PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000356PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000357{
358#if SIZEOF_LONG_LONG == SIZEOF_LONG
359 /* In case the compiler is faking it. */
360 return PyLong_FromUnsignedLong( (unsigned long)ival );
361#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000362 if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000363 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000364 }
365 else {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000366 /* Assume a C long fits in at most 10 'digits'. */
367 PyLongObject *v = _PyLong_New(10);
368
369 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000370 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000371 int i;
372 for (i = 0; i < 10; i++) {
373 v->ob_digit[i] = (digit) (t & MASK);
374 t >>= SHIFT;
375 }
376
377 v = long_normalize(v);
378 }
379
380 return (PyObject *)v;
381 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000382#endif
383}
384
Guido van Rossum3293b071998-08-25 16:07:15 +0000385/* Get a C LONG_LONG int from a long int object.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000386 Returns -1 and sets an error condition if overflow occurs. */
387
Guido van Rossum3293b071998-08-25 16:07:15 +0000388LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000389PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000390{
391#if SIZEOF_LONG_LONG == SIZEOF_LONG
392 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000393 return (LONG_LONG)PyLong_AsLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000394#else
395 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000396 LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000397 int i, sign;
398
399 if (vv == NULL || !PyLong_Check(vv)) {
400 PyErr_BadInternalCall();
401 return -1;
402 }
403
404 v = (PyLongObject *)vv;
405 i = v->ob_size;
406 sign = 1;
407 x = 0;
408
409 if (i < 0) {
410 sign = -1;
411 i = -(i);
412 }
413
414 while (--i >= 0) {
415 prev = x;
416 x = (x << SHIFT) + v->ob_digit[i];
417 if ((x >> SHIFT) != prev) {
418 PyErr_SetString(PyExc_OverflowError,
419 "long int too long to convert");
420 return -1;
421 }
422 }
423
424 return x * sign;
425#endif
426}
427
Guido van Rossum3293b071998-08-25 16:07:15 +0000428unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000429PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000430{
431#if SIZEOF_LONG_LONG == 4
432 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000433 return (unsigned LONG_LONG)PyLong_AsUnsignedLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000434#else
435 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000436 unsigned LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000437 int i;
438
439 if (vv == NULL || !PyLong_Check(vv)) {
440 PyErr_BadInternalCall();
Guido van Rossum3293b071998-08-25 16:07:15 +0000441 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000442 }
443
444 v = (PyLongObject *)vv;
445 i = v->ob_size;
446 x = 0;
447
448 if (i < 0) {
449 PyErr_SetString(PyExc_OverflowError,
450 "can't convert negative value to unsigned long");
Guido van Rossum3293b071998-08-25 16:07:15 +0000451 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000452 }
453
454 while (--i >= 0) {
455 prev = x;
456 x = (x << SHIFT) + v->ob_digit[i];
457 if ((x >> SHIFT) != prev) {
458 PyErr_SetString(PyExc_OverflowError,
459 "long int too long to convert");
Guido van Rossum3293b071998-08-25 16:07:15 +0000460 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000461 }
462 }
463
464 return x;
465#endif
466}
467#endif /* HAVE_LONG_LONG */
468
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000469/* Multiply by a single digit, ignoring the sign. */
470
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000471static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000472mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000473{
474 return muladd1(a, n, (digit)0);
475}
476
477/* Multiply by a single digit and add a single digit, ignoring the sign. */
478
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000479static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000480muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000481{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000482 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000484 twodigits carry = extra;
485 int i;
486
487 if (z == NULL)
488 return NULL;
489 for (i = 0; i < size_a; ++i) {
490 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000491 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000492 carry >>= SHIFT;
493 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000494 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000495 return long_normalize(z);
496}
497
498/* Divide a long integer by a digit, returning both the quotient
499 (as function result) and the remainder (through *prem).
500 The sign of a is ignored; n should not be zero. */
501
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000503divrem1(PyLongObject *a, wdigit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000504{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000505 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000507 int i;
508 twodigits rem = 0;
509
510 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000512 if (z == NULL)
513 return NULL;
514 for (i = size; --i >= 0; ) {
515 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000516 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000517 rem %= n;
518 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000519 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000520 return long_normalize(z);
521}
522
523/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000524 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000525 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000526
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000528long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000529{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 register PyLongObject *a = (PyLongObject *)aa;
531 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000532 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000533 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000534 char *p;
535 int bits;
536 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000537
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538 if (a == NULL || !PyLong_Check(a)) {
539 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000540 return NULL;
541 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000542 assert(base >= 2 && base <= 36);
543
544 /* Compute a rough upper bound for the length of the string */
545 i = base;
546 bits = 0;
547 while (i > 1) {
548 ++bits;
549 i >>= 1;
550 }
Fred Drake121ee271999-12-23 15:41:28 +0000551 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000552 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000553 if (str == NULL)
554 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000556 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000557 if (addL)
558 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000559 if (a->ob_size < 0)
560 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000561
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000562 if (a->ob_size == 0) {
563 *--p = '0';
564 }
565 else if ((base & (base - 1)) == 0) {
566 /* JRH: special case for power-of-2 bases */
567 twodigits temp = a->ob_digit[0];
568 int bitsleft = SHIFT;
569 int rem;
570 int last = abs(a->ob_size);
571 int basebits = 1;
572 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000573 while ((i >>= 1) > 1)
574 ++basebits;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000575
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;
Tim Peters7d3a5112000-07-08 04:17:21 +0000856 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
857 carry, SHIFT);
858 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000859 }
860
861 if (i+k < size_v) {
862 carry += v->ob_digit[i+k];
863 v->ob_digit[i+k] = 0;
864 }
865
866 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000867 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000868 else {
869 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000870 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000871 carry = 0;
872 for (i = 0; i < size_w && i+k < size_v; ++i) {
873 carry += v->ob_digit[i+k] + w->ob_digit[i];
874 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +0000875 carry = Py_ARITHMETIC_RIGHT_SHIFT(
876 BASE_TWODIGITS_TYPE,
877 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000878 }
879 }
880 } /* for j, k */
881
Guido van Rossumc206c761995-01-10 15:23:19 +0000882 if (a == NULL)
883 *prem = NULL;
884 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000885 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000886 *prem = divrem1(v, d, &d);
887 /* d receives the (unused) remainder */
888 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000889 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000890 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000891 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000892 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 Py_DECREF(v);
894 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000895 return a;
896}
897
898/* Methods */
899
900static void
Tim Peters9f688bf2000-07-07 15:53:28 +0000901long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000902{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000903 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000904}
905
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000906static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000907long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000908{
Fred Drake121ee271999-12-23 15:41:28 +0000909 return long_format(v, 10, 1);
910}
911
912static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000913long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +0000914{
915 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000916}
917
918static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000919long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000920{
921 int sign;
922
Guido van Rossumc6913e71991-11-19 20:26:46 +0000923 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000924 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +0000925 sign = 0;
926 else
927 sign = a->ob_size - b->ob_size;
928 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000929 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000930 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000931 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
932 ;
933 if (i < 0)
934 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000935 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000936 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000937 if (a->ob_size < 0)
938 sign = -sign;
939 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000940 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000941 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000942}
943
Guido van Rossum9bfef441993-03-29 10:43:31 +0000944static long
Tim Peters9f688bf2000-07-07 15:53:28 +0000945long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000946{
947 long x;
948 int i, sign;
949
950 /* This is designed so that Python ints and longs with the
951 same value hash to the same value, otherwise comparisons
952 of mapping keys will turn out weird */
953 i = v->ob_size;
954 sign = 1;
955 x = 0;
956 if (i < 0) {
957 sign = -1;
958 i = -(i);
959 }
960 while (--i >= 0) {
961 /* Force a 32-bit circular shift */
962 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
963 x += v->ob_digit[i];
964 }
965 x = x * sign;
966 if (x == -1)
967 x = -2;
968 return x;
969}
970
971
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000972/* Add the absolute values of two long integers. */
973
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000975x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000976{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000977 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000979 int i;
980 digit carry = 0;
981
982 /* Ensure a is the larger of the two: */
983 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000984 { PyLongObject *temp = a; a = b; b = temp; }
985 { int size_temp = size_a;
986 size_a = size_b;
987 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000988 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000990 if (z == NULL)
991 return NULL;
992 for (i = 0; i < size_b; ++i) {
993 carry += a->ob_digit[i] + b->ob_digit[i];
994 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000995 carry >>= SHIFT;
996 }
997 for (; i < size_a; ++i) {
998 carry += a->ob_digit[i];
999 z->ob_digit[i] = carry & MASK;
1000 carry >>= SHIFT;
1001 }
1002 z->ob_digit[i] = carry;
1003 return long_normalize(z);
1004}
1005
1006/* Subtract the absolute values of two integers. */
1007
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001008static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001009x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001010{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001011 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001012 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001013 int i;
1014 int sign = 1;
1015 digit borrow = 0;
1016
1017 /* Ensure a is the larger of the two: */
1018 if (size_a < size_b) {
1019 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 { PyLongObject *temp = a; a = b; b = temp; }
1021 { int size_temp = size_a;
1022 size_a = size_b;
1023 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001024 }
1025 else if (size_a == size_b) {
1026 /* Find highest digit where a and b differ: */
1027 i = size_a;
1028 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1029 ;
1030 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001031 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001032 if (a->ob_digit[i] < b->ob_digit[i]) {
1033 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001035 }
1036 size_a = size_b = i+1;
1037 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001039 if (z == NULL)
1040 return NULL;
1041 for (i = 0; i < size_b; ++i) {
1042 /* The following assumes unsigned arithmetic
1043 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001044 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001045 z->ob_digit[i] = borrow & MASK;
1046 borrow >>= SHIFT;
1047 borrow &= 1; /* Keep only one sign bit */
1048 }
1049 for (; i < size_a; ++i) {
1050 borrow = a->ob_digit[i] - borrow;
1051 z->ob_digit[i] = borrow & MASK;
1052 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001053 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001054 }
1055 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001056 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001057 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001058 return long_normalize(z);
1059}
1060
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001061static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001062long_add(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001063{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001064 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001065
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001066 if (a->ob_size < 0) {
1067 if (b->ob_size < 0) {
1068 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001069 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001070 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001071 }
1072 else
1073 z = x_sub(b, a);
1074 }
1075 else {
1076 if (b->ob_size < 0)
1077 z = x_sub(a, b);
1078 else
1079 z = x_add(a, b);
1080 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001082}
1083
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001084static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001085long_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001086{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001087 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001088
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001089 if (a->ob_size < 0) {
1090 if (b->ob_size < 0)
1091 z = x_sub(a, b);
1092 else
1093 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001094 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001095 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001096 }
1097 else {
1098 if (b->ob_size < 0)
1099 z = x_add(a, b);
1100 else
1101 z = x_sub(a, b);
1102 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001103 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001104}
1105
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001106static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001107long_mul(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001108{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001109 int size_a;
1110 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001111 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001112 int i;
1113
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001114 size_a = ABS(a->ob_size);
1115 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001116 if (size_a > size_b) {
1117 /* we are faster with the small object on the left */
1118 int hold_sa = size_a;
1119 PyLongObject *hold_a = a;
1120 size_a = size_b;
1121 size_b = hold_sa;
1122 a = b;
1123 b = hold_a;
1124 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001125 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001126 if (z == NULL)
1127 return NULL;
1128 for (i = 0; i < z->ob_size; ++i)
1129 z->ob_digit[i] = 0;
1130 for (i = 0; i < size_a; ++i) {
1131 twodigits carry = 0;
1132 twodigits f = a->ob_digit[i];
1133 int j;
1134
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001135 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001136 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001137 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001138 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001139 for (j = 0; j < size_b; ++j) {
1140 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001141 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001142 carry >>= SHIFT;
1143 }
1144 for (; carry != 0; ++j) {
1145 assert(i+j < z->ob_size);
1146 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001147 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001148 carry >>= SHIFT;
1149 }
1150 }
1151 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001152 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001153 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001154 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001155 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001156}
1157
Guido van Rossume32e0141992-01-19 16:31:05 +00001158/* The / and % operators are now defined in terms of divmod().
1159 The expression a mod b has the value a - b*floor(a/b).
1160 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001161 |a| by |b|, with the sign of a. This is also expressed
1162 as a - b*trunc(a/b), if trunc truncates towards zero.
1163 Some examples:
1164 a b a rem b a mod b
1165 13 10 3 3
1166 -13 10 -3 7
1167 13 -10 3 -7
1168 -13 -10 -3 -3
1169 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001170 have different signs. We then subtract one from the 'div'
1171 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001172
Guido van Rossume32e0141992-01-19 16:31:05 +00001173static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001174l_divmod(PyLongObject *v, PyLongObject *w,
1175 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001176{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001177 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001178
1179 if (long_divrem(v, w, &div, &mod) < 0)
1180 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001181 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1182 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001183 PyLongObject *temp;
1184 PyLongObject *one;
1185 temp = (PyLongObject *) long_add(mod, w);
1186 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001187 mod = temp;
1188 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001189 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001190 return -1;
1191 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001192 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001193 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001194 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1195 Py_DECREF(mod);
1196 Py_DECREF(div);
1197 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001198 return -1;
1199 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001200 Py_DECREF(one);
1201 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001202 div = temp;
1203 }
1204 *pdiv = div;
1205 *pmod = mod;
1206 return 0;
1207}
1208
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001209static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001210long_div(PyLongObject *v, PyLongObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001211{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001213 if (l_divmod(v, w, &div, &mod) < 0)
1214 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215 Py_DECREF(mod);
1216 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001217}
1218
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001220long_mod(PyLongObject *v, PyLongObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001221{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001222 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001223 if (l_divmod(v, w, &div, &mod) < 0)
1224 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001225 Py_DECREF(div);
1226 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001227}
1228
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001229static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001230long_divmod(PyLongObject *v, PyLongObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001231{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001232 PyObject *z;
1233 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001234 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001235 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001237 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001238 PyTuple_SetItem(z, 0, (PyObject *) div);
1239 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001240 }
1241 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242 Py_DECREF(div);
1243 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001244 }
1245 return z;
1246}
1247
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001249long_pow(PyLongObject *a, PyLongObject *b, PyLongObject *c)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001250{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001252 int size_b, i;
1253
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001254 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001255 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256 PyErr_SetString(PyExc_ValueError,
1257 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001258 return NULL;
1259 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001260 z = (PyLongObject *)PyLong_FromLong(1L);
1261 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001262 for (i = 0; i < size_b; ++i) {
1263 digit bi = b->ob_digit[i];
1264 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001265
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001266 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001267 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001268
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001269 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001270 temp = (PyLongObject *)long_mul(z, a);
1271 Py_DECREF(z);
1272 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001273 if (l_divmod(temp,c,&div,&mod) < 0) {
1274 Py_DECREF(temp);
1275 z = NULL;
1276 goto error;
1277 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001278 Py_XDECREF(div);
1279 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001280 temp = mod;
1281 }
1282 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001283 if (z == NULL)
1284 break;
1285 }
1286 bi >>= 1;
1287 if (bi == 0 && i+1 == size_b)
1288 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001289 temp = (PyLongObject *)long_mul(a, a);
1290 Py_DECREF(a);
1291 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001292 if (l_divmod(temp, c, &div, &mod) < 0) {
1293 Py_DECREF(temp);
1294 z = NULL;
1295 goto error;
1296 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001297 Py_XDECREF(div);
1298 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001299 temp = mod;
1300 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001301 a = temp;
1302 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001304 z = NULL;
1305 break;
1306 }
1307 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001308 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001309 break;
1310 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311 Py_XDECREF(a);
1312 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001313 if (l_divmod(z, c, &div, &mod) < 0) {
1314 Py_DECREF(z);
1315 z = NULL;
1316 }
1317 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001318 Py_XDECREF(div);
1319 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001320 z = mod;
1321 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001322 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001323 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001324 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001325}
1326
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001328long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001329{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001330 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 PyLongObject *x;
1332 PyLongObject *w;
1333 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001334 if (w == NULL)
1335 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336 x = (PyLongObject *) long_add(v, w);
1337 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001338 if (x == NULL)
1339 return NULL;
1340 if (x->ob_size != 0)
1341 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001343}
1344
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001346long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001347{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348 Py_INCREF(v);
1349 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001350}
1351
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001352static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001353long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001354{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001355 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001356 int i, n;
1357 n = ABS(v->ob_size);
1358 if (n == 0) {
1359 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 Py_INCREF(v);
1361 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001362 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001364 if (z == NULL)
1365 return NULL;
1366 for (i = 0; i < n; i++)
1367 z->ob_digit[i] = v->ob_digit[i];
1368 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001370}
1371
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001372static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001373long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001374{
1375 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001376 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001377 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001378 Py_INCREF(v);
1379 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001380 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001381}
1382
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001383static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001384long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001385{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001386 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001387}
1388
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001390long_rshift(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001391{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001392 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001393 long shiftby;
1394 int newsize, wordshift, loshift, hishift, i, j;
1395 digit lomask, himask;
1396
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001397 if (a->ob_size < 0) {
1398 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001399 PyLongObject *a1, *a2, *a3;
1400 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001401 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001402 a2 = (PyLongObject *) long_rshift(a1, b);
1403 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001404 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405 a3 = (PyLongObject *) long_invert(a2);
1406 Py_DECREF(a2);
1407 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001408 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001409
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001410 shiftby = PyLong_AsLong((PyObject *)b);
1411 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001412 return NULL;
1413 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001414 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001415 return NULL;
1416 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001417 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001418 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001419 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001420 z = _PyLong_New(0);
1421 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001422 }
1423 loshift = shiftby % SHIFT;
1424 hishift = SHIFT - loshift;
1425 lomask = ((digit)1 << hishift) - 1;
1426 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001428 if (z == NULL)
1429 return NULL;
1430 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001431 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001432 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1433 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1434 if (i+1 < newsize)
1435 z->ob_digit[i] |=
1436 (a->ob_digit[j+1] << hishift) & himask;
1437 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001439}
1440
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001441static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001442long_lshift(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001443{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001444 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001445 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001446 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001447 int oldsize, newsize, wordshift, remshift, i, j;
1448 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001449
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001450 shiftby = PyLong_AsLong((PyObject *)b);
1451 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001452 return NULL;
1453 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001454 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001455 return NULL;
1456 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001457 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001458 PyErr_SetString(PyExc_ValueError,
1459 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001460 return NULL;
1461 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001462 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1463 wordshift = (int)shiftby / SHIFT;
1464 remshift = (int)shiftby - wordshift * SHIFT;
1465
1466 oldsize = ABS(a->ob_size);
1467 newsize = oldsize + wordshift;
1468 if (remshift)
1469 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001470 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001471 if (z == NULL)
1472 return NULL;
1473 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001474 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001475 for (i = 0; i < wordshift; i++)
1476 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001477 accum = 0;
1478 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1479 accum |= a->ob_digit[j] << remshift;
1480 z->ob_digit[i] = (digit)(accum & MASK);
1481 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001482 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001483 if (remshift)
1484 z->ob_digit[newsize-1] = (digit)accum;
1485 else
1486 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001487 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001488}
1489
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001490
1491/* Bitwise and/xor/or operations */
1492
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001493#define MAX(x, y) ((x) < (y) ? (y) : (x))
1494#define MIN(x, y) ((x) > (y) ? (y) : (x))
1495
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001496static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001497long_bitwise(PyLongObject *a,
1498 int op, /* '&', '|', '^' */
1499 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001500{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001501 digit maska, maskb; /* 0 or MASK */
1502 int negz;
1503 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001504 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001505 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001506 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001507 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001508
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001509 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001510 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001511 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001512 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001513 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001514 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001515 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001516 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001517 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001518 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001519 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001520 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001521 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001522 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001523 maskb = 0;
1524 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001525
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001526 negz = 0;
1527 switch (op) {
1528 case '^':
1529 if (maska != maskb) {
1530 maska ^= MASK;
1531 negz = -1;
1532 }
1533 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001534 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001535 if (maska && maskb) {
1536 op = '|';
1537 maska ^= MASK;
1538 maskb ^= MASK;
1539 negz = -1;
1540 }
1541 break;
1542 case '|':
1543 if (maska || maskb) {
1544 op = '&';
1545 maska ^= MASK;
1546 maskb ^= MASK;
1547 negz = -1;
1548 }
1549 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001550 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001551
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001552 /* JRH: The original logic here was to allocate the result value (z)
1553 as the longer of the two operands. However, there are some cases
1554 where the result is guaranteed to be shorter than that: AND of two
1555 positives, OR of two negatives: use the shorter number. AND with
1556 mixed signs: use the positive number. OR with mixed signs: use the
1557 negative number. After the transformations above, op will be '&'
1558 iff one of these cases applies, and mask will be non-0 for operands
1559 whose length should be ignored.
1560 */
1561
1562 size_a = a->ob_size;
1563 size_b = b->ob_size;
1564 size_z = op == '&'
1565 ? (maska
1566 ? size_b
1567 : (maskb ? size_a : MIN(size_a, size_b)))
1568 : MAX(size_a, size_b);
1569 z = _PyLong_New(size_z);
1570 if (a == NULL || b == NULL || z == NULL) {
1571 Py_XDECREF(a);
1572 Py_XDECREF(b);
1573 Py_XDECREF(z);
1574 return NULL;
1575 }
1576
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001577 for (i = 0; i < size_z; ++i) {
1578 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1579 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1580 switch (op) {
1581 case '&': z->ob_digit[i] = diga & digb; break;
1582 case '|': z->ob_digit[i] = diga | digb; break;
1583 case '^': z->ob_digit[i] = diga ^ digb; break;
1584 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001585 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001586
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001587 Py_DECREF(a);
1588 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001589 z = long_normalize(z);
1590 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001591 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001592 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001593 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001594 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001595}
1596
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001597static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001598long_and(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001599{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001600 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001601}
1602
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001603static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001604long_xor(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001605{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001606 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001607}
1608
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001609static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001610long_or(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001611{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001612 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001613}
1614
Guido van Rossum234f9421993-06-17 12:35:49 +00001615static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001616long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001617{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001618 if (PyInt_Check(*pw)) {
1619 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1620 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001621 return 0;
1622 }
1623 return 1; /* Can't do it */
1624}
1625
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001626static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001627long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001628{
1629 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001630 x = PyLong_AsLong(v);
1631 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001632 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001633 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001634}
1635
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001636static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001637long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001638{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001640 return v;
1641}
1642
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001643static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001644long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001645{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001646 double result;
1647 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001648 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001649 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001650 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001651}
1652
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001653static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001654long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001655{
Fred Drake121ee271999-12-23 15:41:28 +00001656 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001657}
1658
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001659static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001660long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001661{
Fred Drake121ee271999-12-23 15:41:28 +00001662 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001663}
1664
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001665static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00001666 (binaryfunc) long_add, /*nb_add*/
1667 (binaryfunc) long_sub, /*nb_subtract*/
1668 (binaryfunc) long_mul, /*nb_multiply*/
1669 (binaryfunc) long_div, /*nb_divide*/
1670 (binaryfunc) long_mod, /*nb_remainder*/
1671 (binaryfunc) long_divmod, /*nb_divmod*/
1672 (ternaryfunc) long_pow, /*nb_power*/
1673 (unaryfunc) long_neg, /*nb_negative*/
1674 (unaryfunc) long_pos, /*tp_positive*/
1675 (unaryfunc) long_abs, /*tp_absolute*/
1676 (inquiry) long_nonzero, /*tp_nonzero*/
1677 (unaryfunc) long_invert, /*nb_invert*/
1678 (binaryfunc) long_lshift, /*nb_lshift*/
1679 (binaryfunc) long_rshift, /*nb_rshift*/
1680 (binaryfunc) long_and, /*nb_and*/
1681 (binaryfunc) long_xor, /*nb_xor*/
1682 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001683 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001684 (unaryfunc) long_int, /*nb_int*/
1685 (unaryfunc) long_long, /*nb_long*/
1686 (unaryfunc) long_float, /*nb_float*/
1687 (unaryfunc) long_oct, /*nb_oct*/
1688 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001689};
1690
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001691PyTypeObject PyLong_Type = {
1692 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001693 0,
1694 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001695 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001696 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00001697 (destructor)long_dealloc, /*tp_dealloc*/
1698 0, /*tp_print*/
1699 0, /*tp_getattr*/
1700 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001701 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001702 (reprfunc)long_repr, /*tp_repr*/
1703 &long_as_number, /*tp_as_number*/
1704 0, /*tp_as_sequence*/
1705 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001706 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001707 0, /*tp_call*/
1708 (reprfunc)long_str, /*tp_str*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001709};