blob: a6be3d9236b486b1abdc15713b1be478bc0ee241 [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumedcc38a1991-05-05 20:09:44 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumedcc38a1991-05-05 20:09:44 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumedcc38a1991-05-05 20:09:44 +000029
30******************************************************************/
31
32/* Long (arbitrary precision) integer object implementation */
33
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000034/* XXX The functional organization of this file is terrible */
35
Guido van Rossumc0b618a1997-05-02 03:12:38 +000036#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +000037#include "longintrepr.h"
Guido van Rossum687ec181995-03-04 22:43:47 +000038#include "mymath.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +000039
Guido van Rossumedcc38a1991-05-05 20:09:44 +000040#include <assert.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000041#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000042
Guido van Rossume32e0141992-01-19 16:31:05 +000043#define ABS(x) ((x) < 0 ? -(x) : (x))
44
45/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000046static PyLongObject *long_normalize Py_PROTO((PyLongObject *));
47static PyLongObject *mul1 Py_PROTO((PyLongObject *, wdigit));
48static PyLongObject *muladd1 Py_PROTO((PyLongObject *, wdigit, wdigit));
49static PyLongObject *divrem1 Py_PROTO((PyLongObject *, wdigit, digit *));
50static PyObject *long_format Py_PROTO((PyObject *aa, int base));
Guido van Rossume32e0141992-01-19 16:31:05 +000051
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000052static int ticker; /* XXX Could be shared with ceval? */
53
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000055 if (--ticker < 0) { \
56 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000058 }
59
Guido van Rossumedcc38a1991-05-05 20:09:44 +000060/* Normalize (remove leading zeros from) a long int object.
61 Doesn't attempt to free the storage--in most cases, due to the nature
62 of the algorithms used, this could save at most be one word anyway. */
63
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +000065long_normalize(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000067{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000068 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000069 register int i = j;
70
71 while (i > 0 && v->ob_digit[i-1] == 0)
72 --i;
73 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000074 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000075 return v;
76}
77
78/* Allocate a new long int object with size digits.
79 Return NULL and set exception if we run out of memory. */
80
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081PyLongObject *
82_PyLong_New(size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000083 int size;
84{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086}
87
88/* Create a new long int object from a C long int */
89
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090PyObject *
91PyLong_FromLong(ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000092 long ival;
93{
Guido van Rossum472c04f1996-12-05 21:57:21 +000094 /* Assume a C long fits in at most 5 'digits' */
95 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 PyLongObject *v = _PyLong_New(5);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000097 if (v != NULL) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000098 unsigned long t = ival;
99 int i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000100 if (ival < 0) {
Guido van Rossum472c04f1996-12-05 21:57:21 +0000101 t = -ival;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000102 v->ob_size = -(v->ob_size);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000103 }
104 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000105 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000106 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000107 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000108 v = long_normalize(v);
109 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000111}
112
Guido van Rossum53756b11997-01-03 17:14:46 +0000113/* Create a new long int object from a C unsigned long int */
114
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyObject *
Guido van Rossum53756b11997-01-03 17:14:46 +0000116PyLong_FromUnsignedLong(ival)
117 unsigned long ival;
118{
119 /* Assume a C long fits in at most 5 'digits' */
120 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 PyLongObject *v = _PyLong_New(5);
Guido van Rossum53756b11997-01-03 17:14:46 +0000122 if (v != NULL) {
123 unsigned long t = ival;
124 int i;
125 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000126 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum53756b11997-01-03 17:14:46 +0000127 t >>= SHIFT;
128 }
129 v = long_normalize(v);
130 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000132}
133
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000134/* Create a new long int object from a C double */
135
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136PyObject *
Guido van Rossum687ec181995-03-04 22:43:47 +0000137#ifdef MPW
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138PyLong_FromDouble(double dval)
Guido van Rossum687ec181995-03-04 22:43:47 +0000139#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140PyLong_FromDouble(dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000141 double dval;
Guido van Rossum687ec181995-03-04 22:43:47 +0000142#endif /* MPW */
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000143{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000145 double frac;
146 int i, ndig, expo, neg;
147 neg = 0;
148 if (dval < 0.0) {
149 neg = 1;
150 dval = -dval;
151 }
152 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
153 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000155 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000157 if (v == NULL)
158 return NULL;
159 frac = ldexp(frac, (expo-1) % SHIFT + 1);
160 for (i = ndig; --i >= 0; ) {
161 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000162 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000163 frac = frac - (double)bits;
164 frac = ldexp(frac, SHIFT);
165 }
166 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000167 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000169}
170
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000171/* Get a C long int from a long int object.
172 Returns -1 and sets an error condition if overflow occurs. */
173
174long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175PyLong_AsLong(vv)
176 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000177{
Guido van Rossumf7531811998-05-26 14:33:37 +0000178 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000180 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000181 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000182
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 if (vv == NULL || !PyLong_Check(vv)) {
184 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000185 return -1;
186 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000188 i = v->ob_size;
189 sign = 1;
190 x = 0;
191 if (i < 0) {
192 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000193 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000194 }
195 while (--i >= 0) {
196 prev = x;
197 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000198 if ((x >> SHIFT) != prev)
199 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000200 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000201 /* Haven't lost any bits, but if the sign bit is set we're in
202 * trouble *unless* this is the min negative number. So,
203 * trouble iff sign bit set && (positive || some bit set other
204 * than the sign bit).
205 */
206 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
207 goto overflow;
208 return (long)x * sign;
209
210 overflow:
211 PyErr_SetString(PyExc_OverflowError,
212 "long int too long to convert");
213 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000214}
215
Guido van Rossum53756b11997-01-03 17:14:46 +0000216/* Get a C long int from a long int object.
217 Returns -1 and sets an error condition if overflow occurs. */
218
219unsigned long
220PyLong_AsUnsignedLong(vv)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 PyObject *vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000222{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000224 unsigned long x, prev;
225 int i;
226
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 if (vv == NULL || !PyLong_Check(vv)) {
228 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000229 return (unsigned long) -1;
230 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000232 i = v->ob_size;
233 x = 0;
234 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000236 "can't convert negative value to unsigned long");
237 return (unsigned long) -1;
238 }
239 while (--i >= 0) {
240 prev = x;
241 x = (x << SHIFT) + v->ob_digit[i];
242 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000244 "long int too long to convert");
245 return (unsigned long) -1;
246 }
247 }
248 return x;
249}
250
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000251/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000252
253double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254PyLong_AsDouble(vv)
255 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000256{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000257 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000258 double x;
259 double multiplier = (double) (1L << SHIFT);
260 int i, sign;
261
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262 if (vv == NULL || !PyLong_Check(vv)) {
263 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000264 return -1;
265 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000266 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000267 i = v->ob_size;
268 sign = 1;
269 x = 0.0;
270 if (i < 0) {
271 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000272 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000273 }
274 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000275 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000276 }
277 return x * sign;
278}
279
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000280#ifdef HAVE_LONG_LONG
281/*
282 * long long support by Chris Herborth (chrish@qnx.com)
283 *
284 * For better or worse :-), I tried to follow the coding style already
285 * here.
286 */
287
288#ifdef HAVE_LIMITS_H
289#include <limits.h>
290#endif
291
292/* Hopefully this is portable... */
293#ifndef LONG_MAX
294#define LONG_MAX 2147483647L
295#endif
296#ifndef ULONG_MAX
297#define ULONG_MAX 4294967295U
298#endif
299#ifndef LONGLONG_MAX
300#define LONGLONG_MAX 9223372036854775807LL
301#endif
302#ifndef ULONGLONG_MAX
303#define ULONGLONG_MAX 0xffffffffffffffffULL
304#endif
305
306/* Create a new long int object from a C long long int */
307
308PyObject *
309PyLong_FromLongLong(ival)
310 long long ival;
311{
312#if SIZEOF_LONG_LONG == SIZEOF_LONG
313 /* In case the compiler is faking it. */
314 return PyLong_FromLong( (long)ival );
315#else
316 if( ival <= (long long)LONG_MAX ) {
317 return PyLong_FromLong( (long)ival );
318 } else if( ival <= (unsigned long long)ULONG_MAX ) {
319 return PyLong_FromUnsignedLong( (unsigned long)ival );
320 } else {
321 /* Assume a C long long fits in at most 10 'digits'.
322 * Should be OK if we're assuming long fits in 5.
323 */
324 PyLongObject *v = _PyLong_New(10);
325
326 if (v != NULL) {
327 unsigned long long t = ival;
328 int i;
329 if (ival < 0) {
330 t = -ival;
331 v->ob_size = -(v->ob_size);
332 }
333
334 for (i = 0; i < 10; i++) {
335 v->ob_digit[i] = (digit) (t & MASK);
336 t >>= SHIFT;
337 }
338
339 v = long_normalize(v);
340 }
341
342 return (PyObject *)v;
343 }
344
345 /* If we got here, we're confused... */
346 PyErr_SetString( PyExc_ArithmeticError, "invalid long integer" );
347 return NULL;
348#endif
349}
350
351/* Create a new long int object from a C unsigned long long int */
352PyObject *
353PyLong_FromUnsignedLongLong(ival)
354 unsigned long long ival;
355{
356#if SIZEOF_LONG_LONG == SIZEOF_LONG
357 /* In case the compiler is faking it. */
358 return PyLong_FromUnsignedLong( (unsigned long)ival );
359#else
360 if( ival <= (unsigned long long)ULONG_MAX ) {
361 return PyLong_FromUnsignedLong( (unsigned long)ival );
362 } else {
363 /* Assume a C long fits in at most 10 'digits'. */
364 PyLongObject *v = _PyLong_New(10);
365
366 if (v != NULL) {
367 unsigned long long t = ival;
368 int i;
369 for (i = 0; i < 10; i++) {
370 v->ob_digit[i] = (digit) (t & MASK);
371 t >>= SHIFT;
372 }
373
374 v = long_normalize(v);
375 }
376
377 return (PyObject *)v;
378 }
379
380 /* If we got here, we're confused... */
381 PyErr_SetString( PyExc_ArithmeticError, "invalid unsigned long integer" );
382 return NULL;
383#endif
384}
385
386/* Get a C long long int from a long int object.
387 Returns -1 and sets an error condition if overflow occurs. */
388
389long long
390PyLong_AsLongLong(vv)
391 PyObject *vv;
392{
393#if SIZEOF_LONG_LONG == SIZEOF_LONG
394 /* In case the compiler is faking it. */
395 return (long long)PyLong_AsLong( vv );
396#else
397 register PyLongObject *v;
398 long long x, prev;
399 int i, sign;
400
401 if (vv == NULL || !PyLong_Check(vv)) {
402 PyErr_BadInternalCall();
403 return -1;
404 }
405
406 v = (PyLongObject *)vv;
407 i = v->ob_size;
408 sign = 1;
409 x = 0;
410
411 if (i < 0) {
412 sign = -1;
413 i = -(i);
414 }
415
416 while (--i >= 0) {
417 prev = x;
418 x = (x << SHIFT) + v->ob_digit[i];
419 if ((x >> SHIFT) != prev) {
420 PyErr_SetString(PyExc_OverflowError,
421 "long int too long to convert");
422 return -1;
423 }
424 }
425
426 return x * sign;
427#endif
428}
429
430unsigned long long
431PyLong_AsUnsignedLongLong(vv)
432 PyObject *vv;
433{
434#if SIZEOF_LONG_LONG == 4
435 /* In case the compiler is faking it. */
436 return (unsigned long long)PyLong_AsUnsignedLong( vv );
437#else
438 register PyLongObject *v;
439 unsigned long long x, prev;
440 int i;
441
442 if (vv == NULL || !PyLong_Check(vv)) {
443 PyErr_BadInternalCall();
444 return (unsigned long long) -1;
445 }
446
447 v = (PyLongObject *)vv;
448 i = v->ob_size;
449 x = 0;
450
451 if (i < 0) {
452 PyErr_SetString(PyExc_OverflowError,
453 "can't convert negative value to unsigned long");
454 return (unsigned long long) -1;
455 }
456
457 while (--i >= 0) {
458 prev = x;
459 x = (x << SHIFT) + v->ob_digit[i];
460 if ((x >> SHIFT) != prev) {
461 PyErr_SetString(PyExc_OverflowError,
462 "long int too long to convert");
463 return (unsigned long long) -1;
464 }
465 }
466
467 return x;
468#endif
469}
470#endif /* HAVE_LONG_LONG */
471
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000472/* Multiply by a single digit, ignoring the sign. */
473
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000475mul1(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000477 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000478{
479 return muladd1(a, n, (digit)0);
480}
481
482/* Multiply by a single digit and add a single digit, ignoring the sign. */
483
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000485muladd1(a, n, extra)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000487 wdigit n;
488 wdigit extra;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000489{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000490 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000492 twodigits carry = extra;
493 int i;
494
495 if (z == NULL)
496 return NULL;
497 for (i = 0; i < size_a; ++i) {
498 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000499 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000500 carry >>= SHIFT;
501 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000502 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000503 return long_normalize(z);
504}
505
506/* Divide a long integer by a digit, returning both the quotient
507 (as function result) and the remainder (through *prem).
508 The sign of a is ignored; n should not be zero. */
509
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000511divrem1(a, n, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000513 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000514 digit *prem;
515{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000516 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000518 int i;
519 twodigits rem = 0;
520
521 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000523 if (z == NULL)
524 return NULL;
525 for (i = size; --i >= 0; ) {
526 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000527 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000528 rem %= n;
529 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000530 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000531 return long_normalize(z);
532}
533
534/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000535 Return a string object.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000536 If base is 8 or 16, add the proper prefix '0' or '0x'.
537 External linkage: used in bltinmodule.c by hex() and oct(). */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000538
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +0000540long_format(aa, base)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541 PyObject *aa;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000542 int base;
543{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544 register PyLongObject *a = (PyLongObject *)aa;
545 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000546 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000547 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000548 char *p;
549 int bits;
550 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000551
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000552 if (a == NULL || !PyLong_Check(a)) {
553 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000554 return NULL;
555 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000556 assert(base >= 2 && base <= 36);
557
558 /* Compute a rough upper bound for the length of the string */
559 i = base;
560 bits = 0;
561 while (i > 1) {
562 ++bits;
563 i >>= 1;
564 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000565 i = 6 + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000567 if (str == NULL)
568 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000570 *p = '\0';
Guido van Rossumc6913e71991-11-19 20:26:46 +0000571 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000572 if (a->ob_size < 0)
573 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000574
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575 Py_INCREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000576 do {
577 digit rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 PyLongObject *temp = divrem1(a, (digit)base, &rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000579 if (temp == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580 Py_DECREF(a);
581 Py_DECREF(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000582 return NULL;
583 }
584 if (rem < 10)
585 rem += '0';
586 else
587 rem += 'A'-10;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 assert(p > PyString_AS_STRING(str));
Guido van Rossum2095d241997-04-09 19:41:24 +0000589 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000591 a = temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000592 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593 Py_DECREF(a);
594 Py_DECREF(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000595 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000596 })
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000597 } while (ABS(a->ob_size) != 0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 Py_DECREF(a);
Guido van Rossum2c475421992-08-14 15:13:07 +0000599 if (base == 8) {
600 if (size_a != 0)
601 *--p = '0';
602 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000603 else if (base == 16) {
604 *--p = 'x';
605 *--p = '0';
606 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000607 else if (base != 10) {
608 *--p = '#';
609 *--p = '0' + base%10;
610 if (base > 10)
611 *--p = '0' + base/10;
612 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000613 if (sign)
614 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 if (p != PyString_AS_STRING(str)) {
616 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000617 assert(p > q);
618 do {
619 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000620 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 _PyString_Resize((PyObject **)&str,
622 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000623 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000625}
626
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000627#if 0
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000628/* Convert a string to a long int object, in a given base.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000629 Base zero implies a default depending on the number.
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000630 External linkage: used in compile.c and stropmodule.c. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000631
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000633long_scan(str, base)
634 char *str;
635 int base;
636{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 return PyLong_FromString(str, (char **)NULL, base);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000638}
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000639#endif
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000640
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641PyObject *
642PyLong_FromString(str, pend, base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000643 char *str;
644 char **pend;
645 int base;
646{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000647 int sign = 1;
Guido van Rossume6762971998-06-22 03:54:46 +0000648 char *start;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000650
Guido van Rossum472c04f1996-12-05 21:57:21 +0000651 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 PyErr_SetString(PyExc_ValueError,
653 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000654 return NULL;
655 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000656 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000657 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000658 if (*str == '+')
659 ++str;
660 else if (*str == '-') {
661 ++str;
662 sign = -1;
663 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000664 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000665 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000666 if (base == 0) {
667 if (str[0] != '0')
668 base = 10;
669 else if (str[1] == 'x' || str[1] == 'X')
670 base = 16;
671 else
672 base = 8;
673 }
674 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
675 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000677 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000678 for ( ; z != NULL; ++str) {
679 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000681
682 if (*str <= '9')
683 k = *str - '0';
684 else if (*str >= 'a')
685 k = *str - 'a' + 10;
686 else if (*str >= 'A')
687 k = *str - 'A' + 10;
688 if (k < 0 || k >= base)
689 break;
690 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000692 z = temp;
693 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000694 if (z == NULL)
695 return NULL;
Guido van Rossume6762971998-06-22 03:54:46 +0000696 if (str == start) {
697 PyErr_SetString(PyExc_ValueError,
698 "no digits in long int constant");
699 return NULL;
700 }
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 Rossumeb1fafc1994-08-29 12:47:19 +0000703 if (pend)
704 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705 return (PyObject *) z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000706}
707
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708static PyLongObject *x_divrem
709 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject **));
710static PyObject *long_pos Py_PROTO((PyLongObject *));
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000711static int long_divrem Py_PROTO((PyLongObject *, PyLongObject *,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000712 PyLongObject **, PyLongObject **));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000713
714/* Long division with remainder, top-level routine */
715
Guido van Rossume32e0141992-01-19 16:31:05 +0000716static int
717long_divrem(a, b, pdiv, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 PyLongObject *a, *b;
719 PyLongObject **pdiv;
720 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000721{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000722 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000724
725 if (size_b == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000726 PyErr_SetString(PyExc_ZeroDivisionError, "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000727 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000728 }
729 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000730 (size_a == size_b &&
731 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000732 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000733 *pdiv = _PyLong_New(0);
734 Py_INCREF(a);
735 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000736 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000737 }
738 if (size_b == 1) {
739 digit rem = 0;
740 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000741 if (z == NULL)
742 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000743 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000744 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000745 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000746 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000747 if (z == NULL)
748 return -1;
749 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000750 /* Set the signs.
751 The quotient z has the sign of a*b;
752 the remainder r has the sign of a,
753 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000754 if ((a->ob_size < 0) != (b->ob_size < 0))
755 z->ob_size = -(z->ob_size);
756 if (a->ob_size < 0 && (*prem)->ob_size != 0)
757 (*prem)->ob_size = -((*prem)->ob_size);
758 *pdiv = z;
759 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000760}
761
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000762/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000763
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000765x_divrem(v1, w1, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 PyLongObject *v1, *w1;
767 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000768{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000769 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000770 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000771 PyLongObject *v = mul1(v1, d);
772 PyLongObject *w = mul1(w1, d);
773 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000774 int j, k;
775
776 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 Py_XDECREF(v);
778 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000779 return NULL;
780 }
781
782 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000783 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000784 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000785
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000786 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000788
789 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
790 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
791 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000792 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000793 int i;
794
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000795 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000796 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000797 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000798 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000799 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000800 if (vj == w->ob_digit[size_w-1])
801 q = MASK;
802 else
803 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
804 w->ob_digit[size_w-1];
805
806 while (w->ob_digit[size_w-2]*q >
807 ((
808 ((twodigits)vj << SHIFT)
809 + v->ob_digit[j-1]
810 - q*w->ob_digit[size_w-1]
811 ) << SHIFT)
812 + v->ob_digit[j-2])
813 --q;
814
815 for (i = 0; i < size_w && i+k < size_v; ++i) {
816 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000817 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818 carry += v->ob_digit[i+k] - z
819 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000820 v->ob_digit[i+k] = carry & MASK;
821 carry = (carry >> SHIFT) - zz;
822 }
823
824 if (i+k < size_v) {
825 carry += v->ob_digit[i+k];
826 v->ob_digit[i+k] = 0;
827 }
828
829 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000830 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000831 else {
832 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000833 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000834 carry = 0;
835 for (i = 0; i < size_w && i+k < size_v; ++i) {
836 carry += v->ob_digit[i+k] + w->ob_digit[i];
837 v->ob_digit[i+k] = carry & MASK;
838 carry >>= SHIFT;
839 }
840 }
841 } /* for j, k */
842
Guido van Rossumc206c761995-01-10 15:23:19 +0000843 if (a == NULL)
844 *prem = NULL;
845 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000846 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000847 *prem = divrem1(v, d, &d);
848 /* d receives the (unused) remainder */
849 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000850 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000851 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000852 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000853 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 Py_DECREF(v);
855 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000856 return a;
857}
858
859/* Methods */
860
Guido van Rossume32e0141992-01-19 16:31:05 +0000861/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862static void long_dealloc Py_PROTO((PyObject *));
863static PyObject *long_repr Py_PROTO((PyObject *));
864static int long_compare Py_PROTO((PyLongObject *, PyLongObject *));
865static long long_hash Py_PROTO((PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000866
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000867static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *));
868static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *));
869static PyObject *long_mul Py_PROTO((PyLongObject *, PyLongObject *));
870static PyObject *long_div Py_PROTO((PyLongObject *, PyLongObject *));
871static PyObject *long_mod Py_PROTO((PyLongObject *, PyLongObject *));
872static PyObject *long_divmod Py_PROTO((PyLongObject *, PyLongObject *));
873static PyObject *long_pow
874 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject *));
875static PyObject *long_neg Py_PROTO((PyLongObject *));
876static PyObject *long_pos Py_PROTO((PyLongObject *));
877static PyObject *long_abs Py_PROTO((PyLongObject *));
878static int long_nonzero Py_PROTO((PyLongObject *));
879static PyObject *long_invert Py_PROTO((PyLongObject *));
880static PyObject *long_lshift Py_PROTO((PyLongObject *, PyLongObject *));
881static PyObject *long_rshift Py_PROTO((PyLongObject *, PyLongObject *));
882static PyObject *long_and Py_PROTO((PyLongObject *, PyLongObject *));
883static PyObject *long_xor Py_PROTO((PyLongObject *, PyLongObject *));
884static PyObject *long_or Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000885
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000886static void
887long_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000889{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000890 PyMem_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000891}
892
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000894long_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000896{
Guido van Rossum8b27d921992-03-27 17:27:05 +0000897 return long_format(v, 10);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000898}
899
900static int
901long_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000903{
904 int sign;
905
Guido van Rossumc6913e71991-11-19 20:26:46 +0000906 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000907 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +0000908 sign = 0;
909 else
910 sign = a->ob_size - b->ob_size;
911 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000912 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000913 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000914 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
915 ;
916 if (i < 0)
917 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000918 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000919 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000920 if (a->ob_size < 0)
921 sign = -sign;
922 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000923 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000924 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000925}
926
Guido van Rossum9bfef441993-03-29 10:43:31 +0000927static long
928long_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 PyLongObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000930{
931 long x;
932 int i, sign;
933
934 /* This is designed so that Python ints and longs with the
935 same value hash to the same value, otherwise comparisons
936 of mapping keys will turn out weird */
937 i = v->ob_size;
938 sign = 1;
939 x = 0;
940 if (i < 0) {
941 sign = -1;
942 i = -(i);
943 }
944 while (--i >= 0) {
945 /* Force a 32-bit circular shift */
946 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
947 x += v->ob_digit[i];
948 }
949 x = x * sign;
950 if (x == -1)
951 x = -2;
952 return x;
953}
954
955
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000956/* Add the absolute values of two long integers. */
957
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958static PyLongObject *x_add Py_PROTO((PyLongObject *, PyLongObject *));
959static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000960x_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000962{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000963 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000964 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000965 int i;
966 digit carry = 0;
967
968 /* Ensure a is the larger of the two: */
969 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 { PyLongObject *temp = a; a = b; b = temp; }
971 { int size_temp = size_a;
972 size_a = size_b;
973 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000974 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000975 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000976 if (z == NULL)
977 return NULL;
978 for (i = 0; i < size_b; ++i) {
979 carry += a->ob_digit[i] + b->ob_digit[i];
980 z->ob_digit[i] = carry & MASK;
981 /* The following assumes unsigned shifts don't
982 propagate the sign bit. */
983 carry >>= SHIFT;
984 }
985 for (; i < size_a; ++i) {
986 carry += a->ob_digit[i];
987 z->ob_digit[i] = carry & MASK;
988 carry >>= SHIFT;
989 }
990 z->ob_digit[i] = carry;
991 return long_normalize(z);
992}
993
994/* Subtract the absolute values of two integers. */
995
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996static PyLongObject *x_sub Py_PROTO((PyLongObject *, PyLongObject *));
997static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000998x_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001000{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001001 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001003 int i;
1004 int sign = 1;
1005 digit borrow = 0;
1006
1007 /* Ensure a is the larger of the two: */
1008 if (size_a < size_b) {
1009 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001010 { PyLongObject *temp = a; a = b; b = temp; }
1011 { int size_temp = size_a;
1012 size_a = size_b;
1013 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001014 }
1015 else if (size_a == size_b) {
1016 /* Find highest digit where a and b differ: */
1017 i = size_a;
1018 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1019 ;
1020 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001022 if (a->ob_digit[i] < b->ob_digit[i]) {
1023 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001024 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001025 }
1026 size_a = size_b = i+1;
1027 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001029 if (z == NULL)
1030 return NULL;
1031 for (i = 0; i < size_b; ++i) {
1032 /* The following assumes unsigned arithmetic
1033 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001034 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001035 z->ob_digit[i] = borrow & MASK;
1036 borrow >>= SHIFT;
1037 borrow &= 1; /* Keep only one sign bit */
1038 }
1039 for (; i < size_a; ++i) {
1040 borrow = a->ob_digit[i] - borrow;
1041 z->ob_digit[i] = borrow & MASK;
1042 borrow >>= SHIFT;
1043 }
1044 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001045 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001046 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001047 return long_normalize(z);
1048}
1049
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001051long_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052 PyLongObject *a;
1053 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 *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001076long_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001077 PyLongObject *a;
1078 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001079{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001081
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001082 if (a->ob_size < 0) {
1083 if (b->ob_size < 0)
1084 z = x_sub(a, b);
1085 else
1086 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001087 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001088 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001089 }
1090 else {
1091 if (b->ob_size < 0)
1092 z = x_add(a, b);
1093 else
1094 z = x_sub(a, b);
1095 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001096 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001097}
1098
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001100long_mul(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001101 PyLongObject *a;
1102 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001103{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001104 int size_a;
1105 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001106 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001107 int i;
1108
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001109 size_a = ABS(a->ob_size);
1110 size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001111 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001112 if (z == NULL)
1113 return NULL;
1114 for (i = 0; i < z->ob_size; ++i)
1115 z->ob_digit[i] = 0;
1116 for (i = 0; i < size_a; ++i) {
1117 twodigits carry = 0;
1118 twodigits f = a->ob_digit[i];
1119 int j;
1120
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001121 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001122 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001123 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001124 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001125 for (j = 0; j < size_b; ++j) {
1126 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001127 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001128 carry >>= SHIFT;
1129 }
1130 for (; carry != 0; ++j) {
1131 assert(i+j < z->ob_size);
1132 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001133 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001134 carry >>= SHIFT;
1135 }
1136 }
1137 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001138 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001139 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001140 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001142}
1143
Guido van Rossume32e0141992-01-19 16:31:05 +00001144/* The / and % operators are now defined in terms of divmod().
1145 The expression a mod b has the value a - b*floor(a/b).
1146 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001147 |a| by |b|, with the sign of a. This is also expressed
1148 as a - b*trunc(a/b), if trunc truncates towards zero.
1149 Some examples:
1150 a b a rem b a mod b
1151 13 10 3 3
1152 -13 10 -3 7
1153 13 -10 3 -7
1154 -13 -10 -3 -3
1155 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001156 have different signs. We then subtract one from the 'div'
1157 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001158
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001159static int l_divmod Py_PROTO((PyLongObject *, PyLongObject *,
1160 PyLongObject **, PyLongObject **));
Guido van Rossume32e0141992-01-19 16:31:05 +00001161static int
1162l_divmod(v, w, pdiv, pmod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001163 PyLongObject *v;
1164 PyLongObject *w;
1165 PyLongObject **pdiv;
1166 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 *
Guido van Rossume32e0141992-01-19 16:31:05 +00001201long_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202 PyLongObject *v;
1203 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001204{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001205 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001206 if (l_divmod(v, w, &div, &mod) < 0)
1207 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001208 Py_DECREF(mod);
1209 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001210}
1211
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001213long_mod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001214 PyLongObject *v;
1215 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001216{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001217 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001218 if (l_divmod(v, w, &div, &mod) < 0)
1219 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220 Py_DECREF(div);
1221 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001222}
1223
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001224static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001225long_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001226 PyLongObject *v;
1227 PyLongObject *w;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001228{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001229 PyObject *z;
1230 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001231 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001232 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001233 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001234 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001235 PyTuple_SetItem(z, 0, (PyObject *) div);
1236 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001237 }
1238 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239 Py_DECREF(div);
1240 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001241 }
1242 return z;
1243}
1244
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001245static PyObject *
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001246long_pow(a, b, c)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001247 PyLongObject *a;
1248 PyLongObject *b;
1249 PyLongObject *c;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001250{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001251 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001252 int size_b, i;
1253
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001254 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001255 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256 PyErr_SetString(PyExc_ValueError,
1257 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001258 return NULL;
1259 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001260 z = (PyLongObject *)PyLong_FromLong(1L);
1261 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001262 for (i = 0; i < size_b; ++i) {
1263 digit bi = b->ob_digit[i];
1264 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001265
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001266 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001267 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001268
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001269 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001270 temp = (PyLongObject *)long_mul(z, a);
1271 Py_DECREF(z);
1272 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001273 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001274 Py_XDECREF(div);
1275 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001276 temp = mod;
1277 }
1278 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001279 if (z == NULL)
1280 break;
1281 }
1282 bi >>= 1;
1283 if (bi == 0 && i+1 == size_b)
1284 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 temp = (PyLongObject *)long_mul(a, a);
1286 Py_DECREF(a);
1287 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001288 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001289 Py_XDECREF(div);
1290 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001291 temp = mod;
1292 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001293 a = temp;
1294 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001295 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001296 z = NULL;
1297 break;
1298 }
1299 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001300 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001301 break;
1302 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303 Py_XDECREF(a);
1304 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001305 l_divmod(z, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 Py_XDECREF(div);
1307 Py_DECREF(z);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001308 z=mod;
1309 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001310 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001311}
1312
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001313static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001314long_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001316{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001317 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001318 PyLongObject *x;
1319 PyLongObject *w;
1320 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001321 if (w == NULL)
1322 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001323 x = (PyLongObject *) long_add(v, w);
1324 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001325 if (x == NULL)
1326 return NULL;
1327 if (x->ob_size != 0)
1328 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001329 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001330}
1331
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001332static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001333long_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001335{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336 Py_INCREF(v);
1337 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001338}
1339
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001341long_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001343{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001344 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001345 int i, n;
1346 n = ABS(v->ob_size);
1347 if (n == 0) {
1348 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001349 Py_INCREF(v);
1350 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001351 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001352 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001353 if (z == NULL)
1354 return NULL;
1355 for (i = 0; i < n; i++)
1356 z->ob_digit[i] = v->ob_digit[i];
1357 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001359}
1360
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001361static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001362long_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001364{
1365 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001366 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001367 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001368 Py_INCREF(v);
1369 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001370 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001371}
1372
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001373static int
1374long_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 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 *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001381long_rshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382 PyLongObject *a;
1383 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001384{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001386 long shiftby;
1387 int newsize, wordshift, loshift, hishift, i, j;
1388 digit lomask, himask;
1389
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001390 if (a->ob_size < 0) {
1391 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001392 PyLongObject *a1, *a2, *a3;
1393 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001394 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001395 a2 = (PyLongObject *) long_rshift(a1, b);
1396 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001397 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 a3 = (PyLongObject *) long_invert(a2);
1399 Py_DECREF(a2);
1400 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001401 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001402
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001403 shiftby = PyLong_AsLong((PyObject *)b);
1404 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001405 return NULL;
1406 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001407 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001408 return NULL;
1409 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001410 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001411 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001412 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001413 z = _PyLong_New(0);
1414 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001415 }
1416 loshift = shiftby % SHIFT;
1417 hishift = SHIFT - loshift;
1418 lomask = ((digit)1 << hishift) - 1;
1419 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001420 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001421 if (z == NULL)
1422 return NULL;
1423 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001424 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001425 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1426 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1427 if (i+1 < newsize)
1428 z->ob_digit[i] |=
1429 (a->ob_digit[j+1] << hishift) & himask;
1430 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001431 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001432}
1433
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001434static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001435long_lshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001436 PyLongObject *a;
1437 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 *long_bitwise Py_PROTO((PyLongObject *, int, PyLongObject *));
1492static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001493long_bitwise(a, op, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001494 PyLongObject *a;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001495 int op; /* '&', '|', '^' */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001496 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001497{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001498 digit maska, maskb; /* 0 or MASK */
1499 int negz;
1500 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001501 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001502 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001503 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001504 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001505
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001506 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001507 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001508 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001509 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001510 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001511 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001512 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001513 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001514 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001515 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001516 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001517 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001518 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001519 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001520 maskb = 0;
1521 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001522
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001523 size_a = a->ob_size;
1524 size_b = b->ob_size;
1525 size_z = MAX(size_a, size_b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001526 z = _PyLong_New(size_z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001527 if (a == NULL || b == NULL || z == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001528 Py_XDECREF(a);
1529 Py_XDECREF(b);
1530 Py_XDECREF(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001531 return NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001532 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001533
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001534 negz = 0;
1535 switch (op) {
1536 case '^':
1537 if (maska != maskb) {
1538 maska ^= MASK;
1539 negz = -1;
1540 }
1541 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001542 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001543 if (maska && maskb) {
1544 op = '|';
1545 maska ^= MASK;
1546 maskb ^= MASK;
1547 negz = -1;
1548 }
1549 break;
1550 case '|':
1551 if (maska || maskb) {
1552 op = '&';
1553 maska ^= MASK;
1554 maskb ^= MASK;
1555 negz = -1;
1556 }
1557 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001558 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001559
1560 for (i = 0; i < size_z; ++i) {
1561 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1562 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1563 switch (op) {
1564 case '&': z->ob_digit[i] = diga & digb; break;
1565 case '|': z->ob_digit[i] = diga | digb; break;
1566 case '^': z->ob_digit[i] = diga ^ digb; break;
1567 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001568 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001569
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001570 Py_DECREF(a);
1571 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001572 z = long_normalize(z);
1573 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001575 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001576 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001577 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001578}
1579
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001580static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001581long_and(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001582 PyLongObject *a;
1583 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001584{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001585 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001586}
1587
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001588static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001589long_xor(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001590 PyLongObject *a;
1591 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001592{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001593 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001594}
1595
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001596static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001597long_or(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001598 PyLongObject *a;
1599 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 Rossum23d6f0e1991-05-14 12:06:49 +00001602}
1603
Guido van Rossum234f9421993-06-17 12:35:49 +00001604static int
Guido van Rossume6eefc21992-08-14 12:06:52 +00001605long_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001606 PyObject **pv;
1607 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 *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001618long_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001619 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001620{
1621 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001622 x = PyLong_AsLong(v);
1623 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001624 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001625 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001626}
1627
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001628static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001629long_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001630 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001631{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001632 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001633 return v;
1634}
1635
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001636static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001637long_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001638 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001639{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001640 double result;
1641 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001642 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001643 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001644 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001645}
1646
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001647static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001648long_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001649 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001650{
1651 return long_format(v, 8);
1652}
1653
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001654static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001655long_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001656 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001657{
1658 return long_format(v, 16);
1659}
1660
1661
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001662#define UF (unaryfunc)
1663#define BF (binaryfunc)
1664#define TF (ternaryfunc)
1665#define IF (inquiry)
Guido van Rossum8b27d921992-03-27 17:27:05 +00001666
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001667static PyNumberMethods long_as_number = {
Guido van Rossum8b27d921992-03-27 17:27:05 +00001668 BF long_add, /*nb_add*/
1669 BF long_sub, /*nb_subtract*/
1670 BF long_mul, /*nb_multiply*/
1671 BF long_div, /*nb_divide*/
1672 BF long_mod, /*nb_remainder*/
1673 BF long_divmod, /*nb_divmod*/
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001674 TF long_pow, /*nb_power*/
Guido van Rossum8b27d921992-03-27 17:27:05 +00001675 UF long_neg, /*nb_negative*/
1676 UF long_pos, /*tp_positive*/
1677 UF long_abs, /*tp_absolute*/
1678 IF long_nonzero,/*tp_nonzero*/
1679 UF long_invert, /*nb_invert*/
1680 BF long_lshift, /*nb_lshift*/
1681 BF long_rshift, /*nb_rshift*/
1682 BF long_and, /*nb_and*/
1683 BF long_xor, /*nb_xor*/
1684 BF long_or, /*nb_or*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001685 (int (*) Py_FPROTO((PyObject **, PyObject **)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001686 (coercion)long_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001687 UF long_int, /*nb_int*/
1688 UF long_long, /*nb_long*/
1689 UF long_float, /*nb_float*/
1690 UF long_oct, /*nb_oct*/
1691 UF long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001692};
1693
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001694PyTypeObject PyLong_Type = {
1695 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001696 0,
1697 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001698 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001699 sizeof(digit),
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001700 (destructor)long_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001701 0, /*tp_print*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001702 0, /*tp_getattr*/
1703 0, /*tp_setattr*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001704 (int (*) Py_FPROTO((PyObject *, PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001705 (cmpfunc)long_compare, /*tp_compare*/
1706 (reprfunc)long_repr, /*tp_repr*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001707 &long_as_number,/*tp_as_number*/
1708 0, /*tp_as_sequence*/
1709 0, /*tp_as_mapping*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001710 (long (*) Py_FPROTO((PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001711 (hashfunc)long_hash, /*tp_hash*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001712};