blob: 9657c08f74f2ac56c6c567964592257f647d4b94 [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
280/* Multiply by 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 +0000283mul1(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000284 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000285 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000286{
287 return muladd1(a, n, (digit)0);
288}
289
290/* Multiply by a single digit and add a single digit, ignoring the sign. */
291
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000293muladd1(a, n, extra)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000295 wdigit n;
296 wdigit extra;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000297{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000298 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000299 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000300 twodigits carry = extra;
301 int i;
302
303 if (z == NULL)
304 return NULL;
305 for (i = 0; i < size_a; ++i) {
306 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000307 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000308 carry >>= SHIFT;
309 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000310 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000311 return long_normalize(z);
312}
313
314/* Divide a long integer by a digit, returning both the quotient
315 (as function result) and the remainder (through *prem).
316 The sign of a is ignored; n should not be zero. */
317
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000318static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000319divrem1(a, n, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000321 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000322 digit *prem;
323{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000324 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000326 int i;
327 twodigits rem = 0;
328
329 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000331 if (z == NULL)
332 return NULL;
333 for (i = size; --i >= 0; ) {
334 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000335 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000336 rem %= n;
337 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000338 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000339 return long_normalize(z);
340}
341
342/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000343 Return a string object.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000344 If base is 8 or 16, add the proper prefix '0' or '0x'.
345 External linkage: used in bltinmodule.c by hex() and oct(). */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000346
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +0000348long_format(aa, base)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 PyObject *aa;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000350 int base;
351{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 register PyLongObject *a = (PyLongObject *)aa;
353 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000354 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000355 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000356 char *p;
357 int bits;
358 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000359
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360 if (a == NULL || !PyLong_Check(a)) {
361 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000362 return NULL;
363 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000364 assert(base >= 2 && base <= 36);
365
366 /* Compute a rough upper bound for the length of the string */
367 i = base;
368 bits = 0;
369 while (i > 1) {
370 ++bits;
371 i >>= 1;
372 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000373 i = 6 + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000375 if (str == NULL)
376 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000378 *p = '\0';
Guido van Rossumc6913e71991-11-19 20:26:46 +0000379 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000380 if (a->ob_size < 0)
381 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000382
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383 Py_INCREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000384 do {
385 digit rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 PyLongObject *temp = divrem1(a, (digit)base, &rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000387 if (temp == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000388 Py_DECREF(a);
389 Py_DECREF(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000390 return NULL;
391 }
392 if (rem < 10)
393 rem += '0';
394 else
395 rem += 'A'-10;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 assert(p > PyString_AS_STRING(str));
Guido van Rossum2095d241997-04-09 19:41:24 +0000397 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000399 a = temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000400 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 Py_DECREF(a);
402 Py_DECREF(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000403 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000404 })
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000405 } while (ABS(a->ob_size) != 0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 Py_DECREF(a);
Guido van Rossum2c475421992-08-14 15:13:07 +0000407 if (base == 8) {
408 if (size_a != 0)
409 *--p = '0';
410 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000411 else if (base == 16) {
412 *--p = 'x';
413 *--p = '0';
414 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000415 else if (base != 10) {
416 *--p = '#';
417 *--p = '0' + base%10;
418 if (base > 10)
419 *--p = '0' + base/10;
420 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000421 if (sign)
422 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 if (p != PyString_AS_STRING(str)) {
424 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000425 assert(p > q);
426 do {
427 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000428 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429 _PyString_Resize((PyObject **)&str,
430 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000431 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000432 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000433}
434
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000435#if 0
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000436/* Convert a string to a long int object, in a given base.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000437 Base zero implies a default depending on the number.
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000438 External linkage: used in compile.c and stropmodule.c. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000439
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000441long_scan(str, base)
442 char *str;
443 int base;
444{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 return PyLong_FromString(str, (char **)NULL, base);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000446}
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000447#endif
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000448
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449PyObject *
450PyLong_FromString(str, pend, base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000451 char *str;
452 char **pend;
453 int base;
454{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000455 int sign = 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000457
Guido van Rossum472c04f1996-12-05 21:57:21 +0000458 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000459 PyErr_SetString(PyExc_ValueError,
460 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000461 return NULL;
462 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000463 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000464 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000465 if (*str == '+')
466 ++str;
467 else if (*str == '-') {
468 ++str;
469 sign = -1;
470 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000471 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000472 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000473 if (base == 0) {
474 if (str[0] != '0')
475 base = 10;
476 else if (str[1] == 'x' || str[1] == 'X')
477 base = 16;
478 else
479 base = 8;
480 }
481 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
482 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 z = _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000484 for ( ; z != NULL; ++str) {
485 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000487
488 if (*str <= '9')
489 k = *str - '0';
490 else if (*str >= 'a')
491 k = *str - 'a' + 10;
492 else if (*str >= 'A')
493 k = *str - 'A' + 10;
494 if (k < 0 || k >= base)
495 break;
496 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000497 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000498 z = temp;
499 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000500 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000501 z->ob_size = -(z->ob_size);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000502 if (pend)
503 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504 return (PyObject *) z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000505}
506
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507static PyLongObject *x_divrem
508 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject **));
509static PyObject *long_pos Py_PROTO((PyLongObject *));
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000510static int long_divrem Py_PROTO((PyLongObject *, PyLongObject *,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 PyLongObject **, PyLongObject **));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000512
513/* Long division with remainder, top-level routine */
514
Guido van Rossume32e0141992-01-19 16:31:05 +0000515static int
516long_divrem(a, b, pdiv, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 PyLongObject *a, *b;
518 PyLongObject **pdiv;
519 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000520{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000521 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000523
524 if (size_b == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 PyErr_SetString(PyExc_ZeroDivisionError, "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000526 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000527 }
528 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000529 (size_a == size_b &&
530 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000531 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 *pdiv = _PyLong_New(0);
533 Py_INCREF(a);
534 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000535 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000536 }
537 if (size_b == 1) {
538 digit rem = 0;
539 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000540 if (z == NULL)
541 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000543 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000544 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000545 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000546 if (z == NULL)
547 return -1;
548 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000549 /* Set the signs.
550 The quotient z has the sign of a*b;
551 the remainder r has the sign of a,
552 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000553 if ((a->ob_size < 0) != (b->ob_size < 0))
554 z->ob_size = -(z->ob_size);
555 if (a->ob_size < 0 && (*prem)->ob_size != 0)
556 (*prem)->ob_size = -((*prem)->ob_size);
557 *pdiv = z;
558 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000559}
560
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000561/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000562
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000564x_divrem(v1, w1, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000565 PyLongObject *v1, *w1;
566 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000567{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000568 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000569 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 PyLongObject *v = mul1(v1, d);
571 PyLongObject *w = mul1(w1, d);
572 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000573 int j, k;
574
575 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576 Py_XDECREF(v);
577 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000578 return NULL;
579 }
580
581 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000582 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000583 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000584
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000585 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000587
588 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
589 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
590 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000591 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000592 int i;
593
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000594 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000596 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000597 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000598 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000599 if (vj == w->ob_digit[size_w-1])
600 q = MASK;
601 else
602 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
603 w->ob_digit[size_w-1];
604
605 while (w->ob_digit[size_w-2]*q >
606 ((
607 ((twodigits)vj << SHIFT)
608 + v->ob_digit[j-1]
609 - q*w->ob_digit[size_w-1]
610 ) << SHIFT)
611 + v->ob_digit[j-2])
612 --q;
613
614 for (i = 0; i < size_w && i+k < size_v; ++i) {
615 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000616 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 carry += v->ob_digit[i+k] - z
618 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000619 v->ob_digit[i+k] = carry & MASK;
620 carry = (carry >> SHIFT) - zz;
621 }
622
623 if (i+k < size_v) {
624 carry += v->ob_digit[i+k];
625 v->ob_digit[i+k] = 0;
626 }
627
628 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000629 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000630 else {
631 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000632 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000633 carry = 0;
634 for (i = 0; i < size_w && i+k < size_v; ++i) {
635 carry += v->ob_digit[i+k] + w->ob_digit[i];
636 v->ob_digit[i+k] = carry & MASK;
637 carry >>= SHIFT;
638 }
639 }
640 } /* for j, k */
641
Guido van Rossumc206c761995-01-10 15:23:19 +0000642 if (a == NULL)
643 *prem = NULL;
644 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000645 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000646 *prem = divrem1(v, d, &d);
647 /* d receives the (unused) remainder */
648 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000650 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000651 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000652 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000653 Py_DECREF(v);
654 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000655 return a;
656}
657
658/* Methods */
659
Guido van Rossume32e0141992-01-19 16:31:05 +0000660/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661static void long_dealloc Py_PROTO((PyObject *));
662static PyObject *long_repr Py_PROTO((PyObject *));
663static int long_compare Py_PROTO((PyLongObject *, PyLongObject *));
664static long long_hash Py_PROTO((PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000665
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *));
667static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *));
668static PyObject *long_mul Py_PROTO((PyLongObject *, PyLongObject *));
669static PyObject *long_div Py_PROTO((PyLongObject *, PyLongObject *));
670static PyObject *long_mod Py_PROTO((PyLongObject *, PyLongObject *));
671static PyObject *long_divmod Py_PROTO((PyLongObject *, PyLongObject *));
672static PyObject *long_pow
673 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject *));
674static PyObject *long_neg Py_PROTO((PyLongObject *));
675static PyObject *long_pos Py_PROTO((PyLongObject *));
676static PyObject *long_abs Py_PROTO((PyLongObject *));
677static int long_nonzero Py_PROTO((PyLongObject *));
678static PyObject *long_invert Py_PROTO((PyLongObject *));
679static PyObject *long_lshift Py_PROTO((PyLongObject *, PyLongObject *));
680static PyObject *long_rshift Py_PROTO((PyLongObject *, PyLongObject *));
681static PyObject *long_and Py_PROTO((PyLongObject *, PyLongObject *));
682static PyObject *long_xor Py_PROTO((PyLongObject *, PyLongObject *));
683static PyObject *long_or Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000684
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000685static void
686long_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000687 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000688{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689 PyMem_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000690}
691
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000693long_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000695{
Guido van Rossum8b27d921992-03-27 17:27:05 +0000696 return long_format(v, 10);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000697}
698
699static int
700long_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000702{
703 int sign;
704
Guido van Rossumc6913e71991-11-19 20:26:46 +0000705 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000706 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +0000707 sign = 0;
708 else
709 sign = a->ob_size - b->ob_size;
710 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000711 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000712 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000713 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
714 ;
715 if (i < 0)
716 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000717 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000718 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000719 if (a->ob_size < 0)
720 sign = -sign;
721 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000722 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000723 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000724}
725
Guido van Rossum9bfef441993-03-29 10:43:31 +0000726static long
727long_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 PyLongObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000729{
730 long x;
731 int i, sign;
732
733 /* This is designed so that Python ints and longs with the
734 same value hash to the same value, otherwise comparisons
735 of mapping keys will turn out weird */
736 i = v->ob_size;
737 sign = 1;
738 x = 0;
739 if (i < 0) {
740 sign = -1;
741 i = -(i);
742 }
743 while (--i >= 0) {
744 /* Force a 32-bit circular shift */
745 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
746 x += v->ob_digit[i];
747 }
748 x = x * sign;
749 if (x == -1)
750 x = -2;
751 return x;
752}
753
754
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000755/* Add the absolute values of two long integers. */
756
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757static PyLongObject *x_add Py_PROTO((PyLongObject *, PyLongObject *));
758static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000759x_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000760 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000761{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000762 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000763 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000764 int i;
765 digit carry = 0;
766
767 /* Ensure a is the larger of the two: */
768 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769 { PyLongObject *temp = a; a = b; b = temp; }
770 { int size_temp = size_a;
771 size_a = size_b;
772 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000773 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000774 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000775 if (z == NULL)
776 return NULL;
777 for (i = 0; i < size_b; ++i) {
778 carry += a->ob_digit[i] + b->ob_digit[i];
779 z->ob_digit[i] = carry & MASK;
780 /* The following assumes unsigned shifts don't
781 propagate the sign bit. */
782 carry >>= SHIFT;
783 }
784 for (; i < size_a; ++i) {
785 carry += a->ob_digit[i];
786 z->ob_digit[i] = carry & MASK;
787 carry >>= SHIFT;
788 }
789 z->ob_digit[i] = carry;
790 return long_normalize(z);
791}
792
793/* Subtract the absolute values of two integers. */
794
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000795static PyLongObject *x_sub Py_PROTO((PyLongObject *, PyLongObject *));
796static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000797x_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000799{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000800 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000802 int i;
803 int sign = 1;
804 digit borrow = 0;
805
806 /* Ensure a is the larger of the two: */
807 if (size_a < size_b) {
808 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809 { PyLongObject *temp = a; a = b; b = temp; }
810 { int size_temp = size_a;
811 size_a = size_b;
812 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000813 }
814 else if (size_a == size_b) {
815 /* Find highest digit where a and b differ: */
816 i = size_a;
817 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
818 ;
819 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000820 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000821 if (a->ob_digit[i] < b->ob_digit[i]) {
822 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000824 }
825 size_a = size_b = i+1;
826 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000827 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000828 if (z == NULL)
829 return NULL;
830 for (i = 0; i < size_b; ++i) {
831 /* The following assumes unsigned arithmetic
832 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000833 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000834 z->ob_digit[i] = borrow & MASK;
835 borrow >>= SHIFT;
836 borrow &= 1; /* Keep only one sign bit */
837 }
838 for (; i < size_a; ++i) {
839 borrow = a->ob_digit[i] - borrow;
840 z->ob_digit[i] = borrow & MASK;
841 borrow >>= SHIFT;
842 }
843 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +0000844 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000845 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000846 return long_normalize(z);
847}
848
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000849static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000850long_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000851 PyLongObject *a;
852 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000853{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000855
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000856 if (a->ob_size < 0) {
857 if (b->ob_size < 0) {
858 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +0000859 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000860 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000861 }
862 else
863 z = x_sub(b, a);
864 }
865 else {
866 if (b->ob_size < 0)
867 z = x_sub(a, b);
868 else
869 z = x_add(a, b);
870 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000871 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000872}
873
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000875long_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 PyLongObject *a;
877 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000878{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000879 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000880
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000881 if (a->ob_size < 0) {
882 if (b->ob_size < 0)
883 z = x_sub(a, b);
884 else
885 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +0000886 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000887 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000888 }
889 else {
890 if (b->ob_size < 0)
891 z = x_add(a, b);
892 else
893 z = x_sub(a, b);
894 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000896}
897
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000898static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000899long_mul(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000900 PyLongObject *a;
901 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000902{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000903 int size_a;
904 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000905 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000906 int i;
907
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000908 size_a = ABS(a->ob_size);
909 size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000910 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000911 if (z == NULL)
912 return NULL;
913 for (i = 0; i < z->ob_size; ++i)
914 z->ob_digit[i] = 0;
915 for (i = 0; i < size_a; ++i) {
916 twodigits carry = 0;
917 twodigits f = a->ob_digit[i];
918 int j;
919
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000920 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000921 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000922 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000923 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000924 for (j = 0; j < size_b; ++j) {
925 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +0000926 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000927 carry >>= SHIFT;
928 }
929 for (; carry != 0; ++j) {
930 assert(i+j < z->ob_size);
931 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +0000932 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000933 carry >>= SHIFT;
934 }
935 }
936 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000937 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000938 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000939 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000941}
942
Guido van Rossume32e0141992-01-19 16:31:05 +0000943/* The / and % operators are now defined in terms of divmod().
944 The expression a mod b has the value a - b*floor(a/b).
945 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000946 |a| by |b|, with the sign of a. This is also expressed
947 as a - b*trunc(a/b), if trunc truncates towards zero.
948 Some examples:
949 a b a rem b a mod b
950 13 10 3 3
951 -13 10 -3 7
952 13 -10 3 -7
953 -13 -10 -3 -3
954 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000955 have different signs. We then subtract one from the 'div'
956 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000957
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958static int l_divmod Py_PROTO((PyLongObject *, PyLongObject *,
959 PyLongObject **, PyLongObject **));
Guido van Rossume32e0141992-01-19 16:31:05 +0000960static int
961l_divmod(v, w, pdiv, pmod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000962 PyLongObject *v;
963 PyLongObject *w;
964 PyLongObject **pdiv;
965 PyLongObject **pmod;
Guido van Rossume32e0141992-01-19 16:31:05 +0000966{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +0000968
969 if (long_divrem(v, w, &div, &mod) < 0)
970 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +0000971 if ((mod->ob_size < 0 && w->ob_size > 0) ||
972 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000973 PyLongObject *temp;
974 PyLongObject *one;
975 temp = (PyLongObject *) long_add(mod, w);
976 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +0000977 mod = temp;
978 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +0000980 return -1;
981 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +0000983 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000984 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
985 Py_DECREF(mod);
986 Py_DECREF(div);
987 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +0000988 return -1;
989 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000990 Py_DECREF(one);
991 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +0000992 div = temp;
993 }
994 *pdiv = div;
995 *pmod = mod;
996 return 0;
997}
998
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001000long_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001001 PyLongObject *v;
1002 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001003{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001004 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001005 if (l_divmod(v, w, &div, &mod) < 0)
1006 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001007 Py_DECREF(mod);
1008 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001009}
1010
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001012long_mod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 PyLongObject *v;
1014 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001015{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001017 if (l_divmod(v, w, &div, &mod) < 0)
1018 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001019 Py_DECREF(div);
1020 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001021}
1022
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001024long_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 PyLongObject *v;
1026 PyLongObject *w;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001027{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 PyObject *z;
1029 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001030 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001031 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001033 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034 PyTuple_SetItem(z, 0, (PyObject *) div);
1035 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001036 }
1037 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 Py_DECREF(div);
1039 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001040 }
1041 return z;
1042}
1043
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001044static PyObject *
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001045long_pow(a, b, c)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046 PyLongObject *a;
1047 PyLongObject *b;
1048 PyLongObject *c;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001049{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001051 int size_b, i;
1052
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001053 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001054 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055 PyErr_SetString(PyExc_ValueError,
1056 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001057 return NULL;
1058 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 z = (PyLongObject *)PyLong_FromLong(1L);
1060 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001061 for (i = 0; i < size_b; ++i) {
1062 digit bi = b->ob_digit[i];
1063 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001064
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001065 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001066 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001067
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001068 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 temp = (PyLongObject *)long_mul(z, a);
1070 Py_DECREF(z);
1071 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001072 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001073 Py_XDECREF(div);
1074 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001075 temp = mod;
1076 }
1077 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001078 if (z == NULL)
1079 break;
1080 }
1081 bi >>= 1;
1082 if (bi == 0 && i+1 == size_b)
1083 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001084 temp = (PyLongObject *)long_mul(a, a);
1085 Py_DECREF(a);
1086 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001087 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001088 Py_XDECREF(div);
1089 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001090 temp = mod;
1091 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001092 a = temp;
1093 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001094 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001095 z = NULL;
1096 break;
1097 }
1098 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001099 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001100 break;
1101 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001102 Py_XDECREF(a);
1103 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001104 l_divmod(z, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001105 Py_XDECREF(div);
1106 Py_DECREF(z);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001107 z=mod;
1108 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001109 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001110}
1111
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001112static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001113long_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001114 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001115{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001116 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001117 PyLongObject *x;
1118 PyLongObject *w;
1119 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001120 if (w == NULL)
1121 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001122 x = (PyLongObject *) long_add(v, w);
1123 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001124 if (x == NULL)
1125 return NULL;
1126 if (x->ob_size != 0)
1127 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001128 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001129}
1130
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001131static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001132long_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001134{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135 Py_INCREF(v);
1136 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001137}
1138
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001139static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001140long_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001142{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001143 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001144 int i, n;
1145 n = ABS(v->ob_size);
1146 if (n == 0) {
1147 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001148 Py_INCREF(v);
1149 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001150 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001151 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001152 if (z == NULL)
1153 return NULL;
1154 for (i = 0; i < n; i++)
1155 z->ob_digit[i] = v->ob_digit[i];
1156 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001157 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001158}
1159
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001160static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001161long_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001162 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001163{
1164 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001165 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001166 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001167 Py_INCREF(v);
1168 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001169 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001170}
1171
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001172static int
1173long_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001174 PyLongObject *v;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001175{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001176 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001177}
1178
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001179static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001180long_rshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001181 PyLongObject *a;
1182 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001183{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001184 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001185 long shiftby;
1186 int newsize, wordshift, loshift, hishift, i, j;
1187 digit lomask, himask;
1188
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001189 if (a->ob_size < 0) {
1190 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001191 PyLongObject *a1, *a2, *a3;
1192 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001193 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001194 a2 = (PyLongObject *) long_rshift(a1, b);
1195 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001196 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001197 a3 = (PyLongObject *) long_invert(a2);
1198 Py_DECREF(a2);
1199 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001200 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001201
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202 shiftby = PyLong_AsLong((PyObject *)b);
1203 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001204 return NULL;
1205 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001206 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001207 return NULL;
1208 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001209 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001210 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001211 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001212 z = _PyLong_New(0);
1213 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001214 }
1215 loshift = shiftby % SHIFT;
1216 hishift = SHIFT - loshift;
1217 lomask = ((digit)1 << hishift) - 1;
1218 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001219 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001220 if (z == NULL)
1221 return NULL;
1222 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001223 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001224 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1225 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1226 if (i+1 < newsize)
1227 z->ob_digit[i] |=
1228 (a->ob_digit[j+1] << hishift) & himask;
1229 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001231}
1232
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001233static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001234long_lshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001235 PyLongObject *a;
1236 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001237{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001238 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001240 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001241 int oldsize, newsize, wordshift, remshift, i, j;
1242 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001243
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001244 shiftby = PyLong_AsLong((PyObject *)b);
1245 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001246 return NULL;
1247 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001249 return NULL;
1250 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001251 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001252 PyErr_SetString(PyExc_ValueError,
1253 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001254 return NULL;
1255 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001256 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1257 wordshift = (int)shiftby / SHIFT;
1258 remshift = (int)shiftby - wordshift * SHIFT;
1259
1260 oldsize = ABS(a->ob_size);
1261 newsize = oldsize + wordshift;
1262 if (remshift)
1263 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001264 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001265 if (z == NULL)
1266 return NULL;
1267 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001268 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001269 for (i = 0; i < wordshift; i++)
1270 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001271 accum = 0;
1272 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1273 accum |= a->ob_digit[j] << remshift;
1274 z->ob_digit[i] = (digit)(accum & MASK);
1275 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001276 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001277 if (remshift)
1278 z->ob_digit[newsize-1] = (digit)accum;
1279 else
1280 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001281 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001282}
1283
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001284
1285/* Bitwise and/xor/or operations */
1286
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001287#define MAX(x, y) ((x) < (y) ? (y) : (x))
1288#define MIN(x, y) ((x) > (y) ? (y) : (x))
1289
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290static PyObject *long_bitwise Py_PROTO((PyLongObject *, int, PyLongObject *));
1291static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001292long_bitwise(a, op, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001293 PyLongObject *a;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001294 int op; /* '&', '|', '^' */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001295 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001296{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001297 digit maska, maskb; /* 0 or MASK */
1298 int negz;
1299 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001301 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001302 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001304
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001305 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001306 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001307 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001308 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001309 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001310 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001311 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001312 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001313 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001314 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001315 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001316 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001317 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001318 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001319 maskb = 0;
1320 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001321
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001322 size_a = a->ob_size;
1323 size_b = b->ob_size;
1324 size_z = MAX(size_a, size_b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001325 z = _PyLong_New(size_z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001326 if (a == NULL || b == NULL || z == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327 Py_XDECREF(a);
1328 Py_XDECREF(b);
1329 Py_XDECREF(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001330 return NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001331 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001332
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001333 negz = 0;
1334 switch (op) {
1335 case '^':
1336 if (maska != maskb) {
1337 maska ^= MASK;
1338 negz = -1;
1339 }
1340 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001341 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001342 if (maska && maskb) {
1343 op = '|';
1344 maska ^= MASK;
1345 maskb ^= MASK;
1346 negz = -1;
1347 }
1348 break;
1349 case '|':
1350 if (maska || maskb) {
1351 op = '&';
1352 maska ^= MASK;
1353 maskb ^= MASK;
1354 negz = -1;
1355 }
1356 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001357 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001358
1359 for (i = 0; i < size_z; ++i) {
1360 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1361 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1362 switch (op) {
1363 case '&': z->ob_digit[i] = diga & digb; break;
1364 case '|': z->ob_digit[i] = diga | digb; break;
1365 case '^': z->ob_digit[i] = diga ^ digb; break;
1366 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001367 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001368
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369 Py_DECREF(a);
1370 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001371 z = long_normalize(z);
1372 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001374 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001376 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001377}
1378
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001379static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001380long_and(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001381 PyLongObject *a;
1382 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001383{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001384 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001385}
1386
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001388long_xor(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 PyLongObject *a;
1390 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001391{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001392 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001393}
1394
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001395static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001396long_or(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001397 PyLongObject *a;
1398 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001399{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001400 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001401}
1402
Guido van Rossum234f9421993-06-17 12:35:49 +00001403static int
Guido van Rossume6eefc21992-08-14 12:06:52 +00001404long_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001405 PyObject **pv;
1406 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001407{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001408 if (PyInt_Check(*pw)) {
1409 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1410 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001411 return 0;
1412 }
1413 return 1; /* Can't do it */
1414}
1415
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001416static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001417long_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001419{
1420 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001421 x = PyLong_AsLong(v);
1422 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001423 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001424 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001425}
1426
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001428long_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001429 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001430{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001431 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001432 return v;
1433}
1434
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001435static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001436long_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001437 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001438{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001439 double result;
1440 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001441 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001442 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001443 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001444}
1445
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001447long_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001448 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001449{
1450 return long_format(v, 8);
1451}
1452
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001453static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001454long_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001456{
1457 return long_format(v, 16);
1458}
1459
1460
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001461#define UF (unaryfunc)
1462#define BF (binaryfunc)
1463#define TF (ternaryfunc)
1464#define IF (inquiry)
Guido van Rossum8b27d921992-03-27 17:27:05 +00001465
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466static PyNumberMethods long_as_number = {
Guido van Rossum8b27d921992-03-27 17:27:05 +00001467 BF long_add, /*nb_add*/
1468 BF long_sub, /*nb_subtract*/
1469 BF long_mul, /*nb_multiply*/
1470 BF long_div, /*nb_divide*/
1471 BF long_mod, /*nb_remainder*/
1472 BF long_divmod, /*nb_divmod*/
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001473 TF long_pow, /*nb_power*/
Guido van Rossum8b27d921992-03-27 17:27:05 +00001474 UF long_neg, /*nb_negative*/
1475 UF long_pos, /*tp_positive*/
1476 UF long_abs, /*tp_absolute*/
1477 IF long_nonzero,/*tp_nonzero*/
1478 UF long_invert, /*nb_invert*/
1479 BF long_lshift, /*nb_lshift*/
1480 BF long_rshift, /*nb_rshift*/
1481 BF long_and, /*nb_and*/
1482 BF long_xor, /*nb_xor*/
1483 BF long_or, /*nb_or*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001484 (int (*) Py_FPROTO((PyObject **, PyObject **)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001485 (coercion)long_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001486 UF long_int, /*nb_int*/
1487 UF long_long, /*nb_long*/
1488 UF long_float, /*nb_float*/
1489 UF long_oct, /*nb_oct*/
1490 UF long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001491};
1492
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001493PyTypeObject PyLong_Type = {
1494 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001495 0,
1496 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001497 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001498 sizeof(digit),
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001499 (destructor)long_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001500 0, /*tp_print*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001501 0, /*tp_getattr*/
1502 0, /*tp_setattr*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001503 (int (*) Py_FPROTO((PyObject *, PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001504 (cmpfunc)long_compare, /*tp_compare*/
1505 (reprfunc)long_repr, /*tp_repr*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001506 &long_as_number,/*tp_as_number*/
1507 0, /*tp_as_sequence*/
1508 0, /*tp_as_mapping*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509 (long (*) Py_FPROTO((PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001510 (hashfunc)long_hash, /*tp_hash*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001511};