blob: e9c35d7273de470fb86fd8fddab1b14e1994a231 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossume5372401993-03-16 12:15:04 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* Integer object implementation */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossume5372401993-03-16 12:15:04 +000028#include "modsupport.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000029
Guido van Rossum72481a31993-10-26 15:21:51 +000030#ifdef __STDC__
31#include <limits.h>
32#endif
33
34#ifndef LONG_MAX
35#define LONG_MAX 0X7FFFFFFFL
36#endif
37
38#ifndef LONG_MIN
39#define LONG_MIN (-LONG_MAX-1)
40#endif
41
42#ifndef CHAR_BIT
43#define CHAR_BIT 8
44#endif
45
Guido van Rossumb376a4a1993-11-23 17:53:17 +000046#ifndef LONG_BIT
Guido van Rossum72481a31993-10-26 15:21:51 +000047#define LONG_BIT (CHAR_BIT * sizeof(long))
Guido van Rossumb376a4a1993-11-23 17:53:17 +000048#endif
Guido van Rossum72481a31993-10-26 15:21:51 +000049
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050/* Standard Booleans */
Guido van Rossum3f5da241990-12-20 15:06:42 +000051
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052intobject FalseObject = {
53 OB_HEAD_INIT(&Inttype)
54 0
55};
Guido van Rossum3f5da241990-12-20 15:06:42 +000056
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057intobject TrueObject = {
58 OB_HEAD_INIT(&Inttype)
59 1
60};
61
Guido van Rossum165e67e1990-10-14 20:02:26 +000062static object *
Guido van Rossum3a628451991-12-10 13:57:36 +000063err_ovf(msg)
64 char *msg;
Guido van Rossum165e67e1990-10-14 20:02:26 +000065{
Guido van Rossum3a628451991-12-10 13:57:36 +000066 err_setstr(OverflowError, msg);
Guido van Rossum165e67e1990-10-14 20:02:26 +000067 return NULL;
68}
69
Guido van Rossum3f5da241990-12-20 15:06:42 +000070/* Integers are quite normal objects, to make object handling uniform.
71 (Using odd pointers to represent integers would save much space
72 but require extra checks for this special case throughout the code.)
73 Since, a typical Python program spends much of its time allocating
74 and deallocating integers, these operations should be very fast.
75 Therefore we use a dedicated allocation scheme with a much lower
76 overhead (in space and time) than straight malloc(): a simple
77 dedicated free list, filled when necessary with memory from malloc().
78*/
79
80#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
81#define N_INTOBJECTS (BLOCK_SIZE / sizeof(intobject))
82
83static intobject *
84fill_free_list()
85{
86 intobject *p, *q;
87 p = NEW(intobject, N_INTOBJECTS);
88 if (p == NULL)
89 return (intobject *)err_nomem();
90 q = p + N_INTOBJECTS;
91 while (--q > p)
92 *(intobject **)q = q-1;
93 *(intobject **)q = NULL;
94 return p + N_INTOBJECTS - 1;
95}
96
97static intobject *free_list = NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000098#ifndef NSMALLPOSINTS
99#define NSMALLPOSINTS 100
100#endif
101#ifndef NSMALLNEGINTS
102#define NSMALLNEGINTS 1
103#endif
104#if NSMALLNEGINTS + NSMALLPOSINTS > 0
105/* References to small integers are saved in this array so that they
106 can be shared.
107 The integers that are saved are those in the range
108 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
109*/
110static intobject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
111#endif
112#ifdef COUNT_ALLOCS
113int quick_int_allocs, quick_neg_int_allocs;
114#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000115
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116object *
117newintobject(ival)
118 long ival;
119{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000120 register intobject *v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000121#if NSMALLNEGINTS + NSMALLPOSINTS > 0
122 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS &&
123 (v = small_ints[ival + NSMALLNEGINTS]) != NULL) {
124 INCREF(v);
125#ifdef COUNT_ALLOCS
126 if (ival >= 0)
127 quick_int_allocs++;
128 else
129 quick_neg_int_allocs++;
130#endif
131 return (object *) v;
132 }
133#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000134 if (free_list == NULL) {
135 if ((free_list = fill_free_list()) == NULL)
136 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000138 v = free_list;
139 free_list = *(intobject **)free_list;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000140 v->ob_type = &Inttype;
141 v->ob_ival = ival;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000142 NEWREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000143#if NSMALLNEGINTS + NSMALLPOSINTS > 0
144 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
145 /* save this one for a following allocation */
146 INCREF(v);
147 small_ints[ival + NSMALLNEGINTS] = v;
148 }
149#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000150 return (object *) v;
151}
152
153static void
154int_dealloc(v)
155 intobject *v;
156{
157 *(intobject **)v = free_list;
158 free_list = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159}
160
161long
162getintvalue(op)
163 register object *op;
164{
165 if (!is_intobject(op)) {
Guido van Rossum5c52b6a1990-10-21 22:11:03 +0000166 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167 return -1;
168 }
169 else
170 return ((intobject *)op) -> ob_ival;
171}
172
173/* Methods */
174
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000175/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000176static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000177int_print(v, fp, flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000178 intobject *v;
179 FILE *fp;
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000180 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181{
182 fprintf(fp, "%ld", v->ob_ival);
Guido van Rossum90933611991-06-07 16:10:43 +0000183 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184}
185
186static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000187int_repr(v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188 intobject *v;
189{
190 char buf[20];
191 sprintf(buf, "%ld", v->ob_ival);
192 return newstringobject(buf);
193}
194
195static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000196int_compare(v, w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197 intobject *v, *w;
198{
199 register long i = v->ob_ival;
200 register long j = w->ob_ival;
201 return (i < j) ? -1 : (i > j) ? 1 : 0;
202}
203
Guido van Rossum9bfef441993-03-29 10:43:31 +0000204static long
205int_hash(v)
206 intobject *v;
207{
208 long x = v -> ob_ival;
209 if (x == -1)
210 x = -2;
211 return x;
212}
213
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000215int_add(v, w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000217 intobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218{
219 register long a, b, x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000221 b = w->ob_ival;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222 x = a + b;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000223 if ((x^a) < 0 && (x^b) < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000224 return err_ovf("integer addition");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225 return newintobject(x);
226}
227
228static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000229int_sub(v, w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000231 intobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232{
233 register long a, b, x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000235 b = w->ob_ival;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236 x = a - b;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000237 if ((x^a) < 0 && (x^~b) < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000238 return err_ovf("integer subtraction");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000239 return newintobject(x);
240}
241
242static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000243int_mul(v, w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000245 intobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246{
247 register long a, b;
248 double x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000250 b = w->ob_ival;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251 x = (double)a * (double)b;
Guido van Rossum72481a31993-10-26 15:21:51 +0000252 if (x > LONG_MAX || x < (double) (long) (LONG_MIN))
Guido van Rossum3a628451991-12-10 13:57:36 +0000253 return err_ovf("integer multiplication");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254 return newintobject(a * b);
255}
256
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000257static int
258i_divmod(x, y, p_xdivy, p_xmody)
259 register intobject *x, *y;
260 long *p_xdivy, *p_xmody;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000262 long xi = x->ob_ival;
263 long yi = y->ob_ival;
264 long xdivy, xmody;
265
266 if (yi == 0) {
267 err_setstr(ZeroDivisionError, "integer division or modulo");
268 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269 }
Guido van Rossum00466951991-05-05 20:08:27 +0000270 if (yi < 0) {
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000271 if (xi < 0)
272 xdivy = -xi / -yi;
273 else
274 xdivy = - (xi / -yi);
Guido van Rossum00466951991-05-05 20:08:27 +0000275 }
276 else {
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000277 if (xi < 0)
278 xdivy = - (-xi / yi);
279 else
280 xdivy = xi / yi;
Guido van Rossum00466951991-05-05 20:08:27 +0000281 }
282 xmody = xi - xdivy*yi;
283 if (xmody < 0 && yi > 0 || xmody > 0 && yi < 0) {
284 xmody += yi;
285 xdivy -= 1;
286 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000287 *p_xdivy = xdivy;
288 *p_xmody = xmody;
289 return 0;
290}
291
292static object *
293int_div(x, y)
294 intobject *x;
295 intobject *y;
296{
297 long d, m;
298 if (i_divmod(x, y, &d, &m) < 0)
299 return NULL;
300 return newintobject(d);
301}
302
303static object *
304int_mod(x, y)
305 intobject *x;
306 intobject *y;
307{
308 long d, m;
309 if (i_divmod(x, y, &d, &m) < 0)
310 return NULL;
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000311 return newintobject(m);
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000312}
313
314static object *
315int_divmod(x, y)
316 intobject *x;
317 intobject *y;
318{
319 object *v, *v0, *v1;
320 long d, m;
321 if (i_divmod(x, y, &d, &m) < 0)
322 return NULL;
Guido van Rossume5372401993-03-16 12:15:04 +0000323 return mkvalue("(ll)", d, m);
Guido van Rossum00466951991-05-05 20:08:27 +0000324}
325
326static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000327int_pow(v, w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000329 intobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330{
331 register long iv, iw, ix;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332 iv = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000333 iw = w->ob_ival;
Guido van Rossum00466951991-05-05 20:08:27 +0000334 if (iw < 0) {
Guido van Rossum3a628451991-12-10 13:57:36 +0000335 err_setstr(ValueError, "integer to the negative power");
Guido van Rossum00466951991-05-05 20:08:27 +0000336 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337 }
Guido van Rossum00466951991-05-05 20:08:27 +0000338 ix = 1;
339 while (--iw >= 0) {
340 long prev = ix;
341 ix = ix * iv;
342 if (iv == 0)
343 break; /* 0 to some power -- avoid ix / 0 */
344 if (ix / iv != prev)
Guido van Rossum3a628451991-12-10 13:57:36 +0000345 return err_ovf("integer pow()");
Guido van Rossum00466951991-05-05 20:08:27 +0000346 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347 return newintobject(ix);
348}
349
350static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000351int_neg(v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000352 intobject *v;
353{
354 register long a, x;
355 a = v->ob_ival;
356 x = -a;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000357 if (a < 0 && x < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000358 return err_ovf("integer negation");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000359 return newintobject(x);
360}
361
362static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000363int_pos(v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364 intobject *v;
365{
366 INCREF(v);
367 return (object *)v;
368}
369
Guido van Rossum00466951991-05-05 20:08:27 +0000370static object *
371int_abs(v)
372 intobject *v;
373{
374 if (v->ob_ival >= 0)
375 return int_pos(v);
376 else
377 return int_neg(v);
378}
379
Guido van Rossum0bff0151991-05-14 12:05:32 +0000380static int
381int_nonzero(v)
382 intobject *v;
383{
384 return v->ob_ival != 0;
385}
386
Guido van Rossum7928cd71991-10-24 14:59:31 +0000387static object *
388int_invert(v)
389 intobject *v;
390{
391 return newintobject(~v->ob_ival);
392}
393
394static object *
395int_lshift(v, w)
396 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000397 intobject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000398{
399 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000400 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000401 b = w->ob_ival;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000402 if (b < 0) {
403 err_setstr(ValueError, "negative shift count");
404 return NULL;
405 }
406 if (a == 0 || b == 0) {
407 INCREF(v);
408 return (object *) v;
409 }
Guido van Rossum72481a31993-10-26 15:21:51 +0000410 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000411 return newintobject(0L);
412 }
413 a = (unsigned long)a << b;
414 return newintobject(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000415}
416
417static object *
418int_rshift(v, w)
419 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000420 intobject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000421{
422 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000423 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000424 b = w->ob_ival;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000425 if (b < 0) {
426 err_setstr(ValueError, "negative shift count");
427 return NULL;
428 }
429 if (a == 0 || b == 0) {
430 INCREF(v);
431 return (object *) v;
432 }
Guido van Rossum72481a31993-10-26 15:21:51 +0000433 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000434 if (a < 0)
435 a = -1;
436 else
437 a = 0;
438 }
439 else {
440 if (a < 0)
441 a = ~( ~(unsigned long)a >> b );
442 else
443 a = (unsigned long)a >> b;
444 }
445 return newintobject(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000446}
447
448static object *
449int_and(v, w)
450 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000451 intobject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000452{
453 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000454 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000455 b = w->ob_ival;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000456 return newintobject(a & b);
457}
458
459static object *
460int_xor(v, w)
461 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000462 intobject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000463{
464 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000465 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000466 b = w->ob_ival;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000467 return newintobject(a ^ b);
468}
469
470static object *
471int_or(v, w)
472 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000473 intobject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000474{
475 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000476 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000477 b = w->ob_ival;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000478 return newintobject(a | b);
479}
480
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000481static object *
482int_int(v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000483 intobject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000484{
485 INCREF(v);
Guido van Rossum9575a441993-04-07 14:06:14 +0000486 return (object *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000487}
488
489static object *
490int_long(v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000491 intobject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000492{
Guido van Rossum9bfef441993-03-29 10:43:31 +0000493 return newlongobject((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000494}
495
496static object *
497int_float(v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000498 intobject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000499{
Guido van Rossum9bfef441993-03-29 10:43:31 +0000500 return newfloatobject((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000501}
502
503static object *
504int_oct(v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000505 intobject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000506{
507 char buf[20];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000508 long x = v -> ob_ival;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000509 if (x == 0)
510 strcpy(buf, "0");
511 else if (x > 0)
512 sprintf(buf, "0%lo", x);
513 else
514 sprintf(buf, "-0%lo", -x);
515 return newstringobject(buf);
516}
517
518static object *
519int_hex(v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000520 intobject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000521{
522 char buf[20];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000523 long x = v -> ob_ival;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000524 if (x >= 0)
525 sprintf(buf, "0x%lx", x);
526 else
527 sprintf(buf, "-0x%lx", -x);
528 return newstringobject(buf);
529}
530
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000531static number_methods int_as_number = {
Guido van Rossum00466951991-05-05 20:08:27 +0000532 int_add, /*nb_add*/
533 int_sub, /*nb_subtract*/
534 int_mul, /*nb_multiply*/
535 int_div, /*nb_divide*/
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000536 int_mod, /*nb_remainder*/
Guido van Rossum00466951991-05-05 20:08:27 +0000537 int_divmod, /*nb_divmod*/
538 int_pow, /*nb_power*/
539 int_neg, /*nb_negative*/
540 int_pos, /*nb_positive*/
541 int_abs, /*nb_absolute*/
Guido van Rossum0bff0151991-05-14 12:05:32 +0000542 int_nonzero, /*nb_nonzero*/
Guido van Rossum7928cd71991-10-24 14:59:31 +0000543 int_invert, /*nb_invert*/
544 int_lshift, /*nb_lshift*/
545 int_rshift, /*nb_rshift*/
546 int_and, /*nb_and*/
547 int_xor, /*nb_xor*/
548 int_or, /*nb_or*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000549 0, /*nb_coerce*/
550 int_int, /*nb_int*/
551 int_long, /*nb_long*/
552 int_float, /*nb_float*/
553 int_oct, /*nb_oct*/
554 int_hex, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000555};
556
557typeobject Inttype = {
558 OB_HEAD_INIT(&Typetype)
559 0,
560 "int",
561 sizeof(intobject),
562 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000563 int_dealloc, /*tp_dealloc*/
564 int_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565 0, /*tp_getattr*/
566 0, /*tp_setattr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000567 int_compare, /*tp_compare*/
568 int_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000569 &int_as_number, /*tp_as_number*/
570 0, /*tp_as_sequence*/
571 0, /*tp_as_mapping*/
Guido van Rossum9575a441993-04-07 14:06:14 +0000572 int_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000573};