blob: bfb431f53d6f4a9c4754e1bd5a1ef5d645485586 [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001
2/* Long (arbitrary precision) integer object implementation */
3
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004/* XXX The functional organization of this file is terrible */
5
Guido van Rossumc0b618a1997-05-02 03:12:38 +00006#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +00007#include "longintrepr.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008
Guido van Rossumedcc38a1991-05-05 20:09:44 +00009#include <assert.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000010#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011
Guido van Rossume32e0141992-01-19 16:31:05 +000012#define ABS(x) ((x) < 0 ? -(x) : (x))
13
14/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000015static PyLongObject *long_normalize(PyLongObject *);
16static PyLongObject *mul1(PyLongObject *, wdigit);
17static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
18static PyLongObject *divrem1(PyLongObject *, wdigit, digit *);
19static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000020
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000021static int ticker; /* XXX Could be shared with ceval? */
22
Guido van Rossumc0b618a1997-05-02 03:12:38 +000023#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000024 if (--ticker < 0) { \
25 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000026 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000027 }
28
Guido van Rossumedcc38a1991-05-05 20:09:44 +000029/* Normalize (remove leading zeros from) a long int object.
30 Doesn't attempt to free the storage--in most cases, due to the nature
31 of the algorithms used, this could save at most be one word anyway. */
32
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000034long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000035{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000036 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000037 register int i = j;
38
39 while (i > 0 && v->ob_digit[i-1] == 0)
40 --i;
41 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000042 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000043 return v;
44}
45
46/* Allocate a new long int object with size digits.
47 Return NULL and set exception if we run out of memory. */
48
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000050_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000051{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000053}
54
55/* Create a new long int object from a C long int */
56
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000058PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000059{
Guido van Rossum472c04f1996-12-05 21:57:21 +000060 /* Assume a C long fits in at most 5 'digits' */
61 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 PyLongObject *v = _PyLong_New(5);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000063 if (v != NULL) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000064 unsigned long t = ival;
65 int i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000066 if (ival < 0) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000067 t = -ival;
Guido van Rossum4c260ff1992-01-14 18:36:43 +000068 v->ob_size = -(v->ob_size);
Guido van Rossum472c04f1996-12-05 21:57:21 +000069 }
70 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +000071 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000072 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000073 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000074 v = long_normalize(v);
75 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000076 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000077}
78
Guido van Rossum53756b11997-01-03 17:14:46 +000079/* Create a new long int object from a C unsigned long int */
80
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000082PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +000083{
84 /* Assume a C long fits in at most 5 'digits' */
85 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 PyLongObject *v = _PyLong_New(5);
Guido van Rossum53756b11997-01-03 17:14:46 +000087 if (v != NULL) {
88 unsigned long t = ival;
89 int i;
90 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +000091 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum53756b11997-01-03 17:14:46 +000092 t >>= SHIFT;
93 }
94 v = long_normalize(v);
95 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +000097}
98
Guido van Rossum149e9ea1991-06-03 10:58:24 +000099/* Create a new long int object from a C double */
100
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000103{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000104 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000105 double frac;
106 int i, ndig, expo, neg;
107 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000108 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000109 PyErr_SetString(PyExc_OverflowError,
110 "cannot convert float infinity to long");
111 return NULL;
112 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000113 if (dval < 0.0) {
114 neg = 1;
115 dval = -dval;
116 }
117 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
118 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000120 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000122 if (v == NULL)
123 return NULL;
124 frac = ldexp(frac, (expo-1) % SHIFT + 1);
125 for (i = ndig; --i >= 0; ) {
126 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000127 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000128 frac = frac - (double)bits;
129 frac = ldexp(frac, SHIFT);
130 }
131 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000132 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000134}
135
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000136/* Get a C long int from a long int object.
137 Returns -1 and sets an error condition if overflow occurs. */
138
139long
Tim Peters9f688bf2000-07-07 15:53:28 +0000140PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000141{
Guido van Rossumf7531811998-05-26 14:33:37 +0000142 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000144 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000145 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000146
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 if (vv == NULL || !PyLong_Check(vv)) {
148 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000149 return -1;
150 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000152 i = v->ob_size;
153 sign = 1;
154 x = 0;
155 if (i < 0) {
156 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000157 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000158 }
159 while (--i >= 0) {
160 prev = x;
161 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000162 if ((x >> SHIFT) != prev)
163 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000164 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000165 /* Haven't lost any bits, but if the sign bit is set we're in
166 * trouble *unless* this is the min negative number. So,
167 * trouble iff sign bit set && (positive || some bit set other
168 * than the sign bit).
169 */
170 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
171 goto overflow;
172 return (long)x * sign;
173
174 overflow:
175 PyErr_SetString(PyExc_OverflowError,
176 "long int too long to convert");
177 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000178}
179
Guido van Rossum53756b11997-01-03 17:14:46 +0000180/* Get a C long int from a long int object.
181 Returns -1 and sets an error condition if overflow occurs. */
182
183unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000184PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000185{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000187 unsigned long x, prev;
188 int i;
189
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190 if (vv == NULL || !PyLong_Check(vv)) {
191 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000192 return (unsigned long) -1;
193 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000195 i = v->ob_size;
196 x = 0;
197 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000199 "can't convert negative value to unsigned long");
200 return (unsigned long) -1;
201 }
202 while (--i >= 0) {
203 prev = x;
204 x = (x << SHIFT) + v->ob_digit[i];
205 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000207 "long int too long to convert");
208 return (unsigned long) -1;
209 }
210 }
211 return x;
212}
213
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000214/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000215
216double
Tim Peters9f688bf2000-07-07 15:53:28 +0000217PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000218{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000219 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000220 double x;
221 double multiplier = (double) (1L << SHIFT);
222 int i, sign;
223
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224 if (vv == NULL || !PyLong_Check(vv)) {
225 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000226 return -1;
227 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000229 i = v->ob_size;
230 sign = 1;
231 x = 0.0;
232 if (i < 0) {
233 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000234 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000235 }
236 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000237 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000238 }
239 return x * sign;
240}
241
Guido van Rossum78694d91998-09-18 14:14:13 +0000242/* Create a new long (or int) object from a C pointer */
243
244PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000245PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000246{
247#if SIZEOF_VOID_P == SIZEOF_LONG
248 return PyInt_FromLong((long)p);
249#else
250 /* optimize null pointers */
251 if ( p == NULL )
252 return PyInt_FromLong(0);
253
254 /* we can assume that HAVE_LONG_LONG is true. if not, then the
255 configuration process should have bailed (having big pointers
256 without long longs seems non-sensical) */
257 return PyLong_FromLongLong((LONG_LONG)p);
258#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
259}
260
261/* Get a C pointer from a long object (or an int object in some cases) */
262
263void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000264PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000265{
266 /* This function will allow int or long objects. If vv is neither,
267 then the PyLong_AsLong*() functions will raise the exception:
268 PyExc_SystemError, "bad argument to internal function"
269 */
270
271#if SIZEOF_VOID_P == SIZEOF_LONG
272 long x;
273
274 if ( PyInt_Check(vv) )
275 x = PyInt_AS_LONG(vv);
276 else
277 x = PyLong_AsLong(vv);
278#else
279 /* we can assume that HAVE_LONG_LONG is true. if not, then the
280 configuration process should have bailed (having big pointers
281 without long longs seems non-sensical) */
282 LONG_LONG x;
283
284 if ( PyInt_Check(vv) )
285 x = PyInt_AS_LONG(vv);
286 else
287 x = PyLong_AsLongLong(vv);
288#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
289
290 if (x == -1 && PyErr_Occurred())
291 return NULL;
292 return (void *)x;
293}
294
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000295#ifdef HAVE_LONG_LONG
296/*
Guido van Rossum3293b071998-08-25 16:07:15 +0000297 * LONG_LONG support by Chris Herborth (chrish@qnx.com)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000298 *
299 * For better or worse :-), I tried to follow the coding style already
300 * here.
301 */
302
Guido van Rossum3293b071998-08-25 16:07:15 +0000303/* Create a new long int object from a C LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000304
305PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000306PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000307{
308#if SIZEOF_LONG_LONG == SIZEOF_LONG
309 /* In case the compiler is faking it. */
310 return PyLong_FromLong( (long)ival );
311#else
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000312 if ((LONG_LONG)LONG_MIN <= ival && ival <= (LONG_LONG)LONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000313 return PyLong_FromLong( (long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000314 }
Fred Drake4c7fdfc2000-06-01 18:37:36 +0000315 else if (0 <= ival && ival <= (unsigned LONG_LONG)ULONG_MAX) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000316 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000317 }
318 else {
Guido van Rossum3293b071998-08-25 16:07:15 +0000319 /* Assume a C LONG_LONG fits in at most 10 'digits'.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000320 * Should be OK if we're assuming long fits in 5.
321 */
322 PyLongObject *v = _PyLong_New(10);
323
324 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000325 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000326 int i;
327 if (ival < 0) {
328 t = -ival;
329 v->ob_size = -(v->ob_size);
330 }
331
332 for (i = 0; i < 10; i++) {
333 v->ob_digit[i] = (digit) (t & MASK);
334 t >>= SHIFT;
335 }
336
337 v = long_normalize(v);
338 }
339
340 return (PyObject *)v;
341 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000342#endif
343}
344
Guido van Rossum3293b071998-08-25 16:07:15 +0000345/* Create a new long int object from a C unsigned LONG_LONG int */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000346PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000347PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000348{
349#if SIZEOF_LONG_LONG == SIZEOF_LONG
350 /* In case the compiler is faking it. */
351 return PyLong_FromUnsignedLong( (unsigned long)ival );
352#else
Guido van Rossum3293b071998-08-25 16:07:15 +0000353 if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000354 return PyLong_FromUnsignedLong( (unsigned long)ival );
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000355 }
356 else {
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000357 /* Assume a C long fits in at most 10 'digits'. */
358 PyLongObject *v = _PyLong_New(10);
359
360 if (v != NULL) {
Guido van Rossum3293b071998-08-25 16:07:15 +0000361 unsigned LONG_LONG t = ival;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000362 int i;
363 for (i = 0; i < 10; i++) {
364 v->ob_digit[i] = (digit) (t & MASK);
365 t >>= SHIFT;
366 }
367
368 v = long_normalize(v);
369 }
370
371 return (PyObject *)v;
372 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000373#endif
374}
375
Guido van Rossum3293b071998-08-25 16:07:15 +0000376/* Get a C LONG_LONG int from a long int object.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000377 Returns -1 and sets an error condition if overflow occurs. */
378
Guido van Rossum3293b071998-08-25 16:07:15 +0000379LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000380PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000381{
382#if SIZEOF_LONG_LONG == SIZEOF_LONG
383 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000384 return (LONG_LONG)PyLong_AsLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000385#else
386 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000387 LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000388 int i, sign;
389
390 if (vv == NULL || !PyLong_Check(vv)) {
391 PyErr_BadInternalCall();
392 return -1;
393 }
394
395 v = (PyLongObject *)vv;
396 i = v->ob_size;
397 sign = 1;
398 x = 0;
399
400 if (i < 0) {
401 sign = -1;
402 i = -(i);
403 }
404
405 while (--i >= 0) {
406 prev = x;
407 x = (x << SHIFT) + v->ob_digit[i];
408 if ((x >> SHIFT) != prev) {
409 PyErr_SetString(PyExc_OverflowError,
410 "long int too long to convert");
411 return -1;
412 }
413 }
414
415 return x * sign;
416#endif
417}
418
Guido van Rossum3293b071998-08-25 16:07:15 +0000419unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000420PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000421{
422#if SIZEOF_LONG_LONG == 4
423 /* In case the compiler is faking it. */
Guido van Rossum3293b071998-08-25 16:07:15 +0000424 return (unsigned LONG_LONG)PyLong_AsUnsignedLong( vv );
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000425#else
426 register PyLongObject *v;
Guido van Rossum3293b071998-08-25 16:07:15 +0000427 unsigned LONG_LONG x, prev;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000428 int i;
429
430 if (vv == NULL || !PyLong_Check(vv)) {
431 PyErr_BadInternalCall();
Guido van Rossum3293b071998-08-25 16:07:15 +0000432 return (unsigned LONG_LONG) -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000433 }
434
435 v = (PyLongObject *)vv;
436 i = v->ob_size;
437 x = 0;
438
439 if (i < 0) {
440 PyErr_SetString(PyExc_OverflowError,
441 "can't convert negative value to unsigned long");
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 while (--i >= 0) {
446 prev = x;
447 x = (x << SHIFT) + v->ob_digit[i];
448 if ((x >> SHIFT) != prev) {
449 PyErr_SetString(PyExc_OverflowError,
450 "long int too long to convert");
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
455 return x;
456#endif
457}
458#endif /* HAVE_LONG_LONG */
459
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000460/* Multiply by a single digit, ignoring the sign. */
461
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000463mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000464{
465 return muladd1(a, n, (digit)0);
466}
467
468/* Multiply by a single digit and add a single digit, ignoring the sign. */
469
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000471muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000472{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000473 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000475 twodigits carry = extra;
476 int i;
477
478 if (z == NULL)
479 return NULL;
480 for (i = 0; i < size_a; ++i) {
481 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000482 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000483 carry >>= SHIFT;
484 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000485 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000486 return long_normalize(z);
487}
488
489/* Divide a long integer by a digit, returning both the quotient
490 (as function result) and the remainder (through *prem).
491 The sign of a is ignored; n should not be zero. */
492
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000493static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000494divrem1(PyLongObject *a, wdigit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000495{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000496 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000497 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000498 int i;
499 twodigits rem = 0;
500
501 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000503 if (z == NULL)
504 return NULL;
505 for (i = size; --i >= 0; ) {
506 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000507 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000508 rem %= n;
509 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000510 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000511 return long_normalize(z);
512}
513
514/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000515 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000516 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000517
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000519long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000520{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 register PyLongObject *a = (PyLongObject *)aa;
522 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000523 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000524 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000525 char *p;
526 int bits;
527 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000528
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000529 if (a == NULL || !PyLong_Check(a)) {
530 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000531 return NULL;
532 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000533 assert(base >= 2 && base <= 36);
534
535 /* Compute a rough upper bound for the length of the string */
536 i = base;
537 bits = 0;
538 while (i > 1) {
539 ++bits;
540 i >>= 1;
541 }
Fred Drake121ee271999-12-23 15:41:28 +0000542 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000544 if (str == NULL)
545 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000547 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000548 if (addL)
549 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000550 if (a->ob_size < 0)
551 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000552
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000553 if (a->ob_size == 0) {
554 *--p = '0';
555 }
556 else if ((base & (base - 1)) == 0) {
557 /* JRH: special case for power-of-2 bases */
558 twodigits temp = a->ob_digit[0];
559 int bitsleft = SHIFT;
560 int rem;
561 int last = abs(a->ob_size);
562 int basebits = 1;
563 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000564 while ((i >>= 1) > 1)
565 ++basebits;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000566
567 i = 0;
568 for (;;) {
569 while (bitsleft >= basebits) {
570 if ((temp == 0) && (i >= last - 1)) break;
571 rem = temp & (base - 1);
572 if (rem < 10)
573 rem += '0';
574 else
575 rem += 'A' - 10;
576 assert(p > PyString_AS_STRING(str));
577 *--p = (char) rem;
578 bitsleft -= basebits;
579 temp >>= basebits;
580 }
581 if (++i >= last) {
582 if (temp == 0) break;
583 bitsleft = 99;
584 /* loop again to pick up final digits */
585 }
586 else {
587 temp = (a->ob_digit[i] << bitsleft) | temp;
588 bitsleft += SHIFT;
589 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000590 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000591 }
592 else {
593 Py_INCREF(a);
594 do {
595 digit rem;
596 PyLongObject *temp = divrem1(a, (digit)base, &rem);
597 if (temp == NULL) {
598 Py_DECREF(a);
599 Py_DECREF(str);
600 return NULL;
601 }
602 if (rem < 10)
603 rem += '0';
604 else
605 rem += 'A'-10;
606 assert(p > PyString_AS_STRING(str));
607 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 Py_DECREF(a);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000609 a = temp;
610 SIGCHECK({
611 Py_DECREF(a);
612 Py_DECREF(str);
613 return NULL;
614 })
615 } while (ABS(a->ob_size) != 0);
616 Py_DECREF(a);
617 }
618
Guido van Rossum2c475421992-08-14 15:13:07 +0000619 if (base == 8) {
620 if (size_a != 0)
621 *--p = '0';
622 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000623 else if (base == 16) {
624 *--p = 'x';
625 *--p = '0';
626 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000627 else if (base != 10) {
628 *--p = '#';
629 *--p = '0' + base%10;
630 if (base > 10)
631 *--p = '0' + base/10;
632 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000633 if (sign)
634 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 if (p != PyString_AS_STRING(str)) {
636 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000637 assert(p > q);
638 do {
639 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000640 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641 _PyString_Resize((PyObject **)&str,
642 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000643 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000645}
646
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000648PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000649{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000650 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000651 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000653
Guido van Rossum472c04f1996-12-05 21:57:21 +0000654 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655 PyErr_SetString(PyExc_ValueError,
656 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000657 return NULL;
658 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000659 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000660 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000661 if (*str == '+')
662 ++str;
663 else if (*str == '-') {
664 ++str;
665 sign = -1;
666 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000667 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000668 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000669 if (base == 0) {
670 if (str[0] != '0')
671 base = 10;
672 else if (str[1] == 'x' || str[1] == 'X')
673 base = 16;
674 else
675 base = 8;
676 }
677 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
678 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000679 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000680 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000681 for ( ; z != NULL; ++str) {
682 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000684
685 if (*str <= '9')
686 k = *str - '0';
687 else if (*str >= 'a')
688 k = *str - 'a' + 10;
689 else if (*str >= 'A')
690 k = *str - 'A' + 10;
691 if (k < 0 || k >= base)
692 break;
693 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000695 z = temp;
696 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000697 if (z == NULL)
698 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000699 if (str == start)
700 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000701 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000702 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000703 if (*str == 'L' || *str == 'l')
704 str++;
705 while (*str && isspace(Py_CHARMASK(*str)))
706 str++;
707 if (*str != '\0')
708 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000709 if (pend)
710 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000712
713 onError:
714 PyErr_Format(PyExc_ValueError,
715 "invalid literal for long(): %.200s", orig_str);
716 Py_XDECREF(z);
717 return NULL;
718}
719
720PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000721PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000722{
723 char buffer[256];
724
725 if (length >= sizeof(buffer)) {
726 PyErr_SetString(PyExc_ValueError,
727 "long() literal too large to convert");
728 return NULL;
729 }
730 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
731 return NULL;
732
733 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000734}
735
Tim Peters9f688bf2000-07-07 15:53:28 +0000736/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +0000738 (PyLongObject *, PyLongObject *, PyLongObject **);
739static PyObject *long_pos(PyLongObject *);
740static int long_divrem(PyLongObject *, PyLongObject *,
741 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000742
743/* Long division with remainder, top-level routine */
744
Guido van Rossume32e0141992-01-19 16:31:05 +0000745static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000746long_divrem(PyLongObject *a, PyLongObject *b,
747 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000748{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000749 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000750 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000751
752 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000753 PyErr_SetString(PyExc_ZeroDivisionError,
754 "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000755 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000756 }
757 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000758 (size_a == size_b &&
759 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000760 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000761 *pdiv = _PyLong_New(0);
762 Py_INCREF(a);
763 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000764 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000765 }
766 if (size_b == 1) {
767 digit rem = 0;
768 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000769 if (z == NULL)
770 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000771 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000772 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000773 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000774 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000775 if (z == NULL)
776 return -1;
777 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000778 /* Set the signs.
779 The quotient z has the sign of a*b;
780 the remainder r has the sign of a,
781 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000782 if ((a->ob_size < 0) != (b->ob_size < 0))
783 z->ob_size = -(z->ob_size);
784 if (a->ob_size < 0 && (*prem)->ob_size != 0)
785 (*prem)->ob_size = -((*prem)->ob_size);
786 *pdiv = z;
787 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000788}
789
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000790/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000791
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000793x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000794{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000795 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000796 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797 PyLongObject *v = mul1(v1, d);
798 PyLongObject *w = mul1(w1, d);
799 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000800 int j, k;
801
802 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803 Py_XDECREF(v);
804 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000805 return NULL;
806 }
807
808 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000809 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000810 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000811
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000812 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000814
815 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
816 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
817 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000818 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000819 int i;
820
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000821 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000822 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000823 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000824 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000825 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000826 if (vj == w->ob_digit[size_w-1])
827 q = MASK;
828 else
829 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
830 w->ob_digit[size_w-1];
831
832 while (w->ob_digit[size_w-2]*q >
833 ((
834 ((twodigits)vj << SHIFT)
835 + v->ob_digit[j-1]
836 - q*w->ob_digit[size_w-1]
837 ) << SHIFT)
838 + v->ob_digit[j-2])
839 --q;
840
841 for (i = 0; i < size_w && i+k < size_v; ++i) {
842 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000843 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 carry += v->ob_digit[i+k] - z
845 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000846 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +0000847 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
848 carry, SHIFT);
849 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000850 }
851
852 if (i+k < size_v) {
853 carry += v->ob_digit[i+k];
854 v->ob_digit[i+k] = 0;
855 }
856
857 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000858 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000859 else {
860 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000861 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000862 carry = 0;
863 for (i = 0; i < size_w && i+k < size_v; ++i) {
864 carry += v->ob_digit[i+k] + w->ob_digit[i];
865 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +0000866 carry = Py_ARITHMETIC_RIGHT_SHIFT(
867 BASE_TWODIGITS_TYPE,
868 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000869 }
870 }
871 } /* for j, k */
872
Guido van Rossumc206c761995-01-10 15:23:19 +0000873 if (a == NULL)
874 *prem = NULL;
875 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000876 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000877 *prem = divrem1(v, d, &d);
878 /* d receives the (unused) remainder */
879 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000880 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000881 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000882 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000883 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 Py_DECREF(v);
885 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000886 return a;
887}
888
889/* Methods */
890
891static void
Tim Peters9f688bf2000-07-07 15:53:28 +0000892long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000893{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000894 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000895}
896
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000897static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000898long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000899{
Fred Drake121ee271999-12-23 15:41:28 +0000900 return long_format(v, 10, 1);
901}
902
903static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000904long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +0000905{
906 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000907}
908
909static int
Tim Peters9f688bf2000-07-07 15:53:28 +0000910long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000911{
912 int sign;
913
Guido van Rossumc6913e71991-11-19 20:26:46 +0000914 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000915 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +0000916 sign = 0;
917 else
918 sign = a->ob_size - b->ob_size;
919 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000920 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000921 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000922 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
923 ;
924 if (i < 0)
925 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000926 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000927 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000928 if (a->ob_size < 0)
929 sign = -sign;
930 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000931 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000932 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000933}
934
Guido van Rossum9bfef441993-03-29 10:43:31 +0000935static long
Tim Peters9f688bf2000-07-07 15:53:28 +0000936long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000937{
938 long x;
939 int i, sign;
940
941 /* This is designed so that Python ints and longs with the
942 same value hash to the same value, otherwise comparisons
943 of mapping keys will turn out weird */
944 i = v->ob_size;
945 sign = 1;
946 x = 0;
947 if (i < 0) {
948 sign = -1;
949 i = -(i);
950 }
951 while (--i >= 0) {
952 /* Force a 32-bit circular shift */
953 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
954 x += v->ob_digit[i];
955 }
956 x = x * sign;
957 if (x == -1)
958 x = -2;
959 return x;
960}
961
962
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000963/* Add the absolute values of two long integers. */
964
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000966x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000967{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000968 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000970 int i;
971 digit carry = 0;
972
973 /* Ensure a is the larger of the two: */
974 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 { PyLongObject *temp = a; a = b; b = temp; }
976 { int size_temp = size_a;
977 size_a = size_b;
978 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000979 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000980 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000981 if (z == NULL)
982 return NULL;
983 for (i = 0; i < size_b; ++i) {
984 carry += a->ob_digit[i] + b->ob_digit[i];
985 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000986 carry >>= SHIFT;
987 }
988 for (; i < size_a; ++i) {
989 carry += a->ob_digit[i];
990 z->ob_digit[i] = carry & MASK;
991 carry >>= SHIFT;
992 }
993 z->ob_digit[i] = carry;
994 return long_normalize(z);
995}
996
997/* Subtract the absolute values of two integers. */
998
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001000x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001001{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001002 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001004 int i;
1005 int sign = 1;
1006 digit borrow = 0;
1007
1008 /* Ensure a is the larger of the two: */
1009 if (size_a < size_b) {
1010 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 { PyLongObject *temp = a; a = b; b = temp; }
1012 { int size_temp = size_a;
1013 size_a = size_b;
1014 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001015 }
1016 else if (size_a == size_b) {
1017 /* Find highest digit where a and b differ: */
1018 i = size_a;
1019 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1020 ;
1021 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001022 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001023 if (a->ob_digit[i] < b->ob_digit[i]) {
1024 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001026 }
1027 size_a = size_b = i+1;
1028 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001029 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001030 if (z == NULL)
1031 return NULL;
1032 for (i = 0; i < size_b; ++i) {
1033 /* The following assumes unsigned arithmetic
1034 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001035 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001036 z->ob_digit[i] = borrow & MASK;
1037 borrow >>= SHIFT;
1038 borrow &= 1; /* Keep only one sign bit */
1039 }
1040 for (; i < size_a; ++i) {
1041 borrow = a->ob_digit[i] - borrow;
1042 z->ob_digit[i] = borrow & MASK;
1043 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001044 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001045 }
1046 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001047 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001048 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001049 return long_normalize(z);
1050}
1051
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001053long_add(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001054{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001056
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001057 if (a->ob_size < 0) {
1058 if (b->ob_size < 0) {
1059 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001060 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001061 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001062 }
1063 else
1064 z = x_sub(b, a);
1065 }
1066 else {
1067 if (b->ob_size < 0)
1068 z = x_sub(a, b);
1069 else
1070 z = x_add(a, b);
1071 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001072 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001073}
1074
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001076long_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001077{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001079
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001080 if (a->ob_size < 0) {
1081 if (b->ob_size < 0)
1082 z = x_sub(a, b);
1083 else
1084 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001085 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001086 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001087 }
1088 else {
1089 if (b->ob_size < 0)
1090 z = x_add(a, b);
1091 else
1092 z = x_sub(a, b);
1093 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001094 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001095}
1096
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001097static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001098long_mul(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001099{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001100 int size_a;
1101 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001102 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001103 int i;
1104
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001105 size_a = ABS(a->ob_size);
1106 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001107 if (size_a > size_b) {
1108 /* we are faster with the small object on the left */
1109 int hold_sa = size_a;
1110 PyLongObject *hold_a = a;
1111 size_a = size_b;
1112 size_b = hold_sa;
1113 a = b;
1114 b = hold_a;
1115 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001116 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001117 if (z == NULL)
1118 return NULL;
1119 for (i = 0; i < z->ob_size; ++i)
1120 z->ob_digit[i] = 0;
1121 for (i = 0; i < size_a; ++i) {
1122 twodigits carry = 0;
1123 twodigits f = a->ob_digit[i];
1124 int j;
1125
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001126 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001127 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001128 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001129 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001130 for (j = 0; j < size_b; ++j) {
1131 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001132 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001133 carry >>= SHIFT;
1134 }
1135 for (; carry != 0; ++j) {
1136 assert(i+j < z->ob_size);
1137 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001138 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001139 carry >>= SHIFT;
1140 }
1141 }
1142 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001143 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001144 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001145 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001146 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001147}
1148
Guido van Rossume32e0141992-01-19 16:31:05 +00001149/* The / and % operators are now defined in terms of divmod().
1150 The expression a mod b has the value a - b*floor(a/b).
1151 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001152 |a| by |b|, with the sign of a. This is also expressed
1153 as a - b*trunc(a/b), if trunc truncates towards zero.
1154 Some examples:
1155 a b a rem b a mod b
1156 13 10 3 3
1157 -13 10 -3 7
1158 13 -10 3 -7
1159 -13 -10 -3 -3
1160 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001161 have different signs. We then subtract one from the 'div'
1162 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001163
Guido van Rossume32e0141992-01-19 16:31:05 +00001164static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001165l_divmod(PyLongObject *v, PyLongObject *w,
1166 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001167{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001168 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001169
1170 if (long_divrem(v, w, &div, &mod) < 0)
1171 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001172 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1173 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174 PyLongObject *temp;
1175 PyLongObject *one;
1176 temp = (PyLongObject *) long_add(mod, w);
1177 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001178 mod = temp;
1179 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001180 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001181 return -1;
1182 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001183 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001184 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001185 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1186 Py_DECREF(mod);
1187 Py_DECREF(div);
1188 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001189 return -1;
1190 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191 Py_DECREF(one);
1192 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001193 div = temp;
1194 }
1195 *pdiv = div;
1196 *pmod = mod;
1197 return 0;
1198}
1199
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001200static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001201long_div(PyLongObject *v, PyLongObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001202{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001204 if (l_divmod(v, w, &div, &mod) < 0)
1205 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001206 Py_DECREF(mod);
1207 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001208}
1209
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001211long_mod(PyLongObject *v, PyLongObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001212{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001213 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001214 if (l_divmod(v, w, &div, &mod) < 0)
1215 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001216 Py_DECREF(div);
1217 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001218}
1219
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001221long_divmod(PyLongObject *v, PyLongObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001222{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001223 PyObject *z;
1224 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001225 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001226 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001227 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001228 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001229 PyTuple_SetItem(z, 0, (PyObject *) div);
1230 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001231 }
1232 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001233 Py_DECREF(div);
1234 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001235 }
1236 return z;
1237}
1238
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001240long_pow(PyLongObject *a, PyLongObject *b, PyLongObject *c)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001241{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001243 int size_b, i;
1244
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001245 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001246 if (size_b < 0) {
Tim Petersc54d1902000-10-06 00:36:09 +00001247 if (a->ob_size)
1248 PyErr_SetString(PyExc_ValueError,
1249 "long integer to a negative power");
1250 else
1251 PyErr_SetString(PyExc_ZeroDivisionError,
1252 "zero to a negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001253 return NULL;
1254 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001255 z = (PyLongObject *)PyLong_FromLong(1L);
1256 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001257 for (i = 0; i < size_b; ++i) {
1258 digit bi = b->ob_digit[i];
1259 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001260
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001261 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001262 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001263
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001264 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001265 temp = (PyLongObject *)long_mul(z, a);
1266 Py_DECREF(z);
1267 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001268 if (l_divmod(temp,c,&div,&mod) < 0) {
1269 Py_DECREF(temp);
1270 z = NULL;
1271 goto error;
1272 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001273 Py_XDECREF(div);
1274 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001275 temp = mod;
1276 }
1277 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001278 if (z == NULL)
1279 break;
1280 }
1281 bi >>= 1;
1282 if (bi == 0 && i+1 == size_b)
1283 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284 temp = (PyLongObject *)long_mul(a, a);
1285 Py_DECREF(a);
1286 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001287 if (l_divmod(temp, c, &div, &mod) < 0) {
1288 Py_DECREF(temp);
1289 z = NULL;
1290 goto error;
1291 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292 Py_XDECREF(div);
1293 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001294 temp = mod;
1295 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001296 a = temp;
1297 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001298 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001299 z = NULL;
1300 break;
1301 }
1302 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001303 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001304 break;
1305 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 Py_XDECREF(a);
1307 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001308 if (l_divmod(z, c, &div, &mod) < 0) {
1309 Py_DECREF(z);
1310 z = NULL;
1311 }
1312 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001313 Py_XDECREF(div);
1314 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001315 z = mod;
1316 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001317 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001318 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001320}
1321
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001322static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001323long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001324{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001325 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 PyLongObject *x;
1327 PyLongObject *w;
1328 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001329 if (w == NULL)
1330 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 x = (PyLongObject *) long_add(v, w);
1332 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001333 if (x == NULL)
1334 return NULL;
1335 if (x->ob_size != 0)
1336 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001337 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001338}
1339
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001341long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001342{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001343 Py_INCREF(v);
1344 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001345}
1346
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001348long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001349{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001350 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001351 int i, n;
1352 n = ABS(v->ob_size);
1353 if (n == 0) {
1354 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001355 Py_INCREF(v);
1356 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001357 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001359 if (z == NULL)
1360 return NULL;
1361 for (i = 0; i < n; i++)
1362 z->ob_digit[i] = v->ob_digit[i];
1363 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001364 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001365}
1366
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001367static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001368long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001369{
1370 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001371 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001372 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373 Py_INCREF(v);
1374 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001375 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001376}
1377
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001378static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001379long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001380{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001381 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001382}
1383
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001384static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001385long_rshift(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001386{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001388 long shiftby;
1389 int newsize, wordshift, loshift, hishift, i, j;
1390 digit lomask, himask;
1391
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001392 if (a->ob_size < 0) {
1393 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001394 PyLongObject *a1, *a2, *a3;
1395 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001396 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001397 a2 = (PyLongObject *) long_rshift(a1, b);
1398 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001399 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400 a3 = (PyLongObject *) long_invert(a2);
1401 Py_DECREF(a2);
1402 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001403 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001404
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405 shiftby = PyLong_AsLong((PyObject *)b);
1406 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001407 return NULL;
1408 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001409 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001410 return NULL;
1411 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001412 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001413 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001414 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001415 z = _PyLong_New(0);
1416 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001417 }
1418 loshift = shiftby % SHIFT;
1419 hishift = SHIFT - loshift;
1420 lomask = ((digit)1 << hishift) - 1;
1421 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001422 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001423 if (z == NULL)
1424 return NULL;
1425 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001426 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001427 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1428 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1429 if (i+1 < newsize)
1430 z->ob_digit[i] |=
1431 (a->ob_digit[j+1] << hishift) & himask;
1432 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001434}
1435
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001436static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001437long_lshift(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001438{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001439 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001440 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001441 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001442 int oldsize, newsize, wordshift, remshift, i, j;
1443 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001444
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001445 shiftby = PyLong_AsLong((PyObject *)b);
1446 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001447 return NULL;
1448 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001449 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001450 return NULL;
1451 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001452 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001453 PyErr_SetString(PyExc_ValueError,
1454 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001455 return NULL;
1456 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001457 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1458 wordshift = (int)shiftby / SHIFT;
1459 remshift = (int)shiftby - wordshift * SHIFT;
1460
1461 oldsize = ABS(a->ob_size);
1462 newsize = oldsize + wordshift;
1463 if (remshift)
1464 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001465 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001466 if (z == NULL)
1467 return NULL;
1468 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001469 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001470 for (i = 0; i < wordshift; i++)
1471 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001472 accum = 0;
1473 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1474 accum |= a->ob_digit[j] << remshift;
1475 z->ob_digit[i] = (digit)(accum & MASK);
1476 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001477 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001478 if (remshift)
1479 z->ob_digit[newsize-1] = (digit)accum;
1480 else
1481 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001482 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001483}
1484
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001485
1486/* Bitwise and/xor/or operations */
1487
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001488#define MAX(x, y) ((x) < (y) ? (y) : (x))
1489#define MIN(x, y) ((x) > (y) ? (y) : (x))
1490
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001491static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001492long_bitwise(PyLongObject *a,
1493 int op, /* '&', '|', '^' */
1494 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001495{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001496 digit maska, maskb; /* 0 or MASK */
1497 int negz;
1498 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001499 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001500 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001501 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001502 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001503
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001504 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001505 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001506 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001507 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001508 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001510 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001511 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001512 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001513 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001514 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001515 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001516 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001517 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001518 maskb = 0;
1519 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001520
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001521 negz = 0;
1522 switch (op) {
1523 case '^':
1524 if (maska != maskb) {
1525 maska ^= MASK;
1526 negz = -1;
1527 }
1528 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001529 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001530 if (maska && maskb) {
1531 op = '|';
1532 maska ^= MASK;
1533 maskb ^= MASK;
1534 negz = -1;
1535 }
1536 break;
1537 case '|':
1538 if (maska || maskb) {
1539 op = '&';
1540 maska ^= MASK;
1541 maskb ^= MASK;
1542 negz = -1;
1543 }
1544 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001545 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001546
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001547 /* JRH: The original logic here was to allocate the result value (z)
1548 as the longer of the two operands. However, there are some cases
1549 where the result is guaranteed to be shorter than that: AND of two
1550 positives, OR of two negatives: use the shorter number. AND with
1551 mixed signs: use the positive number. OR with mixed signs: use the
1552 negative number. After the transformations above, op will be '&'
1553 iff one of these cases applies, and mask will be non-0 for operands
1554 whose length should be ignored.
1555 */
1556
1557 size_a = a->ob_size;
1558 size_b = b->ob_size;
1559 size_z = op == '&'
1560 ? (maska
1561 ? size_b
1562 : (maskb ? size_a : MIN(size_a, size_b)))
1563 : MAX(size_a, size_b);
1564 z = _PyLong_New(size_z);
1565 if (a == NULL || b == NULL || z == NULL) {
1566 Py_XDECREF(a);
1567 Py_XDECREF(b);
1568 Py_XDECREF(z);
1569 return NULL;
1570 }
1571
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001572 for (i = 0; i < size_z; ++i) {
1573 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1574 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1575 switch (op) {
1576 case '&': z->ob_digit[i] = diga & digb; break;
1577 case '|': z->ob_digit[i] = diga | digb; break;
1578 case '^': z->ob_digit[i] = diga ^ digb; break;
1579 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001580 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001581
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582 Py_DECREF(a);
1583 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001584 z = long_normalize(z);
1585 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001586 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001587 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001588 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001589 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001590}
1591
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001592static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001593long_and(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001594{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001595 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001596}
1597
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001598static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001599long_xor(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001600{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001601 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001602}
1603
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001604static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001605long_or(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001606{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001607 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001608}
1609
Guido van Rossum234f9421993-06-17 12:35:49 +00001610static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001611long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001612{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001613 if (PyInt_Check(*pw)) {
1614 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1615 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001616 return 0;
1617 }
1618 return 1; /* Can't do it */
1619}
1620
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001621static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001622long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001623{
1624 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001625 x = PyLong_AsLong(v);
1626 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001627 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001628 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001629}
1630
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001631static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001632long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001633{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001634 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001635 return v;
1636}
1637
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001638static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001639long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001640{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001641 double result;
1642 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001643 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001644 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001645 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001646}
1647
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001648static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001649long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001650{
Fred Drake121ee271999-12-23 15:41:28 +00001651 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001652}
1653
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001654static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001655long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001656{
Fred Drake121ee271999-12-23 15:41:28 +00001657 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001658}
1659
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001660static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00001661 (binaryfunc) long_add, /*nb_add*/
1662 (binaryfunc) long_sub, /*nb_subtract*/
1663 (binaryfunc) long_mul, /*nb_multiply*/
1664 (binaryfunc) long_div, /*nb_divide*/
1665 (binaryfunc) long_mod, /*nb_remainder*/
1666 (binaryfunc) long_divmod, /*nb_divmod*/
1667 (ternaryfunc) long_pow, /*nb_power*/
1668 (unaryfunc) long_neg, /*nb_negative*/
1669 (unaryfunc) long_pos, /*tp_positive*/
1670 (unaryfunc) long_abs, /*tp_absolute*/
1671 (inquiry) long_nonzero, /*tp_nonzero*/
1672 (unaryfunc) long_invert, /*nb_invert*/
1673 (binaryfunc) long_lshift, /*nb_lshift*/
1674 (binaryfunc) long_rshift, /*nb_rshift*/
1675 (binaryfunc) long_and, /*nb_and*/
1676 (binaryfunc) long_xor, /*nb_xor*/
1677 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001678 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001679 (unaryfunc) long_int, /*nb_int*/
1680 (unaryfunc) long_long, /*nb_long*/
1681 (unaryfunc) long_float, /*nb_float*/
1682 (unaryfunc) long_oct, /*nb_oct*/
1683 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001684};
1685
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001686PyTypeObject PyLong_Type = {
1687 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001688 0,
1689 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001690 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001691 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00001692 (destructor)long_dealloc, /*tp_dealloc*/
1693 0, /*tp_print*/
1694 0, /*tp_getattr*/
1695 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001696 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001697 (reprfunc)long_repr, /*tp_repr*/
1698 &long_as_number, /*tp_as_number*/
1699 0, /*tp_as_sequence*/
1700 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001701 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001702 0, /*tp_call*/
1703 (reprfunc)long_str, /*tp_str*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001704};