blob: 0eaf4edf23b29fb361d04ef7213037592c69f41d [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) {
320 complexstr = newstringobject("__complex__");
321 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
843static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000844builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000845 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000846 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000847{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000848 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000849 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000850
851 if (!newgetargs(args, "O:int", &v))
852 return NULL;
853 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000854 nb->nb_int == NULL) {
855 err_setstr(TypeError,
856 "int() argument can't be converted to int");
857 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000858 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000859 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000860}
861
862static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000863builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000864 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000865 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000866{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000867 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000868 long len;
869 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000870
871 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000872 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000873 tp = v->ob_type;
874 if (tp->tp_as_sequence != NULL) {
875 len = (*tp->tp_as_sequence->sq_length)(v);
876 }
877 else if (tp->tp_as_mapping != NULL) {
878 len = (*tp->tp_as_mapping->mp_length)(v);
879 }
880 else {
881 err_setstr(TypeError, "len() of unsized object");
882 return NULL;
883 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000884 if (len < 0)
885 return NULL;
886 else
887 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000888}
889
890static object *
Guido van Rossumd1705771996-04-09 02:41:06 +0000891builtin_list(self, args)
892 object *self;
893 object *args;
894{
895 object *v;
896 sequence_methods *sqf;
897
898 if (!newgetargs(args, "O:list", &v))
899 return NULL;
900 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
901 int n = (*sqf->sq_length)(v);
902 int i;
903 object *l;
904 if (n < 0)
905 return NULL;
906 l = newlistobject(n);
907 if (l == NULL)
908 return NULL;
909 for (i = 0; i < n; i++) {
910 object *item = (*sqf->sq_item)(v, i);
911 if (item == NULL) {
912 DECREF(l);
913 l = NULL;
914 break;
915 }
916 setlistitem(l, i, item);
917 }
918 /* XXX Should support indefinite-length sequences */
919 return l;
920 }
921 err_setstr(TypeError, "list() argument must be a sequence");
922 return NULL;
923}
924
Guido van Rossum8861b741996-07-30 16:49:37 +0000925
926static PyObject *
927builtin_slice(self, args)
928 PyObject *self;
929 PyObject *args;
930{
931 PyObject *start, *stop, *step;
932
933 start = stop = step = NULL;
934
935 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
936 return NULL;
937
938 /*This swapping of stop and start is to maintain compatibility with
939 the range builtin.*/
940 if (stop == NULL) {
941 stop = start;
942 start = NULL;
943 }
944 return PySlice_New(start, stop, step);
945}
946
Guido van Rossumd1705771996-04-09 02:41:06 +0000947static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000948builtin_locals(self, args)
949 object *self;
950 object *args;
951{
952 object *d;
953
954 if (!newgetargs(args, ""))
955 return NULL;
956 d = getlocals();
957 INCREF(d);
958 return d;
959}
960
961static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000962builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000963 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000964 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000965{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000966 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000967 number_methods *nb;
968
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000969 if (!newgetargs(args, "O:long", &v))
970 return NULL;
971 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000972 nb->nb_long == NULL) {
973 err_setstr(TypeError,
974 "long() argument can't be converted to long");
975 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000976 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000977 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000978}
979
980static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000981min_max(args, sign)
982 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000983 int sign;
984{
Guido van Rossum2d951851994-08-29 12:52:16 +0000985 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000986 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000987 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000988
989 if (gettuplesize(args) > 1)
990 v = args;
991 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000992 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000993 sq = v->ob_type->tp_as_sequence;
994 if (sq == NULL) {
995 err_setstr(TypeError, "min() or max() of non-sequence");
996 return NULL;
997 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000998 w = NULL;
999 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001000 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001001 if (x == NULL) {
1002 if (err_occurred() == IndexError) {
1003 err_clear();
1004 break;
1005 }
1006 XDECREF(w);
1007 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001008 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001009 if (w == NULL)
1010 w = x;
1011 else {
1012 if (cmpobject(x, w) * sign > 0) {
1013 DECREF(w);
1014 w = x;
1015 }
1016 else
1017 DECREF(x);
1018 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001019 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001020 if (w == NULL)
1021 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001022 return w;
1023}
1024
1025static object *
1026builtin_min(self, v)
1027 object *self;
1028 object *v;
1029{
1030 return min_max(v, -1);
1031}
1032
1033static object *
1034builtin_max(self, v)
1035 object *self;
1036 object *v;
1037{
1038 return min_max(v, 1);
1039}
1040
1041static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001042builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001043 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001044 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001045{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001046 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001047 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001048
1049 if (!newgetargs(args, "O:oct", &v))
1050 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001051 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1052 nb->nb_oct == NULL) {
1053 err_setstr(TypeError,
1054 "oct() argument can't be converted to oct");
1055 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001056 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001057 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001058}
1059
1060static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001061builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001062 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001063 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001064{
Guido van Rossum2d951851994-08-29 12:52:16 +00001065 char *name;
1066 char *mode = "r";
1067 int bufsize = -1;
1068 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001069
1070 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001071 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001072 f = newfileobject(name, mode);
1073 if (f != NULL)
1074 setfilebufsize(f, bufsize);
1075 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001076}
1077
1078static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001079builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001080 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001081 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001082{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001083 char c;
1084
1085 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001086 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001087 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001088}
1089
1090static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001091do_pow(v, w)
1092 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +00001093{
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001094 object *res;
1095 if (is_instanceobject(v) || is_instanceobject(w))
1096 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001097 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +00001098 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +00001099 err_setstr(TypeError, "pow() requires numeric arguments");
1100 return NULL;
1101 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001102 if (
1103#ifndef WITHOUT_COMPLEX
1104 !is_complexobject(v) &&
1105#endif
1106 is_floatobject(w) && getfloatvalue(v) < 0.0) {
Guido van Rossum8a1e8eb1995-02-18 14:51:32 +00001107 if (!err_occurred())
1108 err_setstr(ValueError, "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001109 return NULL;
1110 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001111 if (coerce(&v, &w) != 0)
1112 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001113 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001114 DECREF(v);
1115 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001116 return res;
1117}
1118
1119static object *
1120builtin_pow(self, args)
1121 object *self;
1122 object *args;
1123{
1124 object *v, *w, *z = None, *res;
1125 object *v1, *z1, *w2, *z2;
1126
1127 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
1128 return NULL;
1129 if (z == None)
1130 return do_pow(v, w);
1131 /* XXX The ternary version doesn't do class instance coercions */
1132 if (is_instanceobject(v))
1133 return v->ob_type->tp_as_number->nb_power(v, w, z);
1134 if (v->ob_type->tp_as_number == NULL ||
1135 z->ob_type->tp_as_number == NULL ||
1136 w->ob_type->tp_as_number == NULL) {
1137 err_setstr(TypeError, "pow() requires numeric arguments");
1138 return NULL;
1139 }
1140 if (coerce(&v, &w) != 0)
1141 return NULL;
1142 res = NULL;
1143 v1 = v;
1144 z1 = z;
1145 if (coerce(&v1, &z1) != 0)
1146 goto error2;
1147 w2 = w;
1148 z2 = z1;
1149 if (coerce(&w2, &z2) != 0)
1150 goto error1;
1151 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
1152 DECREF(w2);
1153 DECREF(z2);
1154 error1:
1155 DECREF(v1);
1156 DECREF(z1);
1157 error2:
1158 DECREF(v);
1159 DECREF(w);
1160 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001161}
1162
1163static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001164builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001165 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001166 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001167{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001168 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001169 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001170 object *v;
1171
1172 if (gettuplesize(args) <= 1) {
1173 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001174 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001175 &ihigh))
1176 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001177 }
1178 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001179 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001180 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001181 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001182 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001183 }
1184 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001185 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001186 return NULL;
1187 }
1188 /* XXX ought to check overflow of subtraction */
1189 if (istep > 0)
1190 n = (ihigh - ilow + istep - 1) / istep;
1191 else
1192 n = (ihigh - ilow + istep + 1) / istep;
1193 if (n < 0)
1194 n = 0;
1195 v = newlistobject(n);
1196 if (v == NULL)
1197 return NULL;
1198 for (i = 0; i < n; i++) {
1199 object *w = newintobject(ilow);
1200 if (w == NULL) {
1201 DECREF(v);
1202 return NULL;
1203 }
1204 setlistitem(v, i, w);
1205 ilow += istep;
1206 }
1207 return v;
1208}
1209
1210static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001211builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001212 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001213 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001214{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001215 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001216 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001217
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001218 if (gettuplesize(args) <= 1) {
1219 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001220 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001221 &ihigh))
1222 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001223 }
1224 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001225 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001226 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001227 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001228 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001229 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001230 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001231 err_setstr(ValueError, "zero step for xrange()");
1232 return NULL;
1233 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001234 /* XXX ought to check overflow of subtraction */
1235 if (istep > 0)
1236 n = (ihigh - ilow + istep - 1) / istep;
1237 else
1238 n = (ihigh - ilow + istep + 1) / istep;
1239 if (n < 0)
1240 n = 0;
1241 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001242}
1243
Guido van Rossum872537c1995-07-07 22:43:42 +00001244extern char *my_readline PROTO((char *));
1245
Guido van Rossum12d12c51993-10-26 17:58:25 +00001246static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001247builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001248 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001249 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001250{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001251 object *v = NULL;
1252 object *f;
1253
1254 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001255 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001256 if (getfilefile(sysget("stdin")) == stdin &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001257 getfilefile(sysget("stdout")) == stdout &&
1258 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum872537c1995-07-07 22:43:42 +00001259 object *po;
1260 char *prompt;
1261 char *s;
1262 object *result;
1263 if (v != NULL) {
1264 po = strobject(v);
1265 if (po == NULL)
1266 return NULL;
1267 prompt = getstringvalue(po);
1268 }
1269 else {
1270 po = NULL;
1271 prompt = "";
1272 }
1273 s = my_readline(prompt);
1274 XDECREF(po);
1275 if (s == NULL) {
1276 err_set(KeyboardInterrupt);
1277 return NULL;
1278 }
1279 if (*s == '\0') {
1280 err_set(EOFError);
1281 result = NULL;
1282 }
1283 else { /* strip trailing '\n' */
1284 result = newsizedstringobject(s, strlen(s)-1);
1285 }
1286 free(s);
1287 return result;
1288 }
Guido van Rossum90933611991-06-07 16:10:43 +00001289 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290 f = sysget("stdout");
1291 if (f == NULL) {
1292 err_setstr(RuntimeError, "lost sys.stdout");
1293 return NULL;
1294 }
1295 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001296 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001297 return NULL;
1298 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001299 f = sysget("stdin");
1300 if (f == NULL) {
1301 err_setstr(RuntimeError, "lost sys.stdin");
1302 return NULL;
1303 }
1304 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001305}
1306
1307static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001308builtin_reduce(self, args)
1309 object *self;
1310 object *args;
1311{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001312 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001313 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001314 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001315
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001316 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1317 return NULL;
1318 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001319 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001320
1321 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1322 err_setstr(TypeError,
1323 "2nd argument to reduce() must be a sequence object");
1324 return NULL;
1325 }
1326
Guido van Rossum12d12c51993-10-26 17:58:25 +00001327 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001328 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001329
Guido van Rossum2d951851994-08-29 12:52:16 +00001330 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001331 object *op2;
1332
1333 if (args->ob_refcnt > 1) {
1334 DECREF(args);
1335 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001336 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001337 }
1338
Guido van Rossum2d951851994-08-29 12:52:16 +00001339 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1340 if (err_occurred() == IndexError) {
1341 err_clear();
1342 break;
1343 }
1344 goto Fail;
1345 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001346
Guido van Rossum2d951851994-08-29 12:52:16 +00001347 if (result == NULL)
1348 result = op2;
1349 else {
1350 settupleitem(args, 0, result);
1351 settupleitem(args, 1, op2);
1352 if ((result = call_object(func, args)) == NULL)
1353 goto Fail;
1354 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001355 }
1356
1357 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001358
Guido van Rossum2d951851994-08-29 12:52:16 +00001359 if (result == NULL)
1360 err_setstr(TypeError,
1361 "reduce of empty sequence with no initial value");
1362
Guido van Rossum12d12c51993-10-26 17:58:25 +00001363 return result;
1364
Guido van Rossum2d951851994-08-29 12:52:16 +00001365Fail:
1366 XDECREF(args);
1367 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001368 return NULL;
1369}
1370
1371static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001372builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001373 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001374 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001375{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001376 object *v;
1377
1378 if (!newgetargs(args, "O:reload", &v))
1379 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001380 return reload_module(v);
1381}
1382
1383static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001384builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001385 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001386 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001387{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001388 object *v;
1389
1390 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001391 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001392 return reprobject(v);
1393}
1394
1395static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001396builtin_round(self, args)
1397 object *self;
1398 object *args;
1399{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001400 double x;
1401 double f;
1402 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001403 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001404
1405 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001406 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001407 f = 1.0;
1408 for (i = ndigits; --i >= 0; )
1409 f = f*10.0;
1410 for (i = ndigits; ++i <= 0; )
1411 f = f*0.1;
1412 if (x >= 0.0)
1413 return newfloatobject(floor(x*f + 0.5) / f);
1414 else
1415 return newfloatobject(ceil(x*f - 0.5) / f);
1416}
1417
1418static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001419builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001420 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001421 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001422{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001423 object *v;
1424
1425 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001426 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001427 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001428}
1429
1430static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001431builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001432 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001433 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001434{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001435 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001436 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001437
1438 if (!newgetargs(args, "O:tuple", &v))
1439 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001440 if (is_tupleobject(v)) {
1441 INCREF(v);
1442 return v;
1443 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001444 if (is_listobject(v))
1445 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001446 if (is_stringobject(v)) {
1447 int n = getstringsize(v);
1448 object *t = newtupleobject(n);
1449 if (t != NULL) {
1450 int i;
1451 char *p = getstringvalue(v);
1452 for (i = 0; i < n; i++) {
1453 object *item = newsizedstringobject(p+i, 1);
1454 if (item == NULL) {
1455 DECREF(t);
1456 t = NULL;
1457 break;
1458 }
1459 settupleitem(t, i, item);
1460 }
1461 }
1462 return t;
1463 }
1464 /* Generic sequence object */
1465 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1466 int n = (*sqf->sq_length)(v);
1467 int i;
1468 object *t;
1469 if (n < 0)
1470 return NULL;
1471 t = newtupleobject(n);
1472 if (t == NULL)
1473 return NULL;
1474 for (i = 0; i < n; i++) {
1475 object *item = (*sqf->sq_item)(v, i);
1476 if (item == NULL) {
1477 DECREF(t);
1478 t = NULL;
1479 break;
1480 }
1481 settupleitem(t, i, item);
1482 }
1483 /* XXX Should support indefinite-length sequences */
1484 return t;
1485 }
1486 /* None of the above */
1487 err_setstr(TypeError, "tuple() argument must be a sequence");
1488 return NULL;
1489}
1490
1491static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001492builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001493 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001494 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001495{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001496 object *v;
1497
1498 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001499 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001500 v = (object *)v->ob_type;
1501 INCREF(v);
1502 return v;
1503}
1504
Guido van Rossum2d951851994-08-29 12:52:16 +00001505static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001506builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001507 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001508 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001509{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001510 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001511 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001512
1513 if (!newgetargs(args, "|O:vars", &v))
1514 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001515 if (v == NULL) {
1516 d = getlocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001517 if (d == NULL) {
1518 if (!err_occurred())
1519 err_setstr(SystemError, "no locals!?");
1520 }
1521 else
1522 INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001523 }
1524 else {
1525 d = getattr(v, "__dict__");
1526 if (d == NULL) {
1527 err_setstr(TypeError,
1528 "vars() argument must have __dict__ attribute");
1529 return NULL;
1530 }
1531 }
1532 return d;
1533}
1534
Guido van Rossum3f5da241990-12-20 15:06:42 +00001535static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001536 {"__import__", builtin___import__, 1},
1537 {"abs", builtin_abs, 1},
1538 {"apply", builtin_apply, 1},
1539 {"callable", builtin_callable, 1},
1540 {"chr", builtin_chr, 1},
1541 {"cmp", builtin_cmp, 1},
1542 {"coerce", builtin_coerce, 1},
1543 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001544#ifndef WITHOUT_COMPLEX
1545 {"complex", builtin_complex, 1},
1546#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001547 {"delattr", builtin_delattr, 1},
1548 {"dir", builtin_dir, 1},
1549 {"divmod", builtin_divmod, 1},
1550 {"eval", builtin_eval, 1},
1551 {"execfile", builtin_execfile, 1},
1552 {"filter", builtin_filter, 1},
1553 {"float", builtin_float, 1},
1554 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001555 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001556 {"hasattr", builtin_hasattr, 1},
1557 {"hash", builtin_hash, 1},
1558 {"hex", builtin_hex, 1},
1559 {"id", builtin_id, 1},
1560 {"input", builtin_input, 1},
1561 {"int", builtin_int, 1},
1562 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001563 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001564 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001565 {"long", builtin_long, 1},
1566 {"map", builtin_map, 1},
1567 {"max", builtin_max, 1},
1568 {"min", builtin_min, 1},
1569 {"oct", builtin_oct, 1},
1570 {"open", builtin_open, 1},
1571 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001572 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001573 {"range", builtin_range, 1},
1574 {"raw_input", builtin_raw_input, 1},
1575 {"reduce", builtin_reduce, 1},
1576 {"reload", builtin_reload, 1},
1577 {"repr", builtin_repr, 1},
1578 {"round", builtin_round, 1},
1579 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001580 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001581 {"str", builtin_str, 1},
1582 {"tuple", builtin_tuple, 1},
1583 {"type", builtin_type, 1},
1584 {"vars", builtin_vars, 1},
1585 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001586 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001587};
1588
Guido van Rossum0865dd91995-01-17 16:30:22 +00001589static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001590static object *builtin_dict;
1591
1592object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001593getbuiltinmod()
1594{
1595 return builtin_mod;
1596}
1597
1598object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001599getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001600{
Guido van Rossum6135a871995-01-09 17:53:26 +00001601 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001602}
1603
1604/* Predefined exceptions */
1605
Guido van Rossum25831651993-05-19 14:50:45 +00001606object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001607object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001608object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001609object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001610object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001611object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001612object *IndexError;
1613object *KeyError;
1614object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001615object *MemoryError;
1616object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001617object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001618object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001619object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001620object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001621object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001622object *TypeError;
1623object *ValueError;
1624object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001625
Guido van Rossum3f5da241990-12-20 15:06:42 +00001626static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001627newstdexception(name)
1628 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001629{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001630 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001631 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1632 fatal("no mem for new standard exception");
1633 return v;
1634}
1635
1636static void
1637initerrors()
1638{
Guido van Rossum25831651993-05-19 14:50:45 +00001639 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001640 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001641 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001642 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001643 IOError = newstdexception("IOError");
1644 ImportError = newstdexception("ImportError");
1645 IndexError = newstdexception("IndexError");
1646 KeyError = newstdexception("KeyError");
1647 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001648 MemoryError = newstdexception("MemoryError");
1649 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001650 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001651 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001652 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001653 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001654 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001655 TypeError = newstdexception("TypeError");
1656 ValueError = newstdexception("ValueError");
1657 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001658}
1659
1660void
1661initbuiltin()
1662{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001663 builtin_mod = initmodule("__builtin__", builtin_methods);
1664 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001665 INCREF(builtin_dict);
1666 initerrors();
1667 (void) dictinsert(builtin_dict, "None", None);
Guido van Rossume449af71996-10-11 16:25:41 +00001668 (void) dictinsert(builtin_dict, "Ellipsis", Py_Ellipsis);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001669}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001670
Guido van Rossum12d12c51993-10-26 17:58:25 +00001671
Guido van Rossume77a7571993-11-03 15:01:26 +00001672/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001673
1674static object *
1675filtertuple(func, tuple)
1676 object *func;
1677 object *tuple;
1678{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001679 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001680 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001681 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001682
Guido van Rossumb7b45621995-08-04 04:07:45 +00001683 if (len == 0) {
1684 INCREF(tuple);
1685 return tuple;
1686 }
1687
Guido van Rossum2586bf01993-11-01 16:21:44 +00001688 if ((result = newtupleobject(len)) == NULL)
1689 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001690
Guido van Rossum12d12c51993-10-26 17:58:25 +00001691 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001692 object *item, *good;
1693 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001694
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001695 if ((item = gettupleitem(tuple, i)) == NULL)
1696 goto Fail_1;
1697 if (func == None) {
1698 INCREF(item);
1699 good = item;
1700 }
1701 else {
1702 object *arg = mkvalue("(O)", item);
1703 if (arg == NULL)
1704 goto Fail_1;
1705 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001706 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001707 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001708 goto Fail_1;
1709 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001710 ok = testbool(good);
1711 DECREF(good);
1712 if (ok) {
1713 INCREF(item);
1714 if (settupleitem(result, j++, item) < 0)
1715 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001716 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001717 }
1718
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001719 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001720 return NULL;
1721
Guido van Rossum12d12c51993-10-26 17:58:25 +00001722 return result;
1723
Guido van Rossum12d12c51993-10-26 17:58:25 +00001724Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001725 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001726 return NULL;
1727}
1728
1729
Guido van Rossume77a7571993-11-03 15:01:26 +00001730/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001731
1732static object *
1733filterstring(func, strobj)
1734 object *func;
1735 object *strobj;
1736{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001737 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001738 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001739 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001740
Guido van Rossum2586bf01993-11-01 16:21:44 +00001741 if (func == None) {
1742 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001743 INCREF(strobj);
1744 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001745 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001746 if ((result = newsizedstringobject(NULL, len)) == NULL)
1747 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001748
Guido van Rossum12d12c51993-10-26 17:58:25 +00001749 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001750 object *item, *arg, *good;
1751 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001752
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001753 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1754 if (item == NULL)
1755 goto Fail_1;
1756 arg = mkvalue("(O)", item);
1757 DECREF(item);
1758 if (arg == NULL)
1759 goto Fail_1;
1760 good = call_object(func, arg);
1761 DECREF(arg);
1762 if (good == NULL)
1763 goto Fail_1;
1764 ok = testbool(good);
1765 DECREF(good);
1766 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001767 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001768 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001769 }
1770
Guido van Rossum79d96d61996-08-16 20:44:34 +00001771 if (j < len && resizestring(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001772 return NULL;
1773
Guido van Rossum12d12c51993-10-26 17:58:25 +00001774 return result;
1775
Guido van Rossum12d12c51993-10-26 17:58:25 +00001776Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001777 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001778 return NULL;
1779}