blob: c1d750cf0b5beb7f1de5d8cbca61a91b72609607 [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 Rossum2e1d4331993-12-24 10:22:45 +000050long
51getmaxint()
52{
53 return LONG_MAX; /* To initialize sys.maxint */
54}
55
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056/* Standard Booleans */
Guido van Rossum3f5da241990-12-20 15:06:42 +000057
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058intobject FalseObject = {
59 OB_HEAD_INIT(&Inttype)
60 0
61};
Guido van Rossum3f5da241990-12-20 15:06:42 +000062
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063intobject TrueObject = {
64 OB_HEAD_INIT(&Inttype)
65 1
66};
67
Guido van Rossum165e67e1990-10-14 20:02:26 +000068static object *
Guido van Rossum3a628451991-12-10 13:57:36 +000069err_ovf(msg)
70 char *msg;
Guido van Rossum165e67e1990-10-14 20:02:26 +000071{
Guido van Rossum3a628451991-12-10 13:57:36 +000072 err_setstr(OverflowError, msg);
Guido van Rossum165e67e1990-10-14 20:02:26 +000073 return NULL;
74}
75
Guido van Rossum3f5da241990-12-20 15:06:42 +000076/* Integers are quite normal objects, to make object handling uniform.
77 (Using odd pointers to represent integers would save much space
78 but require extra checks for this special case throughout the code.)
79 Since, a typical Python program spends much of its time allocating
80 and deallocating integers, these operations should be very fast.
81 Therefore we use a dedicated allocation scheme with a much lower
82 overhead (in space and time) than straight malloc(): a simple
83 dedicated free list, filled when necessary with memory from malloc().
84*/
85
86#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
87#define N_INTOBJECTS (BLOCK_SIZE / sizeof(intobject))
88
89static intobject *
90fill_free_list()
91{
92 intobject *p, *q;
93 p = NEW(intobject, N_INTOBJECTS);
94 if (p == NULL)
95 return (intobject *)err_nomem();
96 q = p + N_INTOBJECTS;
97 while (--q > p)
98 *(intobject **)q = q-1;
99 *(intobject **)q = NULL;
100 return p + N_INTOBJECTS - 1;
101}
102
103static intobject *free_list = NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000104#ifndef NSMALLPOSINTS
105#define NSMALLPOSINTS 100
106#endif
107#ifndef NSMALLNEGINTS
108#define NSMALLNEGINTS 1
109#endif
110#if NSMALLNEGINTS + NSMALLPOSINTS > 0
111/* References to small integers are saved in this array so that they
112 can be shared.
113 The integers that are saved are those in the range
114 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
115*/
116static intobject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
117#endif
118#ifdef COUNT_ALLOCS
119int quick_int_allocs, quick_neg_int_allocs;
120#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000121
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122object *
123newintobject(ival)
124 long ival;
125{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000126 register intobject *v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000127#if NSMALLNEGINTS + NSMALLPOSINTS > 0
128 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS &&
129 (v = small_ints[ival + NSMALLNEGINTS]) != NULL) {
130 INCREF(v);
131#ifdef COUNT_ALLOCS
132 if (ival >= 0)
133 quick_int_allocs++;
134 else
135 quick_neg_int_allocs++;
136#endif
137 return (object *) v;
138 }
139#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000140 if (free_list == NULL) {
141 if ((free_list = fill_free_list()) == NULL)
142 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000144 v = free_list;
145 free_list = *(intobject **)free_list;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000146 v->ob_type = &Inttype;
147 v->ob_ival = ival;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000148 NEWREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000149#if NSMALLNEGINTS + NSMALLPOSINTS > 0
150 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
151 /* save this one for a following allocation */
152 INCREF(v);
153 small_ints[ival + NSMALLNEGINTS] = v;
154 }
155#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000156 return (object *) v;
157}
158
159static void
160int_dealloc(v)
161 intobject *v;
162{
163 *(intobject **)v = free_list;
164 free_list = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165}
166
167long
168getintvalue(op)
169 register object *op;
170{
171 if (!is_intobject(op)) {
Guido van Rossum5c52b6a1990-10-21 22:11:03 +0000172 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173 return -1;
174 }
175 else
176 return ((intobject *)op) -> ob_ival;
177}
178
179/* Methods */
180
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000181/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000182static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000183int_print(v, fp, flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184 intobject *v;
185 FILE *fp;
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000186 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187{
188 fprintf(fp, "%ld", v->ob_ival);
Guido van Rossum90933611991-06-07 16:10:43 +0000189 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190}
191
192static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000193int_repr(v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194 intobject *v;
195{
196 char buf[20];
197 sprintf(buf, "%ld", v->ob_ival);
198 return newstringobject(buf);
199}
200
201static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000202int_compare(v, w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 intobject *v, *w;
204{
205 register long i = v->ob_ival;
206 register long j = w->ob_ival;
207 return (i < j) ? -1 : (i > j) ? 1 : 0;
208}
209
Guido van Rossum9bfef441993-03-29 10:43:31 +0000210static long
211int_hash(v)
212 intobject *v;
213{
214 long x = v -> ob_ival;
215 if (x == -1)
216 x = -2;
217 return x;
218}
219
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000221int_add(v, w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000223 intobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224{
225 register long a, b, x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000227 b = w->ob_ival;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228 x = a + b;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000229 if ((x^a) < 0 && (x^b) < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000230 return err_ovf("integer addition");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231 return newintobject(x);
232}
233
234static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000235int_sub(v, w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000237 intobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238{
239 register long a, b, x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000241 b = w->ob_ival;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242 x = a - b;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000243 if ((x^a) < 0 && (x^~b) < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000244 return err_ovf("integer subtraction");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245 return newintobject(x);
246}
247
248static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000249int_mul(v, w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000251 intobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000252{
253 register long a, b;
254 double x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000255 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000256 b = w->ob_ival;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257 x = (double)a * (double)b;
Guido van Rossum72481a31993-10-26 15:21:51 +0000258 if (x > LONG_MAX || x < (double) (long) (LONG_MIN))
Guido van Rossum3a628451991-12-10 13:57:36 +0000259 return err_ovf("integer multiplication");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260 return newintobject(a * b);
261}
262
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000263static int
264i_divmod(x, y, p_xdivy, p_xmody)
265 register intobject *x, *y;
266 long *p_xdivy, *p_xmody;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000268 long xi = x->ob_ival;
269 long yi = y->ob_ival;
270 long xdivy, xmody;
271
272 if (yi == 0) {
273 err_setstr(ZeroDivisionError, "integer division or modulo");
274 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275 }
Guido van Rossum00466951991-05-05 20:08:27 +0000276 if (yi < 0) {
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 else {
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000283 if (xi < 0)
284 xdivy = - (-xi / yi);
285 else
286 xdivy = xi / yi;
Guido van Rossum00466951991-05-05 20:08:27 +0000287 }
288 xmody = xi - xdivy*yi;
289 if (xmody < 0 && yi > 0 || xmody > 0 && yi < 0) {
290 xmody += yi;
291 xdivy -= 1;
292 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000293 *p_xdivy = xdivy;
294 *p_xmody = xmody;
295 return 0;
296}
297
298static object *
299int_div(x, y)
300 intobject *x;
301 intobject *y;
302{
303 long d, m;
304 if (i_divmod(x, y, &d, &m) < 0)
305 return NULL;
306 return newintobject(d);
307}
308
309static object *
310int_mod(x, y)
311 intobject *x;
312 intobject *y;
313{
314 long d, m;
315 if (i_divmod(x, y, &d, &m) < 0)
316 return NULL;
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000317 return newintobject(m);
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000318}
319
320static object *
321int_divmod(x, y)
322 intobject *x;
323 intobject *y;
324{
325 object *v, *v0, *v1;
326 long d, m;
327 if (i_divmod(x, y, &d, &m) < 0)
328 return NULL;
Guido van Rossume5372401993-03-16 12:15:04 +0000329 return mkvalue("(ll)", d, m);
Guido van Rossum00466951991-05-05 20:08:27 +0000330}
331
332static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000333int_pow(v, w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000335 intobject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336{
337 register long iv, iw, ix;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338 iv = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000339 iw = w->ob_ival;
Guido van Rossum00466951991-05-05 20:08:27 +0000340 if (iw < 0) {
Guido van Rossum3a628451991-12-10 13:57:36 +0000341 err_setstr(ValueError, "integer to the negative power");
Guido van Rossum00466951991-05-05 20:08:27 +0000342 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343 }
Guido van Rossum00466951991-05-05 20:08:27 +0000344 ix = 1;
345 while (--iw >= 0) {
346 long prev = ix;
347 ix = ix * iv;
348 if (iv == 0)
349 break; /* 0 to some power -- avoid ix / 0 */
350 if (ix / iv != prev)
Guido van Rossum3a628451991-12-10 13:57:36 +0000351 return err_ovf("integer pow()");
Guido van Rossum00466951991-05-05 20:08:27 +0000352 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353 return newintobject(ix);
354}
355
356static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000357int_neg(v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358 intobject *v;
359{
360 register long a, x;
361 a = v->ob_ival;
362 x = -a;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000363 if (a < 0 && x < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000364 return err_ovf("integer negation");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365 return newintobject(x);
366}
367
368static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000369int_pos(v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000370 intobject *v;
371{
372 INCREF(v);
373 return (object *)v;
374}
375
Guido van Rossum00466951991-05-05 20:08:27 +0000376static object *
377int_abs(v)
378 intobject *v;
379{
380 if (v->ob_ival >= 0)
381 return int_pos(v);
382 else
383 return int_neg(v);
384}
385
Guido van Rossum0bff0151991-05-14 12:05:32 +0000386static int
387int_nonzero(v)
388 intobject *v;
389{
390 return v->ob_ival != 0;
391}
392
Guido van Rossum7928cd71991-10-24 14:59:31 +0000393static object *
394int_invert(v)
395 intobject *v;
396{
397 return newintobject(~v->ob_ival);
398}
399
400static object *
401int_lshift(v, w)
402 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000403 intobject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000404{
405 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000406 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000407 b = w->ob_ival;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000408 if (b < 0) {
409 err_setstr(ValueError, "negative shift count");
410 return NULL;
411 }
412 if (a == 0 || b == 0) {
413 INCREF(v);
414 return (object *) v;
415 }
Guido van Rossum72481a31993-10-26 15:21:51 +0000416 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000417 return newintobject(0L);
418 }
419 a = (unsigned long)a << b;
420 return newintobject(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000421}
422
423static object *
424int_rshift(v, w)
425 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000426 intobject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000427{
428 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000429 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000430 b = w->ob_ival;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000431 if (b < 0) {
432 err_setstr(ValueError, "negative shift count");
433 return NULL;
434 }
435 if (a == 0 || b == 0) {
436 INCREF(v);
437 return (object *) v;
438 }
Guido van Rossum72481a31993-10-26 15:21:51 +0000439 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000440 if (a < 0)
441 a = -1;
442 else
443 a = 0;
444 }
445 else {
446 if (a < 0)
447 a = ~( ~(unsigned long)a >> b );
448 else
449 a = (unsigned long)a >> b;
450 }
451 return newintobject(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000452}
453
454static object *
455int_and(v, w)
456 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000457 intobject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000458{
459 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000460 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000461 b = w->ob_ival;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000462 return newintobject(a & b);
463}
464
465static object *
466int_xor(v, w)
467 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000468 intobject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000469{
470 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000471 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000472 b = w->ob_ival;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000473 return newintobject(a ^ b);
474}
475
476static object *
477int_or(v, w)
478 intobject *v;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000479 intobject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000480{
481 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000482 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000483 b = w->ob_ival;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000484 return newintobject(a | b);
485}
486
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000487static object *
488int_int(v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000489 intobject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000490{
491 INCREF(v);
Guido van Rossum9575a441993-04-07 14:06:14 +0000492 return (object *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000493}
494
495static object *
496int_long(v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000497 intobject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000498{
Guido van Rossum9bfef441993-03-29 10:43:31 +0000499 return newlongobject((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000500}
501
502static object *
503int_float(v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000504 intobject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000505{
Guido van Rossum9bfef441993-03-29 10:43:31 +0000506 return newfloatobject((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000507}
508
509static object *
510int_oct(v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000511 intobject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000512{
513 char buf[20];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000514 long x = v -> ob_ival;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000515 if (x == 0)
516 strcpy(buf, "0");
517 else if (x > 0)
518 sprintf(buf, "0%lo", x);
519 else
520 sprintf(buf, "-0%lo", -x);
521 return newstringobject(buf);
522}
523
524static object *
525int_hex(v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000526 intobject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000527{
528 char buf[20];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000529 long x = v -> ob_ival;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000530 if (x >= 0)
531 sprintf(buf, "0x%lx", x);
532 else
533 sprintf(buf, "-0x%lx", -x);
534 return newstringobject(buf);
535}
536
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000537static number_methods int_as_number = {
Guido van Rossum00466951991-05-05 20:08:27 +0000538 int_add, /*nb_add*/
539 int_sub, /*nb_subtract*/
540 int_mul, /*nb_multiply*/
541 int_div, /*nb_divide*/
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000542 int_mod, /*nb_remainder*/
Guido van Rossum00466951991-05-05 20:08:27 +0000543 int_divmod, /*nb_divmod*/
544 int_pow, /*nb_power*/
545 int_neg, /*nb_negative*/
546 int_pos, /*nb_positive*/
547 int_abs, /*nb_absolute*/
Guido van Rossum0bff0151991-05-14 12:05:32 +0000548 int_nonzero, /*nb_nonzero*/
Guido van Rossum7928cd71991-10-24 14:59:31 +0000549 int_invert, /*nb_invert*/
550 int_lshift, /*nb_lshift*/
551 int_rshift, /*nb_rshift*/
552 int_and, /*nb_and*/
553 int_xor, /*nb_xor*/
554 int_or, /*nb_or*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000555 0, /*nb_coerce*/
556 int_int, /*nb_int*/
557 int_long, /*nb_long*/
558 int_float, /*nb_float*/
559 int_oct, /*nb_oct*/
560 int_hex, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000561};
562
563typeobject Inttype = {
564 OB_HEAD_INIT(&Typetype)
565 0,
566 "int",
567 sizeof(intobject),
568 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000569 int_dealloc, /*tp_dealloc*/
570 int_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000571 0, /*tp_getattr*/
572 0, /*tp_setattr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000573 int_compare, /*tp_compare*/
574 int_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000575 &int_as_number, /*tp_as_number*/
576 0, /*tp_as_sequence*/
577 0, /*tp_as_mapping*/
Guido van Rossum9575a441993-04-07 14:06:14 +0000578 int_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000579};