blob: d95e86cf796c51311c8cc0efbf663ba7ec91cc32 [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 Rossumc0b618a1997-05-02 03:12:38 +0000178 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000179 long x, prev;
180 int i, sign;
181
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 if (vv == NULL || !PyLong_Check(vv)) {
183 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000184 return -1;
185 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000187 i = v->ob_size;
188 sign = 1;
189 x = 0;
190 if (i < 0) {
191 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000192 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000193 }
194 while (--i >= 0) {
195 prev = x;
196 x = (x << SHIFT) + v->ob_digit[i];
197 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000199 "long int too long to convert");
200 return -1;
201 }
202 }
203 return x * sign;
204}
205
Guido van Rossum53756b11997-01-03 17:14:46 +0000206/* Get a C long int from a long int object.
207 Returns -1 and sets an error condition if overflow occurs. */
208
209unsigned long
210PyLong_AsUnsignedLong(vv)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000211 PyObject *vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000212{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000214 unsigned long x, prev;
215 int i;
216
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 if (vv == NULL || !PyLong_Check(vv)) {
218 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000219 return (unsigned long) -1;
220 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000222 i = v->ob_size;
223 x = 0;
224 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000226 "can't convert negative value to unsigned long");
227 return (unsigned long) -1;
228 }
229 while (--i >= 0) {
230 prev = x;
231 x = (x << SHIFT) + v->ob_digit[i];
232 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000234 "long int too long to convert");
235 return (unsigned long) -1;
236 }
237 }
238 return x;
239}
240
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000241/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000242
243double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244PyLong_AsDouble(vv)
245 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000246{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000247 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000248 double x;
249 double multiplier = (double) (1L << SHIFT);
250 int i, sign;
251
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000252 if (vv == NULL || !PyLong_Check(vv)) {
253 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000254 return -1;
255 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000257 i = v->ob_size;
258 sign = 1;
259 x = 0.0;
260 if (i < 0) {
261 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000262 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000263 }
264 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000265 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000266 }
267 return x * sign;
268}
269
270/* Multiply by a single digit, ignoring the sign. */
271
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000272static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000273mul1(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000274 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000275 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000276{
277 return muladd1(a, n, (digit)0);
278}
279
280/* Multiply by a single digit and add a single digit, ignoring the sign. */
281
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000283muladd1(a, n, extra)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000284 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000285 wdigit n;
286 wdigit extra;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000287{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000288 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000290 twodigits carry = extra;
291 int i;
292
293 if (z == NULL)
294 return NULL;
295 for (i = 0; i < size_a; ++i) {
296 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000297 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000298 carry >>= SHIFT;
299 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000300 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000301 return long_normalize(z);
302}
303
304/* Divide a long integer by a digit, returning both the quotient
305 (as function result) and the remainder (through *prem).
306 The sign of a is ignored; n should not be zero. */
307
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000309divrem1(a, n, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000310 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000311 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000312 digit *prem;
313{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000314 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000316 int i;
317 twodigits rem = 0;
318
319 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000321 if (z == NULL)
322 return NULL;
323 for (i = size; --i >= 0; ) {
324 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000325 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000326 rem %= n;
327 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000328 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000329 return long_normalize(z);
330}
331
332/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000333 Return a string object.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000334 If base is 8 or 16, add the proper prefix '0' or '0x'.
335 External linkage: used in bltinmodule.c by hex() and oct(). */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000336
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +0000338long_format(aa, base)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 PyObject *aa;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000340 int base;
341{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342 register PyLongObject *a = (PyLongObject *)aa;
343 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000344 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000345 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000346 char *p;
347 int bits;
348 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000349
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350 if (a == NULL || !PyLong_Check(a)) {
351 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000352 return NULL;
353 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000354 assert(base >= 2 && base <= 36);
355
356 /* Compute a rough upper bound for the length of the string */
357 i = base;
358 bits = 0;
359 while (i > 1) {
360 ++bits;
361 i >>= 1;
362 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000363 i = 6 + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000365 if (str == NULL)
366 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000367 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000368 *p = '\0';
Guido van Rossumc6913e71991-11-19 20:26:46 +0000369 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000370 if (a->ob_size < 0)
371 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000372
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 Py_INCREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000374 do {
375 digit rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000376 PyLongObject *temp = divrem1(a, (digit)base, &rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000377 if (temp == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000378 Py_DECREF(a);
379 Py_DECREF(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000380 return NULL;
381 }
382 if (rem < 10)
383 rem += '0';
384 else
385 rem += 'A'-10;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 assert(p > PyString_AS_STRING(str));
Guido van Rossum2095d241997-04-09 19:41:24 +0000387 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000388 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000389 a = temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000390 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391 Py_DECREF(a);
392 Py_DECREF(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000393 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000394 })
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000395 } while (ABS(a->ob_size) != 0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 Py_DECREF(a);
Guido van Rossum2c475421992-08-14 15:13:07 +0000397 if (base == 8) {
398 if (size_a != 0)
399 *--p = '0';
400 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000401 else if (base == 16) {
402 *--p = 'x';
403 *--p = '0';
404 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000405 else if (base != 10) {
406 *--p = '#';
407 *--p = '0' + base%10;
408 if (base > 10)
409 *--p = '0' + base/10;
410 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000411 if (sign)
412 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 if (p != PyString_AS_STRING(str)) {
414 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000415 assert(p > q);
416 do {
417 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000418 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 _PyString_Resize((PyObject **)&str,
420 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000421 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000423}
424
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000425#if 0
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000426/* Convert a string to a long int object, in a given base.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000427 Base zero implies a default depending on the number.
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000428 External linkage: used in compile.c and stropmodule.c. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000429
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000431long_scan(str, base)
432 char *str;
433 int base;
434{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435 return PyLong_FromString(str, (char **)NULL, base);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000436}
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000437#endif
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000438
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439PyObject *
440PyLong_FromString(str, pend, base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000441 char *str;
442 char **pend;
443 int base;
444{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000445 int sign = 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000447
Guido van Rossum472c04f1996-12-05 21:57:21 +0000448 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 PyErr_SetString(PyExc_ValueError,
450 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000451 return NULL;
452 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000453 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000454 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000455 if (*str == '+')
456 ++str;
457 else if (*str == '-') {
458 ++str;
459 sign = -1;
460 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000461 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000462 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000463 if (base == 0) {
464 if (str[0] != '0')
465 base = 10;
466 else if (str[1] == 'x' || str[1] == 'X')
467 base = 16;
468 else
469 base = 8;
470 }
471 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
472 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 z = _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000474 for ( ; z != NULL; ++str) {
475 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000477
478 if (*str <= '9')
479 k = *str - '0';
480 else if (*str >= 'a')
481 k = *str - 'a' + 10;
482 else if (*str >= 'A')
483 k = *str - 'A' + 10;
484 if (k < 0 || k >= base)
485 break;
486 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000488 z = temp;
489 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000490 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000491 z->ob_size = -(z->ob_size);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000492 if (pend)
493 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 return (PyObject *) z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000495}
496
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000497static PyLongObject *x_divrem
498 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject **));
499static PyObject *long_pos Py_PROTO((PyLongObject *));
500static long_divrem Py_PROTO((PyLongObject *, PyLongObject *,
501 PyLongObject **, PyLongObject **));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000502
503/* Long division with remainder, top-level routine */
504
Guido van Rossume32e0141992-01-19 16:31:05 +0000505static int
506long_divrem(a, b, pdiv, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507 PyLongObject *a, *b;
508 PyLongObject **pdiv;
509 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000510{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000511 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000513
514 if (size_b == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 PyErr_SetString(PyExc_ZeroDivisionError, "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000516 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000517 }
518 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000519 (size_a == size_b &&
520 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000521 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 *pdiv = _PyLong_New(0);
523 Py_INCREF(a);
524 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000525 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000526 }
527 if (size_b == 1) {
528 digit rem = 0;
529 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000530 if (z == NULL)
531 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000533 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000534 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000535 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000536 if (z == NULL)
537 return -1;
538 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000539 /* Set the signs.
540 The quotient z has the sign of a*b;
541 the remainder r has the sign of a,
542 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000543 if ((a->ob_size < 0) != (b->ob_size < 0))
544 z->ob_size = -(z->ob_size);
545 if (a->ob_size < 0 && (*prem)->ob_size != 0)
546 (*prem)->ob_size = -((*prem)->ob_size);
547 *pdiv = z;
548 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000549}
550
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000551/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000552
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000554x_divrem(v1, w1, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 PyLongObject *v1, *w1;
556 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000557{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000558 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000559 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 PyLongObject *v = mul1(v1, d);
561 PyLongObject *w = mul1(w1, d);
562 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000563 int j, k;
564
565 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 Py_XDECREF(v);
567 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000568 return NULL;
569 }
570
571 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000572 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000573 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000574
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000575 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000577
578 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
579 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
580 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000581 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000582 int i;
583
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000584 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000586 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000587 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000588 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000589 if (vj == w->ob_digit[size_w-1])
590 q = MASK;
591 else
592 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
593 w->ob_digit[size_w-1];
594
595 while (w->ob_digit[size_w-2]*q >
596 ((
597 ((twodigits)vj << SHIFT)
598 + v->ob_digit[j-1]
599 - q*w->ob_digit[size_w-1]
600 ) << SHIFT)
601 + v->ob_digit[j-2])
602 --q;
603
604 for (i = 0; i < size_w && i+k < size_v; ++i) {
605 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000606 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607 carry += v->ob_digit[i+k] - z
608 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000609 v->ob_digit[i+k] = carry & MASK;
610 carry = (carry >> SHIFT) - zz;
611 }
612
613 if (i+k < size_v) {
614 carry += v->ob_digit[i+k];
615 v->ob_digit[i+k] = 0;
616 }
617
618 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000619 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000620 else {
621 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000622 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000623 carry = 0;
624 for (i = 0; i < size_w && i+k < size_v; ++i) {
625 carry += v->ob_digit[i+k] + w->ob_digit[i];
626 v->ob_digit[i+k] = carry & MASK;
627 carry >>= SHIFT;
628 }
629 }
630 } /* for j, k */
631
Guido van Rossumc206c761995-01-10 15:23:19 +0000632 if (a == NULL)
633 *prem = NULL;
634 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000635 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000636 *prem = divrem1(v, d, &d);
637 /* d receives the (unused) remainder */
638 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000640 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000641 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000642 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643 Py_DECREF(v);
644 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000645 return a;
646}
647
648/* Methods */
649
Guido van Rossume32e0141992-01-19 16:31:05 +0000650/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651static void long_dealloc Py_PROTO((PyObject *));
652static PyObject *long_repr Py_PROTO((PyObject *));
653static int long_compare Py_PROTO((PyLongObject *, PyLongObject *));
654static long long_hash Py_PROTO((PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000655
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *));
657static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *));
658static PyObject *long_mul Py_PROTO((PyLongObject *, PyLongObject *));
659static PyObject *long_div Py_PROTO((PyLongObject *, PyLongObject *));
660static PyObject *long_mod Py_PROTO((PyLongObject *, PyLongObject *));
661static PyObject *long_divmod Py_PROTO((PyLongObject *, PyLongObject *));
662static PyObject *long_pow
663 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject *));
664static PyObject *long_neg Py_PROTO((PyLongObject *));
665static PyObject *long_pos Py_PROTO((PyLongObject *));
666static PyObject *long_abs Py_PROTO((PyLongObject *));
667static int long_nonzero Py_PROTO((PyLongObject *));
668static PyObject *long_invert Py_PROTO((PyLongObject *));
669static PyObject *long_lshift Py_PROTO((PyLongObject *, PyLongObject *));
670static PyObject *long_rshift Py_PROTO((PyLongObject *, PyLongObject *));
671static PyObject *long_and Py_PROTO((PyLongObject *, PyLongObject *));
672static PyObject *long_xor Py_PROTO((PyLongObject *, PyLongObject *));
673static PyObject *long_or Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000674
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000675static void
676long_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000678{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000679 PyMem_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000680}
681
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000683long_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000684 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000685{
Guido van Rossum8b27d921992-03-27 17:27:05 +0000686 return long_format(v, 10);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000687}
688
689static int
690long_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000692{
693 int sign;
694
Guido van Rossumc6913e71991-11-19 20:26:46 +0000695 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000696 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +0000697 sign = 0;
698 else
699 sign = a->ob_size - b->ob_size;
700 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000701 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000702 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000703 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
704 ;
705 if (i < 0)
706 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000707 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000708 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000709 if (a->ob_size < 0)
710 sign = -sign;
711 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000712 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000713 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000714}
715
Guido van Rossum9bfef441993-03-29 10:43:31 +0000716static long
717long_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 PyLongObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000719{
720 long x;
721 int i, sign;
722
723 /* This is designed so that Python ints and longs with the
724 same value hash to the same value, otherwise comparisons
725 of mapping keys will turn out weird */
726 i = v->ob_size;
727 sign = 1;
728 x = 0;
729 if (i < 0) {
730 sign = -1;
731 i = -(i);
732 }
733 while (--i >= 0) {
734 /* Force a 32-bit circular shift */
735 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
736 x += v->ob_digit[i];
737 }
738 x = x * sign;
739 if (x == -1)
740 x = -2;
741 return x;
742}
743
744
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000745/* Add the absolute values of two long integers. */
746
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000747static PyLongObject *x_add Py_PROTO((PyLongObject *, PyLongObject *));
748static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000749x_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000750 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000751{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000752 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000754 int i;
755 digit carry = 0;
756
757 /* Ensure a is the larger of the two: */
758 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759 { PyLongObject *temp = a; a = b; b = temp; }
760 { int size_temp = size_a;
761 size_a = size_b;
762 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000763 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000765 if (z == NULL)
766 return NULL;
767 for (i = 0; i < size_b; ++i) {
768 carry += a->ob_digit[i] + b->ob_digit[i];
769 z->ob_digit[i] = carry & MASK;
770 /* The following assumes unsigned shifts don't
771 propagate the sign bit. */
772 carry >>= SHIFT;
773 }
774 for (; i < size_a; ++i) {
775 carry += a->ob_digit[i];
776 z->ob_digit[i] = carry & MASK;
777 carry >>= SHIFT;
778 }
779 z->ob_digit[i] = carry;
780 return long_normalize(z);
781}
782
783/* Subtract the absolute values of two integers. */
784
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785static PyLongObject *x_sub Py_PROTO((PyLongObject *, PyLongObject *));
786static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000787x_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000789{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000790 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000791 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000792 int i;
793 int sign = 1;
794 digit borrow = 0;
795
796 /* Ensure a is the larger of the two: */
797 if (size_a < size_b) {
798 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000799 { PyLongObject *temp = a; a = b; b = temp; }
800 { int size_temp = size_a;
801 size_a = size_b;
802 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000803 }
804 else if (size_a == size_b) {
805 /* Find highest digit where a and b differ: */
806 i = size_a;
807 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
808 ;
809 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000811 if (a->ob_digit[i] < b->ob_digit[i]) {
812 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000814 }
815 size_a = size_b = i+1;
816 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000818 if (z == NULL)
819 return NULL;
820 for (i = 0; i < size_b; ++i) {
821 /* The following assumes unsigned arithmetic
822 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000823 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000824 z->ob_digit[i] = borrow & MASK;
825 borrow >>= SHIFT;
826 borrow &= 1; /* Keep only one sign bit */
827 }
828 for (; i < size_a; ++i) {
829 borrow = a->ob_digit[i] - borrow;
830 z->ob_digit[i] = borrow & MASK;
831 borrow >>= SHIFT;
832 }
833 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +0000834 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000835 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000836 return long_normalize(z);
837}
838
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000840long_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000841 PyLongObject *a;
842 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000843{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000845
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000846 if (a->ob_size < 0) {
847 if (b->ob_size < 0) {
848 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +0000849 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000850 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000851 }
852 else
853 z = x_sub(b, a);
854 }
855 else {
856 if (b->ob_size < 0)
857 z = x_sub(a, b);
858 else
859 z = x_add(a, b);
860 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000862}
863
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000864static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000865long_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000866 PyLongObject *a;
867 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000868{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000869 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000870
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000871 if (a->ob_size < 0) {
872 if (b->ob_size < 0)
873 z = x_sub(a, b);
874 else
875 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +0000876 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000877 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000878 }
879 else {
880 if (b->ob_size < 0)
881 z = x_add(a, b);
882 else
883 z = x_sub(a, b);
884 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000886}
887
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000889long_mul(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000890 PyLongObject *a;
891 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000892{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000893 int size_a;
894 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000896 int i;
897
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000898 size_a = ABS(a->ob_size);
899 size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000900 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000901 if (z == NULL)
902 return NULL;
903 for (i = 0; i < z->ob_size; ++i)
904 z->ob_digit[i] = 0;
905 for (i = 0; i < size_a; ++i) {
906 twodigits carry = 0;
907 twodigits f = a->ob_digit[i];
908 int j;
909
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000910 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000911 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000912 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000913 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000914 for (j = 0; j < size_b; ++j) {
915 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +0000916 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000917 carry >>= SHIFT;
918 }
919 for (; carry != 0; ++j) {
920 assert(i+j < z->ob_size);
921 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +0000922 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000923 carry >>= SHIFT;
924 }
925 }
926 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000927 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000928 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000929 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000931}
932
Guido van Rossume32e0141992-01-19 16:31:05 +0000933/* The / and % operators are now defined in terms of divmod().
934 The expression a mod b has the value a - b*floor(a/b).
935 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000936 |a| by |b|, with the sign of a. This is also expressed
937 as a - b*trunc(a/b), if trunc truncates towards zero.
938 Some examples:
939 a b a rem b a mod b
940 13 10 3 3
941 -13 10 -3 7
942 13 -10 3 -7
943 -13 -10 -3 -3
944 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000945 have different signs. We then subtract one from the 'div'
946 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000947
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948static int l_divmod Py_PROTO((PyLongObject *, PyLongObject *,
949 PyLongObject **, PyLongObject **));
Guido van Rossume32e0141992-01-19 16:31:05 +0000950static int
951l_divmod(v, w, pdiv, pmod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952 PyLongObject *v;
953 PyLongObject *w;
954 PyLongObject **pdiv;
955 PyLongObject **pmod;
Guido van Rossume32e0141992-01-19 16:31:05 +0000956{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +0000958
959 if (long_divrem(v, w, &div, &mod) < 0)
960 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +0000961 if ((mod->ob_size < 0 && w->ob_size > 0) ||
962 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 PyLongObject *temp;
964 PyLongObject *one;
965 temp = (PyLongObject *) long_add(mod, w);
966 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +0000967 mod = temp;
968 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +0000970 return -1;
971 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +0000973 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
975 Py_DECREF(mod);
976 Py_DECREF(div);
977 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +0000978 return -1;
979 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000980 Py_DECREF(one);
981 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +0000982 div = temp;
983 }
984 *pdiv = div;
985 *pmod = mod;
986 return 0;
987}
988
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +0000990long_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 PyLongObject *v;
992 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +0000993{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +0000995 if (l_divmod(v, w, &div, &mod) < 0)
996 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997 Py_DECREF(mod);
998 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +0000999}
1000
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001001static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001002long_mod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 PyLongObject *v;
1004 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001005{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001007 if (l_divmod(v, w, &div, &mod) < 0)
1008 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 Py_DECREF(div);
1010 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001011}
1012
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001014long_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001015 PyLongObject *v;
1016 PyLongObject *w;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001017{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001018 PyObject *z;
1019 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001020 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001021 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001022 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001023 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001024 PyTuple_SetItem(z, 0, (PyObject *) div);
1025 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001026 }
1027 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 Py_DECREF(div);
1029 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001030 }
1031 return z;
1032}
1033
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034static PyObject *
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001035long_pow(a, b, c)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 PyLongObject *a;
1037 PyLongObject *b;
1038 PyLongObject *c;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001039{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001040 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001041 int size_b, i;
1042
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001043 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001044 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 PyErr_SetString(PyExc_ValueError,
1046 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001047 return NULL;
1048 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001049 z = (PyLongObject *)PyLong_FromLong(1L);
1050 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001051 for (i = 0; i < size_b; ++i) {
1052 digit bi = b->ob_digit[i];
1053 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001054
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001055 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001057
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001058 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 temp = (PyLongObject *)long_mul(z, a);
1060 Py_DECREF(z);
1061 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001062 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001063 Py_XDECREF(div);
1064 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001065 temp = mod;
1066 }
1067 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001068 if (z == NULL)
1069 break;
1070 }
1071 bi >>= 1;
1072 if (bi == 0 && i+1 == size_b)
1073 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001074 temp = (PyLongObject *)long_mul(a, a);
1075 Py_DECREF(a);
1076 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001077 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 Py_XDECREF(div);
1079 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001080 temp = mod;
1081 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001082 a = temp;
1083 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001084 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001085 z = NULL;
1086 break;
1087 }
1088 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001089 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001090 break;
1091 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001092 Py_XDECREF(a);
1093 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001094 l_divmod(z, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001095 Py_XDECREF(div);
1096 Py_DECREF(z);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001097 z=mod;
1098 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001100}
1101
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001102static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001103long_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001104 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001105{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001106 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001107 PyLongObject *x;
1108 PyLongObject *w;
1109 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001110 if (w == NULL)
1111 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001112 x = (PyLongObject *) long_add(v, w);
1113 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001114 if (x == NULL)
1115 return NULL;
1116 if (x->ob_size != 0)
1117 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001118 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001119}
1120
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001122long_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001123 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001124{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001125 Py_INCREF(v);
1126 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001127}
1128
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001129static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001130long_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001131 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001132{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001134 int i, n;
1135 n = ABS(v->ob_size);
1136 if (n == 0) {
1137 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001138 Py_INCREF(v);
1139 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001140 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001142 if (z == NULL)
1143 return NULL;
1144 for (i = 0; i < n; i++)
1145 z->ob_digit[i] = v->ob_digit[i];
1146 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001147 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001148}
1149
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001150static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001151long_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001152 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001153{
1154 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001155 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001156 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001157 Py_INCREF(v);
1158 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001159 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001160}
1161
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001162static int
1163long_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001164 PyLongObject *v;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001165{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001166 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001167}
1168
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001169static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001170long_rshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001171 PyLongObject *a;
1172 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001173{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001175 long shiftby;
1176 int newsize, wordshift, loshift, hishift, i, j;
1177 digit lomask, himask;
1178
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001179 if (a->ob_size < 0) {
1180 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001181 PyLongObject *a1, *a2, *a3;
1182 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001183 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001184 a2 = (PyLongObject *) long_rshift(a1, b);
1185 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001186 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187 a3 = (PyLongObject *) long_invert(a2);
1188 Py_DECREF(a2);
1189 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001190 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001191
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001192 shiftby = PyLong_AsLong((PyObject *)b);
1193 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001194 return NULL;
1195 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001196 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001197 return NULL;
1198 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001199 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001200 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001201 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202 z = _PyLong_New(0);
1203 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001204 }
1205 loshift = shiftby % SHIFT;
1206 hishift = SHIFT - loshift;
1207 lomask = ((digit)1 << hishift) - 1;
1208 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001209 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001210 if (z == NULL)
1211 return NULL;
1212 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001213 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001214 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1215 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1216 if (i+1 < newsize)
1217 z->ob_digit[i] |=
1218 (a->ob_digit[j+1] << hishift) & himask;
1219 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001221}
1222
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001223static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001224long_lshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001225 PyLongObject *a;
1226 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001227{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001228 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001229 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001230 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001231 int oldsize, newsize, wordshift, remshift, i, j;
1232 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001233
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001234 shiftby = PyLong_AsLong((PyObject *)b);
1235 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001236 return NULL;
1237 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001238 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001239 return NULL;
1240 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001241 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242 PyErr_SetString(PyExc_ValueError,
1243 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001244 return NULL;
1245 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001246 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1247 wordshift = (int)shiftby / SHIFT;
1248 remshift = (int)shiftby - wordshift * SHIFT;
1249
1250 oldsize = ABS(a->ob_size);
1251 newsize = oldsize + wordshift;
1252 if (remshift)
1253 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001255 if (z == NULL)
1256 return NULL;
1257 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001258 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001259 for (i = 0; i < wordshift; i++)
1260 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001261 accum = 0;
1262 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1263 accum |= a->ob_digit[j] << remshift;
1264 z->ob_digit[i] = (digit)(accum & MASK);
1265 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001266 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001267 if (remshift)
1268 z->ob_digit[newsize-1] = (digit)accum;
1269 else
1270 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001272}
1273
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001274
1275/* Bitwise and/xor/or operations */
1276
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001277#define MAX(x, y) ((x) < (y) ? (y) : (x))
1278#define MIN(x, y) ((x) > (y) ? (y) : (x))
1279
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280static PyObject *long_bitwise Py_PROTO((PyLongObject *, int, PyLongObject *));
1281static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001282long_bitwise(a, op, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283 PyLongObject *a;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001284 int op; /* '&', '|', '^' */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001285 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001286{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001287 digit maska, maskb; /* 0 or MASK */
1288 int negz;
1289 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001291 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001292 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001293 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001294
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001295 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001296 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001297 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001298 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001299 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001301 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001302 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001303 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001305 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001306 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001307 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001308 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001309 maskb = 0;
1310 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001311
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001312 size_a = a->ob_size;
1313 size_b = b->ob_size;
1314 size_z = MAX(size_a, size_b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 z = _PyLong_New(size_z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001316 if (a == NULL || b == NULL || z == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317 Py_XDECREF(a);
1318 Py_XDECREF(b);
1319 Py_XDECREF(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001320 return NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001321 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001322
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001323 negz = 0;
1324 switch (op) {
1325 case '^':
1326 if (maska != maskb) {
1327 maska ^= MASK;
1328 negz = -1;
1329 }
1330 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001331 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001332 if (maska && maskb) {
1333 op = '|';
1334 maska ^= MASK;
1335 maskb ^= MASK;
1336 negz = -1;
1337 }
1338 break;
1339 case '|':
1340 if (maska || maskb) {
1341 op = '&';
1342 maska ^= MASK;
1343 maskb ^= MASK;
1344 negz = -1;
1345 }
1346 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001347 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001348
1349 for (i = 0; i < size_z; ++i) {
1350 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1351 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1352 switch (op) {
1353 case '&': z->ob_digit[i] = diga & digb; break;
1354 case '|': z->ob_digit[i] = diga | digb; break;
1355 case '^': z->ob_digit[i] = diga ^ digb; break;
1356 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001357 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001358
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359 Py_DECREF(a);
1360 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001361 z = long_normalize(z);
1362 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001364 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001365 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001366 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001367}
1368
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001370long_and(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371 PyLongObject *a;
1372 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001373{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001374 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001375}
1376
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001377static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001378long_xor(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001379 PyLongObject *a;
1380 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001381{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001382 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001383}
1384
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001385static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001386long_or(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387 PyLongObject *a;
1388 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001389{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001390 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001391}
1392
Guido van Rossum234f9421993-06-17 12:35:49 +00001393static int
Guido van Rossume6eefc21992-08-14 12:06:52 +00001394long_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001395 PyObject **pv;
1396 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001397{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 if (PyInt_Check(*pw)) {
1399 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1400 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001401 return 0;
1402 }
1403 return 1; /* Can't do it */
1404}
1405
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001407long_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001408 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001409{
1410 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001411 x = PyLong_AsLong(v);
1412 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001413 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001414 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001415}
1416
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001418long_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001420{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001421 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001422 return v;
1423}
1424
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001425static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001426long_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001428{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001429 double result;
1430 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001431 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001432 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001434}
1435
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001436static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001437long_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001439{
1440 return long_format(v, 8);
1441}
1442
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001444long_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001445 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001446{
1447 return long_format(v, 16);
1448}
1449
1450
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001451#define UF (unaryfunc)
1452#define BF (binaryfunc)
1453#define TF (ternaryfunc)
1454#define IF (inquiry)
Guido van Rossum8b27d921992-03-27 17:27:05 +00001455
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001456static PyNumberMethods long_as_number = {
Guido van Rossum8b27d921992-03-27 17:27:05 +00001457 BF long_add, /*nb_add*/
1458 BF long_sub, /*nb_subtract*/
1459 BF long_mul, /*nb_multiply*/
1460 BF long_div, /*nb_divide*/
1461 BF long_mod, /*nb_remainder*/
1462 BF long_divmod, /*nb_divmod*/
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001463 TF long_pow, /*nb_power*/
Guido van Rossum8b27d921992-03-27 17:27:05 +00001464 UF long_neg, /*nb_negative*/
1465 UF long_pos, /*tp_positive*/
1466 UF long_abs, /*tp_absolute*/
1467 IF long_nonzero,/*tp_nonzero*/
1468 UF long_invert, /*nb_invert*/
1469 BF long_lshift, /*nb_lshift*/
1470 BF long_rshift, /*nb_rshift*/
1471 BF long_and, /*nb_and*/
1472 BF long_xor, /*nb_xor*/
1473 BF long_or, /*nb_or*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001474 (int (*) Py_FPROTO((PyObject **, PyObject **)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001475 (coercion)long_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001476 UF long_int, /*nb_int*/
1477 UF long_long, /*nb_long*/
1478 UF long_float, /*nb_float*/
1479 UF long_oct, /*nb_oct*/
1480 UF long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001481};
1482
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001483PyTypeObject PyLong_Type = {
1484 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001485 0,
1486 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001487 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001488 sizeof(digit),
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001489 (destructor)long_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001490 0, /*tp_print*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001491 0, /*tp_getattr*/
1492 0, /*tp_setattr*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001493 (int (*) Py_FPROTO((PyObject *, PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001494 (cmpfunc)long_compare, /*tp_compare*/
1495 (reprfunc)long_repr, /*tp_repr*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001496 &long_as_number,/*tp_as_number*/
1497 0, /*tp_as_sequence*/
1498 0, /*tp_as_mapping*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001499 (long (*) Py_FPROTO((PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001500 (hashfunc)long_hash, /*tp_hash*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001501};