blob: da76f187ceb06bdec802b0e4d726475ea793cfac [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +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 Rossumf70e43a1991-02-19 12:39:46 +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 Rossumf70e43a1991-02-19 12:39:46 +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 Rossumf70e43a1991-02-19 12:39:46 +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 Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Built-in functions */
33
34#include "allobjects.h"
35
36#include "node.h"
37#include "graminit.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000038#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000039#include "import.h"
Guido van Rossum5b722181993-03-30 17:46:03 +000040#include "compile.h"
41#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000042
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +000043#include "mymath.h"
44
Guido van Rossum6bf62da1997-04-11 20:37:35 +000045#include <ctype.h>
46
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000047#ifdef HAVE_UNISTD_H
48#include <unistd.h>
49#endif
50
Guido van Rossum12d12c51993-10-26 17:58:25 +000051/* Forward */
52static object *filterstring PROTO((object *, object *));
53static object *filtertuple PROTO((object *, object *));
Guido van Rossumc6472e91997-03-31 17:15:43 +000054static object *int_from_string PROTO((object *));
55static object *long_from_string PROTO((object *));
56static object *float_from_string PROTO((object *));
Guido van Rossum12d12c51993-10-26 17:58:25 +000057
Guido van Rossum3f5da241990-12-20 15:06:42 +000058static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000059builtin___import__(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000060 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000061 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000062{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000063 char *name;
Guido van Rossum24c13741995-02-14 09:42:43 +000064 object *globals = NULL;
65 object *locals = NULL;
66 object *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000067
Guido van Rossum24c13741995-02-14 09:42:43 +000068 if (!newgetargs(args, "s|OOO:__import__",
69 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070 return NULL;
Guido van Rossum7f9fa971995-01-20 16:53:12 +000071 return import_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000072}
73
74
75static object *
76builtin_abs(self, args)
77 object *self;
78 object *args;
79{
80 object *v;
Guido van Rossumd4905451991-05-05 20:00:36 +000081 number_methods *nm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000082
83 if (!newgetargs(args, "O:abs", &v))
84 return NULL;
85 if ((nm = v->ob_type->tp_as_number) == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +000086 err_setstr(TypeError, "abs() requires numeric argument");
87 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 }
Guido van Rossumd4905451991-05-05 20:00:36 +000089 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000090}
91
92static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000093builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000094 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000095 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000096{
Guido van Rossumc96ef6a1996-01-26 20:44:30 +000097 object *func, *alist = NULL, *kwdict = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000098
Guido van Rossum681d79a1995-07-18 14:51:37 +000099 if (!newgetargs(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000100 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000101 if (alist != NULL && !is_tupleobject(alist)) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000102 err_setstr(TypeError, "apply() 2nd argument must be tuple");
103 return NULL;
104 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000105 if (kwdict != NULL && !is_dictobject(kwdict)) {
106 err_setstr(TypeError,
107 "apply() 3rd argument must be dictionary");
108 return NULL;
109 }
110 return PyEval_CallObjectWithKeywords(func, alist, kwdict);
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000111}
112
Guido van Rossum2d951851994-08-29 12:52:16 +0000113static object *
114builtin_callable(self, args)
115 object *self;
116 object *args;
117{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000118 object *v;
119
120 if (!newgetargs(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000121 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000122 return newintobject((long)callable(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000123}
124
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000125static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000126builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000127 object *self;
128 object *args;
129{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000130 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000131 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000132 int len;
133 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000134
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000135 if (!newgetargs(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000136 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000137
Guido van Rossum12d12c51993-10-26 17:58:25 +0000138 if (is_stringobject(seq)) {
139 object *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000140 return r;
141 }
142
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000143 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000144 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000145 return r;
146 }
147
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000148 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000149 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000150 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000151 goto Fail_2;
152 }
153
154 if ((len = (*sqf->sq_length)(seq)) < 0)
155 goto Fail_2;
156
157 if (is_listobject(seq) && seq->ob_refcnt == 1) {
158 INCREF(seq);
159 result = seq;
160 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000161 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000162 if ((result = newlistobject(len)) == NULL)
163 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000164 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000165
Guido van Rossum2d951851994-08-29 12:52:16 +0000166 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000167 object *item, *good;
168 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000169
Guido van Rossum2d951851994-08-29 12:52:16 +0000170 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
171 if (i < len)
172 goto Fail_1;
173 if (err_occurred() == IndexError) {
174 err_clear();
175 break;
176 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000177 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000178 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000179
180 if (func == None) {
181 good = item;
Guido van Rossum58b68731995-01-10 17:40:55 +0000182 INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000183 }
184 else {
185 object *arg = mkvalue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000186 if (arg == NULL)
187 goto Fail_1;
188 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000189 DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000190 if (good == NULL) {
191 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000192 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000193 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000194 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000195 ok = testbool(good);
196 DECREF(good);
197 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000198 if (j < len) {
199 if (setlistitem(result, j++, item) < 0)
200 goto Fail_1;
201 }
202 else {
203 j++;
204 if (addlistitem(result, item) < 0)
205 goto Fail_1;
206 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000207 } else {
208 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000209 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000210 }
211
Guido van Rossum12d12c51993-10-26 17:58:25 +0000212
Guido van Rossum2d951851994-08-29 12:52:16 +0000213 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000214 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000215
Guido van Rossum12d12c51993-10-26 17:58:25 +0000216 return result;
217
Guido van Rossum12d12c51993-10-26 17:58:25 +0000218Fail_1:
219 DECREF(result);
220Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000221 return NULL;
222}
223
224static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000225builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000227 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000228{
229 long x;
230 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000231
232 if (!newgetargs(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000234 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000235 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000236 return NULL;
237 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000238 s[0] = (char)x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000239 return newsizedstringobject(s, 1);
240}
241
242static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000243builtin_cmp(self, args)
244 object *self;
245 object *args;
246{
247 object *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000248
249 if (!newgetargs(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000250 return NULL;
251 return newintobject((long)cmpobject(a, b));
252}
253
254static object *
Guido van Rossum5524a591995-01-10 15:26:20 +0000255builtin_coerce(self, args)
256 object *self;
257 object *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000258{
Guido van Rossum5524a591995-01-10 15:26:20 +0000259 object *v, *w;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000260 object *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000261
262 if (!newgetargs(args, "OO:coerce", &v, &w))
263 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000264 if (coerce(&v, &w) < 0)
265 return NULL;
266 res = mkvalue("(OO)", v, w);
267 DECREF(v);
268 DECREF(w);
269 return res;
270}
271
272static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000273builtin_compile(self, args)
274 object *self;
275 object *args;
276{
277 char *str;
278 char *filename;
279 char *startstr;
280 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000281
282 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000283 return NULL;
284 if (strcmp(startstr, "exec") == 0)
285 start = file_input;
286 else if (strcmp(startstr, "eval") == 0)
287 start = eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000288 else if (strcmp(startstr, "single") == 0)
289 start = single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000290 else {
291 err_setstr(ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000292 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000293 return NULL;
294 }
295 return compile_string(str, filename, start);
296}
297
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000298#ifndef WITHOUT_COMPLEX
299
300static object *
301builtin_complex(self, args)
302 object *self;
303 object *args;
304{
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000305 object *r, *i, *tmp;
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000306 number_methods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000307 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000308 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000309
310 i = NULL;
311 if (!newgetargs(args, "O|O:complex", &r, &i))
312 return NULL;
313 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000314 nbr->nb_float == NULL ||
315 (i != NULL &&
316 ((nbi = i->ob_type->tp_as_number) == NULL ||
317 nbi->nb_float == NULL))) {
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000318 err_setstr(TypeError,
319 "complex() argument can't be converted to complex");
320 return NULL;
321 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000322 /* XXX Hack to support classes with __complex__ method */
323 if (is_instanceobject(r)) {
324 static object *complexstr;
325 object *f;
326 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000327 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000328 if (complexstr == NULL)
329 return NULL;
330 }
331 f = getattro(r, complexstr);
332 if (f == NULL)
333 err_clear();
334 else {
335 object *args = mkvalue("()");
336 if (args == NULL)
337 return NULL;
338 r = call_object(f, args);
339 DECREF(args);
340 if (r == NULL)
341 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000342 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000343 }
344 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000345 if (is_complexobject(r)) {
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000346 cr = ((complexobject*)r)->cval;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000347 if (own_r)
348 DECREF(r);
349 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000350 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000351 tmp = (*nbr->nb_float)(r);
Guido van Rossumc6472e91997-03-31 17:15:43 +0000352 if (own_r)
353 DECREF(r);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000354 if (tmp == NULL)
355 return NULL;
356 cr.real = getfloatvalue(tmp);
357 DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000358 cr.imag = 0.;
359 }
360 if (i == NULL) {
361 ci.real = 0.;
362 ci.imag = 0.;
363 }
364 else if (is_complexobject(i))
365 ci = ((complexobject*)i)->cval;
366 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000367 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000368 if (tmp == NULL)
369 return NULL;
370 ci.real = getfloatvalue(tmp);
371 DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000372 ci.imag = 0.;
373 }
374 cr.real -= ci.imag;
375 cr.imag += ci.real;
376 return newcomplexobject(cr);
377}
378
379#endif
380
Guido van Rossum5b722181993-03-30 17:46:03 +0000381static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000382builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000383 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000384 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000386 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000387 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000388
389 if (!newgetargs(args, "|O:dir", &v))
390 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000391 if (v == NULL) {
392 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000393 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000394 }
395 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000396 d = getattr(v, "__dict__");
397 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000399 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000400 return NULL;
401 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000402 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000403 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000404 v = getdictkeys(d);
405 if (sortlist(v) != 0) {
406 DECREF(v);
407 v = NULL;
408 }
409 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000410 else {
Guido van Rossum795ba581996-05-23 22:49:07 +0000411 v = PyObject_CallMethod(d, "keys", NULL);
412 if (v == NULL) {
413 PyErr_Clear();
414 v = newlistobject(0);
415 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000416 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000417 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000418 return v;
419}
420
421static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000422do_divmod(v, w)
423 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000424{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000425 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000426
Guido van Rossum180d7b41994-09-29 09:45:57 +0000427 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000428 return instancebinop(v, w, "__divmod__", "__rdivmod__",
429 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000430 if (v->ob_type->tp_as_number == NULL ||
431 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432 err_setstr(TypeError,
433 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000434 return NULL;
435 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000436 if (coerce(&v, &w) != 0)
437 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000438 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000439 DECREF(v);
440 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000441 return res;
442}
443
444static object *
445builtin_divmod(self, args)
446 object *self;
447 object *args;
448{
449 object *v, *w;
450
451 if (!newgetargs(args, "OO:divmod", &v, &w))
452 return NULL;
453 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000454}
455
456static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000457builtin_eval(self, args)
458 object *self;
459 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000460{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000462 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000464
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000465 if (!newgetargs(args, "O|O!O!:eval",
466 &cmd,
467 &Mappingtype, &globals,
468 &Mappingtype, &locals))
469 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000470 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000471 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000472 if (locals == None)
473 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000474 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000475 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000476 locals = globals;
477 if (dictlookup(globals, "__builtins__") == NULL) {
478 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
479 return NULL;
480 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000481 if (is_codeobject(cmd))
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 return eval_code((codeobject *) cmd, globals, locals);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000483 if (!is_stringobject(cmd)) {
484 err_setstr(TypeError,
485 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000486 return NULL;
487 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000488 str = getstringvalue(cmd);
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000489 if ((int)strlen(str) != getstringsize(cmd)) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000490 err_setstr(ValueError,
491 "embedded '\\0' in string arg");
492 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000493 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000494 while (*str == ' ' || *str == '\t')
495 str++;
496 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000497}
498
499static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000500builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000501 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000502 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000503{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000504 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000505 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000506 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000507 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000508
509 if (!newgetargs(args, "s|O!O!:execfile",
510 &filename,
511 &Mappingtype, &globals,
512 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000513 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000514 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000515 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000516 if (locals == None)
517 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000518 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000519 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000520 locals = globals;
521 if (dictlookup(globals, "__builtins__") == NULL) {
522 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
523 return NULL;
524 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000525 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000527 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000528 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000529 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000530 return NULL;
531 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000532 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000533 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000534 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000535 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000536 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000537}
538
539static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000540builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000541 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000542 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000543{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000544 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000545 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000546
547 if (!newgetargs(args, "O:float", &v))
548 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000549 if (is_stringobject(v))
550 return float_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000551 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000552 nb->nb_float == NULL) {
553 err_setstr(TypeError,
554 "float() argument can't be converted to float");
555 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000556 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000557 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000558}
559
560static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000561builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000562 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000563 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000564{
Guido van Rossum94390a41992-08-14 15:14:30 +0000565 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000566 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000567
568 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000569 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000570 return getattro(v, name);
571}
572
573static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000574builtin_globals(self, args)
575 object *self;
576 object *args;
577{
578 object *d;
579
580 if (!newgetargs(args, ""))
581 return NULL;
582 d = getglobals();
583 INCREF(d);
584 return d;
585}
586
587static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000588builtin_hasattr(self, args)
589 object *self;
590 object *args;
591{
592 object *v;
593 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000594
595 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000596 return NULL;
597 v = getattro(v, name);
598 if (v == NULL) {
599 err_clear();
600 return newintobject(0L);
601 }
602 DECREF(v);
603 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000604}
605
606static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000607builtin_id(self, args)
608 object *self;
609 object *args;
610{
611 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612
613 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000614 return NULL;
615 return newintobject((long)v);
616}
617
618static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000619builtin_map(self, args)
620 object *self;
621 object *args;
622{
623 typedef struct {
624 object *seq;
625 sequence_methods *sqf;
626 int len;
627 } sequence;
628
629 object *func, *result;
630 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000631 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000632 register int i, j;
633
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000634 n = gettuplesize(args);
635 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000636 err_setstr(TypeError, "map() requires at least two args");
637 return NULL;
638 }
639
640 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000641 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000642
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000643 if ((seqs = NEW(sequence, n)) == NULL) {
644 err_nomem();
645 goto Fail_2;
646 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000647
Guido van Rossum2d951851994-08-29 12:52:16 +0000648 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000649 int curlen;
650
651 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
652 goto Fail_2;
653
654 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
655 static char errmsg[] =
656 "argument %d to map() must be a sequence object";
657 char errbuf[sizeof(errmsg) + 3];
658
659 sprintf(errbuf, errmsg, i+2);
660 err_setstr(TypeError, errbuf);
661 goto Fail_2;
662 }
663
664 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
665 goto Fail_2;
666
667 if (curlen > len)
668 len = curlen;
669 }
670
671 if ((result = (object *) newlistobject(len)) == NULL)
672 goto Fail_2;
673
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000674 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000675 for (i = 0; ; ++i) {
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000676 object *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000677 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000678
Guido van Rossum2d951851994-08-29 12:52:16 +0000679 if (func == None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000680 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000681 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000682 if ((alist = newtupleobject(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000683 goto Fail_1;
684 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000685
686 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000687 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000688 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000689 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000690 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000691 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000692 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000693 if (item == NULL) {
694 if (i < sqp->len)
695 goto Fail_0;
696 if (err_occurred() == IndexError) {
697 err_clear();
698 INCREF(None);
699 item = None;
700 sqp->len = -1;
701 }
702 else {
703 goto Fail_0;
704 }
705 }
706 else
707 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000708
Guido van Rossum12d12c51993-10-26 17:58:25 +0000709 }
Guido van Rossum32120311995-07-10 13:52:21 +0000710 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000711 break;
Guido van Rossum32120311995-07-10 13:52:21 +0000712 if (settupleitem(alist, j, item) < 0) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000713 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000714 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000715 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000716 continue;
717
718 Fail_0:
Guido van Rossum32120311995-07-10 13:52:21 +0000719 XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000720 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000721 }
722
Guido van Rossum32120311995-07-10 13:52:21 +0000723 if (!alist)
724 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000725
726 if (!any) {
Guido van Rossum32120311995-07-10 13:52:21 +0000727 DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000728 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000729 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000730
731 if (func == None)
Guido van Rossum32120311995-07-10 13:52:21 +0000732 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000733 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000734 value = call_object(func, alist);
735 DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000736 if (value == NULL)
737 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000738 }
739 if (i >= len) {
740 if (addlistitem(result, value) < 0)
741 goto Fail_1;
742 }
743 else {
744 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000745 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000746 }
747 }
748
Guido van Rossum2d951851994-08-29 12:52:16 +0000749 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000750 return result;
751
Guido van Rossum12d12c51993-10-26 17:58:25 +0000752Fail_1:
753 DECREF(result);
754Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000755 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000756 return NULL;
757}
758
759static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000760builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000761 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000762 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000763{
Guido van Rossum94390a41992-08-14 15:14:30 +0000764 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000765 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000766 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000767
768 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000769 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000770 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000771 return NULL;
772 INCREF(None);
773 return None;
774}
775
776static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000777builtin_delattr(self, args)
778 object *self;
779 object *args;
780{
781 object *v;
782 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000783
784 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000785 return NULL;
786 if (setattro(v, name, (object *)NULL) != 0)
787 return NULL;
788 INCREF(None);
789 return None;
790}
791
792static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000793builtin_hash(self, args)
794 object *self;
795 object *args;
796{
797 object *v;
798 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000799
800 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000801 return NULL;
802 x = hashobject(v);
803 if (x == -1)
804 return NULL;
805 return newintobject(x);
806}
807
808static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000809builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000810 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000811 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000812{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000813 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000814 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815
816 if (!newgetargs(args, "O:hex", &v))
817 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000818
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000819 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000820 nb->nb_hex == NULL) {
821 err_setstr(TypeError,
822 "hex() argument can't be converted to hex");
823 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000824 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000825 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000826}
827
Guido van Rossum3165fe61992-09-25 21:59:05 +0000828static object *builtin_raw_input PROTO((object *, object *));
829
Guido van Rossum006bcd41991-10-24 14:54:44 +0000830static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000831builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000832 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000833 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000834{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000835 object *line;
836 char *str;
837 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000838 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000839
840 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000841 if (line == NULL)
842 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000843 if (!getargs(line, "s;embedded '\\0' in input line", &str))
844 return NULL;
845 while (*str == ' ' || *str == '\t')
846 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000847 globals = getglobals();
848 locals = getlocals();
849 if (dictlookup(globals, "__builtins__") == NULL) {
850 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
851 return NULL;
852 }
853 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000854 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000855 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000856}
857
Guido van Rossume8811f81997-02-14 15:48:05 +0000858static PyObject *
859builtin_intern(self, args)
860 PyObject *self;
861 PyObject *args;
862{
863 PyObject *s;
864 if (!PyArg_ParseTuple(args, "S", &s))
865 return NULL;
866 Py_INCREF(s);
867 PyString_InternInPlace(&s);
868 return s;
869}
870
Guido van Rossum3f5da241990-12-20 15:06:42 +0000871static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000872builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000873 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000874 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000875{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000876 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000877 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878
879 if (!newgetargs(args, "O:int", &v))
880 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000881 if (is_stringobject(v))
882 return int_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000883 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000884 nb->nb_int == NULL) {
885 err_setstr(TypeError,
886 "int() argument can't be converted to int");
887 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000888 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000889 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000890}
891
892static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000894 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000895 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000896{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000898 long len;
899 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900
901 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000902 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000903 tp = v->ob_type;
904 if (tp->tp_as_sequence != NULL) {
905 len = (*tp->tp_as_sequence->sq_length)(v);
906 }
907 else if (tp->tp_as_mapping != NULL) {
908 len = (*tp->tp_as_mapping->mp_length)(v);
909 }
910 else {
911 err_setstr(TypeError, "len() of unsized object");
912 return NULL;
913 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000914 if (len < 0)
915 return NULL;
916 else
917 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000918}
919
920static object *
Guido van Rossumd1705771996-04-09 02:41:06 +0000921builtin_list(self, args)
922 object *self;
923 object *args;
924{
925 object *v;
926 sequence_methods *sqf;
927
928 if (!newgetargs(args, "O:list", &v))
929 return NULL;
930 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
931 int n = (*sqf->sq_length)(v);
932 int i;
933 object *l;
934 if (n < 0)
935 return NULL;
936 l = newlistobject(n);
937 if (l == NULL)
938 return NULL;
939 for (i = 0; i < n; i++) {
940 object *item = (*sqf->sq_item)(v, i);
941 if (item == NULL) {
942 DECREF(l);
943 l = NULL;
944 break;
945 }
946 setlistitem(l, i, item);
947 }
948 /* XXX Should support indefinite-length sequences */
949 return l;
950 }
951 err_setstr(TypeError, "list() argument must be a sequence");
952 return NULL;
953}
954
Guido van Rossum8861b741996-07-30 16:49:37 +0000955
956static PyObject *
957builtin_slice(self, args)
958 PyObject *self;
959 PyObject *args;
960{
961 PyObject *start, *stop, *step;
962
963 start = stop = step = NULL;
964
965 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
966 return NULL;
967
968 /*This swapping of stop and start is to maintain compatibility with
969 the range builtin.*/
970 if (stop == NULL) {
971 stop = start;
972 start = NULL;
973 }
974 return PySlice_New(start, stop, step);
975}
976
Guido van Rossumd1705771996-04-09 02:41:06 +0000977static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000978builtin_locals(self, args)
979 object *self;
980 object *args;
981{
982 object *d;
983
984 if (!newgetargs(args, ""))
985 return NULL;
986 d = getlocals();
987 INCREF(d);
988 return d;
989}
990
991static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000992builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000993 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000994 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000995{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000996 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000997 number_methods *nb;
998
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000999 if (!newgetargs(args, "O:long", &v))
1000 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +00001001 if (is_stringobject(v))
1002 return long_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001003 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001004 nb->nb_long == NULL) {
1005 err_setstr(TypeError,
1006 "long() argument can't be converted to long");
1007 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +00001008 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001009 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +00001010}
1011
1012static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001013min_max(args, sign)
1014 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001015 int sign;
1016{
Guido van Rossum2d951851994-08-29 12:52:16 +00001017 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001018 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001019 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001020
1021 if (gettuplesize(args) > 1)
1022 v = args;
1023 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001024 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001025 sq = v->ob_type->tp_as_sequence;
1026 if (sq == NULL) {
1027 err_setstr(TypeError, "min() or max() of non-sequence");
1028 return NULL;
1029 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001030 w = NULL;
1031 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001032 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001033 if (x == NULL) {
1034 if (err_occurred() == IndexError) {
1035 err_clear();
1036 break;
1037 }
1038 XDECREF(w);
1039 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001040 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001041 if (w == NULL)
1042 w = x;
1043 else {
1044 if (cmpobject(x, w) * sign > 0) {
1045 DECREF(w);
1046 w = x;
1047 }
1048 else
1049 DECREF(x);
1050 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001051 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001052 if (w == NULL)
1053 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001054 return w;
1055}
1056
1057static object *
1058builtin_min(self, v)
1059 object *self;
1060 object *v;
1061{
1062 return min_max(v, -1);
1063}
1064
1065static object *
1066builtin_max(self, v)
1067 object *self;
1068 object *v;
1069{
1070 return min_max(v, 1);
1071}
1072
1073static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001074builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001075 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001076 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001077{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001078 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001079 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001080
1081 if (!newgetargs(args, "O:oct", &v))
1082 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001083 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1084 nb->nb_oct == NULL) {
1085 err_setstr(TypeError,
1086 "oct() argument can't be converted to oct");
1087 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001088 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001089 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001090}
1091
1092static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001093builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001094 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001095 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001096{
Guido van Rossum2d951851994-08-29 12:52:16 +00001097 char *name;
1098 char *mode = "r";
1099 int bufsize = -1;
1100 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001101
1102 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001103 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001104 f = newfileobject(name, mode);
1105 if (f != NULL)
1106 setfilebufsize(f, bufsize);
1107 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001108}
1109
1110static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001111builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001112 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001113 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001114{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001115 char c;
1116
1117 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001118 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001119 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001120}
1121
1122static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001123do_pow(v, w)
1124 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +00001125{
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001126 object *res;
1127 if (is_instanceobject(v) || is_instanceobject(w))
1128 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001129 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +00001130 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +00001131 err_setstr(TypeError, "pow() requires numeric arguments");
1132 return NULL;
1133 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001134 if (
1135#ifndef WITHOUT_COMPLEX
1136 !is_complexobject(v) &&
1137#endif
1138 is_floatobject(w) && getfloatvalue(v) < 0.0) {
Guido van Rossum8a1e8eb1995-02-18 14:51:32 +00001139 if (!err_occurred())
1140 err_setstr(ValueError, "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001141 return NULL;
1142 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001143 if (coerce(&v, &w) != 0)
1144 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001145 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001146 DECREF(v);
1147 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001148 return res;
1149}
1150
1151static object *
1152builtin_pow(self, args)
1153 object *self;
1154 object *args;
1155{
1156 object *v, *w, *z = None, *res;
1157 object *v1, *z1, *w2, *z2;
1158
1159 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
1160 return NULL;
1161 if (z == None)
1162 return do_pow(v, w);
1163 /* XXX The ternary version doesn't do class instance coercions */
1164 if (is_instanceobject(v))
1165 return v->ob_type->tp_as_number->nb_power(v, w, z);
1166 if (v->ob_type->tp_as_number == NULL ||
1167 z->ob_type->tp_as_number == NULL ||
1168 w->ob_type->tp_as_number == NULL) {
1169 err_setstr(TypeError, "pow() requires numeric arguments");
1170 return NULL;
1171 }
1172 if (coerce(&v, &w) != 0)
1173 return NULL;
1174 res = NULL;
1175 v1 = v;
1176 z1 = z;
1177 if (coerce(&v1, &z1) != 0)
1178 goto error2;
1179 w2 = w;
1180 z2 = z1;
1181 if (coerce(&w2, &z2) != 0)
1182 goto error1;
1183 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
1184 DECREF(w2);
1185 DECREF(z2);
1186 error1:
1187 DECREF(v1);
1188 DECREF(z1);
1189 error2:
1190 DECREF(v);
1191 DECREF(w);
1192 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001193}
1194
1195static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001196builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001197 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001198 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001199{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001200 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001201 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001202 object *v;
1203
1204 if (gettuplesize(args) <= 1) {
1205 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001206 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001207 &ihigh))
1208 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001209 }
1210 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001211 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001212 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001213 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001214 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001215 }
1216 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001217 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001218 return NULL;
1219 }
1220 /* XXX ought to check overflow of subtraction */
1221 if (istep > 0)
1222 n = (ihigh - ilow + istep - 1) / istep;
1223 else
1224 n = (ihigh - ilow + istep + 1) / istep;
1225 if (n < 0)
1226 n = 0;
1227 v = newlistobject(n);
1228 if (v == NULL)
1229 return NULL;
1230 for (i = 0; i < n; i++) {
1231 object *w = newintobject(ilow);
1232 if (w == NULL) {
1233 DECREF(v);
1234 return NULL;
1235 }
1236 setlistitem(v, i, w);
1237 ilow += istep;
1238 }
1239 return v;
1240}
1241
1242static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001243builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001244 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001245 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001246{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001247 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001248 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001249
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001250 if (gettuplesize(args) <= 1) {
1251 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001252 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001253 &ihigh))
1254 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001255 }
1256 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001257 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001258 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001259 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001260 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001261 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001262 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001263 err_setstr(ValueError, "zero step for xrange()");
1264 return NULL;
1265 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001266 /* XXX ought to check overflow of subtraction */
1267 if (istep > 0)
1268 n = (ihigh - ilow + istep - 1) / istep;
1269 else
1270 n = (ihigh - ilow + istep + 1) / istep;
1271 if (n < 0)
1272 n = 0;
1273 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001274}
1275
Guido van Rossum872537c1995-07-07 22:43:42 +00001276extern char *my_readline PROTO((char *));
1277
Guido van Rossum12d12c51993-10-26 17:58:25 +00001278static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001279builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001280 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001281 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001282{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283 object *v = NULL;
1284 object *f;
1285
1286 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001287 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001288 if (getfilefile(sysget("stdin")) == stdin &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001289 getfilefile(sysget("stdout")) == stdout &&
1290 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum872537c1995-07-07 22:43:42 +00001291 object *po;
1292 char *prompt;
1293 char *s;
1294 object *result;
1295 if (v != NULL) {
1296 po = strobject(v);
1297 if (po == NULL)
1298 return NULL;
1299 prompt = getstringvalue(po);
1300 }
1301 else {
1302 po = NULL;
1303 prompt = "";
1304 }
1305 s = my_readline(prompt);
1306 XDECREF(po);
1307 if (s == NULL) {
1308 err_set(KeyboardInterrupt);
1309 return NULL;
1310 }
1311 if (*s == '\0') {
1312 err_set(EOFError);
1313 result = NULL;
1314 }
1315 else { /* strip trailing '\n' */
1316 result = newsizedstringobject(s, strlen(s)-1);
1317 }
1318 free(s);
1319 return result;
1320 }
Guido van Rossum90933611991-06-07 16:10:43 +00001321 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001322 f = sysget("stdout");
1323 if (f == NULL) {
1324 err_setstr(RuntimeError, "lost sys.stdout");
1325 return NULL;
1326 }
1327 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001328 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001329 return NULL;
1330 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001331 f = sysget("stdin");
1332 if (f == NULL) {
1333 err_setstr(RuntimeError, "lost sys.stdin");
1334 return NULL;
1335 }
1336 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001337}
1338
1339static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001340builtin_reduce(self, args)
1341 object *self;
1342 object *args;
1343{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001344 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001345 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001346 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001347
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001348 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1349 return NULL;
1350 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001351 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001352
1353 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1354 err_setstr(TypeError,
1355 "2nd argument to reduce() must be a sequence object");
1356 return NULL;
1357 }
1358
Guido van Rossum12d12c51993-10-26 17:58:25 +00001359 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001360 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001361
Guido van Rossum2d951851994-08-29 12:52:16 +00001362 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001363 object *op2;
1364
1365 if (args->ob_refcnt > 1) {
1366 DECREF(args);
1367 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001368 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001369 }
1370
Guido van Rossum2d951851994-08-29 12:52:16 +00001371 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1372 if (err_occurred() == IndexError) {
1373 err_clear();
1374 break;
1375 }
1376 goto Fail;
1377 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001378
Guido van Rossum2d951851994-08-29 12:52:16 +00001379 if (result == NULL)
1380 result = op2;
1381 else {
1382 settupleitem(args, 0, result);
1383 settupleitem(args, 1, op2);
1384 if ((result = call_object(func, args)) == NULL)
1385 goto Fail;
1386 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001387 }
1388
1389 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001390
Guido van Rossum2d951851994-08-29 12:52:16 +00001391 if (result == NULL)
1392 err_setstr(TypeError,
1393 "reduce of empty sequence with no initial value");
1394
Guido van Rossum12d12c51993-10-26 17:58:25 +00001395 return result;
1396
Guido van Rossum2d951851994-08-29 12:52:16 +00001397Fail:
1398 XDECREF(args);
1399 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001400 return NULL;
1401}
1402
1403static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001404builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001405 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001406 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001407{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001408 object *v;
1409
1410 if (!newgetargs(args, "O:reload", &v))
1411 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001412 return reload_module(v);
1413}
1414
1415static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001416builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001417 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001418 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001419{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001420 object *v;
1421
1422 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001423 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001424 return reprobject(v);
1425}
1426
1427static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001428builtin_round(self, args)
1429 object *self;
1430 object *args;
1431{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001432 double x;
1433 double f;
1434 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001435 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001436
1437 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001438 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001439 f = 1.0;
1440 for (i = ndigits; --i >= 0; )
1441 f = f*10.0;
1442 for (i = ndigits; ++i <= 0; )
1443 f = f*0.1;
1444 if (x >= 0.0)
1445 return newfloatobject(floor(x*f + 0.5) / f);
1446 else
1447 return newfloatobject(ceil(x*f - 0.5) / f);
1448}
1449
1450static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001451builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001452 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001453 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001454{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001455 object *v;
1456
1457 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001458 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001459 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001460}
1461
1462static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001463builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001464 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001465 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001466{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001467 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001468 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001469
1470 if (!newgetargs(args, "O:tuple", &v))
1471 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001472 if (is_tupleobject(v)) {
1473 INCREF(v);
1474 return v;
1475 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001476 if (is_listobject(v))
1477 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001478 if (is_stringobject(v)) {
1479 int n = getstringsize(v);
1480 object *t = newtupleobject(n);
1481 if (t != NULL) {
1482 int i;
1483 char *p = getstringvalue(v);
1484 for (i = 0; i < n; i++) {
1485 object *item = newsizedstringobject(p+i, 1);
1486 if (item == NULL) {
1487 DECREF(t);
1488 t = NULL;
1489 break;
1490 }
1491 settupleitem(t, i, item);
1492 }
1493 }
1494 return t;
1495 }
1496 /* Generic sequence object */
1497 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1498 int n = (*sqf->sq_length)(v);
1499 int i;
1500 object *t;
1501 if (n < 0)
1502 return NULL;
1503 t = newtupleobject(n);
1504 if (t == NULL)
1505 return NULL;
1506 for (i = 0; i < n; i++) {
1507 object *item = (*sqf->sq_item)(v, i);
1508 if (item == NULL) {
1509 DECREF(t);
1510 t = NULL;
1511 break;
1512 }
1513 settupleitem(t, i, item);
1514 }
1515 /* XXX Should support indefinite-length sequences */
1516 return t;
1517 }
1518 /* None of the above */
1519 err_setstr(TypeError, "tuple() argument must be a sequence");
1520 return NULL;
1521}
1522
1523static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001524builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001525 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001526 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001527{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001528 object *v;
1529
1530 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001531 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001532 v = (object *)v->ob_type;
1533 INCREF(v);
1534 return v;
1535}
1536
Guido van Rossum2d951851994-08-29 12:52:16 +00001537static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001538builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001539 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001540 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001541{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001542 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001543 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001544
1545 if (!newgetargs(args, "|O:vars", &v))
1546 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001547 if (v == NULL) {
1548 d = getlocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001549 if (d == NULL) {
1550 if (!err_occurred())
1551 err_setstr(SystemError, "no locals!?");
1552 }
1553 else
1554 INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001555 }
1556 else {
1557 d = getattr(v, "__dict__");
1558 if (d == NULL) {
1559 err_setstr(TypeError,
1560 "vars() argument must have __dict__ attribute");
1561 return NULL;
1562 }
1563 }
1564 return d;
1565}
1566
Guido van Rossum3f5da241990-12-20 15:06:42 +00001567static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001568 {"__import__", builtin___import__, 1},
1569 {"abs", builtin_abs, 1},
1570 {"apply", builtin_apply, 1},
1571 {"callable", builtin_callable, 1},
1572 {"chr", builtin_chr, 1},
1573 {"cmp", builtin_cmp, 1},
1574 {"coerce", builtin_coerce, 1},
1575 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001576#ifndef WITHOUT_COMPLEX
1577 {"complex", builtin_complex, 1},
1578#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001579 {"delattr", builtin_delattr, 1},
1580 {"dir", builtin_dir, 1},
1581 {"divmod", builtin_divmod, 1},
1582 {"eval", builtin_eval, 1},
1583 {"execfile", builtin_execfile, 1},
1584 {"filter", builtin_filter, 1},
1585 {"float", builtin_float, 1},
1586 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001587 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001588 {"hasattr", builtin_hasattr, 1},
1589 {"hash", builtin_hash, 1},
1590 {"hex", builtin_hex, 1},
1591 {"id", builtin_id, 1},
1592 {"input", builtin_input, 1},
Guido van Rossume8811f81997-02-14 15:48:05 +00001593 {"intern", builtin_intern, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001594 {"int", builtin_int, 1},
1595 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001596 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001597 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001598 {"long", builtin_long, 1},
1599 {"map", builtin_map, 1},
1600 {"max", builtin_max, 1},
1601 {"min", builtin_min, 1},
1602 {"oct", builtin_oct, 1},
1603 {"open", builtin_open, 1},
1604 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001605 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001606 {"range", builtin_range, 1},
1607 {"raw_input", builtin_raw_input, 1},
1608 {"reduce", builtin_reduce, 1},
1609 {"reload", builtin_reload, 1},
1610 {"repr", builtin_repr, 1},
1611 {"round", builtin_round, 1},
1612 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001613 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001614 {"str", builtin_str, 1},
1615 {"tuple", builtin_tuple, 1},
1616 {"type", builtin_type, 1},
1617 {"vars", builtin_vars, 1},
1618 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001619 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001620};
1621
Guido van Rossum0865dd91995-01-17 16:30:22 +00001622static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001623static object *builtin_dict;
1624
1625object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001626getbuiltinmod()
1627{
1628 return builtin_mod;
1629}
1630
1631object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001632getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001633{
Guido van Rossum6135a871995-01-09 17:53:26 +00001634 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001635}
1636
1637/* Predefined exceptions */
1638
Guido van Rossum25831651993-05-19 14:50:45 +00001639object *AccessError;
Guido van Rossumc6472e91997-03-31 17:15:43 +00001640object *PyExc_AssertionError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001641object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001642object *EOFError;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001643object *FloatingPointError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001644object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001645object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001646object *IndexError;
1647object *KeyError;
1648object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001649object *MemoryError;
1650object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001651object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001652object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001653object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001654object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001655object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001656object *TypeError;
1657object *ValueError;
1658object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001659
Guido van Rossum3f5da241990-12-20 15:06:42 +00001660static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001661newstdexception(name)
1662 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001663{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001664 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001665 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1666 fatal("no mem for new standard exception");
1667 return v;
1668}
1669
1670static void
1671initerrors()
1672{
Guido van Rossum25831651993-05-19 14:50:45 +00001673 AccessError = newstdexception("AccessError");
Guido van Rossumc6472e91997-03-31 17:15:43 +00001674 PyExc_AssertionError = newstdexception("AssertionError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001675 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001676 EOFError = newstdexception("EOFError");
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001677 FloatingPointError = newstdexception("FloatingPointError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001678 IOError = newstdexception("IOError");
1679 ImportError = newstdexception("ImportError");
1680 IndexError = newstdexception("IndexError");
1681 KeyError = newstdexception("KeyError");
1682 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001683 MemoryError = newstdexception("MemoryError");
1684 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001685 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001686 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001687 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001688 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001689 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001690 TypeError = newstdexception("TypeError");
1691 ValueError = newstdexception("ValueError");
1692 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001693}
1694
1695void
1696initbuiltin()
1697{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001698 builtin_mod = initmodule("__builtin__", builtin_methods);
1699 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001700 INCREF(builtin_dict);
1701 initerrors();
1702 (void) dictinsert(builtin_dict, "None", None);
Guido van Rossume449af71996-10-11 16:25:41 +00001703 (void) dictinsert(builtin_dict, "Ellipsis", Py_Ellipsis);
Guido van Rossum1c6a4591997-03-11 18:43:26 +00001704 (void) dictinsert(builtin_dict, "__debug__",
1705 newintobject(Py_OptimizeFlag == 0));
1706 if (err_occurred())
1707 fatal("error creating None/Ellipsis/__debug__ in __builtin__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001708}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001709
Guido van Rossum12d12c51993-10-26 17:58:25 +00001710
Guido van Rossume77a7571993-11-03 15:01:26 +00001711/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001712
1713static object *
1714filtertuple(func, tuple)
1715 object *func;
1716 object *tuple;
1717{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001718 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001719 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001720 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001721
Guido van Rossumb7b45621995-08-04 04:07:45 +00001722 if (len == 0) {
1723 INCREF(tuple);
1724 return tuple;
1725 }
1726
Guido van Rossum2586bf01993-11-01 16:21:44 +00001727 if ((result = newtupleobject(len)) == NULL)
1728 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001729
Guido van Rossum12d12c51993-10-26 17:58:25 +00001730 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001731 object *item, *good;
1732 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001733
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001734 if ((item = gettupleitem(tuple, i)) == NULL)
1735 goto Fail_1;
1736 if (func == None) {
1737 INCREF(item);
1738 good = item;
1739 }
1740 else {
1741 object *arg = mkvalue("(O)", item);
1742 if (arg == NULL)
1743 goto Fail_1;
1744 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001745 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001746 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001747 goto Fail_1;
1748 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001749 ok = testbool(good);
1750 DECREF(good);
1751 if (ok) {
1752 INCREF(item);
1753 if (settupleitem(result, j++, item) < 0)
1754 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001755 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001756 }
1757
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001758 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001759 return NULL;
1760
Guido van Rossum12d12c51993-10-26 17:58:25 +00001761 return result;
1762
Guido van Rossum12d12c51993-10-26 17:58:25 +00001763Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001764 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001765 return NULL;
1766}
1767
1768
Guido van Rossume77a7571993-11-03 15:01:26 +00001769/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001770
1771static object *
1772filterstring(func, strobj)
1773 object *func;
1774 object *strobj;
1775{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001776 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001777 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001778 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001779
Guido van Rossum2586bf01993-11-01 16:21:44 +00001780 if (func == None) {
1781 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001782 INCREF(strobj);
1783 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001784 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001785 if ((result = newsizedstringobject(NULL, len)) == NULL)
1786 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001787
Guido van Rossum12d12c51993-10-26 17:58:25 +00001788 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001789 object *item, *arg, *good;
1790 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001791
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001792 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1793 if (item == NULL)
1794 goto Fail_1;
1795 arg = mkvalue("(O)", item);
1796 DECREF(item);
1797 if (arg == NULL)
1798 goto Fail_1;
1799 good = call_object(func, arg);
1800 DECREF(arg);
1801 if (good == NULL)
1802 goto Fail_1;
1803 ok = testbool(good);
1804 DECREF(good);
1805 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001806 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001807 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001808 }
1809
Guido van Rossum79d96d61996-08-16 20:44:34 +00001810 if (j < len && resizestring(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001811 return NULL;
1812
Guido van Rossum12d12c51993-10-26 17:58:25 +00001813 return result;
1814
Guido van Rossum12d12c51993-10-26 17:58:25 +00001815Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001816 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001817 return NULL;
1818}
Guido van Rossumc6472e91997-03-31 17:15:43 +00001819
1820/* Copied with modifications from stropmodule.c: atoi,atof.atol */
1821
1822static PyObject *
1823int_from_string(v)
1824 PyObject *v;
1825{
1826 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
1827 char *s, *end;
1828 long x;
1829 char buffer[256]; /* For errors */
1830
1831 if (!PyArg_Parse(v, "s", &s))
1832 return NULL;
1833 while (*s && isspace(Py_CHARMASK(*s)))
1834 s++;
1835 if (s[0] == '\0') {
1836 PyErr_SetString(PyExc_ValueError, "empty string for int()");
1837 return NULL;
1838 }
1839 errno = 0;
1840 x = PyOS_strtol(s, &end, 10);
1841 while (*end && isspace(Py_CHARMASK(*end)))
1842 end++;
1843 if (*end != '\0') {
1844 sprintf(buffer, "invalid literal for int(): %.200s", s);
1845 PyErr_SetString(PyExc_ValueError, buffer);
1846 return NULL;
1847 }
1848 else if (errno != 0) {
1849 sprintf(buffer, "int() literal too large: %.200s", s);
1850 PyErr_SetString(PyExc_ValueError, buffer);
1851 return NULL;
1852 }
1853 return PyInt_FromLong(x);
1854}
1855
1856static PyObject *
1857long_from_string(v)
1858 PyObject *v;
1859{
1860 char *s, *end;
1861 PyObject *x;
1862 char buffer[256]; /* For errors */
1863
1864 if (!PyArg_Parse(v, "s", &s))
1865 return NULL;
1866
1867 while (*s && isspace(Py_CHARMASK(*s)))
1868 s++;
1869 if (s[0] == '\0') {
1870 PyErr_SetString(PyExc_ValueError, "empty string for long()");
1871 return NULL;
1872 }
1873 x = PyLong_FromString(s, &end, 10);
1874 if (x == NULL)
1875 return NULL;
1876 while (*end && isspace(Py_CHARMASK(*end)))
1877 end++;
1878 if (*end != '\0') {
1879 sprintf(buffer, "invalid literal for long(): %.200s", s);
1880 PyErr_SetString(PyExc_ValueError, buffer);
1881 Py_DECREF(x);
1882 return NULL;
1883 }
1884 return x;
1885}
1886
1887static PyObject *
1888float_from_string(v)
1889 PyObject *v;
1890{
1891 extern double strtod Py_PROTO((const char *, char **));
1892 char *s, *end;
1893 double x;
1894 char buffer[256]; /* For errors */
1895
1896 if (!PyArg_Parse(v, "s", &s))
1897 return NULL;
1898 while (*s && isspace(Py_CHARMASK(*s)))
1899 s++;
1900 if (s[0] == '\0') {
1901 PyErr_SetString(PyExc_ValueError, "empty string for float()");
1902 return NULL;
1903 }
1904 errno = 0;
1905 PyFPE_START_PROTECT("float_from_string", return 0)
1906 x = strtod(s, &end);
1907 PyFPE_END_PROTECT(x)
1908 while (*end && isspace(Py_CHARMASK(*end)))
1909 end++;
1910 if (*end != '\0') {
1911 sprintf(buffer, "invalid literal for float(): %.200s", s);
1912 PyErr_SetString(PyExc_ValueError, buffer);
1913 return NULL;
1914 }
1915 else if (errno != 0) {
1916 sprintf(buffer, "float() literal too large: %.200s", s);
1917 PyErr_SetString(PyExc_ValueError, buffer);
1918 return NULL;
1919 }
1920 return PyFloat_FromDouble(x);
1921}