blob: 65dcaa06ded93c3a8afc06c9ff45a9d3485bcca2 [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) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001247 PyErr_SetString(PyExc_ValueError,
1248 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001249 return NULL;
1250 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251 z = (PyLongObject *)PyLong_FromLong(1L);
1252 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001253 for (i = 0; i < size_b; ++i) {
1254 digit bi = b->ob_digit[i];
1255 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001256
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001257 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001258 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001259
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001260 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001261 temp = (PyLongObject *)long_mul(z, a);
1262 Py_DECREF(z);
1263 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001264 if (l_divmod(temp,c,&div,&mod) < 0) {
1265 Py_DECREF(temp);
1266 z = NULL;
1267 goto error;
1268 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001269 Py_XDECREF(div);
1270 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001271 temp = mod;
1272 }
1273 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001274 if (z == NULL)
1275 break;
1276 }
1277 bi >>= 1;
1278 if (bi == 0 && i+1 == size_b)
1279 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280 temp = (PyLongObject *)long_mul(a, a);
1281 Py_DECREF(a);
1282 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001283 if (l_divmod(temp, c, &div, &mod) < 0) {
1284 Py_DECREF(temp);
1285 z = NULL;
1286 goto error;
1287 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001288 Py_XDECREF(div);
1289 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001290 temp = mod;
1291 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001292 a = temp;
1293 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001294 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001295 z = NULL;
1296 break;
1297 }
1298 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001299 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001300 break;
1301 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302 Py_XDECREF(a);
1303 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001304 if (l_divmod(z, c, &div, &mod) < 0) {
1305 Py_DECREF(z);
1306 z = NULL;
1307 }
1308 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001309 Py_XDECREF(div);
1310 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001311 z = mod;
1312 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001313 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001314 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001316}
1317
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001318static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001319long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001320{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001321 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001322 PyLongObject *x;
1323 PyLongObject *w;
1324 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001325 if (w == NULL)
1326 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327 x = (PyLongObject *) long_add(v, w);
1328 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001329 if (x == NULL)
1330 return NULL;
1331 if (x->ob_size != 0)
1332 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001333 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001334}
1335
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001337long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001338{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 Py_INCREF(v);
1340 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001341}
1342
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001343static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001344long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001345{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001347 int i, n;
1348 n = ABS(v->ob_size);
1349 if (n == 0) {
1350 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001351 Py_INCREF(v);
1352 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001353 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001354 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001355 if (z == NULL)
1356 return NULL;
1357 for (i = 0; i < n; i++)
1358 z->ob_digit[i] = v->ob_digit[i];
1359 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001361}
1362
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001364long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001365{
1366 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001367 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001368 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369 Py_INCREF(v);
1370 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001371 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001372}
1373
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001374static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001375long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001376{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001377 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001378}
1379
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001380static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001381long_rshift(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001382{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001383 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001384 long shiftby;
1385 int newsize, wordshift, loshift, hishift, i, j;
1386 digit lomask, himask;
1387
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001388 if (a->ob_size < 0) {
1389 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001390 PyLongObject *a1, *a2, *a3;
1391 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001392 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001393 a2 = (PyLongObject *) long_rshift(a1, b);
1394 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001395 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001396 a3 = (PyLongObject *) long_invert(a2);
1397 Py_DECREF(a2);
1398 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001399 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001400
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001401 shiftby = PyLong_AsLong((PyObject *)b);
1402 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001403 return NULL;
1404 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001406 return NULL;
1407 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001408 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001409 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001410 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001411 z = _PyLong_New(0);
1412 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001413 }
1414 loshift = shiftby % SHIFT;
1415 hishift = SHIFT - loshift;
1416 lomask = ((digit)1 << hishift) - 1;
1417 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001419 if (z == NULL)
1420 return NULL;
1421 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001422 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001423 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1424 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1425 if (i+1 < newsize)
1426 z->ob_digit[i] |=
1427 (a->ob_digit[j+1] << hishift) & himask;
1428 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001429 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001430}
1431
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001432static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001433long_lshift(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001434{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001435 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001436 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001437 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001438 int oldsize, newsize, wordshift, remshift, i, j;
1439 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001440
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001441 shiftby = PyLong_AsLong((PyObject *)b);
1442 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001443 return NULL;
1444 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001445 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001446 return NULL;
1447 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001448 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001449 PyErr_SetString(PyExc_ValueError,
1450 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001451 return NULL;
1452 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001453 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1454 wordshift = (int)shiftby / SHIFT;
1455 remshift = (int)shiftby - wordshift * SHIFT;
1456
1457 oldsize = ABS(a->ob_size);
1458 newsize = oldsize + wordshift;
1459 if (remshift)
1460 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001462 if (z == NULL)
1463 return NULL;
1464 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001465 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001466 for (i = 0; i < wordshift; i++)
1467 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001468 accum = 0;
1469 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1470 accum |= a->ob_digit[j] << remshift;
1471 z->ob_digit[i] = (digit)(accum & MASK);
1472 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001473 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001474 if (remshift)
1475 z->ob_digit[newsize-1] = (digit)accum;
1476 else
1477 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001478 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001479}
1480
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001481
1482/* Bitwise and/xor/or operations */
1483
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001484#define MAX(x, y) ((x) < (y) ? (y) : (x))
1485#define MIN(x, y) ((x) > (y) ? (y) : (x))
1486
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001487static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001488long_bitwise(PyLongObject *a,
1489 int op, /* '&', '|', '^' */
1490 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001491{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001492 digit maska, maskb; /* 0 or MASK */
1493 int negz;
1494 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001495 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001496 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001497 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001498 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001499
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001500 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001501 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001502 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001503 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001504 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001505 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001506 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001507 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001508 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001510 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001511 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001512 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001513 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001514 maskb = 0;
1515 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001516
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001517 negz = 0;
1518 switch (op) {
1519 case '^':
1520 if (maska != maskb) {
1521 maska ^= MASK;
1522 negz = -1;
1523 }
1524 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001525 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001526 if (maska && maskb) {
1527 op = '|';
1528 maska ^= MASK;
1529 maskb ^= MASK;
1530 negz = -1;
1531 }
1532 break;
1533 case '|':
1534 if (maska || maskb) {
1535 op = '&';
1536 maska ^= MASK;
1537 maskb ^= MASK;
1538 negz = -1;
1539 }
1540 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001541 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001542
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001543 /* JRH: The original logic here was to allocate the result value (z)
1544 as the longer of the two operands. However, there are some cases
1545 where the result is guaranteed to be shorter than that: AND of two
1546 positives, OR of two negatives: use the shorter number. AND with
1547 mixed signs: use the positive number. OR with mixed signs: use the
1548 negative number. After the transformations above, op will be '&'
1549 iff one of these cases applies, and mask will be non-0 for operands
1550 whose length should be ignored.
1551 */
1552
1553 size_a = a->ob_size;
1554 size_b = b->ob_size;
1555 size_z = op == '&'
1556 ? (maska
1557 ? size_b
1558 : (maskb ? size_a : MIN(size_a, size_b)))
1559 : MAX(size_a, size_b);
1560 z = _PyLong_New(size_z);
1561 if (a == NULL || b == NULL || z == NULL) {
1562 Py_XDECREF(a);
1563 Py_XDECREF(b);
1564 Py_XDECREF(z);
1565 return NULL;
1566 }
1567
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001568 for (i = 0; i < size_z; ++i) {
1569 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1570 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1571 switch (op) {
1572 case '&': z->ob_digit[i] = diga & digb; break;
1573 case '|': z->ob_digit[i] = diga | digb; break;
1574 case '^': z->ob_digit[i] = diga ^ digb; break;
1575 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001576 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001577
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001578 Py_DECREF(a);
1579 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001580 z = long_normalize(z);
1581 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001583 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001584 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001585 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001586}
1587
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001588static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001589long_and(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001590{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001591 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001592}
1593
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001595long_xor(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001596{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001597 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001598}
1599
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001600static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001601long_or(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001602{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001603 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001604}
1605
Guido van Rossum234f9421993-06-17 12:35:49 +00001606static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001607long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001608{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001609 if (PyInt_Check(*pw)) {
1610 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1611 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001612 return 0;
1613 }
1614 return 1; /* Can't do it */
1615}
1616
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001617static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001618long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001619{
1620 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001621 x = PyLong_AsLong(v);
1622 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001623 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001624 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001625}
1626
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001627static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001628long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001629{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001630 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001631 return v;
1632}
1633
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001634static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001635long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001636{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001637 double result;
1638 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001639 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001640 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001641 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001642}
1643
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001644static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001645long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001646{
Fred Drake121ee271999-12-23 15:41:28 +00001647 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001648}
1649
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001650static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001651long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001652{
Fred Drake121ee271999-12-23 15:41:28 +00001653 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001654}
1655
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001656static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00001657 (binaryfunc) long_add, /*nb_add*/
1658 (binaryfunc) long_sub, /*nb_subtract*/
1659 (binaryfunc) long_mul, /*nb_multiply*/
1660 (binaryfunc) long_div, /*nb_divide*/
1661 (binaryfunc) long_mod, /*nb_remainder*/
1662 (binaryfunc) long_divmod, /*nb_divmod*/
1663 (ternaryfunc) long_pow, /*nb_power*/
1664 (unaryfunc) long_neg, /*nb_negative*/
1665 (unaryfunc) long_pos, /*tp_positive*/
1666 (unaryfunc) long_abs, /*tp_absolute*/
1667 (inquiry) long_nonzero, /*tp_nonzero*/
1668 (unaryfunc) long_invert, /*nb_invert*/
1669 (binaryfunc) long_lshift, /*nb_lshift*/
1670 (binaryfunc) long_rshift, /*nb_rshift*/
1671 (binaryfunc) long_and, /*nb_and*/
1672 (binaryfunc) long_xor, /*nb_xor*/
1673 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001674 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001675 (unaryfunc) long_int, /*nb_int*/
1676 (unaryfunc) long_long, /*nb_long*/
1677 (unaryfunc) long_float, /*nb_float*/
1678 (unaryfunc) long_oct, /*nb_oct*/
1679 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001680};
1681
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001682PyTypeObject PyLong_Type = {
1683 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001684 0,
1685 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001686 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001687 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00001688 (destructor)long_dealloc, /*tp_dealloc*/
1689 0, /*tp_print*/
1690 0, /*tp_getattr*/
1691 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001692 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001693 (reprfunc)long_repr, /*tp_repr*/
1694 &long_as_number, /*tp_as_number*/
1695 0, /*tp_as_sequence*/
1696 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00001697 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00001698 0, /*tp_call*/
1699 (reprfunc)long_str, /*tp_str*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001700};