blob: d1dc9a5bdaf9103a3e53347a572044f568203295 [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 Rossum1a2c5cb1996-12-10 15:37:36 +000045#ifdef HAVE_UNISTD_H
46#include <unistd.h>
47#endif
48
Guido van Rossum12d12c51993-10-26 17:58:25 +000049/* Forward */
50static object *filterstring PROTO((object *, object *));
51static object *filtertuple PROTO((object *, object *));
Guido van Rossum12d12c51993-10-26 17:58:25 +000052
Guido van Rossum3f5da241990-12-20 15:06:42 +000053static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000054builtin___import__(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000055 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000057{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000058 char *name;
Guido van Rossum24c13741995-02-14 09:42:43 +000059 object *globals = NULL;
60 object *locals = NULL;
61 object *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000062
Guido van Rossum24c13741995-02-14 09:42:43 +000063 if (!newgetargs(args, "s|OOO:__import__",
64 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000065 return NULL;
Guido van Rossum7f9fa971995-01-20 16:53:12 +000066 return import_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000067}
68
69
70static object *
71builtin_abs(self, args)
72 object *self;
73 object *args;
74{
75 object *v;
Guido van Rossumd4905451991-05-05 20:00:36 +000076 number_methods *nm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000077
78 if (!newgetargs(args, "O:abs", &v))
79 return NULL;
80 if ((nm = v->ob_type->tp_as_number) == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +000081 err_setstr(TypeError, "abs() requires numeric argument");
82 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000083 }
Guido van Rossumd4905451991-05-05 20:00:36 +000084 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000085}
86
87static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000088builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000089 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000090 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000091{
Guido van Rossumc96ef6a1996-01-26 20:44:30 +000092 object *func, *alist = NULL, *kwdict = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000093
Guido van Rossum681d79a1995-07-18 14:51:37 +000094 if (!newgetargs(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000095 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +000096 if (alist != NULL && !is_tupleobject(alist)) {
Guido van Rossum2d951851994-08-29 12:52:16 +000097 err_setstr(TypeError, "apply() 2nd argument must be tuple");
98 return NULL;
99 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000100 if (kwdict != NULL && !is_dictobject(kwdict)) {
101 err_setstr(TypeError,
102 "apply() 3rd argument must be dictionary");
103 return NULL;
104 }
105 return PyEval_CallObjectWithKeywords(func, alist, kwdict);
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000106}
107
Guido van Rossum2d951851994-08-29 12:52:16 +0000108static object *
109builtin_callable(self, args)
110 object *self;
111 object *args;
112{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000113 object *v;
114
115 if (!newgetargs(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000116 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000117 return newintobject((long)callable(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000118}
119
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000120static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000121builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000122 object *self;
123 object *args;
124{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000125 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000126 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000127 int len;
128 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000129
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000130 if (!newgetargs(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000131 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000132
Guido van Rossum12d12c51993-10-26 17:58:25 +0000133 if (is_stringobject(seq)) {
134 object *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000135 return r;
136 }
137
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000138 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000139 object *r = filtertuple(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 ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000144 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000145 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000146 goto Fail_2;
147 }
148
149 if ((len = (*sqf->sq_length)(seq)) < 0)
150 goto Fail_2;
151
152 if (is_listobject(seq) && seq->ob_refcnt == 1) {
153 INCREF(seq);
154 result = seq;
155 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000156 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000157 if ((result = newlistobject(len)) == NULL)
158 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000159 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000160
Guido van Rossum2d951851994-08-29 12:52:16 +0000161 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000162 object *item, *good;
163 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000164
Guido van Rossum2d951851994-08-29 12:52:16 +0000165 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
166 if (i < len)
167 goto Fail_1;
168 if (err_occurred() == IndexError) {
169 err_clear();
170 break;
171 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000172 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000173 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000174
175 if (func == None) {
176 good = item;
Guido van Rossum58b68731995-01-10 17:40:55 +0000177 INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000178 }
179 else {
180 object *arg = mkvalue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000181 if (arg == NULL)
182 goto Fail_1;
183 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000184 DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000185 if (good == NULL) {
186 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000187 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000188 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000189 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000190 ok = testbool(good);
191 DECREF(good);
192 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000193 if (j < len) {
194 if (setlistitem(result, j++, item) < 0)
195 goto Fail_1;
196 }
197 else {
198 j++;
199 if (addlistitem(result, item) < 0)
200 goto Fail_1;
201 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000202 } else {
203 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000204 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000205 }
206
Guido van Rossum12d12c51993-10-26 17:58:25 +0000207
Guido van Rossum2d951851994-08-29 12:52:16 +0000208 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000209 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000210
Guido van Rossum12d12c51993-10-26 17:58:25 +0000211 return result;
212
Guido van Rossum12d12c51993-10-26 17:58:25 +0000213Fail_1:
214 DECREF(result);
215Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000216 return NULL;
217}
218
219static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000220builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000221 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000222 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000223{
224 long x;
225 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000226
227 if (!newgetargs(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000228 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000229 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000230 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000231 return NULL;
232 }
233 s[0] = x;
234 return newsizedstringobject(s, 1);
235}
236
237static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000238builtin_cmp(self, args)
239 object *self;
240 object *args;
241{
242 object *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000243
244 if (!newgetargs(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000245 return NULL;
246 return newintobject((long)cmpobject(a, b));
247}
248
249static object *
Guido van Rossum5524a591995-01-10 15:26:20 +0000250builtin_coerce(self, args)
251 object *self;
252 object *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000253{
Guido van Rossum5524a591995-01-10 15:26:20 +0000254 object *v, *w;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000255 object *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000256
257 if (!newgetargs(args, "OO:coerce", &v, &w))
258 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000259 if (coerce(&v, &w) < 0)
260 return NULL;
261 res = mkvalue("(OO)", v, w);
262 DECREF(v);
263 DECREF(w);
264 return res;
265}
266
267static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000268builtin_compile(self, args)
269 object *self;
270 object *args;
271{
272 char *str;
273 char *filename;
274 char *startstr;
275 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000276
277 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000278 return NULL;
279 if (strcmp(startstr, "exec") == 0)
280 start = file_input;
281 else if (strcmp(startstr, "eval") == 0)
282 start = eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000283 else if (strcmp(startstr, "single") == 0)
284 start = single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000285 else {
286 err_setstr(ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000287 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000288 return NULL;
289 }
290 return compile_string(str, filename, start);
291}
292
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000293#ifndef WITHOUT_COMPLEX
294
295static object *
296builtin_complex(self, args)
297 object *self;
298 object *args;
299{
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000300 object *r, *i, *tmp;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000301 number_methods *nbr, *nbi;
Guido van Rossum530956d1996-07-21 02:27:43 +0000302 Py_complex cr, ci;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000303
304 i = NULL;
305 if (!newgetargs(args, "O|O:complex", &r, &i))
306 return NULL;
307 if ((nbr = r->ob_type->tp_as_number) == NULL ||
308 nbr->nb_float == NULL || (i != NULL &&
309 ((nbi = i->ob_type->tp_as_number) == NULL ||
310 nbi->nb_float == NULL))) {
311 err_setstr(TypeError,
312 "complex() argument can't be converted to complex");
313 return NULL;
314 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000315 /* XXX Hack to support classes with __complex__ method */
316 if (is_instanceobject(r)) {
317 static object *complexstr;
318 object *f;
319 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000320 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000321 if (complexstr == NULL)
322 return NULL;
323 }
324 f = getattro(r, complexstr);
325 if (f == NULL)
326 err_clear();
327 else {
328 object *args = mkvalue("()");
329 if (args == NULL)
330 return NULL;
331 r = call_object(f, args);
332 DECREF(args);
333 if (r == NULL)
334 return NULL;
335 }
336 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000337 if (is_complexobject(r))
338 cr = ((complexobject*)r)->cval;
339 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000340 tmp = (*nbr->nb_float)(r);
341 if (tmp == NULL)
342 return NULL;
343 cr.real = getfloatvalue(tmp);
344 DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000345 cr.imag = 0.;
346 }
347 if (i == NULL) {
348 ci.real = 0.;
349 ci.imag = 0.;
350 }
351 else if (is_complexobject(i))
352 ci = ((complexobject*)i)->cval;
353 else {
Guido van Rossumb0721501996-09-07 15:55:27 +0000354 tmp = (*nbr->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000355 if (tmp == NULL)
356 return NULL;
357 ci.real = getfloatvalue(tmp);
358 DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000359 ci.imag = 0.;
360 }
361 cr.real -= ci.imag;
362 cr.imag += ci.real;
363 return newcomplexobject(cr);
364}
365
366#endif
367
Guido van Rossum5b722181993-03-30 17:46:03 +0000368static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000370 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000371 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000372{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000373 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000374 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375
376 if (!newgetargs(args, "|O:dir", &v))
377 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000378 if (v == NULL) {
379 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000380 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000381 }
382 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000383 d = getattr(v, "__dict__");
384 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000386 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000387 return NULL;
388 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000389 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000390 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000391 v = getdictkeys(d);
392 if (sortlist(v) != 0) {
393 DECREF(v);
394 v = NULL;
395 }
396 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000397 else {
Guido van Rossum795ba581996-05-23 22:49:07 +0000398 v = PyObject_CallMethod(d, "keys", NULL);
399 if (v == NULL) {
400 PyErr_Clear();
401 v = newlistobject(0);
402 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000403 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000404 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000405 return v;
406}
407
408static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000409do_divmod(v, w)
410 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000411{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000412 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000413
Guido van Rossum180d7b41994-09-29 09:45:57 +0000414 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000415 return instancebinop(v, w, "__divmod__", "__rdivmod__",
416 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000417 if (v->ob_type->tp_as_number == NULL ||
418 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000419 err_setstr(TypeError,
420 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000421 return NULL;
422 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000423 if (coerce(&v, &w) != 0)
424 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000425 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000426 DECREF(v);
427 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000428 return res;
429}
430
431static object *
432builtin_divmod(self, args)
433 object *self;
434 object *args;
435{
436 object *v, *w;
437
438 if (!newgetargs(args, "OO:divmod", &v, &w))
439 return NULL;
440 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000441}
442
443static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444builtin_eval(self, args)
445 object *self;
446 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000447{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000448 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000449 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000451
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000452 if (!newgetargs(args, "O|O!O!:eval",
453 &cmd,
454 &Mappingtype, &globals,
455 &Mappingtype, &locals))
456 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000457 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000458 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000459 if (locals == None)
460 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000461 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000462 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000463 locals = globals;
464 if (dictlookup(globals, "__builtins__") == NULL) {
465 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
466 return NULL;
467 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000468 if (is_codeobject(cmd))
Guido van Rossum681d79a1995-07-18 14:51:37 +0000469 return eval_code((codeobject *) cmd, globals, locals);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000470 if (!is_stringobject(cmd)) {
471 err_setstr(TypeError,
472 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000473 return NULL;
474 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000475 str = getstringvalue(cmd);
476 if (strlen(str) != getstringsize(cmd)) {
477 err_setstr(ValueError,
478 "embedded '\\0' in string arg");
479 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000480 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000481 while (*str == ' ' || *str == '\t')
482 str++;
483 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000484}
485
486static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000487builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000488 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000489 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000490{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000491 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000492 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000493 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000494 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000495
496 if (!newgetargs(args, "s|O!O!:execfile",
497 &filename,
498 &Mappingtype, &globals,
499 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000500 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000501 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000502 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000503 if (locals == None)
504 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000505 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000506 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000507 locals = globals;
508 if (dictlookup(globals, "__builtins__") == NULL) {
509 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
510 return NULL;
511 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000512 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000513 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000514 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000515 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000516 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000517 return NULL;
518 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000519 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000520 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000521 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000522 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000523 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000524}
525
526static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000527builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000528 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000529 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000530{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000532 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000533
534 if (!newgetargs(args, "O:float", &v))
535 return NULL;
536 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000537 nb->nb_float == NULL) {
538 err_setstr(TypeError,
539 "float() argument can't be converted to float");
540 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000541 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000542 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000543}
544
545static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000546builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000547 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000548 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000549{
Guido van Rossum94390a41992-08-14 15:14:30 +0000550 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000551 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000552
553 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000554 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000555 return getattro(v, name);
556}
557
558static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000559builtin_globals(self, args)
560 object *self;
561 object *args;
562{
563 object *d;
564
565 if (!newgetargs(args, ""))
566 return NULL;
567 d = getglobals();
568 INCREF(d);
569 return d;
570}
571
572static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000573builtin_hasattr(self, args)
574 object *self;
575 object *args;
576{
577 object *v;
578 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000579
580 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000581 return NULL;
582 v = getattro(v, name);
583 if (v == NULL) {
584 err_clear();
585 return newintobject(0L);
586 }
587 DECREF(v);
588 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000589}
590
591static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000592builtin_id(self, args)
593 object *self;
594 object *args;
595{
596 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000597
598 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000599 return NULL;
600 return newintobject((long)v);
601}
602
603static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000604builtin_map(self, args)
605 object *self;
606 object *args;
607{
608 typedef struct {
609 object *seq;
610 sequence_methods *sqf;
611 int len;
612 } sequence;
613
614 object *func, *result;
615 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000616 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000617 register int i, j;
618
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000619 n = gettuplesize(args);
620 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000621 err_setstr(TypeError, "map() requires at least two args");
622 return NULL;
623 }
624
625 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000626 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000627
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000628 if ((seqs = NEW(sequence, n)) == NULL) {
629 err_nomem();
630 goto Fail_2;
631 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000632
Guido van Rossum2d951851994-08-29 12:52:16 +0000633 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000634 int curlen;
635
636 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
637 goto Fail_2;
638
639 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
640 static char errmsg[] =
641 "argument %d to map() must be a sequence object";
642 char errbuf[sizeof(errmsg) + 3];
643
644 sprintf(errbuf, errmsg, i+2);
645 err_setstr(TypeError, errbuf);
646 goto Fail_2;
647 }
648
649 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
650 goto Fail_2;
651
652 if (curlen > len)
653 len = curlen;
654 }
655
656 if ((result = (object *) newlistobject(len)) == NULL)
657 goto Fail_2;
658
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000659 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000660 for (i = 0; ; ++i) {
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000661 object *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000662 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000663
Guido van Rossum2d951851994-08-29 12:52:16 +0000664 if (func == None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000665 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000666 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000667 if ((alist = newtupleobject(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000668 goto Fail_1;
669 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000670
671 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000672 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000673 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000674 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000675 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000676 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000677 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000678 if (item == NULL) {
679 if (i < sqp->len)
680 goto Fail_0;
681 if (err_occurred() == IndexError) {
682 err_clear();
683 INCREF(None);
684 item = None;
685 sqp->len = -1;
686 }
687 else {
688 goto Fail_0;
689 }
690 }
691 else
692 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000693
Guido van Rossum12d12c51993-10-26 17:58:25 +0000694 }
Guido van Rossum32120311995-07-10 13:52:21 +0000695 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000696 break;
Guido van Rossum32120311995-07-10 13:52:21 +0000697 if (settupleitem(alist, j, item) < 0) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000698 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000699 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000700 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000701 continue;
702
703 Fail_0:
Guido van Rossum32120311995-07-10 13:52:21 +0000704 XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000705 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000706 }
707
Guido van Rossum32120311995-07-10 13:52:21 +0000708 if (!alist)
709 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000710
711 if (!any) {
Guido van Rossum32120311995-07-10 13:52:21 +0000712 DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000713 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000714 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000715
716 if (func == None)
Guido van Rossum32120311995-07-10 13:52:21 +0000717 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000718 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000719 value = call_object(func, alist);
720 DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000721 if (value == NULL)
722 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000723 }
724 if (i >= len) {
725 if (addlistitem(result, value) < 0)
726 goto Fail_1;
727 }
728 else {
729 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000730 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000731 }
732 }
733
Guido van Rossum2d951851994-08-29 12:52:16 +0000734 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000735 return result;
736
Guido van Rossum12d12c51993-10-26 17:58:25 +0000737Fail_1:
738 DECREF(result);
739Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000740 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000741 return NULL;
742}
743
744static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000745builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000746 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000747 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000748{
Guido van Rossum94390a41992-08-14 15:14:30 +0000749 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000750 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000751 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000752
753 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000754 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000755 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000756 return NULL;
757 INCREF(None);
758 return None;
759}
760
761static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000762builtin_delattr(self, args)
763 object *self;
764 object *args;
765{
766 object *v;
767 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768
769 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000770 return NULL;
771 if (setattro(v, name, (object *)NULL) != 0)
772 return NULL;
773 INCREF(None);
774 return None;
775}
776
777static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000778builtin_hash(self, args)
779 object *self;
780 object *args;
781{
782 object *v;
783 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000784
785 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000786 return NULL;
787 x = hashobject(v);
788 if (x == -1)
789 return NULL;
790 return newintobject(x);
791}
792
793static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000794builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000795 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000796 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000797{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000798 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000799 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000800
801 if (!newgetargs(args, "O:hex", &v))
802 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000803
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000804 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000805 nb->nb_hex == NULL) {
806 err_setstr(TypeError,
807 "hex() argument can't be converted to hex");
808 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000809 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000810 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000811}
812
Guido van Rossum3165fe61992-09-25 21:59:05 +0000813static object *builtin_raw_input PROTO((object *, object *));
814
Guido van Rossum006bcd41991-10-24 14:54:44 +0000815static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000816builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000817 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000818 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000819{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000820 object *line;
821 char *str;
822 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000823 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000824
825 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000826 if (line == NULL)
827 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000828 if (!getargs(line, "s;embedded '\\0' in input line", &str))
829 return NULL;
830 while (*str == ' ' || *str == '\t')
831 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000832 globals = getglobals();
833 locals = getlocals();
834 if (dictlookup(globals, "__builtins__") == NULL) {
835 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
836 return NULL;
837 }
838 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000839 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000840 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000841}
842
Guido van Rossume8811f81997-02-14 15:48:05 +0000843static PyObject *
844builtin_intern(self, args)
845 PyObject *self;
846 PyObject *args;
847{
848 PyObject *s;
849 if (!PyArg_ParseTuple(args, "S", &s))
850 return NULL;
851 Py_INCREF(s);
852 PyString_InternInPlace(&s);
853 return s;
854}
855
Guido van Rossum3f5da241990-12-20 15:06:42 +0000856static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000857builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000858 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000859 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000860{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000861 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000862 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000863
864 if (!newgetargs(args, "O:int", &v))
865 return NULL;
866 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000867 nb->nb_int == NULL) {
868 err_setstr(TypeError,
869 "int() argument can't be converted to int");
870 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000871 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000872 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000873}
874
875static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000876builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000877 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000879{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000880 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000881 long len;
882 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000883
884 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000885 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000886 tp = v->ob_type;
887 if (tp->tp_as_sequence != NULL) {
888 len = (*tp->tp_as_sequence->sq_length)(v);
889 }
890 else if (tp->tp_as_mapping != NULL) {
891 len = (*tp->tp_as_mapping->mp_length)(v);
892 }
893 else {
894 err_setstr(TypeError, "len() of unsized object");
895 return NULL;
896 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000897 if (len < 0)
898 return NULL;
899 else
900 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000901}
902
903static object *
Guido van Rossumd1705771996-04-09 02:41:06 +0000904builtin_list(self, args)
905 object *self;
906 object *args;
907{
908 object *v;
909 sequence_methods *sqf;
910
911 if (!newgetargs(args, "O:list", &v))
912 return NULL;
913 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
914 int n = (*sqf->sq_length)(v);
915 int i;
916 object *l;
917 if (n < 0)
918 return NULL;
919 l = newlistobject(n);
920 if (l == NULL)
921 return NULL;
922 for (i = 0; i < n; i++) {
923 object *item = (*sqf->sq_item)(v, i);
924 if (item == NULL) {
925 DECREF(l);
926 l = NULL;
927 break;
928 }
929 setlistitem(l, i, item);
930 }
931 /* XXX Should support indefinite-length sequences */
932 return l;
933 }
934 err_setstr(TypeError, "list() argument must be a sequence");
935 return NULL;
936}
937
Guido van Rossum8861b741996-07-30 16:49:37 +0000938
939static PyObject *
940builtin_slice(self, args)
941 PyObject *self;
942 PyObject *args;
943{
944 PyObject *start, *stop, *step;
945
946 start = stop = step = NULL;
947
948 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
949 return NULL;
950
951 /*This swapping of stop and start is to maintain compatibility with
952 the range builtin.*/
953 if (stop == NULL) {
954 stop = start;
955 start = NULL;
956 }
957 return PySlice_New(start, stop, step);
958}
959
Guido van Rossumd1705771996-04-09 02:41:06 +0000960static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000961builtin_locals(self, args)
962 object *self;
963 object *args;
964{
965 object *d;
966
967 if (!newgetargs(args, ""))
968 return NULL;
969 d = getlocals();
970 INCREF(d);
971 return d;
972}
973
974static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000975builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000976 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000977 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000978{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000979 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000980 number_methods *nb;
981
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000982 if (!newgetargs(args, "O:long", &v))
983 return NULL;
984 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000985 nb->nb_long == NULL) {
986 err_setstr(TypeError,
987 "long() argument can't be converted to long");
988 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000989 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000990 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000991}
992
993static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000994min_max(args, sign)
995 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000996 int sign;
997{
Guido van Rossum2d951851994-08-29 12:52:16 +0000998 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000999 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001000 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001001
1002 if (gettuplesize(args) > 1)
1003 v = args;
1004 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001005 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001006 sq = v->ob_type->tp_as_sequence;
1007 if (sq == NULL) {
1008 err_setstr(TypeError, "min() or max() of non-sequence");
1009 return NULL;
1010 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001011 w = NULL;
1012 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001013 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001014 if (x == NULL) {
1015 if (err_occurred() == IndexError) {
1016 err_clear();
1017 break;
1018 }
1019 XDECREF(w);
1020 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001021 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001022 if (w == NULL)
1023 w = x;
1024 else {
1025 if (cmpobject(x, w) * sign > 0) {
1026 DECREF(w);
1027 w = x;
1028 }
1029 else
1030 DECREF(x);
1031 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001032 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001033 if (w == NULL)
1034 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001035 return w;
1036}
1037
1038static object *
1039builtin_min(self, v)
1040 object *self;
1041 object *v;
1042{
1043 return min_max(v, -1);
1044}
1045
1046static object *
1047builtin_max(self, v)
1048 object *self;
1049 object *v;
1050{
1051 return min_max(v, 1);
1052}
1053
1054static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001055builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001056 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001057 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001058{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001059 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001060 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001061
1062 if (!newgetargs(args, "O:oct", &v))
1063 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001064 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1065 nb->nb_oct == NULL) {
1066 err_setstr(TypeError,
1067 "oct() argument can't be converted to oct");
1068 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001069 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001070 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001071}
1072
1073static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001074builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001075 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001076 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001077{
Guido van Rossum2d951851994-08-29 12:52:16 +00001078 char *name;
1079 char *mode = "r";
1080 int bufsize = -1;
1081 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001082
1083 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001084 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001085 f = newfileobject(name, mode);
1086 if (f != NULL)
1087 setfilebufsize(f, bufsize);
1088 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001089}
1090
1091static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001092builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001093 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001094 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001095{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001096 char c;
1097
1098 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001099 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001100 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001101}
1102
1103static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001104do_pow(v, w)
1105 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +00001106{
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001107 object *res;
1108 if (is_instanceobject(v) || is_instanceobject(w))
1109 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001110 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +00001111 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +00001112 err_setstr(TypeError, "pow() requires numeric arguments");
1113 return NULL;
1114 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001115 if (
1116#ifndef WITHOUT_COMPLEX
1117 !is_complexobject(v) &&
1118#endif
1119 is_floatobject(w) && getfloatvalue(v) < 0.0) {
Guido van Rossum8a1e8eb1995-02-18 14:51:32 +00001120 if (!err_occurred())
1121 err_setstr(ValueError, "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001122 return NULL;
1123 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001124 if (coerce(&v, &w) != 0)
1125 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001126 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001127 DECREF(v);
1128 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001129 return res;
1130}
1131
1132static object *
1133builtin_pow(self, args)
1134 object *self;
1135 object *args;
1136{
1137 object *v, *w, *z = None, *res;
1138 object *v1, *z1, *w2, *z2;
1139
1140 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
1141 return NULL;
1142 if (z == None)
1143 return do_pow(v, w);
1144 /* XXX The ternary version doesn't do class instance coercions */
1145 if (is_instanceobject(v))
1146 return v->ob_type->tp_as_number->nb_power(v, w, z);
1147 if (v->ob_type->tp_as_number == NULL ||
1148 z->ob_type->tp_as_number == NULL ||
1149 w->ob_type->tp_as_number == NULL) {
1150 err_setstr(TypeError, "pow() requires numeric arguments");
1151 return NULL;
1152 }
1153 if (coerce(&v, &w) != 0)
1154 return NULL;
1155 res = NULL;
1156 v1 = v;
1157 z1 = z;
1158 if (coerce(&v1, &z1) != 0)
1159 goto error2;
1160 w2 = w;
1161 z2 = z1;
1162 if (coerce(&w2, &z2) != 0)
1163 goto error1;
1164 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
1165 DECREF(w2);
1166 DECREF(z2);
1167 error1:
1168 DECREF(v1);
1169 DECREF(z1);
1170 error2:
1171 DECREF(v);
1172 DECREF(w);
1173 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001174}
1175
1176static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001177builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001178 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001179 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001180{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001181 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001182 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001183 object *v;
1184
1185 if (gettuplesize(args) <= 1) {
1186 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001187 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001188 &ihigh))
1189 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001190 }
1191 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001192 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001193 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001194 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001195 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001196 }
1197 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001198 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001199 return NULL;
1200 }
1201 /* XXX ought to check overflow of subtraction */
1202 if (istep > 0)
1203 n = (ihigh - ilow + istep - 1) / istep;
1204 else
1205 n = (ihigh - ilow + istep + 1) / istep;
1206 if (n < 0)
1207 n = 0;
1208 v = newlistobject(n);
1209 if (v == NULL)
1210 return NULL;
1211 for (i = 0; i < n; i++) {
1212 object *w = newintobject(ilow);
1213 if (w == NULL) {
1214 DECREF(v);
1215 return NULL;
1216 }
1217 setlistitem(v, i, w);
1218 ilow += istep;
1219 }
1220 return v;
1221}
1222
1223static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001224builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001225 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001226 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001227{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001228 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001229 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001230
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001231 if (gettuplesize(args) <= 1) {
1232 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001233 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001234 &ihigh))
1235 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001236 }
1237 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001238 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001239 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001240 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001241 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001242 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001243 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001244 err_setstr(ValueError, "zero step for xrange()");
1245 return NULL;
1246 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001247 /* XXX ought to check overflow of subtraction */
1248 if (istep > 0)
1249 n = (ihigh - ilow + istep - 1) / istep;
1250 else
1251 n = (ihigh - ilow + istep + 1) / istep;
1252 if (n < 0)
1253 n = 0;
1254 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001255}
1256
Guido van Rossum872537c1995-07-07 22:43:42 +00001257extern char *my_readline PROTO((char *));
1258
Guido van Rossum12d12c51993-10-26 17:58:25 +00001259static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001260builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001261 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001262 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001263{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001264 object *v = NULL;
1265 object *f;
1266
1267 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001268 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001269 if (getfilefile(sysget("stdin")) == stdin &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001270 getfilefile(sysget("stdout")) == stdout &&
1271 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum872537c1995-07-07 22:43:42 +00001272 object *po;
1273 char *prompt;
1274 char *s;
1275 object *result;
1276 if (v != NULL) {
1277 po = strobject(v);
1278 if (po == NULL)
1279 return NULL;
1280 prompt = getstringvalue(po);
1281 }
1282 else {
1283 po = NULL;
1284 prompt = "";
1285 }
1286 s = my_readline(prompt);
1287 XDECREF(po);
1288 if (s == NULL) {
1289 err_set(KeyboardInterrupt);
1290 return NULL;
1291 }
1292 if (*s == '\0') {
1293 err_set(EOFError);
1294 result = NULL;
1295 }
1296 else { /* strip trailing '\n' */
1297 result = newsizedstringobject(s, strlen(s)-1);
1298 }
1299 free(s);
1300 return result;
1301 }
Guido van Rossum90933611991-06-07 16:10:43 +00001302 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001303 f = sysget("stdout");
1304 if (f == NULL) {
1305 err_setstr(RuntimeError, "lost sys.stdout");
1306 return NULL;
1307 }
1308 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001309 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001310 return NULL;
1311 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001312 f = sysget("stdin");
1313 if (f == NULL) {
1314 err_setstr(RuntimeError, "lost sys.stdin");
1315 return NULL;
1316 }
1317 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001318}
1319
1320static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001321builtin_reduce(self, args)
1322 object *self;
1323 object *args;
1324{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001325 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001326 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001327 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001328
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001329 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1330 return NULL;
1331 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001332 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001333
1334 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1335 err_setstr(TypeError,
1336 "2nd argument to reduce() must be a sequence object");
1337 return NULL;
1338 }
1339
Guido van Rossum12d12c51993-10-26 17:58:25 +00001340 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001341 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001342
Guido van Rossum2d951851994-08-29 12:52:16 +00001343 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001344 object *op2;
1345
1346 if (args->ob_refcnt > 1) {
1347 DECREF(args);
1348 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001349 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001350 }
1351
Guido van Rossum2d951851994-08-29 12:52:16 +00001352 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1353 if (err_occurred() == IndexError) {
1354 err_clear();
1355 break;
1356 }
1357 goto Fail;
1358 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001359
Guido van Rossum2d951851994-08-29 12:52:16 +00001360 if (result == NULL)
1361 result = op2;
1362 else {
1363 settupleitem(args, 0, result);
1364 settupleitem(args, 1, op2);
1365 if ((result = call_object(func, args)) == NULL)
1366 goto Fail;
1367 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001368 }
1369
1370 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001371
Guido van Rossum2d951851994-08-29 12:52:16 +00001372 if (result == NULL)
1373 err_setstr(TypeError,
1374 "reduce of empty sequence with no initial value");
1375
Guido van Rossum12d12c51993-10-26 17:58:25 +00001376 return result;
1377
Guido van Rossum2d951851994-08-29 12:52:16 +00001378Fail:
1379 XDECREF(args);
1380 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001381 return NULL;
1382}
1383
1384static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001385builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001386 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001387 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001388{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001389 object *v;
1390
1391 if (!newgetargs(args, "O:reload", &v))
1392 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001393 return reload_module(v);
1394}
1395
1396static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001397builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001398 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001399 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001400{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001401 object *v;
1402
1403 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001404 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001405 return reprobject(v);
1406}
1407
1408static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001409builtin_round(self, args)
1410 object *self;
1411 object *args;
1412{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001413 double x;
1414 double f;
1415 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001416 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001417
1418 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001419 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001420 f = 1.0;
1421 for (i = ndigits; --i >= 0; )
1422 f = f*10.0;
1423 for (i = ndigits; ++i <= 0; )
1424 f = f*0.1;
1425 if (x >= 0.0)
1426 return newfloatobject(floor(x*f + 0.5) / f);
1427 else
1428 return newfloatobject(ceil(x*f - 0.5) / f);
1429}
1430
1431static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001432builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001433 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001434 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001435{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001436 object *v;
1437
1438 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001439 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001440 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001441}
1442
1443static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001444builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001445 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001446 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001447{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001448 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001449 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001450
1451 if (!newgetargs(args, "O:tuple", &v))
1452 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001453 if (is_tupleobject(v)) {
1454 INCREF(v);
1455 return v;
1456 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001457 if (is_listobject(v))
1458 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001459 if (is_stringobject(v)) {
1460 int n = getstringsize(v);
1461 object *t = newtupleobject(n);
1462 if (t != NULL) {
1463 int i;
1464 char *p = getstringvalue(v);
1465 for (i = 0; i < n; i++) {
1466 object *item = newsizedstringobject(p+i, 1);
1467 if (item == NULL) {
1468 DECREF(t);
1469 t = NULL;
1470 break;
1471 }
1472 settupleitem(t, i, item);
1473 }
1474 }
1475 return t;
1476 }
1477 /* Generic sequence object */
1478 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1479 int n = (*sqf->sq_length)(v);
1480 int i;
1481 object *t;
1482 if (n < 0)
1483 return NULL;
1484 t = newtupleobject(n);
1485 if (t == NULL)
1486 return NULL;
1487 for (i = 0; i < n; i++) {
1488 object *item = (*sqf->sq_item)(v, i);
1489 if (item == NULL) {
1490 DECREF(t);
1491 t = NULL;
1492 break;
1493 }
1494 settupleitem(t, i, item);
1495 }
1496 /* XXX Should support indefinite-length sequences */
1497 return t;
1498 }
1499 /* None of the above */
1500 err_setstr(TypeError, "tuple() argument must be a sequence");
1501 return NULL;
1502}
1503
1504static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001505builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001506 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001507 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001508{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001509 object *v;
1510
1511 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001512 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001513 v = (object *)v->ob_type;
1514 INCREF(v);
1515 return v;
1516}
1517
Guido van Rossum2d951851994-08-29 12:52:16 +00001518static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001519builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001520 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001521 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001522{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001523 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001524 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001525
1526 if (!newgetargs(args, "|O:vars", &v))
1527 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001528 if (v == NULL) {
1529 d = getlocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001530 if (d == NULL) {
1531 if (!err_occurred())
1532 err_setstr(SystemError, "no locals!?");
1533 }
1534 else
1535 INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001536 }
1537 else {
1538 d = getattr(v, "__dict__");
1539 if (d == NULL) {
1540 err_setstr(TypeError,
1541 "vars() argument must have __dict__ attribute");
1542 return NULL;
1543 }
1544 }
1545 return d;
1546}
1547
Guido van Rossum3f5da241990-12-20 15:06:42 +00001548static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001549 {"__import__", builtin___import__, 1},
1550 {"abs", builtin_abs, 1},
1551 {"apply", builtin_apply, 1},
1552 {"callable", builtin_callable, 1},
1553 {"chr", builtin_chr, 1},
1554 {"cmp", builtin_cmp, 1},
1555 {"coerce", builtin_coerce, 1},
1556 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001557#ifndef WITHOUT_COMPLEX
1558 {"complex", builtin_complex, 1},
1559#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001560 {"delattr", builtin_delattr, 1},
1561 {"dir", builtin_dir, 1},
1562 {"divmod", builtin_divmod, 1},
1563 {"eval", builtin_eval, 1},
1564 {"execfile", builtin_execfile, 1},
1565 {"filter", builtin_filter, 1},
1566 {"float", builtin_float, 1},
1567 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001568 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001569 {"hasattr", builtin_hasattr, 1},
1570 {"hash", builtin_hash, 1},
1571 {"hex", builtin_hex, 1},
1572 {"id", builtin_id, 1},
1573 {"input", builtin_input, 1},
Guido van Rossume8811f81997-02-14 15:48:05 +00001574 {"intern", builtin_intern, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001575 {"int", builtin_int, 1},
1576 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001577 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001578 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001579 {"long", builtin_long, 1},
1580 {"map", builtin_map, 1},
1581 {"max", builtin_max, 1},
1582 {"min", builtin_min, 1},
1583 {"oct", builtin_oct, 1},
1584 {"open", builtin_open, 1},
1585 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001586 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001587 {"range", builtin_range, 1},
1588 {"raw_input", builtin_raw_input, 1},
1589 {"reduce", builtin_reduce, 1},
1590 {"reload", builtin_reload, 1},
1591 {"repr", builtin_repr, 1},
1592 {"round", builtin_round, 1},
1593 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001594 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001595 {"str", builtin_str, 1},
1596 {"tuple", builtin_tuple, 1},
1597 {"type", builtin_type, 1},
1598 {"vars", builtin_vars, 1},
1599 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001600 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001601};
1602
Guido van Rossum0865dd91995-01-17 16:30:22 +00001603static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001604static object *builtin_dict;
1605
1606object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001607getbuiltinmod()
1608{
1609 return builtin_mod;
1610}
1611
1612object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001613getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001614{
Guido van Rossum6135a871995-01-09 17:53:26 +00001615 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001616}
1617
1618/* Predefined exceptions */
1619
Guido van Rossum25831651993-05-19 14:50:45 +00001620object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001621object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001622object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001623object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001624object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001625object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001626object *IndexError;
1627object *KeyError;
1628object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001629object *MemoryError;
1630object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001631object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001632object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001633object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001634object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001635object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001636object *TypeError;
1637object *ValueError;
1638object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001639
Guido van Rossum3f5da241990-12-20 15:06:42 +00001640static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001641newstdexception(name)
1642 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001643{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001644 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001645 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1646 fatal("no mem for new standard exception");
1647 return v;
1648}
1649
1650static void
1651initerrors()
1652{
Guido van Rossum25831651993-05-19 14:50:45 +00001653 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001654 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001655 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001656 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001657 IOError = newstdexception("IOError");
1658 ImportError = newstdexception("ImportError");
1659 IndexError = newstdexception("IndexError");
1660 KeyError = newstdexception("KeyError");
1661 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001662 MemoryError = newstdexception("MemoryError");
1663 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001664 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001665 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001666 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001667 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001668 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001669 TypeError = newstdexception("TypeError");
1670 ValueError = newstdexception("ValueError");
1671 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001672}
1673
1674void
1675initbuiltin()
1676{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001677 builtin_mod = initmodule("__builtin__", builtin_methods);
1678 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001679 INCREF(builtin_dict);
1680 initerrors();
1681 (void) dictinsert(builtin_dict, "None", None);
Guido van Rossume449af71996-10-11 16:25:41 +00001682 (void) dictinsert(builtin_dict, "Ellipsis", Py_Ellipsis);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001683}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001684
Guido van Rossum12d12c51993-10-26 17:58:25 +00001685
Guido van Rossume77a7571993-11-03 15:01:26 +00001686/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001687
1688static object *
1689filtertuple(func, tuple)
1690 object *func;
1691 object *tuple;
1692{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001693 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001694 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001695 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001696
Guido van Rossumb7b45621995-08-04 04:07:45 +00001697 if (len == 0) {
1698 INCREF(tuple);
1699 return tuple;
1700 }
1701
Guido van Rossum2586bf01993-11-01 16:21:44 +00001702 if ((result = newtupleobject(len)) == NULL)
1703 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001704
Guido van Rossum12d12c51993-10-26 17:58:25 +00001705 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001706 object *item, *good;
1707 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001708
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001709 if ((item = gettupleitem(tuple, i)) == NULL)
1710 goto Fail_1;
1711 if (func == None) {
1712 INCREF(item);
1713 good = item;
1714 }
1715 else {
1716 object *arg = mkvalue("(O)", item);
1717 if (arg == NULL)
1718 goto Fail_1;
1719 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001720 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001721 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001722 goto Fail_1;
1723 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001724 ok = testbool(good);
1725 DECREF(good);
1726 if (ok) {
1727 INCREF(item);
1728 if (settupleitem(result, j++, item) < 0)
1729 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001730 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001731 }
1732
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001733 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001734 return NULL;
1735
Guido van Rossum12d12c51993-10-26 17:58:25 +00001736 return result;
1737
Guido van Rossum12d12c51993-10-26 17:58:25 +00001738Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001739 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001740 return NULL;
1741}
1742
1743
Guido van Rossume77a7571993-11-03 15:01:26 +00001744/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001745
1746static object *
1747filterstring(func, strobj)
1748 object *func;
1749 object *strobj;
1750{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001751 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001752 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001753 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001754
Guido van Rossum2586bf01993-11-01 16:21:44 +00001755 if (func == None) {
1756 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001757 INCREF(strobj);
1758 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001759 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001760 if ((result = newsizedstringobject(NULL, len)) == NULL)
1761 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001762
Guido van Rossum12d12c51993-10-26 17:58:25 +00001763 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001764 object *item, *arg, *good;
1765 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001766
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001767 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1768 if (item == NULL)
1769 goto Fail_1;
1770 arg = mkvalue("(O)", item);
1771 DECREF(item);
1772 if (arg == NULL)
1773 goto Fail_1;
1774 good = call_object(func, arg);
1775 DECREF(arg);
1776 if (good == NULL)
1777 goto Fail_1;
1778 ok = testbool(good);
1779 DECREF(good);
1780 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001781 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001782 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001783 }
1784
Guido van Rossum79d96d61996-08-16 20:44:34 +00001785 if (j < len && resizestring(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001786 return NULL;
1787
Guido van Rossum12d12c51993-10-26 17:58:25 +00001788 return result;
1789
Guido van Rossum12d12c51993-10-26 17:58:25 +00001790Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001791 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001792 return NULL;
1793}